blob: 10fe9e5423ed164c5c073e5e825271550ae27a92 [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 Johnsone94ccd02019-04-02 15:02:56 -0700803 status = csr_set_channels(mac_ctx, &pSmeConfigParams->csr_config);
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700804 if (!QDF_IS_STATUS_SUCCESS(status))
805 sme_err("csr_set_channels failed with status: %d", status);
806
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800807 return status;
808}
809
Krunal Sonie3531942016-04-12 17:43:53 -0700810/**
811 * sme_update_fine_time_measurement_capab() - Update the FTM capabitlies from
812 * incoming val
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -0800813 * @mac_handle: Opaque handle to the global MAC context
Krunal Sonie3531942016-04-12 17:43:53 -0700814 * @val: New FTM capability value
815 *
816 * Return: None
817 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -0800818void sme_update_fine_time_measurement_capab(mac_handle_t mac_handle,
Jeff Johnson1f2dabc2018-11-07 15:33:01 -0800819 uint8_t session_id,
820 uint32_t val)
Krunal Sonie3531942016-04-12 17:43:53 -0700821{
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800822 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +0530823 QDF_STATUS status;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530824
Naveen Rawatd2657be2017-10-10 14:31:23 -0700825 ucfg_wifi_pos_set_ftm_cap(mac_ctx->psoc, val);
Krunal Sonie3531942016-04-12 17:43:53 -0700826
Selvaraj, Sridhar57bb4d02016-08-31 16:14:15 +0530827 if (!val) {
Krunal Sonie3531942016-04-12 17:43:53 -0700828 mac_ctx->rrm.rrmPEContext.rrmEnabledCaps.fine_time_meas_rpt = 0;
829 ((tpRRMCaps)mac_ctx->rrm.rrmSmeContext.
830 rrmConfig.rm_capability)->fine_time_meas_rpt = 0;
831 } else {
832 mac_ctx->rrm.rrmPEContext.rrmEnabledCaps.fine_time_meas_rpt = 1;
833 ((tpRRMCaps)mac_ctx->rrm.rrmSmeContext.
834 rrmConfig.rm_capability)->fine_time_meas_rpt = 1;
835 }
Selvaraj, Sridhar57bb4d02016-08-31 16:14:15 +0530836
837 /* Inform this RRM IE change to FW */
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +0530838 status = sme_acquire_global_lock(&mac_ctx->sme);
839 if (QDF_IS_STATUS_SUCCESS(status)) {
840 csr_roam_offload_scan(mac_ctx, session_id,
Selvaraj, Sridhar57bb4d02016-08-31 16:14:15 +0530841 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
842 REASON_CONNECT_IES_CHANGED);
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +0530843 sme_release_global_lock(&mac_ctx->sme);
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +0530844 }
Krunal Sonie3531942016-04-12 17:43:53 -0700845}
846
Manikandan Mohan06d38d82018-11-26 18:36:58 -0800847/**
848 * sme_update_neighbor_report_config() - Update CSR config for 11k params
849 * @mac_handle: Pointer to MAC context
850 * @csr_config: Pointer to CSR config data structure
851 *
852 * Return: None
853 */
Jeff Johnsondd821152019-04-02 14:50:51 -0700854static void
855sme_update_neighbor_report_config(struct mac_context *mac,
856 struct csr_config_params *csr_config)
Manikandan Mohan06d38d82018-11-26 18:36:58 -0800857{
858 struct wlan_fwol_neighbor_report_cfg fwol_neighbor_report_cfg = {0};
859 QDF_STATUS status;
860
861 status = ucfg_fwol_get_neighbor_report_cfg(mac->psoc,
862 &fwol_neighbor_report_cfg);
863 if (!QDF_IS_STATUS_SUCCESS(status))
864 sme_err("Using defaults for 11K offload params: Error: %d",
865 status);
866
867 csr_config->offload_11k_enable_bitmask =
868 fwol_neighbor_report_cfg.enable_bitmask;
869 csr_config->neighbor_report_offload.params_bitmask =
870 fwol_neighbor_report_cfg.params_bitmask;
871 csr_config->neighbor_report_offload.time_offset =
872 fwol_neighbor_report_cfg.time_offset;
873 csr_config->neighbor_report_offload.low_rssi_offset =
874 fwol_neighbor_report_cfg.low_rssi_offset;
875 csr_config->neighbor_report_offload.bmiss_count_trigger =
876 fwol_neighbor_report_cfg.bmiss_count_trigger;
877 csr_config->neighbor_report_offload.per_threshold_offset =
878 fwol_neighbor_report_cfg.per_threshold_offset;
879 csr_config->neighbor_report_offload.neighbor_report_cache_timeout =
880 fwol_neighbor_report_cfg.cache_timeout;
881 csr_config->neighbor_report_offload.max_neighbor_report_req_cap =
882 fwol_neighbor_report_cfg.max_req_cap;
883}
884
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530885/*
886 * sme_update_config() - Change configurations for all SME moduels
887 * The function updates some configuration for modules in SME, CSR, etc
888 * during SMEs close open sequence.
889 * Modules inside SME apply the new configuration at the next transaction.
890 * This is a synchronous call
891 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -0800892 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530893 * pSmeConfigParams - a pointer to a caller allocated object of
Jeff Johnson46b4f0e2019-03-08 10:48:35 -0800894 * struct sme_config_params.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530895 * Return QDF_STATUS_SUCCESS - SME update the config parameters successfully.
896 * Other status means SME is failed to update the config parameters.
897 */
Jeff Johnson46b4f0e2019-03-08 10:48:35 -0800898QDF_STATUS sme_update_config(mac_handle_t mac_handle,
899 struct sme_config_params *pSmeConfigParams)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800900{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530901 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800902 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800903
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530904 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800905 TRACE_CODE_SME_RX_HDD_MSG_UPDATE_CONFIG, NO_SESSION,
906 0));
Jeff Johnson038efe72019-03-18 13:39:31 -0700907 if (!pSmeConfigParams) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700908 sme_err("SME config params empty");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800909 return status;
910 }
Jeff Johnsone94ccd02019-04-02 15:02:56 -0700911 sme_update_neighbor_report_config(mac, &pSmeConfigParams->csr_config);
Jeff Johnson01f2c232018-11-21 19:17:44 -0800912 status = csr_change_default_config_param(mac, &pSmeConfigParams->
Jeff Johnsone94ccd02019-04-02 15:02:56 -0700913 csr_config);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800914
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530915 if (!QDF_IS_STATUS_SUCCESS(status))
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700916 sme_err("csr_change_default_config_param failed status: %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800917 status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800918
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530919 /* For SOC, CFG is set before start We don't want to apply global CFG
920 * in connect state because that may cause some side affect
921 */
Jeff Johnson01f2c232018-11-21 19:17:44 -0800922 if (csr_is_all_session_disconnected(mac))
923 csr_set_global_cfgs(mac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800924
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800925 return status;
926}
927
928/**
Abhishek Singh158fe252017-03-23 11:09:34 +0530929 * sme_update_scan_roam_params() - Update the scan roaming params
930 * @mac_ctx: mac ctx
931 *
932 * Return: void.
933 */
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800934static void sme_update_scan_roam_params(struct mac_context *mac_ctx)
Abhishek Singh158fe252017-03-23 11:09:34 +0530935{
936 struct roam_filter_params scan_params = {0};
937 struct roam_ext_params *roam_params_src;
938 uint8_t i;
939 QDF_STATUS status;
940
941 roam_params_src = &mac_ctx->roam.configParam.roam_params;
942
943 scan_params.num_bssid_avoid_list =
944 roam_params_src->num_bssid_avoid_list;
Abhishek Singh158fe252017-03-23 11:09:34 +0530945
946 if (scan_params.num_bssid_avoid_list >
947 MAX_AVOID_LIST_BSSID)
948 scan_params.num_bssid_avoid_list =
949 MAX_AVOID_LIST_BSSID;
950
951 for (i = 0; i < scan_params.num_bssid_avoid_list; i++) {
952 qdf_copy_macaddr(&scan_params.bssid_avoid_list[i],
953 &roam_params_src->bssid_avoid_list[i]);
954 }
955
956 status = ucfg_scan_update_roam_params(mac_ctx->psoc, &scan_params);
957 if (QDF_IS_STATUS_ERROR(status))
Srinivas Girigowda2c263352017-03-17 17:49:53 -0700958 sme_err("ailed to update scan roam params with status=%d",
Abhishek Singh158fe252017-03-23 11:09:34 +0530959 status);
960}
961
962/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800963 * sme_update_roam_params() - Store/Update the roaming params
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -0800964 * @mac_handle: Opaque handle to the global MAC context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800965 * @session_id: SME Session ID
966 * @roam_params_src: The source buffer to copy
967 * @update_param: Type of parameter to be updated
968 *
969 * Return: Return the status of the updation.
970 */
Jeff Johnsonc7309062018-11-09 20:59:42 -0800971QDF_STATUS sme_update_roam_params(mac_handle_t mac_handle,
972 uint8_t session_id,
973 struct roam_ext_params *roam_params_src,
974 int update_param)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800975{
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800976 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800977 struct roam_ext_params *roam_params_dst;
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +0530978 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800979 uint8_t i;
980
981 roam_params_dst = &mac_ctx->roam.configParam.roam_params;
982 switch (update_param) {
983 case REASON_ROAM_EXT_SCAN_PARAMS_CHANGED:
Wu Gaoca416ff2018-09-17 11:05:07 +0800984 mac_ctx->mlme_cfg->lfr.rssi_boost_threshold_5g =
Srinivas Girigowda72f30392017-07-13 18:55:09 -0700985 roam_params_src->raise_rssi_thresh_5g;
Wu Gaoca416ff2018-09-17 11:05:07 +0800986 mac_ctx->mlme_cfg->lfr.rssi_penalize_threshold_5g =
Srinivas Girigowda72f30392017-07-13 18:55:09 -0700987 roam_params_src->drop_rssi_thresh_5g;
Wu Gaoca416ff2018-09-17 11:05:07 +0800988 mac_ctx->mlme_cfg->lfr.rssi_boost_factor_5g =
Srinivas Girigowda72f30392017-07-13 18:55:09 -0700989 roam_params_src->raise_factor_5g;
Wu Gaoca416ff2018-09-17 11:05:07 +0800990 mac_ctx->mlme_cfg->lfr.rssi_penalize_factor_5g =
Srinivas Girigowda72f30392017-07-13 18:55:09 -0700991 roam_params_src->drop_factor_5g;
Wu Gaoca416ff2018-09-17 11:05:07 +0800992 mac_ctx->mlme_cfg->lfr.max_rssi_boost_5g =
Srinivas Girigowda72f30392017-07-13 18:55:09 -0700993 roam_params_src->max_raise_rssi_5g;
Wu Gaoca416ff2018-09-17 11:05:07 +0800994 mac_ctx->mlme_cfg->lfr.max_rssi_penalize_5g =
Srinivas Girigowda72f30392017-07-13 18:55:09 -0700995 roam_params_src->max_drop_rssi_5g;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800996 roam_params_dst->alert_rssi_threshold =
Srinivas Girigowda72f30392017-07-13 18:55:09 -0700997 roam_params_src->alert_rssi_threshold;
Wu Gaoca416ff2018-09-17 11:05:07 +0800998 mac_ctx->mlme_cfg->lfr.enable_5g_band_pref = true;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800999 break;
1000 case REASON_ROAM_SET_SSID_ALLOWED:
hangtian127c9532019-01-12 13:29:07 +08001001 qdf_mem_zero(&roam_params_dst->ssid_allowed_list,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001002 sizeof(tSirMacSSid) * MAX_SSID_ALLOWED_LIST);
1003 roam_params_dst->num_ssid_allowed_list =
Srinivas Girigowda72f30392017-07-13 18:55:09 -07001004 roam_params_src->num_ssid_allowed_list;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001005 for (i = 0; i < roam_params_dst->num_ssid_allowed_list; i++) {
1006 roam_params_dst->ssid_allowed_list[i].length =
Srinivas Girigowda72f30392017-07-13 18:55:09 -07001007 roam_params_src->ssid_allowed_list[i].length;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301008 qdf_mem_copy(roam_params_dst->ssid_allowed_list[i].ssId,
Srinivas Girigowda72f30392017-07-13 18:55:09 -07001009 roam_params_src->ssid_allowed_list[i].ssId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001010 roam_params_dst->ssid_allowed_list[i].length);
1011 }
1012 break;
1013 case REASON_ROAM_SET_FAVORED_BSSID:
hangtian127c9532019-01-12 13:29:07 +08001014 qdf_mem_zero(&roam_params_dst->bssid_favored,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001015 sizeof(tSirMacAddr) * MAX_BSSID_FAVORED);
1016 roam_params_dst->num_bssid_favored =
Srinivas Girigowda72f30392017-07-13 18:55:09 -07001017 roam_params_src->num_bssid_favored;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001018 for (i = 0; i < roam_params_dst->num_bssid_favored; i++) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301019 qdf_mem_copy(&roam_params_dst->bssid_favored[i],
Srinivas Girigowda72f30392017-07-13 18:55:09 -07001020 &roam_params_src->bssid_favored[i],
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001021 sizeof(tSirMacAddr));
1022 roam_params_dst->bssid_favored_factor[i] =
Srinivas Girigowda72f30392017-07-13 18:55:09 -07001023 roam_params_src->bssid_favored_factor[i];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001024 }
1025 break;
1026 case REASON_ROAM_SET_BLACKLIST_BSSID:
hangtian127c9532019-01-12 13:29:07 +08001027 qdf_mem_zero(&roam_params_dst->bssid_avoid_list,
Anurag Chouhan6d760662016-02-20 16:05:43 +05301028 QDF_MAC_ADDR_SIZE * MAX_BSSID_AVOID_LIST);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001029 roam_params_dst->num_bssid_avoid_list =
Srinivas Girigowda72f30392017-07-13 18:55:09 -07001030 roam_params_src->num_bssid_avoid_list;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001031 for (i = 0; i < roam_params_dst->num_bssid_avoid_list; i++) {
Anurag Chouhanc5548422016-02-24 18:33:27 +05301032 qdf_copy_macaddr(&roam_params_dst->bssid_avoid_list[i],
Srinivas Girigowda72f30392017-07-13 18:55:09 -07001033 &roam_params_src->bssid_avoid_list[i]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001034 }
1035 break;
1036 case REASON_ROAM_GOOD_RSSI_CHANGED:
1037 roam_params_dst->good_rssi_roam =
Srinivas Girigowda72f30392017-07-13 18:55:09 -07001038 roam_params_src->good_rssi_roam;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001039 break;
1040 default:
1041 break;
1042 }
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05301043
1044 status = sme_acquire_global_lock(&mac_ctx->sme);
1045 if (QDF_IS_STATUS_SUCCESS(status)) {
1046 csr_roam_offload_scan(mac_ctx, session_id,
1047 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
1048 update_param);
1049 sme_release_global_lock(&mac_ctx->sme);
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05301050 }
Abhishek Singh158fe252017-03-23 11:09:34 +05301051
1052 sme_update_scan_roam_params(mac_ctx);
1053
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001054 return 0;
1055}
1056
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001057#ifdef WLAN_FEATURE_EXTWOW_SUPPORT
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001058
Krishna Kumaar Natarajand9131902015-10-19 11:52:47 -07001059/**
1060 * sme_process_ready_to_ext_wow() - inform ready to ExtWoW indication.
Jeff Johnson9d7c99e2018-06-28 15:36:00 -07001061 * @mac: Global MAC context
1062 * @indication: ready to Ext WoW indication from lower layer
Krishna Kumaar Natarajand9131902015-10-19 11:52:47 -07001063 *
1064 * On getting ready to Ext WoW indication, this function calls callback
Jeff Johnson9d7c99e2018-06-28 15:36:00 -07001065 * registered (HDD callback) with SME to inform ready to ExtWoW indication.
Krishna Kumaar Natarajand9131902015-10-19 11:52:47 -07001066 *
1067 * Return: None
1068 */
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001069static void sme_process_ready_to_ext_wow(struct mac_context *mac,
Jeff Johnson9d7c99e2018-06-28 15:36:00 -07001070 tpSirReadyToExtWoWInd indication)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001071{
Jeff Johnson9d7c99e2018-06-28 15:36:00 -07001072 if (!mac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301073 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_FATAL,
Jeff Johnson9d7c99e2018-06-28 15:36:00 -07001074 "%s: mac is null", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001075 return;
1076 }
1077
Jeff Johnson038efe72019-03-18 13:39:31 -07001078 if (mac->readyToExtWoWCallback) {
Jeff Johnson9d7c99e2018-06-28 15:36:00 -07001079 mac->readyToExtWoWCallback(mac->readyToExtWoWContext,
1080 indication->status);
1081 mac->readyToExtWoWCallback = NULL;
1082 mac->readyToExtWoWContext = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001083 }
1084
1085}
1086#endif
1087
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301088/*
1089 * sme_hdd_ready_ind() - SME sends eWNI_SME_SYS_READY_IND to PE to inform
1090 * that the NIC is ready tio run.
1091 * The function is called by HDD at the end of initialization stage so PE/HAL
1092 * can enable the NIC to running state.
1093 * This is a synchronous call
1094 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08001095 * @mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301096 * Return QDF_STATUS_SUCCESS - eWNI_SME_SYS_READY_IND is sent to PE
1097 * successfully.
1098 * Other status means SME failed to send the message to PE.
1099 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08001100QDF_STATUS sme_hdd_ready_ind(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001101{
Jeff Johnson47e4b552019-02-01 23:12:25 -08001102 struct sme_ready_req *msg;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301103 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001104 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001105
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301106 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001107 TRACE_CODE_SME_RX_HDD_MSG_HDDREADYIND, NO_SESSION, 0));
1108 do {
1109
Abhishek Singhde410b72017-05-22 15:25:39 +05301110 msg = qdf_mem_malloc(sizeof(*msg));
Arif Hussain0ef77082018-10-10 16:42:53 -07001111 if (!msg)
Abhishek Singhde410b72017-05-22 15:25:39 +05301112 return QDF_STATUS_E_NOMEM;
Arif Hussain0ef77082018-10-10 16:42:53 -07001113
Abhishek Singhde410b72017-05-22 15:25:39 +05301114 msg->messageType = eWNI_SME_SYS_READY_IND;
1115 msg->length = sizeof(*msg);
Abhishek Singhde410b72017-05-22 15:25:39 +05301116 msg->csr_roam_synch_cb = csr_roam_synch_callback;
Sandeep Puligilla1426d612017-04-12 18:22:06 -07001117 msg->sme_msg_cb = sme_process_msg_callback;
Vignesh Viswanathan3d478032018-08-02 20:18:53 +05301118 msg->stop_roaming_cb = sme_stop_roaming;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001119
Jeff Johnsonb460dd72018-11-08 10:26:51 -08001120 status = u_mac_post_ctrl_msg(mac_handle, (tSirMbMsg *)msg);
Jeff Johnsonc09caa42018-06-07 22:58:55 -07001121 if (QDF_IS_STATUS_ERROR(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001122 sme_err("u_mac_post_ctrl_msg failed to send eWNI_SME_SYS_READY_IND");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001123 break;
1124 }
1125
Jeff Johnson01f2c232018-11-21 19:17:44 -08001126 status = csr_ready(mac);
Jeff Johnsonc09caa42018-06-07 22:58:55 -07001127 if (QDF_IS_STATUS_ERROR(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001128 sme_err("csr_ready failed with status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001129 break;
1130 }
1131
Jeff Johnson01f2c232018-11-21 19:17:44 -08001132 mac->sme.state = SME_STATE_READY;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001133 } while (0);
1134
1135 return status;
1136}
1137
Tushnim Bhattacharyyac3c375e2017-08-04 23:39:55 -07001138QDF_STATUS sme_get_valid_channels(uint8_t *chan_list, uint32_t *list_len)
1139{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001140 struct mac_context *mac_ctx = sme_get_mac_context();
Tushnim Bhattacharyyac3c375e2017-08-04 23:39:55 -07001141
Jeff Johnson038efe72019-03-18 13:39:31 -07001142 if (!mac_ctx) {
Tushnim Bhattacharyyac3c375e2017-08-04 23:39:55 -07001143 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
1144 FL("Invalid MAC context"));
1145 return QDF_STATUS_E_FAILURE;
1146 }
1147
Wu Gaof3cbeaf2019-01-15 18:26:25 +08001148 *list_len = (uint32_t)mac_ctx->mlme_cfg->reg.valid_channel_list_num;
1149 qdf_mem_copy(chan_list, mac_ctx->mlme_cfg->reg.valid_channel_list,
1150 *list_len);
1151
1152 return QDF_STATUS_SUCCESS;
Tushnim Bhattacharyyac3c375e2017-08-04 23:39:55 -07001153}
1154
Sandeep Puligilla8e89d572018-04-02 18:07:45 -07001155#ifdef WLAN_CONV_SPECTRAL_ENABLE
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001156static QDF_STATUS sme_register_spectral_cb(struct mac_context *mac_ctx)
Sandeep Puligilla8e89d572018-04-02 18:07:45 -07001157{
1158 struct spectral_legacy_cbacks spectral_cb;
1159 QDF_STATUS status;
1160
1161 spectral_cb.vdev_get_chan_freq = sme_get_oper_chan_freq;
1162 spectral_cb.vdev_get_ch_width = sme_get_oper_ch_width;
1163 spectral_cb.vdev_get_sec20chan_freq_mhz = sme_get_sec20chan_freq_mhz;
1164 status = spectral_register_legacy_cb(mac_ctx->psoc, &spectral_cb);
1165
1166 return status;
1167}
1168#else
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001169static QDF_STATUS sme_register_spectral_cb(struct mac_context *mac_ctx)
Sandeep Puligilla8e89d572018-04-02 18:07:45 -07001170{
1171 return QDF_STATUS_SUCCESS;
1172}
1173#endif
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301174/*
1175 * sme_start() - Put all SME modules at ready state.
1176 * The function starts each module in SME, PMC, CSR, etc. . Upon
1177 * successfully return, all modules are ready to run.
1178 * This is a synchronous call
1179 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08001180 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301181 * Return QDF_STATUS_SUCCESS - SME is ready.
1182 * Other status means SME is failed to start
1183 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08001184QDF_STATUS sme_start(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001185{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301186 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001187 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Tushnim Bhattacharyya91049632017-03-17 17:31:27 -07001188 struct policy_mgr_sme_cbacks sme_cbacks;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001189
1190 do {
Jeff Johnson01f2c232018-11-21 19:17:44 -08001191 status = csr_start(mac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301192 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001193 sme_err("csr_start failed status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001194 break;
1195 }
Tushnim Bhattacharyya91049632017-03-17 17:31:27 -07001196 sme_cbacks.sme_get_nss_for_vdev = sme_get_vdev_type_nss;
Tushnim Bhattacharyyac3c375e2017-08-04 23:39:55 -07001197 sme_cbacks.sme_get_valid_channels = sme_get_valid_channels;
Tushnim Bhattacharyya91049632017-03-17 17:31:27 -07001198 sme_cbacks.sme_nss_update_request = sme_nss_update_request;
1199 sme_cbacks.sme_pdev_set_hw_mode = sme_pdev_set_hw_mode;
1200 sme_cbacks.sme_pdev_set_pcl = sme_pdev_set_pcl;
1201 sme_cbacks.sme_soc_set_dual_mac_config =
1202 sme_soc_set_dual_mac_config;
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07001203 sme_cbacks.sme_change_mcc_beacon_interval =
1204 sme_change_mcc_beacon_interval;
1205 sme_cbacks.sme_get_ap_channel_from_scan =
1206 sme_get_ap_channel_from_scan;
1207 sme_cbacks.sme_scan_result_purge = sme_scan_result_purge;
Jeff Johnson01f2c232018-11-21 19:17:44 -08001208 status = policy_mgr_register_sme_cb(mac->psoc, &sme_cbacks);
Tushnim Bhattacharyya91049632017-03-17 17:31:27 -07001209 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2c263352017-03-17 17:49:53 -07001210 sme_err("Failed to register sme cb with Policy Manager: %d",
Tushnim Bhattacharyya91049632017-03-17 17:31:27 -07001211 status);
1212 break;
1213 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08001214 sme_register_spectral_cb(mac);
1215 mac->sme.state = SME_STATE_START;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001216
Sandeep Puligilla66d09c42017-09-06 17:10:27 -07001217 /* START RRM */
Jeff Johnson01f2c232018-11-21 19:17:44 -08001218 status = rrm_start(mac);
Sandeep Puligilla66d09c42017-09-06 17:10:27 -07001219 if (!QDF_IS_STATUS_SUCCESS(status)) {
1220 sme_err("Failed to start RRM");
1221 break;
1222 }
1223 } while (0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001224 return status;
1225}
1226
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001227static QDF_STATUS dfs_msg_processor(struct mac_context *mac,
Arif Hussaincd151632017-02-11 16:57:19 -08001228 struct scheduler_msg *msg)
1229{
1230 QDF_STATUS status = QDF_STATUS_SUCCESS;
Min Liu3621ede2018-11-07 18:36:00 +08001231 struct csr_roam_info *roam_info;
Arif Hussaincd151632017-02-11 16:57:19 -08001232 tSirSmeCSAIeTxCompleteRsp *csa_ie_tx_complete_rsp;
1233 uint32_t session_id = 0;
1234 eRoamCmdStatus roam_status;
1235 eCsrRoamResult roam_result;
1236
Min Liu3621ede2018-11-07 18:36:00 +08001237 roam_info = qdf_mem_malloc(sizeof(*roam_info));
1238 if (!roam_info)
1239 return QDF_STATUS_E_NOMEM;
1240
Arif Hussaincd151632017-02-11 16:57:19 -08001241 switch (msg->type) {
1242 case eWNI_SME_DFS_RADAR_FOUND:
1243 {
1244 session_id = msg->bodyval;
1245 roam_status = eCSR_ROAM_DFS_RADAR_IND;
1246 roam_result = eCSR_ROAM_RESULT_DFS_RADAR_FOUND_IND;
Abhishek Singhe4a1f882017-08-10 17:59:44 +05301247 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Arif Hussaincd151632017-02-11 16:57:19 -08001248 "sapdfs: Radar indication event occurred");
1249 break;
1250 }
1251 case eWNI_SME_DFS_CSAIE_TX_COMPLETE_IND:
1252 {
1253 csa_ie_tx_complete_rsp =
1254 (tSirSmeCSAIeTxCompleteRsp *) msg->bodyptr;
1255 if (!csa_ie_tx_complete_rsp) {
1256 sme_err("eWNI_SME_DFS_CSAIE_TX_COMPLETE_IND null msg");
Min Liu3621ede2018-11-07 18:36:00 +08001257 qdf_mem_free(roam_info);
Arif Hussaincd151632017-02-11 16:57:19 -08001258 return QDF_STATUS_E_FAILURE;
1259 }
1260 session_id = csa_ie_tx_complete_rsp->sessionId;
1261 roam_status = eCSR_ROAM_DFS_CHAN_SW_NOTIFY;
1262 roam_result = eCSR_ROAM_RESULT_DFS_CHANSW_UPDATE_SUCCESS;
Abhishek Singhe4a1f882017-08-10 17:59:44 +05301263 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Arif Hussaincd151632017-02-11 16:57:19 -08001264 "eWNI_SME_DFS_CSAIE_TX_COMPLETE_IND session=%d",
1265 session_id);
1266 break;
1267 }
1268 case eWNI_SME_DFS_CAC_COMPLETE:
1269 {
1270 session_id = msg->bodyval;
1271 roam_status = eCSR_ROAM_CAC_COMPLETE_IND;
1272 roam_result = eCSR_ROAM_RESULT_CAC_END_IND;
Abhishek Singhe4a1f882017-08-10 17:59:44 +05301273 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Arif Hussaincd151632017-02-11 16:57:19 -08001274 "sapdfs: Received eWNI_SME_DFS_CAC_COMPLETE vdevid%d",
1275 session_id);
1276 break;
1277 }
Abhishek Singh20a8e442018-09-12 15:50:44 +05301278 case eWNI_SME_CSA_RESTART_RSP:
1279 {
1280 session_id = msg->bodyval;
1281 roam_status = 0;
1282 roam_result = eCSR_ROAM_RESULT_CSA_RESTART_RSP;
1283 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
1284 "sapdfs: Received eCSR_ROAM_RESULT_DFS_CHANSW_UPDATE_REQ vdevid%d",
1285 session_id);
1286 break;
1287 }
Arif Hussaincd151632017-02-11 16:57:19 -08001288 default:
1289 {
1290 sme_err("Invalid DFS message: 0x%x", msg->type);
Min Liu3621ede2018-11-07 18:36:00 +08001291 qdf_mem_free(roam_info);
Arif Hussaincd151632017-02-11 16:57:19 -08001292 status = QDF_STATUS_E_FAILURE;
1293 return status;
1294 }
1295 }
1296
1297 /* Indicate Radar Event to SAP */
Min Liu3621ede2018-11-07 18:36:00 +08001298 csr_roam_call_callback(mac, session_id, roam_info, 0,
Arif Hussaincd151632017-02-11 16:57:19 -08001299 roam_status, roam_result);
Min Liu3621ede2018-11-07 18:36:00 +08001300 qdf_mem_free(roam_info);
Arif Hussaincd151632017-02-11 16:57:19 -08001301 return status;
1302}
1303
1304
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001305#ifdef WLAN_FEATURE_11W
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301306/*
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001307 * Handle the unprotected management frame indication from LIM and
1308 * forward it to HDD.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301309 */
Jeff Johnson2ef47442018-06-09 23:43:40 -07001310static QDF_STATUS
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001311sme_unprotected_mgmt_frm_ind(struct mac_context *mac,
Jeff Johnson2ef47442018-06-09 23:43:40 -07001312 tpSirSmeUnprotMgmtFrameInd pSmeMgmtFrm)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001313{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301314 QDF_STATUS status = QDF_STATUS_SUCCESS;
Min Liu3621ede2018-11-07 18:36:00 +08001315 struct csr_roam_info *roam_info;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001316 uint32_t SessionId = pSmeMgmtFrm->sessionId;
1317
Min Liu3621ede2018-11-07 18:36:00 +08001318 roam_info = qdf_mem_malloc(sizeof(*roam_info));
1319 if (!roam_info)
1320 return QDF_STATUS_E_NOMEM;
1321
1322 roam_info->nFrameLength = pSmeMgmtFrm->frameLen;
1323 roam_info->pbFrames = pSmeMgmtFrm->frameBuf;
1324 roam_info->frameType = pSmeMgmtFrm->frameType;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001325
1326 /* forward the mgmt frame to HDD */
Min Liu3621ede2018-11-07 18:36:00 +08001327 csr_roam_call_callback(mac, SessionId, roam_info, 0,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001328 eCSR_ROAM_UNPROT_MGMT_FRAME_IND, 0);
1329
Min Liu3621ede2018-11-07 18:36:00 +08001330 qdf_mem_free(roam_info);
1331
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001332 return status;
1333}
1334#endif
1335
Jeff Johnsonc7309062018-11-09 20:59:42 -08001336QDF_STATUS sme_update_new_channel_event(mac_handle_t mac_handle,
1337 uint8_t session_id)
Kapil Gupta8878ad92017-02-13 11:56:04 +05301338{
1339 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001340 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Jeff Johnson172237b2017-11-07 15:32:59 -08001341 struct csr_roam_info *roamInfo;
Kapil Gupta8878ad92017-02-13 11:56:04 +05301342 eRoamCmdStatus roamStatus;
1343 eCsrRoamResult roamResult;
1344
1345 roamInfo = qdf_mem_malloc(sizeof(*roamInfo));
Arif Hussain0ef77082018-10-10 16:42:53 -07001346 if (!roamInfo)
Krunal Soni3fa80e22018-01-09 14:16:02 -08001347 return QDF_STATUS_E_FAILURE;
Kapil Gupta8878ad92017-02-13 11:56:04 +05301348
Arif Hussain0ef77082018-10-10 16:42:53 -07001349 roamInfo->dfs_event.sessionId = session_id;
Kapil Gupta8878ad92017-02-13 11:56:04 +05301350 roamStatus = eCSR_ROAM_CHANNEL_COMPLETE_IND;
1351 roamResult = eCSR_ROAM_RESULT_DFS_RADAR_FOUND_IND;
Abhishek Singhe4a1f882017-08-10 17:59:44 +05301352 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Kapil Gupta8878ad92017-02-13 11:56:04 +05301353 "sapdfs: Updated new channel event");
1354
1355 /* Indicate channel Event to SAP */
1356 csr_roam_call_callback(mac, session_id, roamInfo, 0,
1357 roamStatus, roamResult);
1358
1359 qdf_mem_free(roamInfo);
1360 return status;
1361}
1362
1363
Abhishek Singh518323d2015-10-19 17:42:01 +05301364/**
1365 * sme_extended_change_channel_ind()- function to indicate ECSA
1366 * action frame is received in lim to SAP
1367 * @mac_ctx: pointer to global mac structure
1368 * @msg_buf: contain new channel and session id.
1369 *
1370 * This function is called to post ECSA action frame
1371 * receive event to SAP.
1372 *
1373 * Return: success if msg indicated to SAP else return failure
1374 */
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001375static QDF_STATUS sme_extended_change_channel_ind(struct mac_context *mac_ctx,
Abhishek Singh518323d2015-10-19 17:42:01 +05301376 void *msg_buf)
1377{
1378 struct sir_sme_ext_cng_chan_ind *ext_chan_ind;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301379 QDF_STATUS status = QDF_STATUS_SUCCESS;
Abhishek Singh518323d2015-10-19 17:42:01 +05301380 uint32_t session_id = 0;
Min Liu3621ede2018-11-07 18:36:00 +08001381 struct csr_roam_info *roam_info;
Abhishek Singh518323d2015-10-19 17:42:01 +05301382 eRoamCmdStatus roam_status;
1383 eCsrRoamResult roam_result;
1384
Abhishek Singh518323d2015-10-19 17:42:01 +05301385 ext_chan_ind = msg_buf;
Jeff Johnson038efe72019-03-18 13:39:31 -07001386 if (!ext_chan_ind) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001387 sme_err("ext_chan_ind is NULL");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301388 return QDF_STATUS_E_FAILURE;
Abhishek Singh518323d2015-10-19 17:42:01 +05301389 }
Min Liu3621ede2018-11-07 18:36:00 +08001390 roam_info = qdf_mem_malloc(sizeof(*roam_info));
1391 if (!roam_info)
1392 return QDF_STATUS_E_NOMEM;
Abhishek Singh518323d2015-10-19 17:42:01 +05301393 session_id = ext_chan_ind->session_id;
Min Liu3621ede2018-11-07 18:36:00 +08001394 roam_info->target_channel = ext_chan_ind->new_channel;
Abhishek Singh518323d2015-10-19 17:42:01 +05301395 roam_status = eCSR_ROAM_EXT_CHG_CHNL_IND;
1396 roam_result = eCSR_ROAM_EXT_CHG_CHNL_UPDATE_IND;
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001397 sme_debug("sapdfs: Received eWNI_SME_EXT_CHANGE_CHANNEL_IND for session id [%d]",
1398 session_id);
Abhishek Singh518323d2015-10-19 17:42:01 +05301399
1400 /* Indicate Ext Channel Change event to SAP */
Min Liu3621ede2018-11-07 18:36:00 +08001401 csr_roam_call_callback(mac_ctx, session_id, roam_info, 0,
1402 roam_status, roam_result);
1403 qdf_mem_free(roam_info);
Abhishek Singh518323d2015-10-19 17:42:01 +05301404 return status;
1405}
1406
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001407#ifdef FEATURE_WLAN_ESE
1408/**
1409 * sme_update_is_ese_feature_enabled() - enable/disable ESE support at runtime
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08001410 * @mac_handle: Opaque handle to the global MAC context
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001411 * @sessionId: session id
1412 * @isEseIniFeatureEnabled: ese ini enabled
1413 *
1414 * It is used at in the REG_DYNAMIC_VARIABLE macro definition of
1415 * isEseIniFeatureEnabled. This is a synchronous call
1416 *
1417 * Return: QDF_STATUS enumeration
1418 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08001419QDF_STATUS sme_update_is_ese_feature_enabled(mac_handle_t mac_handle,
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001420 uint8_t sessionId, const bool isEseIniFeatureEnabled)
1421{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001422 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05301423 QDF_STATUS status;
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001424
Wu Gao51a63562018-11-08 16:29:10 +08001425 if (mac->mlme_cfg->lfr.ese_enabled ==
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001426 isEseIniFeatureEnabled) {
Abhishek Singhe4a1f882017-08-10 17:59:44 +05301427 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001428 "%s: ESE Mode is already enabled or disabled, nothing to do (returning) old(%d) new(%d)",
1429 __func__,
Wu Gao51a63562018-11-08 16:29:10 +08001430 mac->mlme_cfg->lfr.ese_enabled,
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001431 isEseIniFeatureEnabled);
1432 return QDF_STATUS_SUCCESS;
1433 }
1434
Abhishek Singhe4a1f882017-08-10 17:59:44 +05301435 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001436 "%s: EseEnabled is changed from %d to %d", __func__,
Wu Gao51a63562018-11-08 16:29:10 +08001437 mac->mlme_cfg->lfr.ese_enabled,
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001438 isEseIniFeatureEnabled);
Wu Gao51a63562018-11-08 16:29:10 +08001439 mac->mlme_cfg->lfr.ese_enabled = isEseIniFeatureEnabled;
Varun Reddy Yeturuff4feb02016-04-20 12:26:11 -07001440 csr_neighbor_roam_update_fast_roaming_enabled(
Jeff Johnson01f2c232018-11-21 19:17:44 -08001441 mac, sessionId, isEseIniFeatureEnabled);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001442
1443 if (true == isEseIniFeatureEnabled)
Wu Gao51a63562018-11-08 16:29:10 +08001444 mac->mlme_cfg->lfr.fast_transition_enabled = true;
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001445
Wu Gao51a63562018-11-08 16:29:10 +08001446 if (mac->mlme_cfg->lfr.roam_scan_offload_enabled) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08001447 status = sme_acquire_global_lock(&mac->sme);
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05301448 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08001449 csr_roam_offload_scan(mac, sessionId,
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05301450 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
1451 REASON_ESE_INI_CFG_CHANGED);
Jeff Johnson01f2c232018-11-21 19:17:44 -08001452 sme_release_global_lock(&mac->sme);
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05301453 } else {
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05301454 return status;
1455 }
1456 }
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001457 return QDF_STATUS_SUCCESS;
1458}
1459
Jeff Johnson36583f02019-02-26 08:02:11 -08001460QDF_STATUS sme_set_plm_request(mac_handle_t mac_handle,
1461 struct plm_req_params *req)
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001462{
1463 QDF_STATUS status;
1464 bool ret = false;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001465 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Wu Gao0821b0d2019-01-11 17:31:11 +08001466 uint8_t ch_list[CFG_VALID_CHANNEL_LIST_LEN] = { 0 };
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001467 uint8_t count, valid_count = 0;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07001468 struct scheduler_msg msg = {0};
Jeff Johnson36583f02019-02-26 08:02:11 -08001469 struct csr_roam_session *session;
1470 struct plm_req_params *body;
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001471
Harprit Chhabadacb9f73c2019-04-04 14:24:43 -07001472 if (!req)
1473 return QDF_STATUS_E_FAILURE;
1474
Jeff Johnson01f2c232018-11-21 19:17:44 -08001475 status = sme_acquire_global_lock(&mac->sme);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001476 if (!QDF_IS_STATUS_SUCCESS(status))
1477 return status;
1478
Jeff Johnson36583f02019-02-26 08:02:11 -08001479 session = CSR_GET_SESSION(mac, req->vdev_id);
1480 if (!session) {
1481 sme_err("session %d not found", req->vdev_id);
Jeff Johnson01f2c232018-11-21 19:17:44 -08001482 sme_release_global_lock(&mac->sme);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001483 return QDF_STATUS_E_FAILURE;
1484 }
1485
Jeff Johnson36583f02019-02-26 08:02:11 -08001486 if (!session->sessionActive) {
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001487 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
1488 FL("Invalid Sessionid"));
Jeff Johnson01f2c232018-11-21 19:17:44 -08001489 sme_release_global_lock(&mac->sme);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001490 return QDF_STATUS_E_FAILURE;
1491 }
1492
Jeff Johnson36583f02019-02-26 08:02:11 -08001493 /* per contract must make a copy of the params when messaging */
1494 body = qdf_mem_malloc(sizeof(*body));
Harprit Chhabadacb9f73c2019-04-04 14:24:43 -07001495
1496 if (!body) {
1497 sme_release_global_lock(&mac->sme);
Jeff Johnson36583f02019-02-26 08:02:11 -08001498 return QDF_STATUS_E_NOMEM;
Harprit Chhabadacb9f73c2019-04-04 14:24:43 -07001499 }
1500
Jeff Johnson36583f02019-02-26 08:02:11 -08001501 *body = *req;
1502
1503 if (!body->enable)
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001504 goto send_plm_start;
1505 /* validating channel numbers */
Jeff Johnson36583f02019-02-26 08:02:11 -08001506 for (count = 0; count < body->plm_num_ch; count++) {
1507 uint8_t ch = body->plm_ch_list[count];
1508
1509 ret = csr_is_supported_channel(mac, ch);
1510 if (!ret) {
1511 /* Not supported, ignore the channel */
1512 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
1513 FL("Unsupported channel %d ignored for PLM"),
1514 ch);
1515 continue;
1516 }
1517
1518 if (ch > 14) {
1519 enum channel_state state =
1520 wlan_reg_get_channel_state(mac->pdev, ch);
1521
1522 if (state == CHANNEL_STATE_DFS) {
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001523 /* DFS channel is provided, no PLM bursts can be
1524 * transmitted. Ignoring these channels.
1525 */
1526 QDF_TRACE(QDF_MODULE_ID_SME,
Abhishek Singhe4a1f882017-08-10 17:59:44 +05301527 QDF_TRACE_LEVEL_DEBUG,
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001528 FL("DFS channel %d ignored for PLM"),
Jeff Johnson36583f02019-02-26 08:02:11 -08001529 ch);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001530 continue;
1531 }
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001532 }
Jeff Johnson36583f02019-02-26 08:02:11 -08001533 ch_list[valid_count++] = ch;
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001534 } /* End of for () */
1535
1536 /* Copying back the valid channel list to plm struct */
Jeff Johnson36583f02019-02-26 08:02:11 -08001537 qdf_mem_zero(body->plm_ch_list, body->plm_num_ch);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001538 if (valid_count)
Jeff Johnson36583f02019-02-26 08:02:11 -08001539 qdf_mem_copy(body->plm_ch_list, ch_list, valid_count);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001540 /* All are invalid channels, FW need to send the PLM
1541 * report with "incapable" bit set.
1542 */
Jeff Johnson36583f02019-02-26 08:02:11 -08001543 body->plm_num_ch = valid_count;
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001544
1545send_plm_start:
1546 /* PLM START */
1547 msg.type = WMA_SET_PLM_REQ;
1548 msg.reserved = 0;
Jeff Johnson36583f02019-02-26 08:02:11 -08001549 msg.bodyptr = body;
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001550
gaurank kathpalia36b0c582018-08-28 17:45:43 +05301551 if (!QDF_IS_STATUS_SUCCESS(scheduler_post_message(QDF_MODULE_ID_SME,
1552 QDF_MODULE_ID_WMA,
1553 QDF_MODULE_ID_WMA,
1554 &msg))) {
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001555 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
1556 FL("Not able to post WMA_SET_PLM_REQ to WMA"));
Jeff Johnson01f2c232018-11-21 19:17:44 -08001557 sme_release_global_lock(&mac->sme);
Jeff Johnson36583f02019-02-26 08:02:11 -08001558 qdf_mem_free(body);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001559 return QDF_STATUS_E_FAILURE;
1560 }
1561
Jeff Johnson01f2c232018-11-21 19:17:44 -08001562 sme_release_global_lock(&mac->sme);
Jeff Johnson36583f02019-02-26 08:02:11 -08001563 return QDF_STATUS_SUCCESS;
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001564}
1565
1566/**
1567 * sme_tsm_ie_ind() - sme tsm ie indication
Jeff Johnson24e65b52018-06-10 08:45:26 -07001568 * @mac: Global mac context
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001569 * @pSmeTsmIeInd: Pointer to tsm ie indication
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001570 *
1571 * Handle the tsm ie indication from LIM and forward it to HDD.
1572 *
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001573 * Return: QDF_STATUS enumeration
1574 */
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001575static QDF_STATUS sme_tsm_ie_ind(struct mac_context *mac,
Jeff Johnsone21b0eb2019-02-02 19:31:54 -08001576 struct tsm_ie_ind *pSmeTsmIeInd)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001577{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301578 QDF_STATUS status = QDF_STATUS_SUCCESS;
Min Liu3621ede2018-11-07 18:36:00 +08001579 struct csr_roam_info *roam_info;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001580 uint32_t SessionId = pSmeTsmIeInd->sessionId;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301581
Min Liu3621ede2018-11-07 18:36:00 +08001582 roam_info = qdf_mem_malloc(sizeof(*roam_info));
1583 if (!roam_info)
1584 return QDF_STATUS_E_NOMEM;
1585
1586 roam_info->tsm_ie.tsid = pSmeTsmIeInd->tsm_ie.tsid;
1587 roam_info->tsm_ie.state = pSmeTsmIeInd->tsm_ie.state;
1588 roam_info->tsm_ie.msmt_interval = pSmeTsmIeInd->tsm_ie.msmt_interval;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001589 /* forward the tsm ie information to HDD */
Min Liu3621ede2018-11-07 18:36:00 +08001590 csr_roam_call_callback(mac, SessionId, roam_info, 0,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301591 eCSR_ROAM_TSM_IE_IND, 0);
Min Liu3621ede2018-11-07 18:36:00 +08001592 qdf_mem_free(roam_info);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001593 return status;
1594}
1595
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001596/**
1597 * sme_set_cckm_ie() - set cckm ie
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08001598 * @mac_handle: Opaque handle to the global MAC context
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001599 * @sessionId: session id
1600 * @pCckmIe: Pointer to CCKM Ie
1601 * @cckmIeLen: Length of @pCckmIe
1602 *
1603 * Function to store the CCKM IE passed from supplicant and use
1604 * it while packing reassociation request.
1605 *
1606 * Return: QDF_STATUS enumeration
1607 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08001608QDF_STATUS sme_set_cckm_ie(mac_handle_t mac_handle, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001609 uint8_t *pCckmIe, uint8_t cckmIeLen)
1610{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001611 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301612 QDF_STATUS status = QDF_STATUS_SUCCESS;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301613
Jeff Johnson01f2c232018-11-21 19:17:44 -08001614 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301615 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08001616 csr_set_cckm_ie(mac, sessionId, pCckmIe, cckmIeLen);
1617 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001618 }
1619 return status;
1620}
1621
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001622/**
1623 * sme_set_ese_beacon_request() - set ese beacon request
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08001624 * @mac_handle: Opaque handle to the global MAC context
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001625 * @sessionId: session id
Jeff Johnsonb2c3d042019-02-26 12:23:26 -08001626 * @in_req: Ese beacon report request
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001627 *
1628 * function to set ESE beacon request parameters
1629 *
1630 * Return: QDF_STATUS enumeration
1631 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08001632QDF_STATUS sme_set_ese_beacon_request(mac_handle_t mac_handle,
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08001633 const uint8_t sessionId,
Jeff Johnsonb2c3d042019-02-26 12:23:26 -08001634 const tCsrEseBeaconReq *in_req)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001635{
Varun Reddy Yeturu7b2a6572017-06-15 11:07:28 -07001636 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001637 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001638 tpSirBeaconReportReqInd pSmeBcnReportReq = NULL;
Jeff Johnsonb2c3d042019-02-26 12:23:26 -08001639 const tCsrEseBeaconReqParams *pBeaconReq = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001640 uint8_t counter = 0;
Jeff Johnson01f2c232018-11-21 19:17:44 -08001641 struct csr_roam_session *pSession = CSR_GET_SESSION(mac, sessionId);
1642 tpRrmSMEContext pSmeRrmContext = &mac->rrm.rrmSmeContext;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001643
1644 if (pSmeRrmContext->eseBcnReqInProgress == true) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001645 sme_err("A Beacon Report Req is already in progress");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301646 return QDF_STATUS_E_RESOURCES;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001647 }
1648
1649 /* Store the info in RRM context */
Jeff Johnsonb2c3d042019-02-26 12:23:26 -08001650 qdf_mem_copy(&pSmeRrmContext->eseBcnReqInfo, in_req,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001651 sizeof(tCsrEseBeaconReq));
1652
1653 /* Prepare the request to send to SME. */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301654 pSmeBcnReportReq = qdf_mem_malloc(sizeof(tSirBeaconReportReqInd));
Arif Hussain0ef77082018-10-10 16:42:53 -07001655 if (!pSmeBcnReportReq)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301656 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001657
1658 pSmeRrmContext->eseBcnReqInProgress = true;
1659
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001660 sme_debug("Sending Beacon Report Req to SME");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001661
1662 pSmeBcnReportReq->messageType = eWNI_SME_BEACON_REPORT_REQ_IND;
1663 pSmeBcnReportReq->length = sizeof(tSirBeaconReportReqInd);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301664 qdf_mem_copy(pSmeBcnReportReq->bssId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001665 pSession->connectedProfile.bssid.bytes,
1666 sizeof(tSirMacAddr));
1667 pSmeBcnReportReq->channelInfo.channelNum = 255;
Jeff Johnsonb2c3d042019-02-26 12:23:26 -08001668 pSmeBcnReportReq->channelList.numChannels = in_req->numBcnReqIe;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001669 pSmeBcnReportReq->msgSource = eRRM_MSG_SOURCE_ESE_UPLOAD;
1670
Jeff Johnsonb2c3d042019-02-26 12:23:26 -08001671 for (counter = 0; counter < in_req->numBcnReqIe; counter++) {
1672 pBeaconReq = &in_req->bcnReq[counter];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001673 pSmeBcnReportReq->fMeasurementtype[counter] =
1674 pBeaconReq->scanMode;
1675 pSmeBcnReportReq->measurementDuration[counter] =
1676 SYS_TU_TO_MS(pBeaconReq->measurementDuration);
1677 pSmeBcnReportReq->channelList.channelNumber[counter] =
1678 pBeaconReq->channel;
1679 }
1680
Jeff Johnson01f2c232018-11-21 19:17:44 -08001681 status = sme_rrm_process_beacon_report_req_ind(mac, pSmeBcnReportReq);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001682
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301683 if (status != QDF_STATUS_SUCCESS)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001684 pSmeRrmContext->eseBcnReqInProgress = false;
1685
Hanumanth Reddy Pothula7f7a2712016-09-07 18:44:47 +05301686 qdf_mem_free(pSmeBcnReportReq);
1687
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001688 return status;
1689}
1690
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001691/**
1692 * sme_get_tsm_stats() - SME get tsm stats
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08001693 * @mac_handle: Opaque handle to the global MAC context
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001694 * @callback: SME sends back the requested stats using the callback
1695 * @staId: The station ID for which the stats is requested for
1696 * @bssId: bssid
1697 * @pContext: user context to be passed back along with the callback
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001698 * @tid: Traffic id
1699 *
1700 * API register a callback to get TSM Stats.
1701 *
1702 * Return: QDF_STATUS enumeration
1703 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08001704QDF_STATUS sme_get_tsm_stats(mac_handle_t mac_handle,
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001705 tCsrTsmStatsCallback callback,
1706 uint8_t staId, struct qdf_mac_addr bssId,
Jeff Johnson30f84552017-09-13 14:55:25 -07001707 void *pContext, uint8_t tid)
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001708{
1709 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001710 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001711
Jeff Johnson01f2c232018-11-21 19:17:44 -08001712 status = sme_acquire_global_lock(&mac->sme);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001713 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08001714 status = csr_get_tsm_stats(mac, callback,
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001715 staId, bssId, pContext,
Jeff Johnson30f84552017-09-13 14:55:25 -07001716 tid);
Jeff Johnson01f2c232018-11-21 19:17:44 -08001717 sme_release_global_lock(&mac->sme);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001718 }
1719 return status;
1720}
1721
1722/**
1723 * sme_set_ese_roam_scan_channel_list() - To set ese roam scan channel list
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08001724 * @mac_handle: Opaque handle to the global MAC context
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001725 * @sessionId: sme session id
1726 * @pChannelList: Output channel list
1727 * @numChannels: Output number of channels
1728 *
1729 * This routine is called to set ese roam scan channel list.
1730 * This is a synchronous call
1731 *
1732 * Return: QDF_STATUS
1733 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08001734QDF_STATUS sme_set_ese_roam_scan_channel_list(mac_handle_t mac_handle,
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001735 uint8_t sessionId,
1736 uint8_t *pChannelList,
1737 uint8_t numChannels)
1738{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001739 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001740 QDF_STATUS status = QDF_STATUS_SUCCESS;
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08001741 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
1742 tpCsrChannelInfo curchnl_list_info = NULL;
Wu Gao0821b0d2019-01-11 17:31:11 +08001743 uint8_t oldChannelList[CFG_VALID_CHANNEL_LIST_LEN * 2] = { 0 };
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001744 uint8_t newChannelList[128] = { 0 };
1745 uint8_t i = 0, j = 0;
Harprit Chhabada5dff30e2019-03-12 17:56:45 -07001746 enum band_info band = -1;
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001747
Dustin Brownad06be62019-02-04 14:52:56 -08001748 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08001749 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
1750 FL("Invalid sme session id: %d"), sessionId);
1751 return QDF_STATUS_E_INVAL;
1752 }
1753
Jeff Johnson01f2c232018-11-21 19:17:44 -08001754 pNeighborRoamInfo = &mac->roam.neighborRoamInfo[sessionId];
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08001755 curchnl_list_info =
1756 &pNeighborRoamInfo->roamChannelInfo.currentChannelListInfo;
1757
Jeff Johnson01f2c232018-11-21 19:17:44 -08001758 status = sme_acquire_global_lock(&mac->sme);
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +05301759 if (!QDF_IS_STATUS_SUCCESS(status))
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001760 return status;
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +05301761
Jeff Johnson038efe72019-03-18 13:39:31 -07001762 if (curchnl_list_info->ChannelList) {
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001763 for (i = 0; i < curchnl_list_info->numOfChannels; i++) {
1764 j += snprintf(oldChannelList + j,
1765 sizeof(oldChannelList) - j, "%d",
1766 curchnl_list_info->ChannelList[i]);
1767 }
1768 }
Harprit Chhabada5dff30e2019-03-12 17:56:45 -07001769 ucfg_reg_get_band(mac->pdev, &band);
Jeff Johnson01f2c232018-11-21 19:17:44 -08001770 status = csr_create_roam_scan_channel_list(mac, sessionId,
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001771 pChannelList, numChannels,
Harprit Chhabada5dff30e2019-03-12 17:56:45 -07001772 band);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001773 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson038efe72019-03-18 13:39:31 -07001774 if (curchnl_list_info->ChannelList) {
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001775 j = 0;
1776 for (i = 0; i < curchnl_list_info->numOfChannels; i++) {
1777 j += snprintf(newChannelList + j,
1778 sizeof(newChannelList) - j, "%d",
1779 curchnl_list_info->ChannelList[i]);
1780 }
1781 }
1782 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
1783 "ESE roam scan chnl list successfully set to %s-old value is %s-roam state is %d",
1784 newChannelList, oldChannelList,
1785 pNeighborRoamInfo->neighborRoamState);
1786 }
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05301787
Wu Gao51a63562018-11-08 16:29:10 +08001788 if (mac->mlme_cfg->lfr.roam_scan_offload_enabled)
Jeff Johnson01f2c232018-11-21 19:17:44 -08001789 csr_roam_offload_scan(mac, sessionId,
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001790 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
1791 REASON_CHANNEL_LIST_CHANGED);
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05301792
Jeff Johnson01f2c232018-11-21 19:17:44 -08001793 sme_release_global_lock(&mac->sme);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001794 return status;
1795}
1796
1797#endif /* FEATURE_WLAN_ESE */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001798
Jeff Johnson49c02f92016-10-07 10:29:09 -07001799static
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001800QDF_STATUS sme_ibss_peer_info_response_handler(struct mac_context *mac,
Jeff Johnson49c02f92016-10-07 10:29:09 -07001801 tpSirIbssGetPeerInfoRspParams
1802 pIbssPeerInfoParams)
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08001803{
Jeff Johnson56ba88a2019-02-17 17:18:43 -08001804 struct ibss_peer_info_cb_info *cb_info;
1805
1806 if (!mac) {
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08001807 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_FATAL,
Jeff Johnson01f2c232018-11-21 19:17:44 -08001808 "%s: mac is null", __func__);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08001809 return QDF_STATUS_E_FAILURE;
1810 }
Jeff Johnsone7aa5cd2019-02-17 19:36:01 -08001811 cb_info = &mac->sme.peer_info_cb_info;
Jeff Johnson56ba88a2019-02-17 17:18:43 -08001812 if (!cb_info->peer_info_cb) {
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08001813 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
1814 "%s: HDD callback is null", __func__);
1815 return QDF_STATUS_E_FAILURE;
1816 }
Jeff Johnson56ba88a2019-02-17 17:18:43 -08001817 cb_info->peer_info_cb(cb_info->peer_info_cb_context,
1818 &pIbssPeerInfoParams->ibssPeerInfoRspParams);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08001819 return QDF_STATUS_SUCCESS;
1820}
1821
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001822/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001823 * sme_process_dual_mac_config_resp() - Process set Dual mac config response
1824 * @mac: Global MAC pointer
1825 * @msg: Dual mac config response
1826 *
1827 * Processes the dual mac configuration response and invokes the HDD callback
1828 * to process further
1829 */
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001830static QDF_STATUS sme_process_dual_mac_config_resp(struct mac_context *mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001831 uint8_t *msg)
1832{
1833 tListElem *entry = NULL;
1834 tSmeCmd *command = NULL;
1835 bool found;
1836 dual_mac_cb callback = NULL;
1837 struct sir_dual_mac_config_resp *param;
1838
1839 param = (struct sir_dual_mac_config_resp *)msg;
1840 if (!param) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001841 sme_err("Dual mac config resp param is NULL");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001842 /* Not returning. Need to check if active command list
1843 * needs to be freed
1844 */
1845 }
1846
Krunal Sonia8270f52017-02-23 19:51:25 -08001847 entry = csr_nonscan_active_ll_peek_head(mac, LL_ACCESS_LOCK);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001848 if (!entry) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001849 sme_err("No cmd found in active list");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301850 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001851 }
1852
1853 command = GET_BASE_ADDR(entry, tSmeCmd, Link);
1854 if (!command) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001855 sme_err("Base address is NULL");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301856 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001857 }
1858
1859 if (e_sme_command_set_dual_mac_config != command->command) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001860 sme_err("Command mismatch!");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301861 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001862 }
1863
1864 callback = command->u.set_dual_mac_cmd.set_dual_mac_cb;
1865 if (callback) {
1866 if (!param) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001867 sme_err("Callback failed-Dual mac config is NULL");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001868 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001869 sme_debug("Calling HDD callback for Dual mac config");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001870 callback(param->status,
1871 command->u.set_dual_mac_cmd.scan_config,
1872 command->u.set_dual_mac_cmd.fw_mode_config);
1873 }
1874 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001875 sme_err("Callback does not exist");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001876 }
1877
Krunal Soni72dba662017-02-15 20:13:17 -08001878 found = csr_nonscan_active_ll_remove_entry(mac, entry, LL_ACCESS_LOCK);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001879 if (found)
1880 /* Now put this command back on the available command list */
Krunal Soni78618d92017-02-14 21:46:31 -08001881 csr_release_command(mac, command);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001882
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301883 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001884}
1885
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001886/**
1887 * sme_process_antenna_mode_resp() - Process set antenna mode
1888 * response
1889 * @mac: Global MAC pointer
1890 * @msg: antenna mode response
1891 *
1892 * Processes the antenna mode response and invokes the HDD
1893 * callback to process further
1894 */
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001895static QDF_STATUS sme_process_antenna_mode_resp(struct mac_context *mac,
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001896 uint8_t *msg)
1897{
1898 tListElem *entry;
1899 tSmeCmd *command;
1900 bool found;
Dundi Raviteja6bb9e322018-05-16 17:04:41 +05301901 void *context = NULL;
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001902 antenna_mode_cb callback;
1903 struct sir_antenna_mode_resp *param;
1904
1905 param = (struct sir_antenna_mode_resp *)msg;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301906 if (!param)
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001907 sme_err("set antenna mode resp is NULL");
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001908 /* Not returning. Need to check if active command list
1909 * needs to be freed
1910 */
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001911
Krunal Sonia8270f52017-02-23 19:51:25 -08001912 entry = csr_nonscan_active_ll_peek_head(mac, LL_ACCESS_LOCK);
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001913 if (!entry) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001914 sme_err("No cmd found in active list");
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001915 return QDF_STATUS_E_FAILURE;
1916 }
1917
1918 command = GET_BASE_ADDR(entry, tSmeCmd, Link);
1919 if (!command) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001920 sme_err("Base address is NULL");
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001921 return QDF_STATUS_E_FAILURE;
1922 }
1923
1924 if (e_sme_command_set_antenna_mode != command->command) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001925 sme_err("Command mismatch!");
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001926 return QDF_STATUS_E_FAILURE;
1927 }
1928
Dundi Raviteja6bb9e322018-05-16 17:04:41 +05301929 context = command->u.set_antenna_mode_cmd.set_antenna_mode_ctx;
1930 callback = command->u.set_antenna_mode_cmd.set_antenna_mode_resp;
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001931 if (callback) {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301932 if (!param)
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001933 sme_err("Set antenna mode call back is NULL");
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301934 else
Dundi Raviteja6bb9e322018-05-16 17:04:41 +05301935 callback(param->status, context);
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001936 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001937 sme_err("Callback does not exist");
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001938 }
1939
Krunal Soni72dba662017-02-15 20:13:17 -08001940 found = csr_nonscan_active_ll_remove_entry(mac, entry, LL_ACCESS_LOCK);
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001941 if (found)
1942 /* Now put this command back on the available command list */
Krunal Soni78618d92017-02-14 21:46:31 -08001943 csr_release_command(mac, command);
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001944
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001945 return QDF_STATUS_SUCCESS;
1946}
1947
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001948QDF_STATUS sme_process_msg(struct mac_context *mac, struct scheduler_msg *pMsg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001949{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301950 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Ashish Kumar Dhanotiya443d31f2017-10-13 12:41:19 +05301951 struct sir_peer_info *peer_stats;
1952 struct sir_peer_info_resp *peer_info_rsp;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001953
Jeff Johnson038efe72019-03-18 13:39:31 -07001954 if (!pMsg) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001955 sme_err("Empty message for SME");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001956 return status;
1957 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08001958 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301959 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001960 if (pMsg->bodyptr)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301961 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001962 return status;
1963 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08001964 if (!SME_IS_START(mac)) {
Rajeev Kumar3887f9b2018-01-10 11:24:01 -08001965 sme_debug("message type %d in stop state ignored", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001966 if (pMsg->bodyptr)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301967 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001968 goto release_lock;
1969 }
1970 switch (pMsg->type) {
1971#ifdef WLAN_FEATURE_ROAM_OFFLOAD
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001972 case eWNI_SME_HO_FAIL_IND:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301973 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001974 FL("LFR3: Rcvd eWNI_SME_HO_FAIL_IND"));
Jeff Johnson01f2c232018-11-21 19:17:44 -08001975 csr_process_ho_fail_ind(mac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301976 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001977 break;
1978#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001979 case eWNI_SME_ADDTS_RSP:
1980 case eWNI_SME_DELTS_RSP:
1981 case eWNI_SME_DELTS_IND:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001982 case eWNI_SME_FT_AGGR_QOS_RSP:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001983 /* QoS */
1984 if (pMsg->bodyptr) {
1985#ifndef WLAN_MDM_CODE_REDUCTION_OPT
Jeff Johnson01f2c232018-11-21 19:17:44 -08001986 status = sme_qos_msg_processor(mac, pMsg->type,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001987 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301988 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001989#endif
1990 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001991 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001992 }
1993 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001994 case eWNI_SME_NEIGHBOR_REPORT_IND:
1995 case eWNI_SME_BEACON_REPORT_REQ_IND:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001996 if (pMsg->bodyptr) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08001997 status = sme_rrm_msg_processor(mac, pMsg->type,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001998 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301999 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002000 } else {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302001 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002002 }
2003 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002004 case eWNI_SME_ADD_STA_SELF_RSP:
2005 if (pMsg->bodyptr) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002006 status = csr_process_add_sta_session_rsp(mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002007 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302008 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002009 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002010 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002011 }
2012 break;
2013 case eWNI_SME_DEL_STA_SELF_RSP:
2014 if (pMsg->bodyptr) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002015 status = csr_process_del_sta_session_rsp(mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002016 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302017 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002018 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002019 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002020 }
2021 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002022 case eWNI_SME_GENERIC_CHANGE_COUNTRY_CODE:
2023 if (pMsg->bodyptr) {
2024 status = sme_handle_generic_change_country_code(
Jeff Johnson01f2c232018-11-21 19:17:44 -08002025 (void *)mac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302026 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002027 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002028 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002029 }
2030 break;
Sandeep Puligilla8d6011b2017-11-08 00:06:18 -08002031
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002032#ifdef WLAN_FEATURE_11W
2033 case eWNI_SME_UNPROT_MGMT_FRM_IND:
2034 if (pMsg->bodyptr) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002035 sme_unprotected_mgmt_frm_ind(mac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302036 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002037 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002038 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002039 }
2040 break;
2041#endif
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08002042#ifdef FEATURE_WLAN_ESE
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002043 case eWNI_SME_TSM_IE_IND:
2044 if (pMsg->bodyptr) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002045 sme_tsm_ie_ind(mac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302046 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002047 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002048 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002049 }
2050 break;
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08002051#endif /* FEATURE_WLAN_ESE */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002052 case eWNI_SME_ROAM_SCAN_OFFLOAD_RSP:
Jeff Johnson01f2c232018-11-21 19:17:44 -08002053 status = csr_roam_offload_scan_rsp_hdlr((void *)mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002054 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302055 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002056 break;
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08002057 case eWNI_SME_IBSS_PEER_INFO_RSP:
2058 if (pMsg->bodyptr) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002059 sme_ibss_peer_info_response_handler(mac,
Jeff Johnson49c02f92016-10-07 10:29:09 -07002060 pMsg->bodyptr);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08002061 qdf_mem_free(pMsg->bodyptr);
2062 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002063 sme_err("Empty message for: %d", pMsg->type);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08002064 }
2065 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002066#ifdef WLAN_FEATURE_EXTWOW_SUPPORT
2067 case eWNI_SME_READY_TO_EXTWOW_IND:
2068 if (pMsg->bodyptr) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002069 sme_process_ready_to_ext_wow(mac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302070 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002071 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002072 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002073 }
2074 break;
2075#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002076#ifdef FEATURE_WLAN_AUTO_SHUTDOWN
2077 case eWNI_SME_AUTO_SHUTDOWN_IND:
Jeff Johnsoneb7bbed2019-02-17 10:34:24 -08002078 if (mac->sme.auto_shutdown_cb) {
Abhishek Singhe4a1f882017-08-10 17:59:44 +05302079 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002080 FL("Auto shutdown notification"));
Jeff Johnsoneb7bbed2019-02-17 10:34:24 -08002081 mac->sme.auto_shutdown_cb();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002082 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002083 break;
2084#endif
2085 case eWNI_SME_DFS_RADAR_FOUND:
Arif Hussaincd151632017-02-11 16:57:19 -08002086 case eWNI_SME_DFS_CAC_COMPLETE:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002087 case eWNI_SME_DFS_CSAIE_TX_COMPLETE_IND:
Abhishek Singh20a8e442018-09-12 15:50:44 +05302088 case eWNI_SME_CSA_RESTART_RSP:
Jeff Johnson01f2c232018-11-21 19:17:44 -08002089 status = dfs_msg_processor(mac, pMsg);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302090 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002091 break;
2092 case eWNI_SME_CHANNEL_CHANGE_RSP:
2093 if (pMsg->bodyptr) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002094 status = sme_process_channel_change_resp(mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002095 pMsg->type,
2096 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302097 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002098 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002099 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002100 }
2101 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002102 case eWNI_SME_STATS_EXT_EVENT:
Jeff Johnson01f2c232018-11-21 19:17:44 -08002103 status = sme_stats_ext_event(mac, pMsg->bodyptr);
Jeff Johnsonfdecd512018-06-10 09:18:32 -07002104 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002105 break;
Will Huang558f8082017-05-31 16:22:24 +08002106 case eWNI_SME_GET_PEER_INFO_IND:
Jeff Johnson01f2c232018-11-21 19:17:44 -08002107 if (mac->sme.pget_peer_info_ind_cb)
2108 mac->sme.pget_peer_info_ind_cb(pMsg->bodyptr,
2109 mac->sme.pget_peer_info_cb_context);
Ashish Kumar Dhanotiya443d31f2017-10-13 12:41:19 +05302110 if (pMsg->bodyptr) {
2111 peer_info_rsp = (struct sir_peer_info_resp *)
2112 (pMsg->bodyptr);
2113 peer_stats = (struct sir_peer_info *)
2114 (peer_info_rsp->info);
2115 if (peer_stats) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002116 mac->peer_rssi = peer_stats[0].rssi;
2117 mac->peer_txrate = peer_stats[0].tx_rate;
2118 mac->peer_rxrate = peer_stats[0].rx_rate;
Ashish Kumar Dhanotiya443d31f2017-10-13 12:41:19 +05302119 }
2120 }
Will Huang558f8082017-05-31 16:22:24 +08002121 qdf_mem_free(pMsg->bodyptr);
2122 break;
2123 case eWNI_SME_GET_PEER_INFO_EXT_IND:
Jeff Johnson01f2c232018-11-21 19:17:44 -08002124 if (mac->sme.pget_peer_info_ext_ind_cb)
2125 mac->sme.pget_peer_info_ext_ind_cb(pMsg->bodyptr,
2126 mac->sme.pget_peer_info_ext_cb_context);
Will Huang558f8082017-05-31 16:22:24 +08002127 qdf_mem_free(pMsg->bodyptr);
2128 break;
Qun Zhangef655622019-02-25 10:48:10 +08002129 case eWNI_SME_FW_STATUS_IND:
2130 status = sme_fw_state_resp(mac);
2131 break;
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07002132 case eWNI_SME_TSF_EVENT:
Jeff Johnson01f2c232018-11-21 19:17:44 -08002133 if (mac->sme.get_tsf_cb) {
2134 mac->sme.get_tsf_cb(mac->sme.get_tsf_cxt,
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07002135 (struct stsf *)pMsg->bodyptr);
2136 }
2137 if (pMsg->bodyptr)
2138 qdf_mem_free(pMsg->bodyptr);
2139 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002140 case eWNI_SME_LINK_STATUS_IND:
2141 {
2142 tAniGetLinkStatus *pLinkStatus =
2143 (tAniGetLinkStatus *) pMsg->bodyptr;
2144 if (pLinkStatus) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002145 if (mac->sme.link_status_callback)
2146 mac->sme.link_status_callback(
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002147 pLinkStatus->linkStatus,
Jeff Johnson01f2c232018-11-21 19:17:44 -08002148 mac->sme.link_status_context);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302149
Jeff Johnson01f2c232018-11-21 19:17:44 -08002150 mac->sme.link_status_callback = NULL;
2151 mac->sme.link_status_context = NULL;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302152 qdf_mem_free(pLinkStatus);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002153 }
2154 break;
2155 }
2156 case eWNI_SME_MSG_GET_TEMPERATURE_IND:
Jeff Johnson3f3ad252019-02-17 20:44:11 -08002157 if (mac->sme.temperature_cb)
2158 mac->sme.temperature_cb(pMsg->bodyval,
2159 mac->sme.temperature_cb_context);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002160 break;
2161 case eWNI_SME_SNR_IND:
2162 {
2163 tAniGetSnrReq *pSnrReq = (tAniGetSnrReq *) pMsg->bodyptr;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302164
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002165 if (pSnrReq) {
2166 if (pSnrReq->snrCallback) {
2167 ((tCsrSnrCallback)
2168 (pSnrReq->snrCallback))
2169 (pSnrReq->snr, pSnrReq->staId,
2170 pSnrReq->pDevContext);
2171 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302172 qdf_mem_free(pSnrReq);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002173 }
2174 break;
2175 }
2176#ifdef FEATURE_WLAN_EXTSCAN
2177 case eWNI_SME_EXTSCAN_FULL_SCAN_RESULT_IND:
Jeff Johnson01f2c232018-11-21 19:17:44 -08002178 if (mac->sme.ext_scan_ind_cb)
2179 mac->sme.ext_scan_ind_cb(mac->hdd_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002180 eSIR_EXTSCAN_FULL_SCAN_RESULT_IND,
2181 pMsg->bodyptr);
2182 else
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002183 sme_err("callback not registered to process: %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002184 pMsg->type);
2185
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302186 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002187 break;
2188 case eWNI_SME_EPNO_NETWORK_FOUND_IND:
Jeff Johnson01f2c232018-11-21 19:17:44 -08002189 if (mac->sme.ext_scan_ind_cb)
2190 mac->sme.ext_scan_ind_cb(mac->hdd_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002191 eSIR_EPNO_NETWORK_FOUND_IND,
2192 pMsg->bodyptr);
2193 else
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002194 sme_err("callback not registered to process: %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002195 pMsg->type);
2196
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302197 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002198 break;
2199#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002200 case eWNI_SME_SET_HW_MODE_RESP:
2201 if (pMsg->bodyptr) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002202 status = sme_process_set_hw_mode_resp(mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002203 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302204 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002205 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002206 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002207 }
2208 break;
2209 case eWNI_SME_HW_MODE_TRANS_IND:
2210 if (pMsg->bodyptr) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002211 status = sme_process_hw_mode_trans_ind(mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002212 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302213 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002214 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002215 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002216 }
2217 break;
2218 case eWNI_SME_NSS_UPDATE_RSP:
2219 if (pMsg->bodyptr) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002220 status = sme_process_nss_update_resp(mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002221 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302222 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002223 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002224 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002225 }
2226 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002227 case eWNI_SME_SET_DUAL_MAC_CFG_RESP:
2228 if (pMsg->bodyptr) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002229 status = sme_process_dual_mac_config_resp(mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002230 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302231 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002232 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002233 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002234 }
gaurank kathpaliaebe3fc82018-05-07 09:39:46 +05302235 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002236 case eWNI_SME_SET_THERMAL_LEVEL_IND:
Jeff Johnson01f2c232018-11-21 19:17:44 -08002237 if (mac->sme.set_thermal_level_cb)
2238 mac->sme.set_thermal_level_cb(mac->hdd_handle,
Jeff Johnson6aaaa992018-06-30 10:43:04 -07002239 pMsg->bodyval);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002240 break;
Abhishek Singh518323d2015-10-19 17:42:01 +05302241 case eWNI_SME_EXT_CHANGE_CHANNEL_IND:
Jeff Johnson01f2c232018-11-21 19:17:44 -08002242 status = sme_extended_change_channel_ind(mac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302243 qdf_mem_free(pMsg->bodyptr);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302244 break;
Archana Ramachandrana20ef812015-11-13 16:12:13 -08002245 case eWNI_SME_SET_ANTENNA_MODE_RESP:
2246 if (pMsg->bodyptr) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002247 status = sme_process_antenna_mode_resp(mac,
Archana Ramachandrana20ef812015-11-13 16:12:13 -08002248 pMsg->bodyptr);
2249 qdf_mem_free(pMsg->bodyptr);
2250 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002251 sme_err("Empty message for: %d", pMsg->type);
Archana Ramachandrana20ef812015-11-13 16:12:13 -08002252 }
2253 break;
Sreelakshmi Konamki58c72432016-11-09 17:06:44 +05302254 case eWNI_SME_LOST_LINK_INFO_IND:
Jeff Johnson01f2c232018-11-21 19:17:44 -08002255 if (mac->sme.lost_link_info_cb)
2256 mac->sme.lost_link_info_cb(mac->hdd_handle,
Sreelakshmi Konamki58c72432016-11-09 17:06:44 +05302257 (struct sir_lost_link_info *)pMsg->bodyptr);
2258 qdf_mem_free(pMsg->bodyptr);
2259 break;
Sreelakshmi Konamki88a2a412017-04-14 15:11:55 +05302260 case eWNI_SME_RSO_CMD_STATUS_IND:
Jeff Johnson01f2c232018-11-21 19:17:44 -08002261 if (mac->sme.rso_cmd_status_cb)
2262 mac->sme.rso_cmd_status_cb(mac->hdd_handle,
Jeff Johnson6aaaa992018-06-30 10:43:04 -07002263 pMsg->bodyptr);
lifeng66831662017-05-19 16:01:35 +08002264 qdf_mem_free(pMsg->bodyptr);
2265 break;
Zhang Qiana6e9c102016-12-22 16:47:24 +08002266 case eWMI_SME_LL_STATS_IND:
Jeff Johnson01f2c232018-11-21 19:17:44 -08002267 if (mac->sme.link_layer_stats_ext_cb)
2268 mac->sme.link_layer_stats_ext_cb(mac->hdd_handle,
Zhang Qiana6e9c102016-12-22 16:47:24 +08002269 pMsg->bodyptr);
Sreelakshmi Konamki88a2a412017-04-14 15:11:55 +05302270 qdf_mem_free(pMsg->bodyptr);
2271 break;
Vidyullatha Kanchanapallybe0ebb32017-03-23 14:36:21 +05302272 case eWNI_SME_BT_ACTIVITY_INFO_IND:
Jeff Johnson01f2c232018-11-21 19:17:44 -08002273 if (mac->sme.bt_activity_info_cb)
2274 mac->sme.bt_activity_info_cb(mac->hdd_handle,
Vidyullatha Kanchanapallybe0ebb32017-03-23 14:36:21 +05302275 pMsg->bodyval);
2276 break;
Abhinav Kumar338e57d2019-02-04 17:30:10 +05302277 case eWNI_SME_HIDDEN_SSID_RESTART_RSP:
2278 if (mac->sme.hidden_ssid_cb)
2279 mac->sme.hidden_ssid_cb(mac->hdd_handle, pMsg->bodyval);
2280 else
2281 sme_err("callback is NULL");
2282 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002283 default:
2284
2285 if ((pMsg->type >= eWNI_SME_MSG_TYPES_BEGIN)
2286 && (pMsg->type <= eWNI_SME_MSG_TYPES_END)) {
2287 /* CSR */
2288 if (pMsg->bodyptr) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002289 status = csr_msg_processor(mac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302290 qdf_mem_free(pMsg->bodyptr);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302291 } else
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002292 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002293 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002294 sme_warn("Unknown message type: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002295 if (pMsg->bodyptr)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302296 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002297 }
2298 } /* switch */
2299release_lock:
Jeff Johnson01f2c232018-11-21 19:17:44 -08002300 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002301 return status;
2302}
2303
Krunal Sonid32c6bc2016-10-18 18:00:21 -07002304QDF_STATUS sme_mc_process_handler(struct scheduler_msg *msg)
2305{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002306 struct mac_context *mac_ctx = cds_get_context(QDF_MODULE_ID_SME);
Krunal Sonid32c6bc2016-10-18 18:00:21 -07002307
Jeff Johnson038efe72019-03-18 13:39:31 -07002308 if (!mac_ctx) {
Krunal Sonid32c6bc2016-10-18 18:00:21 -07002309 QDF_ASSERT(0);
2310 return QDF_STATUS_E_FAILURE;
2311 }
2312
Jeff Johnson5f9ce2d2018-06-09 21:20:45 -07002313 return sme_process_msg(mac_ctx, msg);
Krunal Sonid32c6bc2016-10-18 18:00:21 -07002314}
Krunal Sonid32c6bc2016-10-18 18:00:21 -07002315
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002316/**
2317 * sme_process_nss_update_resp() - Process nss update response
2318 * @mac: Global MAC pointer
2319 * @msg: nss update response
2320 *
2321 * Processes the nss update response and invokes the HDD
2322 * callback to process further
2323 */
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002324static QDF_STATUS sme_process_nss_update_resp(struct mac_context *mac, uint8_t *msg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002325{
2326 tListElem *entry = NULL;
2327 tSmeCmd *command = NULL;
2328 bool found;
Tushnim Bhattacharyyaeab33dd2017-11-15 15:20:02 -08002329 policy_mgr_nss_update_cback callback = NULL;
Abhishek Singhfc740be2018-10-12 11:34:26 +05302330 struct sir_bcn_update_rsp *param;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002331
Abhishek Singhfc740be2018-10-12 11:34:26 +05302332 param = (struct sir_bcn_update_rsp *)msg;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302333 if (!param)
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002334 sme_err("nss update resp param is NULL");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002335 /* Not returning. Need to check if active command list
2336 * needs to be freed
2337 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002338
Abhishek Singhfc740be2018-10-12 11:34:26 +05302339 if (param && param->reason != REASON_NSS_UPDATE) {
2340 sme_err("reason not NSS update");
2341 return QDF_STATUS_E_INVAL;
2342 }
Krunal Sonia8270f52017-02-23 19:51:25 -08002343 entry = csr_nonscan_active_ll_peek_head(mac, LL_ACCESS_LOCK);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002344 if (!entry) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002345 sme_err("No cmd found in active list");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302346 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002347 }
2348
2349 command = GET_BASE_ADDR(entry, tSmeCmd, Link);
2350 if (!command) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002351 sme_err("Base address is NULL");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302352 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002353 }
2354
2355 if (e_sme_command_nss_update != command->command) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002356 sme_err("Command mismatch!");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302357 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002358 }
2359
2360 callback = command->u.nss_update_cmd.nss_update_cb;
2361 if (callback) {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302362 if (!param)
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002363 sme_err("Callback failed since nss update params is NULL");
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302364 else
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002365 callback(command->u.nss_update_cmd.context,
Abhishek Singhfc740be2018-10-12 11:34:26 +05302366 param->status,
2367 param->vdev_id,
Chandrasekaran, Manishekarce2172e2016-02-18 16:12:43 +05302368 command->u.nss_update_cmd.next_action,
Liangwei Dong1ba99482018-10-19 02:57:29 -04002369 command->u.nss_update_cmd.reason,
2370 command->u.nss_update_cmd.original_vdev_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002371 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002372 sme_err("Callback does not exisit");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002373 }
2374
Krunal Soni72dba662017-02-15 20:13:17 -08002375 found = csr_nonscan_active_ll_remove_entry(mac, entry, LL_ACCESS_LOCK);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002376 if (found) {
2377 /* Now put this command back on the avilable command list */
Krunal Soni78618d92017-02-14 21:46:31 -08002378 csr_release_command(mac, command);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002379 }
Krunal Sonia8270f52017-02-23 19:51:25 -08002380
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302381 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002382}
2383
Jeff Johnson62cd6802018-07-20 12:38:25 -07002384QDF_STATUS sme_stop(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002385{
Jeff Johnson62cd6802018-07-20 12:38:25 -07002386 QDF_STATUS status;
2387 QDF_STATUS ret_status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002388 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002389
Jeff Johnson62cd6802018-07-20 12:38:25 -07002390 status = rrm_stop(mac);
2391 if (QDF_IS_STATUS_ERROR(status)) {
2392 ret_status = status;
Sandeep Puligilla66d09c42017-09-06 17:10:27 -07002393 sme_err("rrm_stop failed with status: %d", status);
2394 }
2395
Jeff Johnson62cd6802018-07-20 12:38:25 -07002396 status = csr_stop(mac);
2397 if (QDF_IS_STATUS_ERROR(status)) {
2398 ret_status = status;
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002399 sme_err("csr_stop failed with status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002400 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002401
Jeff Johnson62cd6802018-07-20 12:38:25 -07002402 mac->sme.state = SME_STATE_STOP;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002403
Jeff Johnson62cd6802018-07-20 12:38:25 -07002404 return ret_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002405}
2406
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302407/*
2408 * sme_close() - Release all SME modules and their resources.
2409 * The function release each module in SME, PMC, CSR, etc. . Upon
2410 * return, all modules are at closed state.
2411 *
2412 * No SME APIs can be involved after smeClose except smeOpen.
2413 * smeClose must be called before mac_close.
2414 * This is a synchronous call
2415 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002416 * mac_handle - The handle returned by mac_open
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302417 * Return QDF_STATUS_SUCCESS - SME is successfully close.
2418 *
2419 * Other status means SME is failed to be closed but caller still cannot
2420 * call any other SME functions except smeOpen.
2421 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002422QDF_STATUS sme_close(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002423{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302424 QDF_STATUS status = QDF_STATUS_E_FAILURE;
2425 QDF_STATUS fail_status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002426 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002427
Jeff Johnson01f2c232018-11-21 19:17:44 -08002428 if (!mac)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302429 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002430
Jeff Johnson01f2c232018-11-21 19:17:44 -08002431 status = csr_close(mac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302432 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002433 sme_err("csr_close failed with status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002434 fail_status = status;
2435 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002436#ifndef WLAN_MDM_CODE_REDUCTION_OPT
Jeff Johnson01f2c232018-11-21 19:17:44 -08002437 status = sme_qos_close(mac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302438 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002439 sme_err("Qos close failed with status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002440 fail_status = status;
2441 }
2442#endif
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002443 status = sme_ps_close(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302444 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002445 sme_err("sme_ps_close failed status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002446 fail_status = status;
2447 }
2448
Jeff Johnson01f2c232018-11-21 19:17:44 -08002449 status = rrm_close(mac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302450 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002451 sme_err("RRM close failed with status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002452 fail_status = status;
2453 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002454
Jeff Johnson01f2c232018-11-21 19:17:44 -08002455 free_sme_cmd_list(mac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002456
Jeff Johnson3e7a4932019-02-17 12:11:36 -08002457 status = qdf_mutex_destroy(&mac->sme.sme_global_lock);
2458 if (!QDF_IS_STATUS_SUCCESS(status))
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302459 fail_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002460
Jeff Johnson01f2c232018-11-21 19:17:44 -08002461 mac->sme.state = SME_STATE_STOP;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002462
Jeff Johnson3e7a4932019-02-17 12:11:36 -08002463 return fail_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002464}
2465
2466/**
Abhishek Singhc9941602016-08-09 16:06:22 +05302467 * sme_remove_bssid_from_scan_list() - wrapper to remove the bssid from
2468 * scan list
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08002469 * @mac_handle: Opaque handle to the global MAC context.
Abhishek Singhc9941602016-08-09 16:06:22 +05302470 * @bssid: bssid to be removed
2471 *
2472 * This function remove the given bssid from scan list.
2473 *
2474 * Return: QDF status.
2475 */
Jeff Johnsonc7309062018-11-09 20:59:42 -08002476QDF_STATUS sme_remove_bssid_from_scan_list(mac_handle_t mac_handle,
2477 tSirMacAddr bssid)
Abhishek Singhc9941602016-08-09 16:06:22 +05302478{
2479 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002480 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Abhishek Singhc9941602016-08-09 16:06:22 +05302481
2482 status = sme_acquire_global_lock(&mac_ctx->sme);
2483 if (QDF_IS_STATUS_SUCCESS(status)) {
2484 csr_remove_bssid_from_scan_list(mac_ctx, bssid);
2485 sme_release_global_lock(&mac_ctx->sme);
2486 }
2487
2488 return status;
2489}
2490
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002491
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302492/*
2493 * sme_scan_get_result
2494 * A wrapper function to request scan results from CSR.
2495 * This is a synchronous call
2496 *
2497 * pFilter - If pFilter is NULL, all cached results are returned
2498 * phResult - an object for the result.
2499 * Return QDF_STATUS
2500 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002501QDF_STATUS sme_scan_get_result(mac_handle_t mac_handle, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002502 tCsrScanResultFilter *pFilter,
2503 tScanResultHandle *phResult)
2504{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302505 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002506 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002507
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302508 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002509 TRACE_CODE_SME_RX_HDD_MSG_SCAN_GET_RESULTS, sessionId,
2510 0));
Jeff Johnson01f2c232018-11-21 19:17:44 -08002511 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302512 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002513 status = csr_scan_get_result(mac, pFilter, phResult);
2514 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002515 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002516
2517 return status;
2518}
2519
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002520QDF_STATUS sme_scan_get_result_for_bssid(mac_handle_t mac_handle,
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +05302521 struct qdf_mac_addr *bssid,
2522 tCsrScanResultInfo *res)
2523{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002524 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +05302525 QDF_STATUS status;
2526
2527 status = sme_acquire_global_lock(&mac_ctx->sme);
2528 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson1b56f6b2018-06-10 18:17:10 -07002529 status = csr_scan_get_result_for_bssid(mac_ctx, bssid, res);
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +05302530 sme_release_global_lock(&mac_ctx->sme);
2531 }
2532
2533 return status;
2534}
2535
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002536/**
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07002537 * sme_get_ap_channel_from_scan() - a wrapper function to get
Srinivas Girigowda828ef232017-10-13 22:31:27 -07002538 * AP's channel id from
2539 * CSR by filtering the
2540 * result which matches
2541 * our roam profile.
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07002542 * @profile: SAP profile
2543 * @ap_chnl_id: pointer to channel id of SAP. Fill the value after finding the
2544 * best ap from scan cache.
2545 *
2546 * This function is written to get AP's channel id from CSR by filtering
2547 * the result which matches our roam profile. This is a synchronous call.
2548 *
2549 * Return: QDF_STATUS.
2550 */
2551QDF_STATUS sme_get_ap_channel_from_scan(void *profile,
2552 tScanResultHandle *scan_cache,
2553 uint8_t *ap_chnl_id)
2554{
Jeff Johnson66ee8a92018-03-17 15:24:26 -07002555 return sme_get_ap_channel_from_scan_cache((struct csr_roam_profile *)
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07002556 profile,
2557 scan_cache,
2558 ap_chnl_id);
2559}
2560
2561/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002562 * sme_get_ap_channel_from_scan_cache() - a wrapper function to get AP's
2563 * channel id from CSR by filtering the
2564 * result which matches our roam profile.
2565 * @profile: SAP adapter
2566 * @ap_chnl_id: pointer to channel id of SAP. Fill the value after finding the
2567 * best ap from scan cache.
2568 *
2569 * This function is written to get AP's channel id from CSR by filtering
2570 * the result which matches our roam profile. This is a synchronous call.
2571 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302572 * Return: QDF_STATUS.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002573 */
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07002574QDF_STATUS sme_get_ap_channel_from_scan_cache(
Jeff Johnson66ee8a92018-03-17 15:24:26 -07002575 struct csr_roam_profile *profile, tScanResultHandle *scan_cache,
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07002576 uint8_t *ap_chnl_id)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002577{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302578 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002579 struct mac_context *mac_ctx = sme_get_mac_context();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002580 tCsrScanResultFilter *scan_filter = NULL;
2581 tScanResultHandle filtered_scan_result = NULL;
2582 tSirBssDescription first_ap_profile;
2583
Jeff Johnson038efe72019-03-18 13:39:31 -07002584 if (!mac_ctx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302585 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002586 FL("mac_ctx is NULL"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302587 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002588 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302589 scan_filter = qdf_mem_malloc(sizeof(tCsrScanResultFilter));
Arif Hussain0ef77082018-10-10 16:42:53 -07002590 if (!scan_filter)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302591 return QDF_STATUS_E_FAILURE;
Arif Hussain0ef77082018-10-10 16:42:53 -07002592
hangtian127c9532019-01-12 13:29:07 +08002593 qdf_mem_zero(&first_ap_profile, sizeof(tSirBssDescription));
Jeff Johnson038efe72019-03-18 13:39:31 -07002594 if (!profile) {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302595 scan_filter->EncryptionType.numEntries = 1;
2596 scan_filter->EncryptionType.encryptionType[0]
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002597 = eCSR_ENCRYPT_TYPE_NONE;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302598 } else {
2599 /* Here is the profile we need to connect to */
2600 status = csr_roam_prepare_filter_from_profile(mac_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002601 profile,
2602 scan_filter);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302603 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002604
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302605 if (QDF_STATUS_SUCCESS == status) {
2606 /* Save the WPS info */
Jeff Johnson038efe72019-03-18 13:39:31 -07002607 if (profile) {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302608 scan_filter->bWPSAssociation =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002609 profile->bWPSAssociation;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302610 scan_filter->bOSENAssociation =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002611 profile->bOSENAssociation;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002612 } else {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302613 scan_filter->bWPSAssociation = 0;
2614 scan_filter->bOSENAssociation = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002615 }
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302616 } else {
2617 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
2618 FL("Preparing the profile filter failed"));
2619 qdf_mem_free(scan_filter);
2620 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002621 }
2622 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302623 if (QDF_STATUS_SUCCESS == status) {
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07002624 status = csr_scan_get_result(mac_ctx, scan_filter,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002625 &filtered_scan_result);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302626 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002627 csr_get_bssdescr_from_scan_handle(filtered_scan_result,
2628 &first_ap_profile);
2629 *scan_cache = filtered_scan_result;
2630 if (0 != first_ap_profile.channelId) {
2631 *ap_chnl_id = first_ap_profile.channelId;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302632 QDF_TRACE(QDF_MODULE_ID_SME,
Abhishek Singh5d8d7332017-08-10 15:15:24 +05302633 QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002634 FL("Found best AP & its on chnl[%d]"),
2635 first_ap_profile.channelId);
2636 } else {
2637 /*
2638 * This means scan result is empty
2639 * so set the channel to zero, caller should
2640 * take of zero channel id case.
2641 */
2642 *ap_chnl_id = 0;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302643 QDF_TRACE(QDF_MODULE_ID_SME,
2644 QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002645 FL("Scan is empty, set chnl to 0"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302646 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002647 }
2648 } else {
Sandeep Puligilla1f1e4002018-08-18 12:15:01 -07002649 sme_err("Failed to get scan get result");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302650 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002651 }
2652 csr_free_scan_filter(mac_ctx, scan_filter);
2653 sme_release_global_lock(&mac_ctx->sme);
2654 } else {
Krunal Sonif9882222016-01-22 17:16:50 -08002655 csr_free_scan_filter(mac_ctx, scan_filter);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302656 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002657 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302658 qdf_mem_free(scan_filter);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002659 return status;
2660}
2661
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302662/*
2663 * sme_scan_flush_result() -
2664 * A wrapper function to request CSR to clear scan results.
2665 * This is a synchronous call
2666 *
2667 * Return QDF_STATUS
2668 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002669QDF_STATUS sme_scan_flush_result(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002670{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302671 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002672 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002673
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302674 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002675 TRACE_CODE_SME_RX_HDD_MSG_SCAN_FLUSH_RESULTS,
2676 0, 0));
Jeff Johnson01f2c232018-11-21 19:17:44 -08002677 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302678 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002679 status = csr_scan_flush_result(mac);
2680 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002681 }
2682
2683 return status;
2684}
2685
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302686/*
2687 * sme_scan_result_get_first() -
2688 * A wrapper function to request CSR to returns the first element of
2689 * scan result.
2690 * This is a synchronous call
2691 *
2692 * hScanResult - returned from csr_scan_get_result
2693 * Return tCsrScanResultInfo * - NULL if no result
2694 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002695tCsrScanResultInfo *sme_scan_result_get_first(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002696 tScanResultHandle hScanResult)
2697{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302698 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002699 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002700 tCsrScanResultInfo *pRet = NULL;
2701
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302702 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002703 TRACE_CODE_SME_RX_HDD_MSG_SCAN_RESULT_GETFIRST,
2704 NO_SESSION, 0));
Jeff Johnson01f2c232018-11-21 19:17:44 -08002705 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302706 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002707 pRet = csr_scan_result_get_first(mac, hScanResult);
2708 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002709 }
2710
2711 return pRet;
2712}
2713
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302714/*
2715 * sme_scan_result_get_next() -
2716 * A wrapper function to request CSR to returns the next element of
2717 * scan result. It can be called without calling csr_scan_result_get_first first
2718 * This is a synchronous call
2719 *
2720 * hScanResult - returned from csr_scan_get_result
2721 * Return Null if no result or reach the end
2722 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002723tCsrScanResultInfo *sme_scan_result_get_next(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002724 tScanResultHandle hScanResult)
2725{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302726 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002727 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002728 tCsrScanResultInfo *pRet = NULL;
2729
Jeff Johnson01f2c232018-11-21 19:17:44 -08002730 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302731 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002732 pRet = csr_scan_result_get_next(mac, hScanResult);
2733 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002734 }
2735
2736 return pRet;
2737}
2738
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302739/*
2740 * sme_scan_result_purge() -
2741 * A wrapper function to request CSR to remove all items(tCsrScanResult)
2742 * in the list and free memory for each item
2743 * This is a synchronous call
2744 *
2745 * hScanResult - returned from csr_scan_get_result. hScanResult is
2746 * considered gone by
2747 * calling this function and even before this function reutrns.
2748 * Return QDF_STATUS
2749 */
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07002750QDF_STATUS sme_scan_result_purge(tScanResultHandle hScanResult)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002751{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302752 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002753 struct mac_context *mac_ctx = sme_get_mac_context();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002754
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302755 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002756 TRACE_CODE_SME_RX_HDD_MSG_SCAN_RESULT_PURGE,
2757 NO_SESSION, 0));
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07002758 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302759 if (QDF_IS_STATUS_SUCCESS(status)) {
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07002760 status = csr_scan_result_purge(mac_ctx, hScanResult);
2761 sme_release_global_lock(&mac_ctx->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002762 }
2763
2764 return status;
2765}
2766
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002767eCsrPhyMode sme_get_phy_mode(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002768{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002769 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302770
Jeff Johnson01f2c232018-11-21 19:17:44 -08002771 return mac->roam.configParam.phyMode;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002772}
2773
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302774/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302775 * sme_roam_connect() -
2776 * A wrapper function to request CSR to inititiate an association
2777 * This is an asynchronous call.
2778 *
2779 * sessionId - the sessionId returned by sme_open_session.
2780 * pProfile - description of the network to which to connect
2781 * hBssListIn - a list of BSS descriptor to roam to. It is returned
2782 * from csr_scan_get_result
2783 * pRoamId - to get back the request ID
2784 * Return QDF_STATUS
2785 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002786QDF_STATUS sme_roam_connect(mac_handle_t mac_handle, uint8_t sessionId,
Jeff Johnson66ee8a92018-03-17 15:24:26 -07002787 struct csr_roam_profile *pProfile,
2788 uint32_t *pRoamId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002789{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302790 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002791 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002792
Jeff Johnson01f2c232018-11-21 19:17:44 -08002793 if (!mac)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302794 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002795
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302796 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002797 TRACE_CODE_SME_RX_HDD_MSG_CONNECT, sessionId, 0));
Jeff Johnson01f2c232018-11-21 19:17:44 -08002798 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302799 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002800 if (CSR_IS_SESSION_VALID(mac, sessionId)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002801 status =
Jeff Johnson01f2c232018-11-21 19:17:44 -08002802 csr_roam_connect(mac, sessionId, pProfile,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002803 pRoamId);
2804 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002805 sme_err("Invalid sessionID: %d", sessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302806 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002807 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08002808 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002809 }
2810
2811 return status;
2812}
2813
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302814/*
2815 * sme_set_phy_mode() -
2816 * Changes the PhyMode.
2817 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002818 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302819 * phyMode new phyMode which is to set
2820 * Return QDF_STATUS SUCCESS.
2821 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002822QDF_STATUS sme_set_phy_mode(mac_handle_t mac_handle, eCsrPhyMode phyMode)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002823{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002824 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002825
Jeff Johnson01f2c232018-11-21 19:17:44 -08002826 mac->roam.configParam.phyMode = phyMode;
2827 mac->roam.configParam.uCfgDot11Mode =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002828 csr_get_cfg_dot11_mode_from_csr_phy_mode(NULL,
Jeff Johnson01f2c232018-11-21 19:17:44 -08002829 mac->roam.configParam.phyMode,
2830 mac->roam.configParam.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302831 ProprietaryRatesEnabled);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002832
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302833 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002834}
2835
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302836/*
2837 * sme_roam_reassoc() -
2838 * A wrapper function to request CSR to inititiate a re-association
2839 *
2840 * pProfile - can be NULL to join the currently connected AP. In that
2841 * case modProfileFields should carry the modified field(s) which could trigger
2842 * reassoc
2843 * modProfileFields - fields which are part of tCsrRoamConnectedProfile
2844 * that might need modification dynamically once STA is up & running and this
2845 * could trigger a reassoc
2846 * pRoamId - to get back the request ID
2847 * Return QDF_STATUS
2848 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002849QDF_STATUS sme_roam_reassoc(mac_handle_t mac_handle, uint8_t sessionId,
Jeff Johnson66ee8a92018-03-17 15:24:26 -07002850 struct csr_roam_profile *pProfile,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002851 tCsrRoamModifyProfileFields modProfileFields,
2852 uint32_t *pRoamId, bool fForce)
2853{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302854 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002855 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002856
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302857 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002858 TRACE_CODE_SME_RX_HDD_ROAM_REASSOC, sessionId, 0));
Jeff Johnson01f2c232018-11-21 19:17:44 -08002859 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302860 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002861 if (CSR_IS_SESSION_VALID(mac, sessionId)) {
Jeff Johnson038efe72019-03-18 13:39:31 -07002862 if ((!pProfile) && (fForce == 1))
Jeff Johnson01f2c232018-11-21 19:17:44 -08002863 status = csr_reassoc(mac, sessionId,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302864 &modProfileFields, pRoamId,
2865 fForce);
2866 else
Jeff Johnson01f2c232018-11-21 19:17:44 -08002867 status = csr_roam_reassoc(mac, sessionId,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302868 pProfile,
2869 modProfileFields, pRoamId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002870 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302871 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002872 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08002873 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002874 }
2875
2876 return status;
2877}
2878
Jeff Johnsonc7309062018-11-09 20:59:42 -08002879QDF_STATUS sme_roam_disconnect(mac_handle_t mac_handle, uint8_t session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002880 eCsrRoamDisconnectReason reason)
2881{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302882 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002883 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002884
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302885 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Varun Reddy Yeturu363809c2018-06-27 14:12:52 -07002886 TRACE_CODE_SME_RX_HDD_ROAM_DISCONNECT, session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002887 reason));
Varun Reddy Yeturu363809c2018-06-27 14:12:52 -07002888 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302889 if (QDF_IS_STATUS_SUCCESS(status)) {
Varun Reddy Yeturu363809c2018-06-27 14:12:52 -07002890 if (CSR_IS_SESSION_VALID(mac_ctx, session_id))
2891 status = csr_roam_disconnect(mac_ctx, session_id,
2892 reason);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302893 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302894 status = QDF_STATUS_E_INVAL;
Varun Reddy Yeturu363809c2018-06-27 14:12:52 -07002895 sme_release_global_lock(&mac_ctx->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002896 }
2897
2898 return status;
2899}
2900
Abhishek Singhca408032016-09-13 15:26:12 +05302901/* sme_dhcp_done_ind() - send dhcp done ind
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08002902 * @mac_handle: Opaque handle to the global MAC context
Abhishek Singhca408032016-09-13 15:26:12 +05302903 * @session_id: session id
2904 *
2905 * Return: void.
2906 */
Jeff Johnsonc7309062018-11-09 20:59:42 -08002907void sme_dhcp_done_ind(mac_handle_t mac_handle, uint8_t session_id)
Abhishek Singhca408032016-09-13 15:26:12 +05302908{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002909 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
gaurank kathpalia14e2f912017-08-31 14:51:45 +05302910 struct csr_roam_session *session;
Abhishek Singhca408032016-09-13 15:26:12 +05302911
2912 if (!mac_ctx)
2913 return;
2914
2915 session = CSR_GET_SESSION(mac_ctx, session_id);
2916 if (!session) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002917 sme_err("Session: %d not found", session_id);
Abhishek Singhca408032016-09-13 15:26:12 +05302918 return;
2919 }
2920 session->dhcp_done = true;
2921}
2922
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302923/*
2924 * sme_roam_stop_bss() -
2925 * To stop BSS for Soft AP. This is an asynchronous API.
2926 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002927 * mac_handle - Global structure
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302928 * sessionId - sessionId of SoftAP
2929 * Return QDF_STATUS SUCCESS Roam callback will be called to indicate
2930 * actual results
2931 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002932QDF_STATUS sme_roam_stop_bss(mac_handle_t mac_handle, uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002933{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302934 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002935 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002936
Jeff Johnson01f2c232018-11-21 19:17:44 -08002937 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302938 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002939 if (CSR_IS_SESSION_VALID(mac, sessionId))
2940 status = csr_roam_issue_stop_bss_cmd(mac, sessionId,
Himanshu Agarwal75c8d792017-12-19 18:31:04 +05302941 false);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302942 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302943 status = QDF_STATUS_E_INVAL;
Jeff Johnson01f2c232018-11-21 19:17:44 -08002944 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002945 }
2946
2947 return status;
2948}
2949
Deepthi Gowrib3bfefd2016-09-13 15:14:34 +05302950/**
2951 * sme_roam_disconnect_sta() - disassociate a station
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002952 * @mac_handle: Global structure
Deepthi Gowrib3bfefd2016-09-13 15:14:34 +05302953 * @sessionId: SessionId of SoftAP
2954 * @p_del_sta_params: Pointer to parameters of the station to disassoc
2955 *
2956 * To disassociate a station. This is an asynchronous API.
2957 *
2958 * Return: QDF_STATUS_SUCCESS on success.Roam callback will
2959 * be called to indicate actual result.
2960 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002961QDF_STATUS sme_roam_disconnect_sta(mac_handle_t mac_handle, uint8_t sessionId,
Jeff Johnsone6bf7192017-11-07 15:16:09 -08002962 struct csr_del_sta_params *p_del_sta_params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002963{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302964 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002965 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002966
Jeff Johnson038efe72019-03-18 13:39:31 -07002967 if (!mac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302968 QDF_ASSERT(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002969 return status;
2970 }
2971
Jeff Johnson01f2c232018-11-21 19:17:44 -08002972 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302973 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002974 if (CSR_IS_SESSION_VALID(mac, sessionId))
2975 status = csr_roam_issue_disassociate_sta_cmd(mac,
Deepthi Gowrib3bfefd2016-09-13 15:14:34 +05302976 sessionId, p_del_sta_params);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302977 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302978 status = QDF_STATUS_E_INVAL;
Jeff Johnson01f2c232018-11-21 19:17:44 -08002979 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002980 }
2981
2982 return status;
2983}
2984
2985/**
2986 * sme_roam_deauth_sta() - deauthenticate a station
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002987 * @mac_handle: Global structure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002988 * @sessionId: SessionId of SoftAP
2989 * @pDelStaParams: Pointer to parameters of the station to deauthenticate
2990 *
2991 * To disassociate a station. This is an asynchronous API.
2992 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302993 * Return: QDF_STATUS_SUCCESS on success or another QDF_STATUS error
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002994 * code on error. Roam callback will be called to indicate actual
2995 * result
2996 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002997QDF_STATUS sme_roam_deauth_sta(mac_handle_t mac_handle, uint8_t sessionId,
Jeff Johnsone6bf7192017-11-07 15:16:09 -08002998 struct csr_del_sta_params *pDelStaParams)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002999{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303000 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003001 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003002
Jeff Johnson038efe72019-03-18 13:39:31 -07003003 if (!mac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303004 QDF_ASSERT(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003005 return status;
3006 }
3007
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303008 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Sreelakshmi Konamki6744cff2015-09-07 12:10:39 +05303009 TRACE_CODE_SME_RX_HDD_MSG_DEAUTH_STA,
3010 sessionId, pDelStaParams->reason_code));
Jeff Johnson01f2c232018-11-21 19:17:44 -08003011 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303012 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08003013 if (CSR_IS_SESSION_VALID(mac, sessionId))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003014 status =
Jeff Johnson01f2c232018-11-21 19:17:44 -08003015 csr_roam_issue_deauth_sta_cmd(mac, sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003016 pDelStaParams);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303017 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303018 status = QDF_STATUS_E_INVAL;
Jeff Johnson01f2c232018-11-21 19:17:44 -08003019 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003020 }
3021
3022 return status;
3023}
3024
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303025/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303026 * sme_roam_get_connect_profile() -
3027 * A wrapper function to request CSR to return the current connect
3028 * profile. Caller must call csr_roam_free_connect_profile after it is done
3029 * and before reuse for another csr_roam_get_connect_profile call.
3030 * This is a synchronous call.
3031 *
3032 * pProfile - pointer to a caller allocated structure
3033 * tCsrRoamConnectedProfile
3034 * eturn QDF_STATUS. Failure if not connected
3035 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003036QDF_STATUS sme_roam_get_connect_profile(mac_handle_t mac_handle,
3037 uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003038 tCsrRoamConnectedProfile *pProfile)
3039{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303040 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003041 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003042
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303043 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003044 TRACE_CODE_SME_RX_HDD_ROAM_GET_CONNECTPROFILE,
3045 sessionId, 0));
Jeff Johnson01f2c232018-11-21 19:17:44 -08003046 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303047 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08003048 if (CSR_IS_SESSION_VALID(mac, sessionId))
3049 status = csr_roam_get_connect_profile(mac, sessionId,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303050 pProfile);
3051 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303052 status = QDF_STATUS_E_INVAL;
Jeff Johnson01f2c232018-11-21 19:17:44 -08003053 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003054 }
3055
3056 return status;
3057}
3058
Naveen Rawatdf0a7e72016-01-06 18:35:53 -08003059/**
3060 * sme_roam_free_connect_profile - a wrapper function to request CSR to free and
3061 * reinitialize the profile returned previously by csr_roam_get_connect_profile.
3062 *
3063 * @profile - pointer to a caller allocated structure tCsrRoamConnectedProfile
3064 *
3065 * Return: none
3066 */
3067void sme_roam_free_connect_profile(tCsrRoamConnectedProfile *profile)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003068{
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303069 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003070 TRACE_CODE_SME_RX_HDD_ROAM_FREE_CONNECTPROFILE,
3071 NO_SESSION, 0));
Naveen Rawatdf0a7e72016-01-06 18:35:53 -08003072 csr_roam_free_connect_profile(profile);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003073}
3074
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303075/*
3076 * sme_roam_set_pmkid_cache() -
3077 * A wrapper function to request CSR to return the PMKID candidate list
3078 * This is a synchronous call.
3079
3080 * pPMKIDCache - caller allocated buffer point to an array of
3081 * tPmkidCacheInfo
3082 * numItems - a variable that has the number of tPmkidCacheInfo
3083 * allocated when retruning, this is either the number needed
3084 * or number of items put into pPMKIDCache
3085 * update_entire_cache - this bool value specifies if the entire pmkid
3086 * cache should be overwritten or should it be
3087 * updated entry by entry.
3088 * Return QDF_STATUS - when fail, it usually means the buffer allocated is not
3089 * big enough and pNumItems has the number of
3090 * tPmkidCacheInfo.
3091 * \Note: pNumItems is a number of tPmkidCacheInfo,
3092 * not sizeof(tPmkidCacheInfo) * something
3093 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003094QDF_STATUS sme_roam_set_pmkid_cache(mac_handle_t mac_handle, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003095 tPmkidCacheInfo *pPMKIDCache,
3096 uint32_t numItems, bool update_entire_cache)
3097{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303098 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003099 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003100
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303101 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003102 TRACE_CODE_SME_RX_HDD_ROAM_SET_PMKIDCACHE, sessionId,
3103 numItems));
Jeff Johnson01f2c232018-11-21 19:17:44 -08003104 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303105 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08003106 if (CSR_IS_SESSION_VALID(mac, sessionId))
3107 status = csr_roam_set_pmkid_cache(mac, sessionId,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303108 pPMKIDCache,
3109 numItems, update_entire_cache);
3110 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303111 status = QDF_STATUS_E_INVAL;
Jeff Johnson01f2c232018-11-21 19:17:44 -08003112 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003113 }
3114
3115 return status;
3116}
3117
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003118QDF_STATUS sme_roam_del_pmkid_from_cache(mac_handle_t mac_handle,
3119 uint8_t sessionId,
Sridhar Selvarajc3684c72017-08-21 14:32:47 +05303120 tPmkidCacheInfo *pmksa,
3121 bool flush_cache)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003122{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303123 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003124 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Sreelakshmi Konamki6744cff2015-09-07 12:10:39 +05303125
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303126 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Sreelakshmi Konamki6744cff2015-09-07 12:10:39 +05303127 TRACE_CODE_SME_RX_HDD_ROAM_DEL_PMKIDCACHE,
3128 sessionId, flush_cache));
Jeff Johnson01f2c232018-11-21 19:17:44 -08003129 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303130 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08003131 if (CSR_IS_SESSION_VALID(mac, sessionId))
3132 status = csr_roam_del_pmkid_from_cache(mac, sessionId,
Sridhar Selvarajc3684c72017-08-21 14:32:47 +05303133 pmksa, flush_cache);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303134 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303135 status = QDF_STATUS_E_INVAL;
Jeff Johnson01f2c232018-11-21 19:17:44 -08003136 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003137 }
3138 return status;
3139}
3140
Abhinav Kumar7830d9c2018-06-27 17:57:48 +05303141#ifdef WLAN_FEATURE_ROAM_OFFLOAD
Jeff Johnsonc7309062018-11-09 20:59:42 -08003142void sme_get_pmk_info(mac_handle_t mac_handle, uint8_t session_id,
3143 tPmkidCacheInfo *pmk_cache)
gaurank kathpalia99d06c12018-05-16 16:28:35 +05303144{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003145 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
gaurank kathpalia99d06c12018-05-16 16:28:35 +05303146 QDF_STATUS status = sme_acquire_global_lock(&mac_ctx->sme);
3147
3148 if (QDF_IS_STATUS_SUCCESS(status)) {
3149 if (CSR_IS_SESSION_VALID(mac_ctx, session_id))
3150 csr_get_pmk_info(mac_ctx, session_id, pmk_cache);
3151 sme_release_global_lock(&mac_ctx->sme);
3152 }
3153}
Abhinav Kumar7830d9c2018-06-27 17:57:48 +05303154#endif
3155
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003156#ifdef WLAN_FEATURE_ROAM_OFFLOAD
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303157/*
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003158 * \fn sme_roam_set_psk_pmk
3159 * \brief a wrapper function to request CSR to save PSK/PMK
3160 * This is a synchronous call.
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003161 * \param mac_handle - Global structure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003162 * \param sessionId - SME sessionId
3163 * \param pPSK_PMK - pointer to an array of Psk[]/Pmk
3164 * \param pmk_len - Length could be only 16 bytes in case if LEAP
3165 * connections. Need to pass this information to
3166 * firmware.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303167 * \return QDF_STATUS -status whether PSK/PMK is set or not
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003168 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003169QDF_STATUS sme_roam_set_psk_pmk(mac_handle_t mac_handle, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003170 uint8_t *pPSK_PMK, size_t pmk_len)
3171{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303172 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003173 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303174
Jeff Johnson01f2c232018-11-21 19:17:44 -08003175 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303176 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08003177 if (CSR_IS_SESSION_VALID(mac, sessionId))
3178 status = csr_roam_set_psk_pmk(mac, sessionId, pPSK_PMK,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003179 pmk_len);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303180 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303181 status = QDF_STATUS_E_INVAL;
Jeff Johnson01f2c232018-11-21 19:17:44 -08003182 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003183 }
3184 return status;
3185}
3186#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003187
Jeff Johnsonc7309062018-11-09 20:59:42 -08003188QDF_STATUS sme_roam_get_wpa_rsn_req_ie(mac_handle_t mac_handle,
3189 uint8_t session_id,
Jeff Johnson0a078b52018-06-01 16:15:54 -07003190 uint32_t *len, uint8_t *buf)
3191{
3192 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003193 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Jeff Johnson0a078b52018-06-01 16:15:54 -07003194
3195 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303196 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson0a078b52018-06-01 16:15:54 -07003197 if (CSR_IS_SESSION_VALID(mac, session_id))
3198 status = csr_roam_get_wpa_rsn_req_ie(mac, session_id,
3199 len, buf);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303200 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303201 status = QDF_STATUS_E_INVAL;
Jeff Johnson0a078b52018-06-01 16:15:54 -07003202 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003203 }
3204
3205 return status;
3206}
3207
Jeff Johnsonc7309062018-11-09 20:59:42 -08003208QDF_STATUS sme_roam_get_wpa_rsn_rsp_ie(mac_handle_t mac_handle,
3209 uint8_t session_id,
Jeff Johnson0a078b52018-06-01 16:15:54 -07003210 uint32_t *len, uint8_t *buf)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003211{
Jeff Johnson0a078b52018-06-01 16:15:54 -07003212 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003213 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003214
Jeff Johnson0a078b52018-06-01 16:15:54 -07003215 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303216 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson0a078b52018-06-01 16:15:54 -07003217 if (CSR_IS_SESSION_VALID(mac, session_id))
3218 status = csr_roam_get_wpa_rsn_rsp_ie(mac, session_id,
3219 len, buf);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303220 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303221 status = QDF_STATUS_E_INVAL;
Jeff Johnson0a078b52018-06-01 16:15:54 -07003222 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003223 }
3224
3225 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003226}
3227
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303228/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303229 * sme_get_config_param() -
3230 * A wrapper function that HDD calls to get the global settings
3231 * currently maintained by CSR.
3232 * This is a synchronous call.
3233 *
3234 * pParam - caller allocated memory
3235 * Return QDF_STATUS
3236 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003237QDF_STATUS sme_get_config_param(mac_handle_t mac_handle,
Jeff Johnson46b4f0e2019-03-08 10:48:35 -08003238 struct sme_config_params *pParam)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003239{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303240 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003241 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003242
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303243 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003244 TRACE_CODE_SME_RX_HDD_GET_CONFIGPARAM, NO_SESSION, 0));
Jeff Johnson01f2c232018-11-21 19:17:44 -08003245 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303246 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnsone94ccd02019-04-02 15:02:56 -07003247 status = csr_get_config_param(mac, &pParam->csr_config);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303248 if (status != QDF_STATUS_SUCCESS) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07003249 sme_err("csr_get_config_param failed");
Jeff Johnson01f2c232018-11-21 19:17:44 -08003250 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003251 return status;
3252 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08003253 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003254 }
3255
3256 return status;
3257}
3258
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303259/*
3260 * sme_get_modify_profile_fields() -
3261 * HDD or SME - QOS calls this function to get the current values of
3262 * connected profile fields, changing which can cause reassoc.
3263 * This function must be called after CFG is downloaded and STA is in connected
3264 * state. Also, make sure to call this function to get the current profile
3265 * fields before calling the reassoc. So that pModifyProfileFields will have
3266 * all the latest values plus the one(s) has been updated as part of reassoc
3267 * request.
3268 *
3269 * pModifyProfileFields - pointer to the connected profile fields
3270 * changing which can cause reassoc
3271 * Return QDF_STATUS
3272 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003273QDF_STATUS sme_get_modify_profile_fields(mac_handle_t mac_handle,
3274 uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003275 tCsrRoamModifyProfileFields *
3276 pModifyProfileFields)
3277{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303278 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003279 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003280
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303281 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003282 TRACE_CODE_SME_RX_HDD_GET_MODPROFFIELDS, sessionId,
3283 0));
Jeff Johnson01f2c232018-11-21 19:17:44 -08003284 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303285 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08003286 if (CSR_IS_SESSION_VALID(mac, sessionId))
3287 status = csr_get_modify_profile_fields(mac, sessionId,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303288 pModifyProfileFields);
3289 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303290 status = QDF_STATUS_E_INVAL;
Jeff Johnson01f2c232018-11-21 19:17:44 -08003291 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003292 }
3293
3294 return status;
3295}
3296
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003297#ifdef FEATURE_OEM_DATA_SUPPORT
3298/**
3299 * sme_register_oem_data_rsp_callback() - Register a routine of
3300 * type send_oem_data_rsp_msg
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003301 * @mac_handle: Handle returned by mac_open.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003302 * @callback: Callback to send response
3303 * to oem application.
3304 *
3305 * sme_oem_data_rsp_callback is used to register sme_send_oem_data_rsp_msg
3306 * callback function.
3307 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303308 * Return: QDF_STATUS.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003309 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003310QDF_STATUS sme_register_oem_data_rsp_callback(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003311 sme_send_oem_data_rsp_msg callback)
3312{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303313 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003314 struct mac_context *pmac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003315
Krishna Kumaar Natarajanbbbf2ef2016-08-03 14:06:26 -07003316 pmac->sme.oem_data_rsp_callback = callback;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003317
3318 return status;
3319
3320}
Arun Khandavalli4b55da72016-07-19 19:55:01 +05303321
3322/**
3323 * sme_deregister_oem_data_rsp_callback() - De-register OEM datarsp callback
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003324 * @mac_handle: Handler return by mac_open
Arun Khandavalli4b55da72016-07-19 19:55:01 +05303325 * This function De-registers the OEM data response callback to SME
3326 *
3327 * Return: None
3328 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003329void sme_deregister_oem_data_rsp_callback(mac_handle_t mac_handle)
Arun Khandavalli4b55da72016-07-19 19:55:01 +05303330{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003331 struct mac_context *pmac;
Arun Khandavalli4b55da72016-07-19 19:55:01 +05303332
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003333 if (!mac_handle) {
Arun Khandavalli4b55da72016-07-19 19:55:01 +05303334 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003335 FL("mac_handle is not valid"));
Arun Khandavalli4b55da72016-07-19 19:55:01 +05303336 return;
3337 }
Jeff Johnsona0619e42018-11-28 17:43:00 -08003338 pmac = MAC_CONTEXT(mac_handle);
Arun Khandavalli4b55da72016-07-19 19:55:01 +05303339
Krishna Kumaar Natarajanbbbf2ef2016-08-03 14:06:26 -07003340 pmac->sme.oem_data_rsp_callback = NULL;
Arun Khandavalli4b55da72016-07-19 19:55:01 +05303341}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003342
3343/**
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08003344 * sme_oem_update_capability() - update UMAC's oem related capability.
Jeff Johnsonc7309062018-11-09 20:59:42 -08003345 * @mac_handle: Handle returned by mac_open
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08003346 * @oem_cap: pointer to oem_capability
3347 *
3348 * This function updates OEM capability to UMAC. Currently RTT
3349 * related capabilities are updated. More capabilities can be
3350 * added in future.
3351 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303352 * Return: QDF_STATUS
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08003353 */
Jeff Johnsonc7309062018-11-09 20:59:42 -08003354QDF_STATUS sme_oem_update_capability(mac_handle_t mac_handle,
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08003355 struct sme_oem_capability *cap)
3356{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303357 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003358 struct mac_context *pmac = MAC_CONTEXT(mac_handle);
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08003359 uint8_t *bytes;
3360
3361 bytes = pmac->rrm.rrmSmeContext.rrmConfig.rm_capability;
3362
3363 if (cap->ftm_rr)
3364 bytes[4] |= RM_CAP_FTM_RANGE_REPORT;
3365 if (cap->lci_capability)
3366 bytes[4] |= RM_CAP_CIVIC_LOC_MEASUREMENT;
3367
3368 return status;
3369}
3370
3371/**
3372 * sme_oem_get_capability() - get oem capability
Jeff Johnsonc7309062018-11-09 20:59:42 -08003373 * @mac_handle: Handle returned by mac_open
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08003374 * @oem_cap: pointer to oem_capability
3375 *
3376 * This function is used to get the OEM capability from UMAC.
3377 * Currently RTT related capabilities are received. More
3378 * capabilities can be added in future.
3379 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303380 * Return: QDF_STATUS
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08003381 */
Jeff Johnsonc7309062018-11-09 20:59:42 -08003382QDF_STATUS sme_oem_get_capability(mac_handle_t mac_handle,
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08003383 struct sme_oem_capability *cap)
3384{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303385 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003386 struct mac_context *pmac = MAC_CONTEXT(mac_handle);
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08003387 uint8_t *bytes;
3388
3389 bytes = pmac->rrm.rrmSmeContext.rrmConfig.rm_capability;
3390
3391 cap->ftm_rr = bytes[4] & RM_CAP_FTM_RANGE_REPORT;
3392 cap->lci_capability = bytes[4] & RM_CAP_CIVIC_LOC_MEASUREMENT;
3393
3394 return status;
3395}
Naveen Rawat910726a2017-03-06 11:42:51 -08003396#endif
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08003397
3398/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003399 * sme_roam_set_key() - To set encryption key.
Jeff Johnsonc7309062018-11-09 20:59:42 -08003400 * @mac_handle: mac_handle global context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003401 * @session_id: session id
3402 * @set_key: pointer to a caller allocated object of tCsrSetContextInfo
3403 * @ptr_roam_id: Upon success return, this is the id caller can use to
3404 * identify the request in roamcallback
3405 *
3406 * This function should be called only when connected. This is an asynchronous
3407 * API.
3408 *
3409 * Return: Status of operation
3410 */
Jeff Johnsonc7309062018-11-09 20:59:42 -08003411QDF_STATUS sme_roam_set_key(mac_handle_t mac_handle, uint8_t session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003412 tCsrRoamSetKey *set_key, uint32_t *ptr_roam_id)
3413{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303414 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003415 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003416 uint32_t roam_id;
gaurank kathpalia14e2f912017-08-31 14:51:45 +05303417 struct csr_roam_session *session = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003418 struct ps_global_info *ps_global_info = &mac_ctx->sme.ps_global_info;
3419
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303420 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_RX_HDD_SET_KEY,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003421 session_id, 0));
3422 if (set_key->keyLength > CSR_MAX_KEY_LEN) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07003423 sme_err("Invalid key length: %d", set_key->keyLength);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303424 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003425 }
3426 /*Once Setkey is done, we can go in BMPS */
3427 if (set_key->keyLength)
3428 ps_global_info->remain_in_power_active_till_dhcp = false;
3429
3430 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303431 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003432 return status;
3433
3434 roam_id = GET_NEXT_ROAM_ID(&mac_ctx->roam);
3435 if (ptr_roam_id)
3436 *ptr_roam_id = roam_id;
3437
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07003438 sme_debug("keyLength: %d", set_key->keyLength);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003439
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07003440 sme_debug("Session_id: %d roam_id: %d", session_id, roam_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003441 session = CSR_GET_SESSION(mac_ctx, session_id);
3442 if (!session) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07003443 sme_err("session %d not found", session_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003444 sme_release_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303445 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003446 }
3447 if (CSR_IS_INFRA_AP(&session->connectedProfile)
3448 && set_key->keyDirection == eSIR_TX_DEFAULT) {
3449 if ((eCSR_ENCRYPT_TYPE_WEP40 == set_key->encType)
3450 || (eCSR_ENCRYPT_TYPE_WEP40_STATICKEY ==
3451 set_key->encType)) {
3452 session->pCurRoamProfile->negotiatedUCEncryptionType =
3453 eCSR_ENCRYPT_TYPE_WEP40_STATICKEY;
3454 }
3455 if ((eCSR_ENCRYPT_TYPE_WEP104 == set_key->encType)
3456 || (eCSR_ENCRYPT_TYPE_WEP104_STATICKEY ==
3457 set_key->encType)) {
3458 session->pCurRoamProfile->negotiatedUCEncryptionType =
3459 eCSR_ENCRYPT_TYPE_WEP104_STATICKEY;
3460 }
3461 }
3462 status = csr_roam_set_key(mac_ctx, session_id, set_key, roam_id);
3463 sme_release_global_lock(&mac_ctx->sme);
3464 return status;
3465}
3466
Masti, Narayanraddiab712a72016-08-04 11:59:11 +05303467/**
3468 * sme_roam_set_default_key_index - To set default wep key idx
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08003469 * @mac_handle: Opaque handle to the global MAC context
Masti, Narayanraddiab712a72016-08-04 11:59:11 +05303470 * @session_id: session id
3471 * @default_idx: default wep key index
3472 *
3473 * This function prepares a message and post to WMA to set wep default
3474 * key index
3475 *
3476 * Return: Success:QDF_STATUS_SUCCESS Failure: Error value
3477 */
Jeff Johnsonc7309062018-11-09 20:59:42 -08003478QDF_STATUS sme_roam_set_default_key_index(mac_handle_t mac_handle,
3479 uint8_t session_id,
Masti, Narayanraddiab712a72016-08-04 11:59:11 +05303480 uint8_t default_idx)
3481{
Rajeev Kumar37d478b2017-04-17 16:59:28 -07003482 struct scheduler_msg msg = {0};
Masti, Narayanraddiab712a72016-08-04 11:59:11 +05303483 struct wep_update_default_key_idx *update_key;
3484
3485 update_key = qdf_mem_malloc(sizeof(*update_key));
Arif Hussain0ef77082018-10-10 16:42:53 -07003486 if (!update_key)
Masti, Narayanraddiab712a72016-08-04 11:59:11 +05303487 return QDF_STATUS_E_NOMEM;
Masti, Narayanraddiab712a72016-08-04 11:59:11 +05303488
3489 update_key->session_id = session_id;
3490 update_key->default_idx = default_idx;
3491
3492 msg.type = WMA_UPDATE_WEP_DEFAULT_KEY;
3493 msg.reserved = 0;
3494 msg.bodyptr = (void *)update_key;
3495
3496 if (QDF_STATUS_SUCCESS !=
gaurank kathpalia36b0c582018-08-28 17:45:43 +05303497 scheduler_post_message(QDF_MODULE_ID_SME,
3498 QDF_MODULE_ID_WMA,
3499 QDF_MODULE_ID_WMA, &msg)) {
Masti, Narayanraddiab712a72016-08-04 11:59:11 +05303500 qdf_mem_free(update_key);
3501 return QDF_STATUS_E_FAILURE;
3502 }
3503
3504 return QDF_STATUS_SUCCESS;
3505}
3506
3507
Jeff Johnson8bd23352017-09-26 11:39:24 -07003508/**
3509 * sme_get_rssi() - API to retrieve current RSSI
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08003510 * @mac_handle: Opaque handle to the global MAC context
Jeff Johnson8bd23352017-09-26 11:39:24 -07003511 * @callback: SME sends back the requested stats using the callback
3512 * @staId: The station ID for which the RSSI is requested for
3513 * @bssid: The bssid of the connected session
3514 * @lastRSSI: RSSI value at time of request. In case fw cannot provide
3515 * RSSI, do not hold up but return this value.
3516 * @pContext: user context to be passed back along with the callback
3517 *
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303518 * A wrapper function that client calls to register a callback to get RSSI
3519 *
Jeff Johnson8bd23352017-09-26 11:39:24 -07003520 * Return: QDF_STATUS
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303521 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003522QDF_STATUS sme_get_rssi(mac_handle_t mac_handle,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303523 tCsrRssiCallback callback, uint8_t staId,
3524 struct qdf_mac_addr bssId, int8_t lastRSSI,
Jeff Johnson8bd23352017-09-26 11:39:24 -07003525 void *pContext)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003526{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303527 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003528 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003529
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303530 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003531 TRACE_CODE_SME_RX_HDD_GET_RSSI, NO_SESSION, 0));
Jeff Johnson01f2c232018-11-21 19:17:44 -08003532 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303533 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08003534 status = csr_get_rssi(mac, callback,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003535 staId, bssId, lastRSSI,
Jeff Johnson8bd23352017-09-26 11:39:24 -07003536 pContext);
Jeff Johnson01f2c232018-11-21 19:17:44 -08003537 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003538 }
3539 return status;
3540}
3541
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303542/*
3543 * sme_get_snr() -
3544 * A wrapper function that client calls to register a callback to get SNR
3545 *
3546 * callback - SME sends back the requested stats using the callback
3547 * staId - The station ID for which the stats is requested for
3548 * pContext - user context to be passed back along with the callback
3549 * p_cds_context - cds context
3550 * \return QDF_STATUS
3551 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003552QDF_STATUS sme_get_snr(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003553 tCsrSnrCallback callback,
Anurag Chouhan6d760662016-02-20 16:05:43 +05303554 uint8_t staId, struct qdf_mac_addr bssId, void *pContext)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003555{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303556 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003557 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003558
Jeff Johnson01f2c232018-11-21 19:17:44 -08003559 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303560 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08003561 status = csr_get_snr(mac, callback, staId, bssId, pContext);
3562 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003563 }
3564 return status;
3565}
3566
Naveen Rawatfa2a1002018-05-17 16:06:37 -07003567#ifndef QCA_SUPPORT_CP_STATS
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303568/*
3569 * sme_get_statistics() -
3570 * A wrapper function that client calls to register a callback to get
3571 * different PHY level statistics from CSR.
3572 *
3573 * requesterId - different client requesting for statistics,
3574 * HDD, UMA/GAN etc
3575 * statsMask - The different category/categories of stats requester
3576 * is looking for
3577 * callback - SME sends back the requested stats using the callback
3578 * periodicity - If requester needs periodic update in millisec, 0 means
3579 * it's an one time request
3580 * cache - If requester is happy with cached stats
3581 * staId - The station ID for which the stats is requested for
3582 * pContext - user context to be passed back along with the callback
3583 * sessionId - sme session interface
3584 * Return QDF_STATUS
3585 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003586QDF_STATUS sme_get_statistics(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003587 eCsrStatsRequesterType requesterId,
3588 uint32_t statsMask, tCsrStatsCallback callback,
Naveen Rawatd0ca4412017-06-16 14:19:19 -07003589 uint8_t staId, void *pContext, uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003590{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303591 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003592 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003593
Jeff Johnson01f2c232018-11-21 19:17:44 -08003594 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303595 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08003596 status = csr_get_statistics(mac, requesterId, statsMask,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303597 callback, staId, pContext,
3598 sessionId);
Jeff Johnson01f2c232018-11-21 19:17:44 -08003599 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003600 }
3601
3602 return status;
3603
3604}
Naveen Rawatfa2a1002018-05-17 16:06:37 -07003605#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003606
Jeff Johnsonca7a7162018-07-07 12:56:54 -07003607QDF_STATUS sme_get_link_status(mac_handle_t mac_handle,
3608 csr_link_status_callback callback,
3609 void *context, uint8_t session_id)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003610{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303611 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003612 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Jeff Johnsonca7a7162018-07-07 12:56:54 -07003613 tAniGetLinkStatus *msg;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07003614 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003615
Jeff Johnsonca7a7162018-07-07 12:56:54 -07003616 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303617 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnsonca7a7162018-07-07 12:56:54 -07003618 msg = qdf_mem_malloc(sizeof(*msg));
3619 if (!msg) {
Jeff Johnsonca7a7162018-07-07 12:56:54 -07003620 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303621 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003622 }
3623
Jeff Johnsonca7a7162018-07-07 12:56:54 -07003624 msg->msgType = WMA_LINK_STATUS_GET_REQ;
3625 msg->msgLen = sizeof(*msg);
3626 msg->sessionId = session_id;
3627 mac->sme.link_status_context = context;
3628 mac->sme.link_status_callback = callback;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003629
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08003630 message.type = WMA_LINK_STATUS_GET_REQ;
Jeff Johnsonca7a7162018-07-07 12:56:54 -07003631 message.bodyptr = msg;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08003632 message.reserved = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003633
gaurank kathpalia36b0c582018-08-28 17:45:43 +05303634 status = scheduler_post_message(QDF_MODULE_ID_SME,
3635 QDF_MODULE_ID_WMA,
3636 QDF_MODULE_ID_WMA, &message);
Jeff Johnsonca7a7162018-07-07 12:56:54 -07003637 if (QDF_IS_STATUS_ERROR(status)) {
3638 sme_err("post msg failed, %d", status);
3639 qdf_mem_free(msg);
3640 mac->sme.link_status_context = NULL;
3641 mac->sme.link_status_callback = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003642 }
3643
Jeff Johnsonca7a7162018-07-07 12:56:54 -07003644 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003645 }
3646
3647 return status;
3648}
3649
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303650/*
3651 * sme_get_country_code() -
3652 * To return the current country code. If no country code is applied,
3653 * default country code is used to fill the buffer.
3654 * If 11d supported is turned off, an error is return and the last
3655 * applied/default country code is used.
3656 * This is a synchronous API.
3657 *
3658 * pBuf - pointer to a caller allocated buffer for returned country code.
3659 * pbLen For input, this parameter indicates how big is the buffer.
3660 * Upon return, this parameter has the number of bytes for
3661 * country. If pBuf doesn't have enough space, this function
3662 * returns fail status and this parameter contains the number
3663 * that is needed.
3664 *
3665 * Return QDF_STATUS SUCCESS.
3666 *
3667 * FAILURE or RESOURCES The API finished and failed.
3668 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003669QDF_STATUS sme_get_country_code(mac_handle_t mac_handle, uint8_t *pBuf,
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08003670 uint8_t *pbLen)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003671{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003672 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003673
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303674 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003675 TRACE_CODE_SME_RX_HDD_GET_CNTRYCODE, NO_SESSION, 0));
3676
Jeff Johnson01f2c232018-11-21 19:17:44 -08003677 return csr_get_country_code(mac, pBuf, pbLen);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003678}
3679
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303680/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303681 * sme_generic_change_country_code() -
3682 * Change Country code from upperlayer during WLAN driver operation.
3683 * This is a synchronous API.
3684 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003685 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303686 * pCountry New Country Code String
3687 * reg_domain regulatory domain
3688 * Return QDF_STATUS SUCCESS.
3689 * FAILURE or RESOURCES The API finished and failed.
3690 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003691QDF_STATUS sme_generic_change_country_code(mac_handle_t mac_handle,
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07003692 uint8_t *pCountry)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003693{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303694 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003695 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07003696 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003697 tAniGenericChangeCountryCodeReq *pMsg;
3698
Jeff Johnson038efe72019-03-18 13:39:31 -07003699 if (!mac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303700 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_FATAL,
Jeff Johnson01f2c232018-11-21 19:17:44 -08003701 "%s: mac is null", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003702 return status;
3703 }
3704
Jeff Johnson01f2c232018-11-21 19:17:44 -08003705 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303706 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303707 pMsg = qdf_mem_malloc(sizeof(tAniGenericChangeCountryCodeReq));
Arif Hussain0ef77082018-10-10 16:42:53 -07003708 if (!pMsg) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08003709 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303710 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003711 }
3712
3713 pMsg->msgType = eWNI_SME_GENERIC_CHANGE_COUNTRY_CODE;
3714 pMsg->msgLen =
3715 (uint16_t) sizeof(tAniGenericChangeCountryCodeReq);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303716 qdf_mem_copy(pMsg->countryCode, pCountry, 2);
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07003717 pMsg->countryCode[2] = ' ';
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003718
3719 msg.type = eWNI_SME_GENERIC_CHANGE_COUNTRY_CODE;
3720 msg.bodyptr = pMsg;
3721 msg.reserved = 0;
3722
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303723 if (QDF_STATUS_SUCCESS !=
gaurank kathpalia36b0c582018-08-28 17:45:43 +05303724 scheduler_post_message(QDF_MODULE_ID_SME,
3725 QDF_MODULE_ID_SME,
3726 QDF_MODULE_ID_SME, &msg)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303727 qdf_mem_free(pMsg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303728 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003729 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08003730 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003731 }
3732
3733 return status;
3734}
3735
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303736/*
3737 * sme_dhcp_start_ind() -
3738 * API to signal the FW about the DHCP Start event.
3739 *
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08003740 * mac_handle: Opaque handle to the global MAC context.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303741 * device_mode - mode(AP,SAP etc) of the device.
3742 * macAddr - MAC address of the adapter.
3743 * sessionId - session ID.
3744 * Return QDF_STATUS SUCCESS.
3745 * FAILURE or RESOURCES The API finished and failed.
3746 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003747QDF_STATUS sme_dhcp_start_ind(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003748 uint8_t device_mode,
3749 uint8_t *macAddr, uint8_t sessionId)
3750{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303751 QDF_STATUS status;
3752 QDF_STATUS qdf_status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003753 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07003754 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003755 tAniDHCPInd *pMsg;
gaurank kathpalia14e2f912017-08-31 14:51:45 +05303756 struct csr_roam_session *pSession;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003757
Jeff Johnson01f2c232018-11-21 19:17:44 -08003758 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303759 if (QDF_STATUS_SUCCESS == status) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08003760 pSession = CSR_GET_SESSION(mac, sessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003761
3762 if (!pSession) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07003763 sme_err("Session: %d not found", sessionId);
Jeff Johnson01f2c232018-11-21 19:17:44 -08003764 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303765 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003766 }
Arif Hussain3316f402016-11-10 13:08:03 -08003767 pSession->dhcp_done = false;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003768
Arif Hussain0ef77082018-10-10 16:42:53 -07003769 pMsg = qdf_mem_malloc(sizeof(tAniDHCPInd));
3770 if (!pMsg) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08003771 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303772 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003773 }
3774 pMsg->msgType = WMA_DHCP_START_IND;
3775 pMsg->msgLen = (uint16_t) sizeof(tAniDHCPInd);
3776 pMsg->device_mode = device_mode;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303777 qdf_mem_copy(pMsg->adapterMacAddr.bytes, macAddr,
Anurag Chouhan6d760662016-02-20 16:05:43 +05303778 QDF_MAC_ADDR_SIZE);
Anurag Chouhanc5548422016-02-24 18:33:27 +05303779 qdf_copy_macaddr(&pMsg->peerMacAddr,
Srinivas Girigowda296105a2015-09-24 16:31:16 -07003780 &pSession->connectedProfile.bssid);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003781
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08003782 message.type = WMA_DHCP_START_IND;
3783 message.bodyptr = pMsg;
3784 message.reserved = 0;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05303785 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08003786 sessionId, message.type));
gaurank kathpalia36b0c582018-08-28 17:45:43 +05303787 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
3788 QDF_MODULE_ID_WMA,
3789 QDF_MODULE_ID_WMA,
3790 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303791 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303792 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003793 "%s: Post DHCP Start MSG fail", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303794 qdf_mem_free(pMsg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303795 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003796 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08003797 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003798 }
3799 return status;
3800}
3801
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303802/*
3803 * sme_dhcp_stop_ind() -
3804 * API to signal the FW about the DHCP complete event.
3805 *
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08003806 * mac_handle: Opaque handle to the global MAC context.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303807 * device_mode - mode(AP, SAP etc) of the device.
3808 * macAddr - MAC address of the adapter.
3809 * sessionId - session ID.
3810 * Return QDF_STATUS SUCCESS.
3811 * FAILURE or RESOURCES The API finished and failed.
3812 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003813QDF_STATUS sme_dhcp_stop_ind(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003814 uint8_t device_mode,
3815 uint8_t *macAddr, uint8_t sessionId)
3816{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303817 QDF_STATUS status;
3818 QDF_STATUS qdf_status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003819 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07003820 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003821 tAniDHCPInd *pMsg;
gaurank kathpalia14e2f912017-08-31 14:51:45 +05303822 struct csr_roam_session *pSession;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003823
Jeff Johnson01f2c232018-11-21 19:17:44 -08003824 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303825 if (QDF_STATUS_SUCCESS == status) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08003826 pSession = CSR_GET_SESSION(mac, sessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003827
3828 if (!pSession) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07003829 sme_err("Session: %d not found", sessionId);
Jeff Johnson01f2c232018-11-21 19:17:44 -08003830 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303831 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003832 }
Arif Hussain3316f402016-11-10 13:08:03 -08003833 pSession->dhcp_done = true;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003834
Arif Hussain0ef77082018-10-10 16:42:53 -07003835 pMsg = qdf_mem_malloc(sizeof(tAniDHCPInd));
3836 if (!pMsg) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08003837 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303838 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003839 }
3840
3841 pMsg->msgType = WMA_DHCP_STOP_IND;
3842 pMsg->msgLen = (uint16_t) sizeof(tAniDHCPInd);
3843 pMsg->device_mode = device_mode;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303844 qdf_mem_copy(pMsg->adapterMacAddr.bytes, macAddr,
Anurag Chouhan6d760662016-02-20 16:05:43 +05303845 QDF_MAC_ADDR_SIZE);
Anurag Chouhanc5548422016-02-24 18:33:27 +05303846 qdf_copy_macaddr(&pMsg->peerMacAddr,
Srinivas Girigowda296105a2015-09-24 16:31:16 -07003847 &pSession->connectedProfile.bssid);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003848
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08003849 message.type = WMA_DHCP_STOP_IND;
3850 message.bodyptr = pMsg;
3851 message.reserved = 0;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05303852 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08003853 sessionId, message.type));
gaurank kathpalia36b0c582018-08-28 17:45:43 +05303854 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
3855 QDF_MODULE_ID_WMA,
3856 QDF_MODULE_ID_WMA,
3857 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303858 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303859 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003860 "%s: Post DHCP Stop MSG fail", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303861 qdf_mem_free(pMsg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303862 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003863 }
3864
Jeff Johnson01f2c232018-11-21 19:17:44 -08003865 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003866 }
3867 return status;
3868}
3869
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303870/*
3871 * sme_TXFailMonitorStopInd() -
3872 * API to signal the FW to start monitoring TX failures
3873 *
3874 * Return QDF_STATUS SUCCESS.
3875 * FAILURE or RESOURCES The API finished and failed.
3876 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003877QDF_STATUS sme_tx_fail_monitor_start_stop_ind(mac_handle_t mac_handle,
3878 uint8_t tx_fail_count,
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003879 void *txFailIndCallback)
3880{
3881 QDF_STATUS status;
3882 QDF_STATUS qdf_status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003883 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07003884 struct scheduler_msg message = {0};
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003885 tAniTXFailMonitorInd *pMsg;
3886
Jeff Johnson01f2c232018-11-21 19:17:44 -08003887 status = sme_acquire_global_lock(&mac->sme);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003888 if (QDF_STATUS_SUCCESS == status) {
Arif Hussain0ef77082018-10-10 16:42:53 -07003889 pMsg = qdf_mem_malloc(sizeof(tAniTXFailMonitorInd));
3890 if (!pMsg) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08003891 sme_release_global_lock(&mac->sme);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003892 return QDF_STATUS_E_NOMEM;
3893 }
3894
3895 pMsg->msgType = WMA_TX_FAIL_MONITOR_IND;
3896 pMsg->msgLen = (uint16_t) sizeof(tAniTXFailMonitorInd);
3897
3898 /* tx_fail_count = 0 should disable the Monitoring in FW */
3899 pMsg->tx_fail_count = tx_fail_count;
3900 pMsg->txFailIndCallback = txFailIndCallback;
3901
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08003902 message.type = WMA_TX_FAIL_MONITOR_IND;
3903 message.bodyptr = pMsg;
3904 message.reserved = 0;
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003905
gaurank kathpalia36b0c582018-08-28 17:45:43 +05303906 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
3907 QDF_MODULE_ID_WMA,
3908 QDF_MODULE_ID_WMA,
3909 &message);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003910 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
3911 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
3912 "%s: Post TX Fail monitor Start MSG fail",
3913 __func__);
3914 qdf_mem_free(pMsg);
3915 status = QDF_STATUS_E_FAILURE;
3916 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08003917 sme_release_global_lock(&mac->sme);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003918 }
3919 return status;
3920}
3921
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303922/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303923 * sme_neighbor_report_request() -
3924 * API to request neighbor report.
3925 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003926 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303927 * pRrmNeighborReq - Pointer to a caller allocated object of type
3928 * tRrmNeighborReq. Caller owns the memory and is
3929 * responsible for freeing it.
3930 * Return QDF_STATUS
3931 * QDF_STATUS_E_FAILURE - failure
3932 * QDF_STATUS_SUCCESS success
3933 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003934QDF_STATUS sme_neighbor_report_request(
3935 mac_handle_t mac_handle,
3936 uint8_t sessionId,
3937 tpRrmNeighborReq pRrmNeighborReq,
3938 tpRrmNeighborRspCallbackInfo callbackInfo)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003939{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303940 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003941 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303942
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303943 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003944 TRACE_CODE_SME_RX_HDD_NEIGHBOR_REPORTREQ, NO_SESSION,
3945 0));
3946
Vignesh Viswanathan694e28e2018-01-18 20:53:57 +05303947 if (pRrmNeighborReq->neighbor_report_offload) {
3948 status = csr_invoke_neighbor_report_request(sessionId,
3949 pRrmNeighborReq,
3950 false);
3951 return status;
3952 }
3953
Jeff Johnson01f2c232018-11-21 19:17:44 -08003954 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&mac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003955 status =
Jeff Johnson01f2c232018-11-21 19:17:44 -08003956 sme_rrm_neighbor_report_request(mac, sessionId,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303957 pRrmNeighborReq, callbackInfo);
Jeff Johnson01f2c232018-11-21 19:17:44 -08003958 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003959 }
3960
3961 return status;
3962}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003963
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003964#ifdef FEATURE_OEM_DATA_SUPPORT
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07003965/**
3966 * sme_oem_data_req() - send oem data request to WMA
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08003967 * @mac_handle: Opaque handle to the global MAC context
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07003968 * @hdd_oem_req: OEM data request from HDD
3969 *
3970 * Return: QDF_STATUS
3971 */
Jeff Johnsonc7309062018-11-09 20:59:42 -08003972QDF_STATUS sme_oem_data_req(mac_handle_t mac_handle,
3973 struct oem_data_req *hdd_oem_req)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003974{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303975 QDF_STATUS status = QDF_STATUS_SUCCESS;
Krishna Kumaar Natarajanc1fa17d2016-08-03 14:19:20 -07003976 struct oem_data_req *oem_data_req;
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07003977 void *wma_handle;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003978
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07003979 SME_ENTER();
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07003980 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
3981 if (!wma_handle) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07003982 sme_err("wma_handle is NULL");
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07003983 return QDF_STATUS_E_FAILURE;
3984 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003985
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07003986 oem_data_req = qdf_mem_malloc(sizeof(*oem_data_req));
Arif Hussain0ef77082018-10-10 16:42:53 -07003987 if (!oem_data_req)
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07003988 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003989
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07003990 oem_data_req->data_len = hdd_oem_req->data_len;
3991 oem_data_req->data = qdf_mem_malloc(oem_data_req->data_len);
Arif Hussain0ef77082018-10-10 16:42:53 -07003992 if (!oem_data_req->data)
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07003993 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003994
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07003995 qdf_mem_copy(oem_data_req->data, hdd_oem_req->data,
3996 oem_data_req->data_len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003997
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07003998 status = wma_start_oem_data_req(wma_handle, oem_data_req);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003999
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304000 if (!QDF_IS_STATUS_SUCCESS(status))
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07004001 sme_err("Post oem data request msg fail");
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304002 else
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07004003 sme_debug("OEM request(length: %d) sent to WMA",
4004 oem_data_req->data_len);
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07004005
4006 if (oem_data_req->data_len)
4007 qdf_mem_free(oem_data_req->data);
4008 qdf_mem_free(oem_data_req);
4009
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07004010 SME_EXIT();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004011 return status;
4012}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004013#endif /*FEATURE_OEM_DATA_SUPPORT */
4014
gaurank kathpalia78af1932018-10-27 20:33:10 +05304015#define STA_NSS_CHAINS_SHIFT 0
4016#define SAP_NSS_CHAINS_SHIFT 3
4017#define P2P_GO_NSS_CHAINS_SHIFT 6
4018#define P2P_CLI_CHAINS_SHIFT 9
gaurank kathpalia651abcd2018-11-12 22:41:23 +05304019#define TDLS_NSS_CHAINS_SHIFT 12
gaurank kathpalia78af1932018-10-27 20:33:10 +05304020#define IBSS_NSS_CHAINS_SHIFT 15
4021#define P2P_DEV_NSS_CHAINS_SHIFT 18
4022#define OCB_NSS_CHAINS_SHIFT 21
4023#define NAN_NSS_CHAIN_SHIFT 24
4024#define NSS_CHAIN_MASK 0x7
4025#define GET_VDEV_NSS_CHAIN(x, y) (((x) >> (y)) & NSS_CHAIN_MASK)
4026
4027static uint8_t sme_get_nss_chain_shift(enum QDF_OPMODE device_mode)
4028{
4029 switch (device_mode) {
4030 case QDF_STA_MODE:
4031 return STA_NSS_CHAINS_SHIFT;
4032 case QDF_SAP_MODE:
4033 return SAP_NSS_CHAINS_SHIFT;
4034 case QDF_P2P_GO_MODE:
4035 return P2P_GO_NSS_CHAINS_SHIFT;
4036 case QDF_P2P_CLIENT_MODE:
4037 return P2P_CLI_CHAINS_SHIFT;
4038 case QDF_IBSS_MODE:
4039 return IBSS_NSS_CHAINS_SHIFT;
4040 case QDF_P2P_DEVICE_MODE:
4041 return P2P_DEV_NSS_CHAINS_SHIFT;
4042 case QDF_OCB_MODE:
4043 return OCB_NSS_CHAINS_SHIFT;
gaurank kathpalia651abcd2018-11-12 22:41:23 +05304044 case QDF_TDLS_MODE:
4045 return TDLS_NSS_CHAINS_SHIFT;
gaurank kathpalia78af1932018-10-27 20:33:10 +05304046
4047 default:
4048 sme_err("Device mode %d invalid", device_mode);
4049 return STA_NSS_CHAINS_SHIFT;
4050 }
4051}
4052
4053static void
gaurank kathpaliacbf12122018-11-18 14:52:11 +05304054sme_check_nss_chain_ini_param(struct wlan_mlme_nss_chains *vdev_ini_cfg,
4055 uint8_t rf_chains_supported,
4056 enum nss_chains_band_info band)
4057{
4058 vdev_ini_cfg->rx_nss[band] = QDF_MIN(vdev_ini_cfg->rx_nss[band],
4059 rf_chains_supported);
4060 vdev_ini_cfg->tx_nss[band] = QDF_MIN(vdev_ini_cfg->tx_nss[band],
4061 rf_chains_supported);
4062}
4063
4064static void
gaurank kathpalia24ed0f42018-11-13 15:37:49 +05304065sme_fill_nss_chain_params(struct mac_context *mac_ctx,
gaurank kathpalia78af1932018-10-27 20:33:10 +05304066 struct wlan_mlme_nss_chains *vdev_ini_cfg,
4067 enum QDF_OPMODE device_mode,
4068 enum nss_chains_band_info band,
4069 uint8_t rf_chains_supported)
4070{
4071 uint8_t nss_chain_shift;
4072 uint8_t max_supported_nss;
4073 struct wlan_mlme_nss_chains *nss_chains_ini_cfg =
4074 &mac_ctx->mlme_cfg->nss_chains_ini_cfg;
4075
4076 nss_chain_shift = sme_get_nss_chain_shift(device_mode);
4077 max_supported_nss = mac_ctx->mlme_cfg->vht_caps.vht_cap_info.enable2x2 ?
4078 MAX_VDEV_NSS : 1;
4079
Nachiket Kukaded4d40bc2019-01-21 17:54:12 +05304080 /*
4081 * If target supports Antenna sharing, set NSS to 1 for 2.4GHz band for
4082 * NDI vdev.
4083 */
4084 if (device_mode == QDF_NDI_MODE && mac_ctx->lteCoexAntShare &&
4085 band == NSS_CHAINS_BAND_2GHZ)
4086 max_supported_nss = NSS_1x1_MODE;
4087
gaurank kathpalia78af1932018-10-27 20:33:10 +05304088 /* If the fw doesn't support two chains, num rf chains can max be 1 */
4089 vdev_ini_cfg->num_rx_chains[band] =
4090 QDF_MIN(GET_VDEV_NSS_CHAIN(
4091 nss_chains_ini_cfg->num_rx_chains[band],
4092 nss_chain_shift), rf_chains_supported);
4093
4094 vdev_ini_cfg->num_tx_chains[band] =
4095 QDF_MIN(GET_VDEV_NSS_CHAIN(
4096 nss_chains_ini_cfg->num_tx_chains[band],
4097 nss_chain_shift), rf_chains_supported);
4098
4099 /* If 2x2 mode is disabled, then max rx, tx nss can be 1 */
4100 vdev_ini_cfg->rx_nss[band] =
4101 QDF_MIN(GET_VDEV_NSS_CHAIN(
4102 nss_chains_ini_cfg->rx_nss[band],
4103 nss_chain_shift), max_supported_nss);
4104
4105 vdev_ini_cfg->tx_nss[band] =
4106 QDF_MIN(GET_VDEV_NSS_CHAIN(
4107 nss_chains_ini_cfg->tx_nss[band],
4108 nss_chain_shift), max_supported_nss);
4109
4110 vdev_ini_cfg->num_tx_chains_11a =
4111 QDF_MIN(GET_VDEV_NSS_CHAIN(
4112 nss_chains_ini_cfg->num_tx_chains_11a,
4113 nss_chain_shift), rf_chains_supported);
4114
4115 /* If the fw doesn't support two chains, num rf chains can max be 1 */
4116 vdev_ini_cfg->num_tx_chains_11b =
4117 QDF_MIN(GET_VDEV_NSS_CHAIN(
4118 nss_chains_ini_cfg->num_tx_chains_11b,
4119 nss_chain_shift), rf_chains_supported);
4120
4121 vdev_ini_cfg->num_tx_chains_11g =
4122 QDF_MIN(GET_VDEV_NSS_CHAIN(
4123 nss_chains_ini_cfg->num_tx_chains_11g,
4124 nss_chain_shift), rf_chains_supported);
4125
4126 vdev_ini_cfg->disable_rx_mrc[band] =
4127 nss_chains_ini_cfg->disable_rx_mrc[band];
4128
4129 vdev_ini_cfg->disable_tx_mrc[band] =
4130 nss_chains_ini_cfg->disable_tx_mrc[band];
gaurank kathpaliacbf12122018-11-18 14:52:11 +05304131 /*
4132 * Check whether the rx/tx nss is greater than the number of rf chains
4133 * supported by FW, if so downgrade the nss to the number of chains
4134 * supported, as higher nss cannot be supported with less chains.
4135 */
4136 sme_check_nss_chain_ini_param(vdev_ini_cfg, rf_chains_supported,
4137 band);
4138
gaurank kathpalia78af1932018-10-27 20:33:10 +05304139}
4140
4141void sme_populate_nss_chain_params(mac_handle_t mac_handle,
4142 struct wlan_mlme_nss_chains *vdev_ini_cfg,
4143 enum QDF_OPMODE device_mode,
4144 uint8_t rf_chains_supported)
4145{
gaurank kathpalia24ed0f42018-11-13 15:37:49 +05304146 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
gaurank kathpalia78af1932018-10-27 20:33:10 +05304147 enum nss_chains_band_info band;
4148
gaurank kathpaliab414bce2018-11-09 18:44:46 +05304149 for (band = NSS_CHAINS_BAND_2GHZ; band < NSS_CHAINS_BAND_MAX; band++)
gaurank kathpalia78af1932018-10-27 20:33:10 +05304150 sme_fill_nss_chain_params(mac_ctx, vdev_ini_cfg,
4151 device_mode, band,
4152 rf_chains_supported);
4153}
4154
gaurank kathpaliab414bce2018-11-09 18:44:46 +05304155void
4156sme_store_nss_chains_cfg_in_vdev(struct wlan_objmgr_vdev *vdev,
4157 struct wlan_mlme_nss_chains *vdev_ini_cfg)
4158{
4159 struct wlan_mlme_nss_chains *ini_cfg;
4160 struct wlan_mlme_nss_chains *dynamic_cfg;
4161
4162 ini_cfg = mlme_get_ini_vdev_config(vdev);
4163 dynamic_cfg = mlme_get_dynamic_vdev_config(vdev);
4164
4165 if (!ini_cfg || !dynamic_cfg) {
4166 sme_err("Nss chains ini/dynamic config NULL vdev_id %d",
4167 vdev->vdev_objmgr.vdev_id);
4168 return;
4169 }
4170
4171 *ini_cfg = *vdev_ini_cfg;
4172 *dynamic_cfg = *vdev_ini_cfg;
4173}
4174
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304175static void
4176sme_populate_user_config(struct wlan_mlme_nss_chains *dynamic_cfg,
4177 struct wlan_mlme_nss_chains *user_cfg,
4178 enum nss_chains_band_info band)
4179{
4180 if (!user_cfg->num_rx_chains[band])
4181 user_cfg->num_rx_chains[band] =
4182 dynamic_cfg->num_rx_chains[band];
4183
4184 if (!user_cfg->num_tx_chains[band])
4185 user_cfg->num_tx_chains[band] =
4186 dynamic_cfg->num_tx_chains[band];
4187
4188 if (!user_cfg->rx_nss[band])
4189 user_cfg->rx_nss[band] =
4190 dynamic_cfg->rx_nss[band];
4191
4192 if (!user_cfg->tx_nss[band])
4193 user_cfg->tx_nss[band] =
4194 dynamic_cfg->tx_nss[band];
4195
4196 if (!user_cfg->num_tx_chains_11a)
4197 user_cfg->num_tx_chains_11a =
4198 dynamic_cfg->num_tx_chains_11a;
4199
4200 if (!user_cfg->num_tx_chains_11b)
4201 user_cfg->num_tx_chains_11b =
4202 dynamic_cfg->num_tx_chains_11b;
4203
4204 if (!user_cfg->num_tx_chains_11g)
4205 user_cfg->num_tx_chains_11g =
4206 dynamic_cfg->num_tx_chains_11g;
4207
4208 if (!user_cfg->disable_rx_mrc[band])
4209 user_cfg->disable_rx_mrc[band] =
4210 dynamic_cfg->disable_rx_mrc[band];
4211
4212 if (!user_cfg->disable_tx_mrc[band])
4213 user_cfg->disable_tx_mrc[band] =
4214 dynamic_cfg->disable_tx_mrc[band];
4215}
4216
4217static QDF_STATUS
4218sme_validate_from_ini_config(struct wlan_mlme_nss_chains *user_cfg,
4219 struct wlan_mlme_nss_chains *ini_cfg,
4220 enum nss_chains_band_info band)
4221{
4222 if (user_cfg->num_rx_chains[band] >
4223 ini_cfg->num_rx_chains[band])
4224 return QDF_STATUS_E_FAILURE;
4225
4226 if (user_cfg->num_tx_chains[band] >
4227 ini_cfg->num_tx_chains[band])
4228 return QDF_STATUS_E_FAILURE;
4229
4230 if (user_cfg->rx_nss[band] >
4231 ini_cfg->rx_nss[band])
4232 return QDF_STATUS_E_FAILURE;
4233
4234 if (user_cfg->tx_nss[band] >
4235 ini_cfg->tx_nss[band])
4236 return QDF_STATUS_E_FAILURE;
4237
4238 if (user_cfg->num_tx_chains_11a >
4239 ini_cfg->num_tx_chains_11a)
4240 return QDF_STATUS_E_FAILURE;
4241
4242 if (user_cfg->num_tx_chains_11b >
4243 ini_cfg->num_tx_chains_11b)
4244 return QDF_STATUS_E_FAILURE;
4245
4246 if (user_cfg->num_tx_chains_11g >
4247 ini_cfg->num_tx_chains_11g)
4248 return QDF_STATUS_E_FAILURE;
4249
4250 return QDF_STATUS_SUCCESS;
4251}
4252
4253static QDF_STATUS
4254sme_validate_user_nss_chain_params(
4255 struct wlan_mlme_nss_chains *user_cfg,
4256 enum nss_chains_band_info band)
4257{
4258 /* Reject as 2x1 modes are not supported in chains yet */
4259
4260 if (user_cfg->num_tx_chains[band] >
4261 user_cfg->num_rx_chains[band])
4262 return QDF_STATUS_E_FAILURE;
4263
4264 /* Also if mode is 2x2, we cant have chains as 1x1, or 1x2, or 2x1 */
4265
4266 if (user_cfg->tx_nss[band] >
4267 user_cfg->num_tx_chains[band])
4268 user_cfg->num_tx_chains[band] =
4269 user_cfg->tx_nss[band];
4270
4271 if (user_cfg->rx_nss[band] >
4272 user_cfg->num_rx_chains[band])
4273 user_cfg->num_rx_chains[band] =
4274 user_cfg->rx_nss[band];
4275
4276 /*
4277 * It may happen that already chains are in 1x1 mode and nss too
4278 * is in 1x1 mode, but the tx 11a/b/g chains in user config comes
4279 * as 2x1, or 1x2 which cannot support respective mode, as tx chains
4280 * for respective band have max of 1x1 only, so these cannot exceed
4281 * respective band num tx chains.
4282 */
4283
4284 if (user_cfg->num_tx_chains_11a >
gaurank kathpaliab414bce2018-11-09 18:44:46 +05304285 user_cfg->num_tx_chains[NSS_CHAINS_BAND_5GHZ])
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304286 user_cfg->num_tx_chains_11a =
gaurank kathpaliab414bce2018-11-09 18:44:46 +05304287 user_cfg->num_tx_chains[NSS_CHAINS_BAND_5GHZ];
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304288
4289 if (user_cfg->num_tx_chains_11b >
gaurank kathpaliab414bce2018-11-09 18:44:46 +05304290 user_cfg->num_tx_chains[NSS_CHAINS_BAND_2GHZ])
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304291 user_cfg->num_tx_chains_11b =
gaurank kathpaliab414bce2018-11-09 18:44:46 +05304292 user_cfg->num_tx_chains[NSS_CHAINS_BAND_2GHZ];
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304293
4294 if (user_cfg->num_tx_chains_11g >
gaurank kathpaliab414bce2018-11-09 18:44:46 +05304295 user_cfg->num_tx_chains[NSS_CHAINS_BAND_2GHZ])
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304296 user_cfg->num_tx_chains_11g =
gaurank kathpaliab414bce2018-11-09 18:44:46 +05304297 user_cfg->num_tx_chains[NSS_CHAINS_BAND_2GHZ];
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304298
4299 return QDF_STATUS_SUCCESS;
4300}
4301
4302static QDF_STATUS
4303sme_validate_nss_chains_config(struct wlan_objmgr_vdev *vdev,
gaurank kathpaliadb87c0d2018-10-31 16:44:00 +05304304 struct wlan_mlme_nss_chains *user_cfg,
4305 struct wlan_mlme_nss_chains *dynamic_cfg)
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304306{
4307 enum nss_chains_band_info band;
4308 struct wlan_mlme_nss_chains *ini_cfg;
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304309 QDF_STATUS status;
4310
4311 ini_cfg = mlme_get_ini_vdev_config(vdev);
4312 if (!ini_cfg) {
4313 sme_err("nss chain ini config NULL");
4314 return QDF_STATUS_E_FAILURE;
4315 }
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304316
gaurank kathpaliab414bce2018-11-09 18:44:46 +05304317 for (band = NSS_CHAINS_BAND_2GHZ; band < NSS_CHAINS_BAND_MAX; band++) {
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304318 sme_populate_user_config(dynamic_cfg,
4319 user_cfg, band);
4320 status = sme_validate_from_ini_config(user_cfg,
4321 ini_cfg,
4322 band);
4323 if (QDF_IS_STATUS_ERROR(status)) {
4324 sme_err("Validation from ini config failed");
4325 return QDF_STATUS_E_FAILURE;
4326 }
4327 status = sme_validate_user_nss_chain_params(user_cfg,
4328 band);
4329 if (QDF_IS_STATUS_ERROR(status)) {
4330 sme_err("User cfg validation failed");
4331 return QDF_STATUS_E_FAILURE;
4332 }
4333 }
4334
4335 return QDF_STATUS_SUCCESS;
4336}
4337
gaurank kathpaliafa7ad0a2019-03-12 19:17:56 +05304338static bool
4339sme_is_nss_update_allowed(struct wlan_mlme_chain_cfg chain_cfg,
4340 uint8_t rx_nss, uint8_t tx_nss,
4341 enum nss_chains_band_info band)
4342{
4343 switch (band) {
4344 case NSS_CHAINS_BAND_2GHZ:
4345 if (rx_nss > chain_cfg.max_rx_chains_2g)
4346 return false;
4347 if (tx_nss > chain_cfg.max_tx_chains_2g)
4348 return false;
4349 break;
4350 case NSS_CHAINS_BAND_5GHZ:
4351 if (rx_nss > chain_cfg.max_rx_chains_5g)
4352 return false;
4353 if (tx_nss > chain_cfg.max_tx_chains_5g)
4354 return false;
4355 break;
4356 default:
4357 sme_err("Unknown Band nss change not allowed");
4358 return false;
4359 }
4360 return true;
4361}
4362
4363static void sme_modify_chains_in_mlme_cfg(mac_handle_t mac_handle,
4364 uint8_t rx_chains,
4365 uint8_t tx_chains,
4366 enum QDF_OPMODE vdev_op_mode,
4367 enum nss_chains_band_info band)
gaurank kathpalia6c4b50c2019-02-28 14:07:48 +05304368{
4369 uint8_t nss_shift;
4370 uint32_t nss_mask = 0x7;
4371 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
4372
4373 nss_shift = sme_get_nss_chain_shift(vdev_op_mode);
4374
gaurank kathpaliafa7ad0a2019-03-12 19:17:56 +05304375 mac_ctx->mlme_cfg->nss_chains_ini_cfg.num_rx_chains[band] &=
4376 ~(nss_mask << nss_shift);
4377 mac_ctx->mlme_cfg->nss_chains_ini_cfg.num_rx_chains[band] |=
4378 (rx_chains << nss_shift);
4379 mac_ctx->mlme_cfg->nss_chains_ini_cfg.num_tx_chains[band] &=
4380 ~(nss_mask << nss_shift);
4381 mac_ctx->mlme_cfg->nss_chains_ini_cfg.num_tx_chains[band] |=
4382 (tx_chains << nss_shift);
4383 sme_debug("rx chains %d tx chains %d changed for vdev mode %d for band %d",
4384 rx_chains, tx_chains, vdev_op_mode, band);
4385}
4386
4387static void
4388sme_modify_nss_in_mlme_cfg(mac_handle_t mac_handle,
4389 uint8_t rx_nss, uint8_t tx_nss,
4390 enum QDF_OPMODE vdev_op_mode,
4391 enum nss_chains_band_info band)
4392{
4393 uint8_t nss_shift;
4394 uint32_t nss_mask = 0x7;
4395 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
4396
4397 if (!sme_is_nss_update_allowed(mac_ctx->fw_chain_cfg, rx_nss, tx_nss,
4398 band)) {
4399 sme_debug("Nss modification failed, fw doesn't support this nss %d",
4400 rx_nss);
4401 return;
4402 }
4403
4404 nss_shift = sme_get_nss_chain_shift(vdev_op_mode);
4405
gaurank kathpalia6c4b50c2019-02-28 14:07:48 +05304406 mac_ctx->mlme_cfg->nss_chains_ini_cfg.rx_nss[band] &=
4407 ~(nss_mask << nss_shift);
4408 mac_ctx->mlme_cfg->nss_chains_ini_cfg.rx_nss[band] |=
4409 (rx_nss << nss_shift);
4410 mac_ctx->mlme_cfg->nss_chains_ini_cfg.tx_nss[band] &=
4411 ~(nss_mask << nss_shift);
4412 mac_ctx->mlme_cfg->nss_chains_ini_cfg.tx_nss[band] |=
4413 (tx_nss << nss_shift);
4414 sme_debug("rx nss %d tx nss %d changed for vdev mode %d for band %d",
4415 rx_nss, tx_nss, vdev_op_mode, band);
4416}
4417
4418void
gaurank kathpaliafa7ad0a2019-03-12 19:17:56 +05304419sme_modify_nss_chains_tgt_cfg(mac_handle_t mac_handle,
4420 enum QDF_OPMODE vdev_op_mode,
4421 enum nss_chains_band_info band)
4422{
4423 uint8_t ini_rx_nss;
4424 uint8_t ini_tx_nss;
4425 uint8_t max_supported_rx_nss = MAX_VDEV_NSS;
4426 uint8_t max_supported_tx_nss = MAX_VDEV_NSS;
4427 uint8_t ini_rx_chains;
4428 uint8_t ini_tx_chains;
4429 uint8_t max_supported_rx_chains = MAX_VDEV_CHAINS;
4430 uint8_t max_supported_tx_chains = MAX_VDEV_CHAINS;
4431
4432 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
4433 struct wlan_mlme_nss_chains *nss_chains_ini_cfg =
4434 &mac_ctx->mlme_cfg->nss_chains_ini_cfg;
4435 uint8_t nss_shift = sme_get_nss_chain_shift(vdev_op_mode);
4436 struct wlan_mlme_chain_cfg chain_cfg = mac_ctx->fw_chain_cfg;
4437
4438 ini_rx_nss = GET_VDEV_NSS_CHAIN(nss_chains_ini_cfg->rx_nss[band],
4439 nss_shift);
4440 ini_tx_nss = GET_VDEV_NSS_CHAIN(nss_chains_ini_cfg->tx_nss[band],
4441 nss_shift);
4442
4443 if (band == NSS_CHAINS_BAND_2GHZ) {
4444 max_supported_rx_nss = chain_cfg.max_rx_chains_2g;
4445 max_supported_tx_nss = chain_cfg.max_tx_chains_2g;
4446 } else if (band == NSS_CHAINS_BAND_5GHZ) {
4447 max_supported_rx_nss = chain_cfg.max_rx_chains_5g;
4448 max_supported_tx_nss = chain_cfg.max_tx_chains_5g;
4449 }
4450
4451 max_supported_rx_nss = QDF_MIN(ini_rx_nss, max_supported_rx_nss);
gaurank kathpalia23afef12019-04-04 12:39:59 +05304452 if (!max_supported_rx_nss)
4453 return;
4454
gaurank kathpaliafa7ad0a2019-03-12 19:17:56 +05304455 max_supported_tx_nss = QDF_MIN(ini_tx_nss, max_supported_tx_nss);
gaurank kathpalia23afef12019-04-04 12:39:59 +05304456 if (!max_supported_tx_nss)
4457 return;
gaurank kathpaliafa7ad0a2019-03-12 19:17:56 +05304458
4459 ini_rx_chains = GET_VDEV_NSS_CHAIN(nss_chains_ini_cfg->
4460 num_rx_chains[band],
4461 nss_shift);
4462 ini_tx_chains = GET_VDEV_NSS_CHAIN(nss_chains_ini_cfg->
4463 num_tx_chains[band],
4464 nss_shift);
4465
4466 if (band == NSS_CHAINS_BAND_2GHZ) {
4467 max_supported_rx_chains = chain_cfg.max_rx_chains_2g;
4468 max_supported_tx_chains = chain_cfg.max_tx_chains_2g;
4469 } else if (band == NSS_CHAINS_BAND_5GHZ) {
4470 max_supported_rx_chains = chain_cfg.max_rx_chains_5g;
4471 max_supported_tx_chains = chain_cfg.max_tx_chains_5g;
4472 }
4473
4474 max_supported_rx_chains = QDF_MIN(ini_rx_chains,
4475 max_supported_rx_chains);
gaurank kathpalia23afef12019-04-04 12:39:59 +05304476 if (!max_supported_rx_chains)
4477 return;
4478
gaurank kathpaliafa7ad0a2019-03-12 19:17:56 +05304479 max_supported_tx_chains = QDF_MIN(ini_tx_chains,
4480 max_supported_tx_chains);
gaurank kathpalia23afef12019-04-04 12:39:59 +05304481 if (!max_supported_tx_chains)
4482 return;
gaurank kathpaliafa7ad0a2019-03-12 19:17:56 +05304483
4484 sme_modify_chains_in_mlme_cfg(mac_handle, max_supported_rx_chains,
4485 max_supported_tx_chains, vdev_op_mode,
4486 band);
4487 sme_modify_nss_in_mlme_cfg(mac_handle, max_supported_rx_nss,
4488 max_supported_tx_nss, vdev_op_mode, band);
4489}
4490
4491void
4492sme_update_nss_in_mlme_cfg(mac_handle_t mac_handle,
4493 uint8_t rx_nss, uint8_t tx_nss,
4494 enum QDF_OPMODE vdev_op_mode,
4495 enum nss_chains_band_info band)
gaurank kathpalia6c4b50c2019-02-28 14:07:48 +05304496{
4497 /*
4498 * If device mode is P2P-DEVICE, then we want P2P to come in that
4499 * particular nss, then we should change the nss of P@P-CLI, and GO
4500 * and we are unaware that for what will be the device mode after
4501 * negotiation yet.
4502 */
4503
4504 if (vdev_op_mode == QDF_P2P_DEVICE_MODE ||
4505 vdev_op_mode == QDF_P2P_CLIENT_MODE ||
4506 vdev_op_mode == QDF_P2P_GO_MODE) {
gaurank kathpaliafa7ad0a2019-03-12 19:17:56 +05304507 sme_modify_nss_in_mlme_cfg(mac_handle, rx_nss, tx_nss,
4508 QDF_P2P_CLIENT_MODE, band);
4509 sme_modify_nss_in_mlme_cfg(mac_handle, rx_nss, tx_nss,
4510 QDF_P2P_GO_MODE, band);
4511 sme_modify_nss_in_mlme_cfg(mac_handle, rx_nss, tx_nss,
4512 QDF_P2P_DEVICE_MODE, band);
gaurank kathpalia6c4b50c2019-02-28 14:07:48 +05304513 } else
gaurank kathpaliafa7ad0a2019-03-12 19:17:56 +05304514 sme_modify_nss_in_mlme_cfg(mac_handle, rx_nss, tx_nss,
4515 vdev_op_mode, band);
gaurank kathpalia6c4b50c2019-02-28 14:07:48 +05304516}
4517
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304518QDF_STATUS
4519sme_nss_chains_update(mac_handle_t mac_handle,
4520 struct wlan_mlme_nss_chains *user_cfg,
4521 uint8_t vdev_id)
4522{
gaurank kathpalia24ed0f42018-11-13 15:37:49 +05304523 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304524 QDF_STATUS status;
gaurank kathpaliadb87c0d2018-10-31 16:44:00 +05304525 struct wlan_mlme_nss_chains *dynamic_cfg;
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304526 struct wlan_objmgr_vdev *vdev =
4527 wlan_objmgr_get_vdev_by_id_from_psoc(mac_ctx->psoc,
4528 vdev_id,
4529 WLAN_LEGACY_SME_ID);
4530 if (!vdev) {
4531 sme_err("Got NULL vdev obj, returning");
4532 return QDF_STATUS_E_FAILURE;
4533 }
gaurank kathpaliadb87c0d2018-10-31 16:44:00 +05304534
gaurank kathpalia748c7272018-10-24 22:05:15 +05304535 status = sme_acquire_global_lock(&mac_ctx->sme);
4536 if (QDF_IS_STATUS_ERROR(status))
4537 goto release_ref;
4538
gaurank kathpaliadb87c0d2018-10-31 16:44:00 +05304539 dynamic_cfg = mlme_get_dynamic_vdev_config(vdev);
4540 if (!dynamic_cfg) {
4541 sme_err("nss chain dynamic config NULL");
4542 status = QDF_STATUS_E_FAILURE;
4543 goto release_lock;
4544 }
4545
4546 status = sme_validate_nss_chains_config(vdev, user_cfg,
4547 dynamic_cfg);
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304548 if (QDF_IS_STATUS_ERROR(status))
gaurank kathpalia748c7272018-10-24 22:05:15 +05304549 goto release_lock;
gaurank kathpaliadb87c0d2018-10-31 16:44:00 +05304550
4551 if (!qdf_mem_cmp(dynamic_cfg, user_cfg,
4552 sizeof(struct wlan_mlme_nss_chains))) {
4553 sme_debug("current config same as user config");
4554 status = QDF_STATUS_SUCCESS;
4555 goto release_lock;
4556 }
gaurank kathpalia748c7272018-10-24 22:05:15 +05304557 sme_debug("User params verified, sending to fw vdev id %d", vdev_id);
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304558
gaurank kathpalia748c7272018-10-24 22:05:15 +05304559 status = wma_vdev_nss_chain_params_send(vdev->vdev_objmgr.vdev_id,
4560 user_cfg);
4561 if (QDF_IS_STATUS_ERROR(status)) {
4562 sme_err("params sent failed to fw vdev id %d", vdev_id);
4563 goto release_lock;
4564 }
4565
gaurank kathpaliab414bce2018-11-09 18:44:46 +05304566 *dynamic_cfg = *user_cfg;
gaurank kathpaliadb87c0d2018-10-31 16:44:00 +05304567
gaurank kathpalia748c7272018-10-24 22:05:15 +05304568release_lock:
4569 sme_release_global_lock(&mac_ctx->sme);
4570
4571release_ref:
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304572 wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_SME_ID);
4573 return status;
4574}
4575
Jeff Johnsonc7309062018-11-09 20:59:42 -08004576QDF_STATUS sme_open_session(mac_handle_t mac_handle,
4577 struct sme_session_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004578{
Arif Hussainee677012017-01-26 17:50:13 -08004579 QDF_STATUS status = QDF_STATUS_E_INVAL;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08004580 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Arif Hussainee677012017-01-26 17:50:13 -08004581 struct cdp_pdev *pdev;
4582 ol_txrx_peer_handle peer;
4583 uint8_t peer_id;
Krishna Kumaar Natarajanb9e1d712017-06-20 17:14:37 -07004584 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004585
Abhishek Singhe4a1f882017-08-10 17:59:44 +05304586 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_DEBUG,
Rajeev Kumar7414c8c2017-04-06 15:42:52 -07004587 "%s: type=%d, session_id %d subType=%d addr:%pM",
Krunal Soni8d184fa2017-11-20 21:52:05 -08004588 __func__, params->type_of_persona,
4589 params->sme_session_id, params->subtype_of_persona,
4590 params->self_mac_addr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004591
Arif Hussainee677012017-01-26 17:50:13 -08004592 pdev = cds_get_context(QDF_MODULE_ID_TXRX);
4593
Jeff Johnson038efe72019-03-18 13:39:31 -07004594 if (!pdev) {
Arif Hussainee677012017-01-26 17:50:13 -08004595 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
4596 "%s: Failed to get pdev handler", __func__);
4597 return status;
4598 }
4599
Krunal Soni8d184fa2017-11-20 21:52:05 -08004600 status = sme_acquire_global_lock(&mac_ctx->sme);
Dustin Brownd28772b2017-03-17 14:16:07 -07004601 if (QDF_IS_STATUS_ERROR(status))
4602 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004603
Krunal Soni8d184fa2017-11-20 21:52:05 -08004604 peer = cdp_peer_find_by_addr(soc, pdev, params->self_mac_addr,
4605 &peer_id);
Arif Hussainee677012017-01-26 17:50:13 -08004606 if (peer) {
4607 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
4608 "%s: Peer=%d exist with same MAC",
4609 __func__, peer_id);
4610 status = QDF_STATUS_E_INVAL;
4611 } else {
Krunal Soni8d184fa2017-11-20 21:52:05 -08004612 status = csr_roam_open_session(mac_ctx, params);
Arif Hussainee677012017-01-26 17:50:13 -08004613 }
Krunal Soni8d184fa2017-11-20 21:52:05 -08004614 sme_release_global_lock(&mac_ctx->sme);
Dustin Brownd28772b2017-03-17 14:16:07 -07004615
4616 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_RX_HDD_OPEN_SESSION,
Krunal Soni8d184fa2017-11-20 21:52:05 -08004617 params->sme_session_id, 0));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004618
4619 return status;
4620}
4621
Jeff Johnsonc7309062018-11-09 20:59:42 -08004622QDF_STATUS sme_close_session(mac_handle_t mac_handle, uint8_t session_id)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004623{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304624 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08004625 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004626
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304627 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Krunal Soni8d184fa2017-11-20 21:52:05 -08004628 TRACE_CODE_SME_RX_HDD_CLOSE_SESSION, session_id, 0));
Jeff Johnson01f2c232018-11-21 19:17:44 -08004629 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304630 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08004631 status = csr_roam_close_session(mac, session_id, false);
4632 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004633 }
4634
4635 return status;
4636}
4637
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304638/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304639 * sme_change_mcc_beacon_interval() -
4640 * To update P2P-GO beaconInterval. This function should be called after
4641 * disassociating all the station is done
4642 * This is an asynchronous API.
4643 *
4644 * @sessionId: Session Identifier
4645 * Return QDF_STATUS SUCCESS
4646 * FAILURE or RESOURCES
4647 * The API finished and failed.
4648 */
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07004649QDF_STATUS sme_change_mcc_beacon_interval(uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004650{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304651 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08004652 struct mac_context *mac_ctx = sme_get_mac_context();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004653
Krunal Soni3fa80e22018-01-09 14:16:02 -08004654 if (!mac_ctx) {
4655 sme_err("mac_ctx is NULL");
4656 return status;
4657 }
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07004658 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304659 if (QDF_IS_STATUS_SUCCESS(status)) {
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07004660 status = csr_send_chng_mcc_beacon_interval(mac_ctx,
4661 sessionId);
4662 sme_release_global_lock(&mac_ctx->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004663 }
4664 return status;
4665}
4666
4667/**
4668 * sme_set_host_offload(): API to set the host offload feature.
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004669 * @mac_handle: The handle returned by mac_open.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004670 * @sessionId: Session Identifier
4671 * @request: Pointer to the offload request.
4672 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304673 * Return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004674 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004675QDF_STATUS sme_set_host_offload(mac_handle_t mac_handle, uint8_t sessionId,
Jeff Johnsond6fda812019-02-06 21:54:23 -08004676 struct sir_host_offload_req *request)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004677{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08004678 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304679 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004680
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304681 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004682 TRACE_CODE_SME_RX_HDD_SET_HOSTOFFLOAD, sessionId, 0));
Jeff Johnson01f2c232018-11-21 19:17:44 -08004683 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304684 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004685#ifdef WLAN_NS_OFFLOAD
4686 if (SIR_IPV6_NS_OFFLOAD == request->offloadType) {
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004687 status = sme_set_ps_ns_offload(mac_handle, request,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004688 sessionId);
4689 } else
4690#endif /* WLAN_NS_OFFLOAD */
4691 {
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004692 status = sme_set_ps_host_offload(mac_handle, request,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004693 sessionId);
4694 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08004695 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004696 }
4697
4698 return status;
4699}
4700
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304701/*
4702 * sme_set_keep_alive() -
4703 * API to set the Keep Alive feature.
4704 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004705 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304706 * request - Pointer to the Keep Alive request.
4707 * Return QDF_STATUS
4708 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004709QDF_STATUS sme_set_keep_alive(mac_handle_t mac_handle, uint8_t session_id,
Jeff Johnson562ccad2019-02-06 22:10:24 -08004710 struct keep_alive_req *request)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004711{
Jeff Johnson562ccad2019-02-06 22:10:24 -08004712 struct keep_alive_req *request_buf;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07004713 struct scheduler_msg msg = {0};
Jeff Johnson0a8786a2018-12-02 10:49:01 -08004714 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Jeff Johnson01f2c232018-11-21 19:17:44 -08004715 struct csr_roam_session *pSession = CSR_GET_SESSION(mac, session_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004716
Abhishek Singhe4a1f882017-08-10 17:59:44 +05304717 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004718 FL("WMA_SET_KEEP_ALIVE message"));
4719
Jeff Johnson038efe72019-03-18 13:39:31 -07004720 if (!pSession) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304721 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004722 FL("Session not Found"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304723 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004724 }
Jeff Johnson562ccad2019-02-06 22:10:24 -08004725 request_buf = qdf_mem_malloc(sizeof(*request_buf));
Arif Hussain0ef77082018-10-10 16:42:53 -07004726 if (!request_buf)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304727 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004728
Anurag Chouhanc5548422016-02-24 18:33:27 +05304729 qdf_copy_macaddr(&request->bssid, &pSession->connectedProfile.bssid);
Jeff Johnson562ccad2019-02-06 22:10:24 -08004730 qdf_mem_copy(request_buf, request, sizeof(*request_buf));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004731
Abhishek Singhe4a1f882017-08-10 17:59:44 +05304732 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004733 "buff TP %d input TP %d ", request_buf->timePeriod,
4734 request->timePeriod);
4735 request_buf->sessionId = session_id;
4736
4737 msg.type = WMA_SET_KEEP_ALIVE;
4738 msg.reserved = 0;
4739 msg.bodyptr = request_buf;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05304740 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
4741 session_id, msg.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304742 if (QDF_STATUS_SUCCESS !=
gaurank kathpalia36b0c582018-08-28 17:45:43 +05304743 scheduler_post_message(QDF_MODULE_ID_SME,
4744 QDF_MODULE_ID_WMA,
4745 QDF_MODULE_ID_WMA, &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304746 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304747 "Not able to post WMA_SET_KEEP_ALIVE message to WMA");
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304748 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304749 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004750 }
4751
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304752 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004753}
4754
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304755/*
4756 * sme_get_operation_channel() -
4757 * API to get current channel on which STA is parked his function gives
4758 * channel information only of infra station or IBSS station
4759 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004760 * mac_handle, pointer to memory location and sessionId
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304761 * Returns QDF_STATUS_SUCCESS
4762 * QDF_STATUS_E_FAILURE
4763 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004764QDF_STATUS sme_get_operation_channel(mac_handle_t mac_handle,
4765 uint32_t *pChannel,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004766 uint8_t sessionId)
4767{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08004768 struct mac_context *mac = MAC_CONTEXT(mac_handle);
gaurank kathpalia14e2f912017-08-31 14:51:45 +05304769 struct csr_roam_session *pSession;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004770
Jeff Johnson01f2c232018-11-21 19:17:44 -08004771 if (CSR_IS_SESSION_VALID(mac, sessionId)) {
4772 pSession = CSR_GET_SESSION(mac, sessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004773
4774 if ((pSession->connectedProfile.BSSType ==
4775 eCSR_BSS_TYPE_INFRASTRUCTURE)
4776 || (pSession->connectedProfile.BSSType ==
4777 eCSR_BSS_TYPE_IBSS)
4778 || (pSession->connectedProfile.BSSType ==
4779 eCSR_BSS_TYPE_INFRA_AP)
4780 || (pSession->connectedProfile.BSSType ==
4781 eCSR_BSS_TYPE_START_IBSS)) {
4782 *pChannel = pSession->connectedProfile.operationChannel;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304783 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004784 }
4785 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304786 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004787} /* sme_get_operation_channel ends here */
4788
Abhishek Singh7996eb72015-12-30 17:24:02 +05304789/**
4790 * sme_register_mgmt_frame_ind_callback() - Register a callback for
4791 * management frame indication to PE.
4792 *
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08004793 * @mac_handle: Opaque handle to the global MAC context
Abhishek Singh7996eb72015-12-30 17:24:02 +05304794 * @callback: callback pointer to be registered
4795 *
4796 * This function is used to register a callback for management
4797 * frame indication to PE.
4798 *
4799 * Return: Success if msg is posted to PE else Failure.
4800 */
Jeff Johnsonc7309062018-11-09 20:59:42 -08004801QDF_STATUS sme_register_mgmt_frame_ind_callback(mac_handle_t mac_handle,
Abhishek Singh7996eb72015-12-30 17:24:02 +05304802 sir_mgmt_frame_ind_callback callback)
4803{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08004804 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Abhishek Singh7996eb72015-12-30 17:24:02 +05304805 struct sir_sme_mgmt_frame_cb_req *msg;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304806 QDF_STATUS status = QDF_STATUS_SUCCESS;
Abhishek Singh7996eb72015-12-30 17:24:02 +05304807
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304808 if (QDF_STATUS_SUCCESS ==
Abhishek Singh7996eb72015-12-30 17:24:02 +05304809 sme_acquire_global_lock(&mac_ctx->sme)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304810 msg = qdf_mem_malloc(sizeof(*msg));
Arif Hussain0ef77082018-10-10 16:42:53 -07004811 if (!msg) {
Abhishek Singh7996eb72015-12-30 17:24:02 +05304812 sme_release_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304813 return QDF_STATUS_E_NOMEM;
Abhishek Singh7996eb72015-12-30 17:24:02 +05304814 }
Abhishek Singh7996eb72015-12-30 17:24:02 +05304815 msg->message_type = eWNI_SME_REGISTER_MGMT_FRAME_CB;
4816 msg->length = sizeof(*msg);
4817
4818 msg->callback = callback;
Rajeev Kumard138ac52017-01-30 18:38:37 -08004819 status = umac_send_mb_message_to_mac(msg);
Abhishek Singh7996eb72015-12-30 17:24:02 +05304820 sme_release_global_lock(&mac_ctx->sme);
4821 return status;
4822 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304823 return QDF_STATUS_E_FAILURE;
Abhishek Singh7996eb72015-12-30 17:24:02 +05304824}
4825
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304826/*
4827 * sme_RegisterMgtFrame() -
Jeff Johnson698eacd2018-05-12 17:00:03 -07004828 * To register management frame of specified type and subtype.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304829 *
4830 * frameType - type of the frame that needs to be passed to HDD.
4831 * matchData - data which needs to be matched before passing frame
4832 * to HDD.
4833 * matchDataLen - Length of matched data.
4834 * Return QDF_STATUS
4835 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004836QDF_STATUS sme_register_mgmt_frame(mac_handle_t mac_handle, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004837 uint16_t frameType, uint8_t *matchData,
4838 uint16_t matchLen)
4839{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304840 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08004841 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004842
Jeff Johnson01f2c232018-11-21 19:17:44 -08004843 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304844 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson78f7a182019-02-01 22:45:41 -08004845 struct register_mgmt_frame *pMsg;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004846 uint16_t len;
Jeff Johnson01f2c232018-11-21 19:17:44 -08004847 struct csr_roam_session *pSession = CSR_GET_SESSION(mac,
gaurank kathpalia14e2f912017-08-31 14:51:45 +05304848 sessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004849
4850 if (!CSR_IS_SESSION_ANY(sessionId) && !pSession) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07004851 sme_err("Session %d not found", sessionId);
Jeff Johnson01f2c232018-11-21 19:17:44 -08004852 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304853 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004854 }
4855
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304856 if (!CSR_IS_SESSION_ANY(sessionId) &&
4857 !pSession->sessionActive) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304858 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004859 "%s Invalid Sessionid", __func__);
Jeff Johnson01f2c232018-11-21 19:17:44 -08004860 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304861 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004862 }
4863
Jeff Johnson78f7a182019-02-01 22:45:41 -08004864 len = sizeof(*pMsg) + matchLen;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004865
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304866 pMsg = qdf_mem_malloc(len);
Jeff Johnson038efe72019-03-18 13:39:31 -07004867 if (!pMsg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304868 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004869 else {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004870 pMsg->messageType = eWNI_SME_REGISTER_MGMT_FRAME_REQ;
4871 pMsg->length = len;
4872 pMsg->sessionId = sessionId;
4873 pMsg->registerFrame = true;
4874 pMsg->frameType = frameType;
4875 pMsg->matchLen = matchLen;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304876 qdf_mem_copy(pMsg->matchData, matchData, matchLen);
Rajeev Kumard138ac52017-01-30 18:38:37 -08004877 status = umac_send_mb_message_to_mac(pMsg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004878 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08004879 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004880 }
4881 return status;
4882}
4883
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304884/*
4885 * sme_DeregisterMgtFrame() -
Jeff Johnson698eacd2018-05-12 17:00:03 -07004886 * To De-register management frame of specified type and subtype.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304887 *
4888 * frameType - type of the frame that needs to be passed to HDD.
4889 * matchData - data which needs to be matched before passing frame
4890 * to HDD.
4891 * matchDataLen - Length of matched data.
4892 * Return QDF_STATUS
4893 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004894QDF_STATUS sme_deregister_mgmt_frame(mac_handle_t mac_handle, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004895 uint16_t frameType, uint8_t *matchData,
4896 uint16_t matchLen)
4897{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304898 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08004899 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004900
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304901 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004902 TRACE_CODE_SME_RX_HDD_DEREGISTER_MGMTFR, sessionId,
4903 0));
Jeff Johnson01f2c232018-11-21 19:17:44 -08004904 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304905 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson78f7a182019-02-01 22:45:41 -08004906 struct register_mgmt_frame *pMsg;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004907 uint16_t len;
Jeff Johnson01f2c232018-11-21 19:17:44 -08004908 struct csr_roam_session *pSession = CSR_GET_SESSION(mac,
gaurank kathpalia14e2f912017-08-31 14:51:45 +05304909 sessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004910
4911 if (!CSR_IS_SESSION_ANY(sessionId) && !pSession) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07004912 sme_err("Session %d not found", sessionId);
Jeff Johnson01f2c232018-11-21 19:17:44 -08004913 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304914 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004915 }
4916
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304917 if (!CSR_IS_SESSION_ANY(sessionId) &&
4918 !pSession->sessionActive) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304919 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004920 "%s Invalid Sessionid", __func__);
Jeff Johnson01f2c232018-11-21 19:17:44 -08004921 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304922 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004923 }
4924
Jeff Johnson78f7a182019-02-01 22:45:41 -08004925 len = sizeof(*pMsg) + matchLen;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004926
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304927 pMsg = qdf_mem_malloc(len);
Jeff Johnson038efe72019-03-18 13:39:31 -07004928 if (!pMsg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304929 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004930 else {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004931 pMsg->messageType = eWNI_SME_REGISTER_MGMT_FRAME_REQ;
4932 pMsg->length = len;
4933 pMsg->registerFrame = false;
4934 pMsg->frameType = frameType;
4935 pMsg->matchLen = matchLen;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304936 qdf_mem_copy(pMsg->matchData, matchData, matchLen);
Rajeev Kumard138ac52017-01-30 18:38:37 -08004937 status = umac_send_mb_message_to_mac(pMsg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004938 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08004939 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004940 }
4941 return status;
4942}
4943
Padma, Santhosh Kumar22c462c2018-01-16 17:56:44 +05304944/**
4945 * sme_prepare_mgmt_tx() - Prepares mgmt frame
Jeff Johnsonc7309062018-11-09 20:59:42 -08004946 * @mac_handle: The handle returned by mac_open
Padma, Santhosh Kumar22c462c2018-01-16 17:56:44 +05304947 * @session_id: session id
4948 * @buf: pointer to frame
4949 * @len: frame length
4950 *
4951 * Return: QDF_STATUS
4952 */
Jeff Johnsonc7309062018-11-09 20:59:42 -08004953static QDF_STATUS sme_prepare_mgmt_tx(mac_handle_t mac_handle,
4954 uint8_t session_id,
4955 const uint8_t *buf, uint32_t len)
Padma, Santhosh Kumar22c462c2018-01-16 17:56:44 +05304956{
4957 QDF_STATUS status = QDF_STATUS_SUCCESS;
4958 struct sir_mgmt_msg *msg;
4959 uint16_t msg_len;
4960 struct scheduler_msg sch_msg = {0};
4961
4962 sme_debug("prepares auth frame");
4963
4964 msg_len = sizeof(*msg) + len;
4965 msg = qdf_mem_malloc(msg_len);
Jeff Johnson038efe72019-03-18 13:39:31 -07004966 if (!msg) {
Padma, Santhosh Kumar22c462c2018-01-16 17:56:44 +05304967 status = QDF_STATUS_E_NOMEM;
4968 } else {
4969 msg->type = eWNI_SME_SEND_MGMT_FRAME_TX;
4970 msg->msg_len = msg_len;
4971 msg->session_id = session_id;
4972 msg->data = (uint8_t *)msg + sizeof(*msg);
4973 qdf_mem_copy(msg->data, buf, len);
4974
4975 sch_msg.type = eWNI_SME_SEND_MGMT_FRAME_TX;
4976 sch_msg.bodyptr = msg;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05304977 status = scheduler_post_message(QDF_MODULE_ID_SME,
4978 QDF_MODULE_ID_PE,
4979 QDF_MODULE_ID_PE, &sch_msg);
Padma, Santhosh Kumar22c462c2018-01-16 17:56:44 +05304980 }
4981 return status;
4982}
4983
Jeff Johnsonc7309062018-11-09 20:59:42 -08004984QDF_STATUS sme_send_mgmt_tx(mac_handle_t mac_handle, uint8_t session_id,
4985 const uint8_t *buf, uint32_t len)
Padma, Santhosh Kumar22c462c2018-01-16 17:56:44 +05304986{
4987 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08004988 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Padma, Santhosh Kumar22c462c2018-01-16 17:56:44 +05304989
Padma, Santhosh Kumar22c462c2018-01-16 17:56:44 +05304990 status = sme_acquire_global_lock(&mac->sme);
4991 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnsonc7309062018-11-09 20:59:42 -08004992 status = sme_prepare_mgmt_tx(mac_handle, session_id, buf, len);
Padma, Santhosh Kumar22c462c2018-01-16 17:56:44 +05304993 sme_release_global_lock(&mac->sme);
4994 }
4995
4996 return status;
4997}
4998
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004999#ifdef WLAN_FEATURE_EXTWOW_SUPPORT
Krishna Kumaar Natarajand9131902015-10-19 11:52:47 -07005000/**
5001 * sme_configure_ext_wow() - configure Extr WoW
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005002 * @mac_handle - The handle returned by mac_open.
Krishna Kumaar Natarajand9131902015-10-19 11:52:47 -07005003 * @wlanExtParams - Depicts the wlan Ext params.
5004 * @callback - ext_wow callback to be registered.
5005 * @callback_context - ext_wow callback context
5006 *
5007 * SME will pass this request to lower mac to configure Extr WoW
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305008 * Return: QDF_STATUS
Krishna Kumaar Natarajand9131902015-10-19 11:52:47 -07005009 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005010QDF_STATUS sme_configure_ext_wow(mac_handle_t mac_handle,
5011 tpSirExtWoWParams wlanExtParams,
5012 csr_readyToExtWoWCallback callback,
5013 void *callback_context)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005014{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305015 QDF_STATUS status = QDF_STATUS_SUCCESS;
5016 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005017 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07005018 struct scheduler_msg message = {0};
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305019 tpSirExtWoWParams MsgPtr = qdf_mem_malloc(sizeof(*MsgPtr));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005020
5021 if (!MsgPtr)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305022 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005023
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305024 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005025 TRACE_CODE_SME_RX_HDD_CONFIG_EXTWOW, NO_SESSION, 0));
5026
Jeff Johnson01f2c232018-11-21 19:17:44 -08005027 mac->readyToExtWoWCallback = callback;
5028 mac->readyToExtWoWContext = callback_context;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005029
Jeff Johnson01f2c232018-11-21 19:17:44 -08005030 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305031 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005032
5033 /* serialize the req through MC thread */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305034 qdf_mem_copy(MsgPtr, wlanExtParams, sizeof(*MsgPtr));
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08005035 message.bodyptr = MsgPtr;
5036 message.type = WMA_WLAN_EXT_WOW;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05305037 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
5038 QDF_MODULE_ID_WMA,
5039 QDF_MODULE_ID_WMA,
5040 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305041 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08005042 mac->readyToExtWoWCallback = NULL;
5043 mac->readyToExtWoWContext = NULL;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305044 qdf_mem_free(MsgPtr);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305045 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005046 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08005047 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005048 } else {
Jeff Johnson01f2c232018-11-21 19:17:44 -08005049 mac->readyToExtWoWCallback = NULL;
5050 mac->readyToExtWoWContext = NULL;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305051 qdf_mem_free(MsgPtr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005052 }
5053
5054 return status;
5055}
5056
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305057/*
5058 * sme_configure_app_type1_params() -
5059 * SME will pass this request to lower mac to configure Indoor WoW parameters.
5060 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005061 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305062 * wlanAppType1Params- Depicts the wlan App Type 1(Indoor) params
5063 * Return QDF_STATUS
5064 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005065QDF_STATUS sme_configure_app_type1_params(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005066 tpSirAppType1Params wlanAppType1Params)
5067{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305068 QDF_STATUS status = QDF_STATUS_SUCCESS;
5069 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005070 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07005071 struct scheduler_msg message = {0};
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305072 tpSirAppType1Params MsgPtr = qdf_mem_malloc(sizeof(*MsgPtr));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005073
5074 if (!MsgPtr)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305075 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005076
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305077 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005078 TRACE_CODE_SME_RX_HDD_CONFIG_APP_TYPE1, NO_SESSION,
5079 0));
5080
Jeff Johnson01f2c232018-11-21 19:17:44 -08005081 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305082 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005083 /* serialize the req through MC thread */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305084 qdf_mem_copy(MsgPtr, wlanAppType1Params, sizeof(*MsgPtr));
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08005085 message.bodyptr = MsgPtr;
5086 message.type = WMA_WLAN_SET_APP_TYPE1_PARAMS;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05305087 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
5088 QDF_MODULE_ID_WMA,
5089 QDF_MODULE_ID_WMA,
5090 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305091 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305092 qdf_mem_free(MsgPtr);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305093 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005094 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08005095 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005096 } else {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305097 qdf_mem_free(MsgPtr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005098 }
5099
5100 return status;
5101}
5102
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305103/*
5104 * sme_configure_app_type2_params() -
5105 * SME will pass this request to lower mac to configure Indoor WoW parameters.
5106 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005107 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305108 * wlanAppType2Params- Depicts the wlan App Type 2 (Outdoor) params
5109 * Return QDF_STATUS
5110 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005111QDF_STATUS sme_configure_app_type2_params(mac_handle_t mac_handle,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305112 tpSirAppType2Params wlanAppType2Params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005113{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305114 QDF_STATUS status = QDF_STATUS_SUCCESS;
5115 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005116 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07005117 struct scheduler_msg message = {0};
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305118 tpSirAppType2Params MsgPtr = qdf_mem_malloc(sizeof(*MsgPtr));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005119
5120 if (!MsgPtr)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305121 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005122
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305123 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005124 TRACE_CODE_SME_RX_HDD_CONFIG_APP_TYPE2, NO_SESSION,
5125 0));
5126
Jeff Johnson01f2c232018-11-21 19:17:44 -08005127 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305128 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005129 /* serialize the req through MC thread */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305130 qdf_mem_copy(MsgPtr, wlanAppType2Params, sizeof(*MsgPtr));
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08005131 message.bodyptr = MsgPtr;
5132 message.type = WMA_WLAN_SET_APP_TYPE2_PARAMS;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05305133 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
5134 QDF_MODULE_ID_WMA,
5135 QDF_MODULE_ID_WMA,
5136 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305137 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305138 qdf_mem_free(MsgPtr);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305139 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005140 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08005141 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005142 } else {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305143 qdf_mem_free(MsgPtr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005144 }
5145
5146 return status;
5147}
5148#endif
5149
Abhishek Singhb1954c62019-02-14 10:18:28 +05305150uint8_t sme_get_beaconing_concurrent_operation_channel(mac_handle_t mac_handle,
5151 uint8_t vdev_id_to_skip)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005152{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305153 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005154 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005155 uint8_t channel = 0;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305156
Jeff Johnson01f2c232018-11-21 19:17:44 -08005157 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305158 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005159
Abhishek Singhb1954c62019-02-14 10:18:28 +05305160 channel = csr_get_beaconing_concurrent_channel(mac,
5161 vdev_id_to_skip);
5162 sme_info("Other Concurrent Channel: %d skipped vdev_id %d",
5163 channel, vdev_id_to_skip);
Jeff Johnson01f2c232018-11-21 19:17:44 -08005164 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005165 }
5166
5167 return channel;
5168}
5169
5170#ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005171uint16_t sme_check_concurrent_channel_overlap(mac_handle_t mac_handle,
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08005172 uint16_t sap_ch,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005173 eCsrPhyMode sapPhyMode,
5174 uint8_t cc_switch_mode)
5175{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305176 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005177 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005178 uint16_t channel = 0;
5179
Jeff Johnson01f2c232018-11-21 19:17:44 -08005180 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305181 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005182 channel =
Jeff Johnson01f2c232018-11-21 19:17:44 -08005183 csr_check_concurrent_channel_overlap(mac, sap_ch,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305184 sapPhyMode,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005185 cc_switch_mode);
Jeff Johnson01f2c232018-11-21 19:17:44 -08005186 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005187 }
5188
5189 return channel;
5190}
5191#endif
5192
Arun Khandavalli4b55da72016-07-19 19:55:01 +05305193/**
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07005194 * sme_set_tsfcb() - Set callback for TSF capture
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005195 * @mac_handle: Handler return by mac_open
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07005196 * @cb_fn: Callback function pointer
5197 * @db_ctx: Callback data
5198 *
5199 * Return: QDF_STATUS
5200 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005201QDF_STATUS sme_set_tsfcb(mac_handle_t mac_handle,
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07005202 int (*cb_fn)(void *cb_ctx, struct stsf *ptsf), void *cb_ctx)
5203{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005204 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07005205 QDF_STATUS status;
5206
Manikandan Mohan976e7562016-03-15 16:33:31 -07005207 status = sme_acquire_global_lock(&mac->sme);
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07005208 if (QDF_IS_STATUS_SUCCESS(status)) {
Manikandan Mohan976e7562016-03-15 16:33:31 -07005209 mac->sme.get_tsf_cb = cb_fn;
5210 mac->sme.get_tsf_cxt = cb_ctx;
5211 sme_release_global_lock(&mac->sme);
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07005212 }
5213 return status;
5214}
5215
Arun Khandavalli4b55da72016-07-19 19:55:01 +05305216/**
5217 * sme_reset_tsfcb() - Reset callback for TSF capture
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005218 * @mac_handle: Handler return by mac_open
Arun Khandavalli4b55da72016-07-19 19:55:01 +05305219 *
5220 * This function reset the tsf capture callback to SME
5221 *
5222 * Return: QDF_STATUS
5223 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005224QDF_STATUS sme_reset_tsfcb(mac_handle_t mac_handle)
Arun Khandavalli4b55da72016-07-19 19:55:01 +05305225{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005226 struct mac_context *mac;
Arun Khandavalli4b55da72016-07-19 19:55:01 +05305227 QDF_STATUS status;
5228
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005229 if (!mac_handle) {
Arun Khandavalli4b55da72016-07-19 19:55:01 +05305230 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005231 FL("mac_handle is not valid"));
Arun Khandavalli4b55da72016-07-19 19:55:01 +05305232 return QDF_STATUS_E_INVAL;
5233 }
Jeff Johnsona0619e42018-11-28 17:43:00 -08005234 mac = MAC_CONTEXT(mac_handle);
Arun Khandavalli4b55da72016-07-19 19:55:01 +05305235
5236 status = sme_acquire_global_lock(&mac->sme);
5237 if (QDF_IS_STATUS_SUCCESS(status)) {
5238 mac->sme.get_tsf_cb = NULL;
5239 mac->sme.get_tsf_cxt = NULL;
5240 sme_release_global_lock(&mac->sme);
5241 }
5242 return status;
5243}
5244
yuanl2746f072018-09-21 19:19:16 +08005245#if defined(WLAN_FEATURE_TSF) && !defined(WLAN_FEATURE_TSF_PLUS_NOIRQ)
Manikandan Mohan976e7562016-03-15 16:33:31 -07005246/*
yuanl2746f072018-09-21 19:19:16 +08005247 * sme_set_tsf_gpio() - set gpio pin that be toggled when capture tsf
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005248 * @mac_handle: Handler return by mac_open
Manikandan Mohan976e7562016-03-15 16:33:31 -07005249 * @pinvalue: gpio pin id
5250 *
5251 * Return: QDF_STATUS
5252 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005253QDF_STATUS sme_set_tsf_gpio(mac_handle_t mac_handle, uint32_t pinvalue)
Manikandan Mohan976e7562016-03-15 16:33:31 -07005254{
5255 QDF_STATUS status;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08005256 struct scheduler_msg tsf_msg = {0};
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005257 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Manikandan Mohan976e7562016-03-15 16:33:31 -07005258
5259 status = sme_acquire_global_lock(&mac->sme);
5260 if (QDF_IS_STATUS_SUCCESS(status)) {
5261 tsf_msg.type = WMA_TSF_GPIO_PIN;
5262 tsf_msg.reserved = 0;
5263 tsf_msg.bodyval = pinvalue;
5264
gaurank kathpalia36b0c582018-08-28 17:45:43 +05305265 status = scheduler_post_message(QDF_MODULE_ID_SME,
5266 QDF_MODULE_ID_WMA,
5267 QDF_MODULE_ID_WMA, &tsf_msg);
Manikandan Mohan976e7562016-03-15 16:33:31 -07005268 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07005269 sme_err("Unable to post WMA_TSF_GPIO_PIN");
Manikandan Mohan976e7562016-03-15 16:33:31 -07005270 status = QDF_STATUS_E_FAILURE;
5271 }
5272 sme_release_global_lock(&mac->sme);
5273 }
5274 return status;
5275}
5276#endif
5277
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -08005278QDF_STATUS sme_get_cfg_valid_channels(uint8_t *aValidChannels,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005279 uint32_t *len)
5280{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305281 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005282 struct mac_context *mac_ctx = sme_get_mac_context();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005283
Jeff Johnson038efe72019-03-18 13:39:31 -07005284 if (!mac_ctx) {
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -08005285 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
5286 FL("Invalid MAC context"));
5287 return QDF_STATUS_E_FAILURE;
5288 }
5289
5290 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305291 if (QDF_IS_STATUS_SUCCESS(status)) {
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -08005292 status = csr_get_cfg_valid_channels(mac_ctx,
5293 aValidChannels, len);
5294 sme_release_global_lock(&mac_ctx->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005295 }
5296
5297 return status;
5298}
5299
Amar Singhalf0a94ad2017-11-27 15:20:00 -08005300static uint8_t *sme_reg_hint_to_str(const enum country_src src)
5301{
5302 switch (src) {
5303 case SOURCE_CORE:
5304 return "WORLD MODE";
5305
5306 case SOURCE_DRIVER:
5307 return "BDF file";
5308
5309 case SOURCE_USERSPACE:
5310 return "user-space";
5311
5312 case SOURCE_11D:
5313 return "802.11D IEs in beacons";
5314
5315 default:
5316 return "unknown";
5317 }
5318}
5319
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005320void sme_set_cc_src(mac_handle_t mac_handle, enum country_src cc_src)
Amar Singhal6edf9732016-11-20 21:43:40 -08005321{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005322 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Amar Singhal6edf9732016-11-20 21:43:40 -08005323
5324 mac_ctx->reg_hint_src = cc_src;
Amar Singhalf0a94ad2017-11-27 15:20:00 -08005325
5326 sme_debug("Country source is %s",
5327 sme_reg_hint_to_str(cc_src));
Amar Singhal6edf9732016-11-20 21:43:40 -08005328}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005329
5330/**
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07005331 * sme_handle_generic_change_country_code() - handles country ch req
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005332 * @mac_ctx: mac global context
5333 * @msg: request msg packet
5334 *
5335 * If Supplicant country code is priority than 11d is disabled.
5336 * If 11D is enabled, we update the country code after every scan.
5337 * Hence when Supplicant country code is priority, we don't need 11D info.
5338 * Country code from Supplicant is set as current country code.
5339 *
5340 * Return: status of operation
5341 */
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305342static QDF_STATUS
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005343sme_handle_generic_change_country_code(struct mac_context *mac_ctx,
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07005344 void *pMsgBuf)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005345{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305346 QDF_STATUS status = QDF_STATUS_SUCCESS;
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07005347 v_REGDOMAIN_t reg_domain_id = 0;
Amar Singhalb6d0dc42016-10-19 09:45:05 -07005348 bool user_ctry_priority =
Bala Venkatesh46e29032018-11-14 18:24:55 +05305349 mac_ctx->mlme_cfg->sap_cfg.country_code_priority;
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07005350 tAniGenericChangeCountryCodeReq *msg = pMsgBuf;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005351
Amar Singhal6edf9732016-11-20 21:43:40 -08005352 if (SOURCE_11D != mac_ctx->reg_hint_src) {
5353 if (SOURCE_DRIVER != mac_ctx->reg_hint_src) {
5354 if (user_ctry_priority)
Abhinav Kumard4d6eb72018-12-04 20:30:37 +05305355 mac_ctx->mlme_cfg->gen.enabled_11d = false;
Amar Singhal6edf9732016-11-20 21:43:40 -08005356 else {
Abhinav Kumard4d6eb72018-12-04 20:30:37 +05305357 if (mac_ctx->mlme_cfg->gen.enabled_11d &&
5358 mac_ctx->scan.countryCode11d[0] != 0) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005359
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07005360 sme_debug("restore 11d");
Amar Singhalb6d0dc42016-10-19 09:45:05 -07005361
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305362 status =
5363 csr_get_regulatory_domain_for_country(
Amar Singhal6edf9732016-11-20 21:43:40 -08005364 mac_ctx,
5365 mac_ctx->scan.countryCode11d,
5366 &reg_domain_id,
5367 SOURCE_11D);
5368 return QDF_STATUS_E_FAILURE;
5369 }
Amar Singhalb6d0dc42016-10-19 09:45:05 -07005370 }
5371 }
5372 } else {
5373 /* if kernel gets invalid country code; it
5374 * resets the country code to world
5375 */
5376 if (('0' != msg->countryCode[0]) ||
5377 ('0' != msg->countryCode[1]))
5378 qdf_mem_copy(mac_ctx->scan.countryCode11d,
5379 msg->countryCode,
Wu Gaoaa155142019-01-14 15:09:26 +08005380 CFG_COUNTRY_CODE_LEN);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005381 }
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07005382
Amar Singhalb6d0dc42016-10-19 09:45:05 -07005383 qdf_mem_copy(mac_ctx->scan.countryCodeCurrent,
5384 msg->countryCode,
Wu Gaoaa155142019-01-14 15:09:26 +08005385 CFG_COUNTRY_CODE_LEN);
Amar Singhal9d5b1fe2016-10-16 20:16:05 -07005386
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005387 /* get the channels based on new cc */
5388 status = csr_get_channel_and_power_list(mac_ctx);
5389
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305390 if (status != QDF_STATUS_SUCCESS) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07005391 sme_err("fail to get Channels");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005392 return status;
5393 }
Amar Singhalb6d0dc42016-10-19 09:45:05 -07005394
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005395 /* reset info based on new cc, and we are done */
5396 csr_apply_channel_power_info_wrapper(mac_ctx);
5397
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005398 csr_scan_filter_results(mac_ctx);
Amar Singhalb6d0dc42016-10-19 09:45:05 -07005399
5400 /* scans after the country is set by User hints or
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005401 * Country IE
5402 */
5403 mac_ctx->scan.curScanType = eSIR_ACTIVE_SCAN;
Amar Singhal9d5b1fe2016-10-16 20:16:05 -07005404
Amar Singhal6edf9732016-11-20 21:43:40 -08005405 mac_ctx->reg_hint_src = SOURCE_UNKNOWN;
5406
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005407 sme_disconnect_connected_sessions(mac_ctx);
Amar Singhalb6d0dc42016-10-19 09:45:05 -07005408
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305409 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005410}
5411
Jeff Johnsonc7309062018-11-09 20:59:42 -08005412QDF_STATUS sme_update_channel_list(mac_handle_t mac_handle)
Mukul Sharmaecf8e092017-12-19 22:36:31 +05305413{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005414 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Jeff Johnson330c0bf2018-06-01 15:13:12 -07005415 QDF_STATUS status;
Mukul Sharmaecf8e092017-12-19 22:36:31 +05305416
5417 status = sme_acquire_global_lock(&mac_ctx->sme);
5418 if (QDF_IS_STATUS_SUCCESS(status)) {
5419 /* Update umac channel (enable/disable) from cds channels */
5420 status = csr_get_channel_and_power_list(mac_ctx);
5421 if (status != QDF_STATUS_SUCCESS) {
5422 sme_err("fail to get Channels");
5423 sme_release_global_lock(&mac_ctx->sme);
5424 return status;
5425 }
5426
5427 csr_apply_channel_power_info_wrapper(mac_ctx);
5428 csr_scan_filter_results(mac_ctx);
5429 sme_disconnect_connected_sessions(mac_ctx);
5430 sme_release_global_lock(&mac_ctx->sme);
5431 }
5432
5433 return status;
5434}
5435
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005436static bool
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005437sme_search_in_base_ch_lst(struct mac_context *mac_ctx, uint8_t curr_ch)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005438{
5439 uint8_t i;
gaurank kathpalia14e2f912017-08-31 14:51:45 +05305440 struct csr_channel *ch_lst_info;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305441
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005442 ch_lst_info = &mac_ctx->scan.base_channels;
5443 for (i = 0; i < ch_lst_info->numChannels; i++) {
5444 if (ch_lst_info->channelList[i] == curr_ch)
5445 return true;
5446 }
5447
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005448 return false;
5449}
5450/**
5451 * sme_disconnect_connected_sessions() - Disconnect STA and P2P client session
5452 * if channel is not supported
5453 * @mac_ctx: mac global context
5454 *
5455 * If new country code does not support the channel on which STA/P2P client
5456 * is connetced, it sends the disconnect to the AP/P2P GO
5457 *
5458 * Return: void
5459 */
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005460static void sme_disconnect_connected_sessions(struct mac_context *mac_ctx)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005461{
5462 uint8_t session_id, found = false;
5463 uint8_t curr_ch;
5464
Dustin Brownad06be62019-02-04 14:52:56 -08005465 for (session_id = 0; session_id < WLAN_MAX_VDEVS; session_id++) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005466 if (!csr_is_session_client_and_connected(mac_ctx, session_id))
5467 continue;
5468 found = false;
5469 /* Session is connected.Check the channel */
5470 curr_ch = csr_get_infra_operation_channel(mac_ctx,
5471 session_id);
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07005472 sme_debug("Current Operating channel : %d, session :%d",
5473 curr_ch, session_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005474 found = sme_search_in_base_ch_lst(mac_ctx, curr_ch);
5475 if (!found) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07005476 sme_debug("Disconnect Session: %d", session_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005477 csr_roam_disconnect(mac_ctx, session_id,
5478 eCSR_DISCONNECT_REASON_UNSPECIFIED);
5479 }
5480 }
5481}
5482
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005483#ifdef WLAN_FEATURE_PACKET_FILTERING
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005484QDF_STATUS sme_8023_multicast_list(mac_handle_t mac_handle, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005485 tpSirRcvFltMcAddrList pMulticastAddrs)
5486{
5487 tpSirRcvFltMcAddrList request_buf;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07005488 struct scheduler_msg msg = {0};
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005489 struct mac_context *mac = MAC_CONTEXT(mac_handle);
gaurank kathpalia14e2f912017-08-31 14:51:45 +05305490 struct csr_roam_session *pSession = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005491
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305492 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
5493 "%s: ulMulticastAddrCnt: %d, multicastAddr[0]: %pK", __func__,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005494 pMulticastAddrs->ulMulticastAddrCnt,
Srinivas Girigowda98530492015-11-20 17:39:24 -08005495 pMulticastAddrs->multicastAddr[0].bytes);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005496
Ravi Joshi4f447cb2016-07-19 13:42:01 -07005497 /* Find the connected Infra / P2P_client connected session */
Jeff Johnson01f2c232018-11-21 19:17:44 -08005498 pSession = CSR_GET_SESSION(mac, sessionId);
5499 if (!CSR_IS_SESSION_VALID(mac, sessionId) ||
5500 (!csr_is_conn_state_infra(mac, sessionId) &&
5501 !csr_is_ndi_started(mac, sessionId))) {
Abhishek Singh5d8d7332017-08-10 15:15:24 +05305502 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Srinivas Girigowdaf2599dd2015-11-16 18:20:46 -08005503 "%s: Unable to find the session Id: %d", __func__,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005504 sessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305505 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005506 }
5507
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305508 request_buf = qdf_mem_malloc(sizeof(tSirRcvFltMcAddrList));
Arif Hussain0ef77082018-10-10 16:42:53 -07005509 if (!request_buf)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305510 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005511
Jeff Johnson01f2c232018-11-21 19:17:44 -08005512 if (!csr_is_conn_state_connected_infra(mac, sessionId) &&
5513 !csr_is_ndi_started(mac, sessionId)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305514 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Ravi Joshi4f447cb2016-07-19 13:42:01 -07005515 "%s: Request ignored, session %d is not connected or started",
5516 __func__, sessionId);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305517 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305518 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005519 }
5520
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305521 qdf_mem_copy(request_buf, pMulticastAddrs,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005522 sizeof(tSirRcvFltMcAddrList));
5523
Anurag Chouhanc5548422016-02-24 18:33:27 +05305524 qdf_copy_macaddr(&request_buf->self_macaddr, &pSession->selfMacAddr);
5525 qdf_copy_macaddr(&request_buf->bssid,
Srinivas Girigowda98530492015-11-20 17:39:24 -08005526 &pSession->connectedProfile.bssid);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005527
5528 msg.type = WMA_8023_MULTICAST_LIST_REQ;
5529 msg.reserved = 0;
5530 msg.bodyptr = request_buf;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05305531 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
5532 sessionId, msg.type));
gaurank kathpalia36b0c582018-08-28 17:45:43 +05305533 if (QDF_STATUS_SUCCESS != scheduler_post_message(QDF_MODULE_ID_SME,
5534 QDF_MODULE_ID_WMA,
5535 QDF_MODULE_ID_WMA,
5536 &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305537 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305538 "%s: Not able to post WMA_8023_MULTICAST_LIST message to WMA",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005539 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305540 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305541 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005542 }
5543
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305544 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005545}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005546#endif /* WLAN_FEATURE_PACKET_FILTERING */
5547
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305548/*
5549 * sme_is_channel_valid() -
5550 * To check if the channel is valid for currently established domain
5551 * This is a synchronous API.
5552 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005553 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305554 * channel - channel to verify
5555 * Return true/false, true if channel is valid
5556 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005557bool sme_is_channel_valid(mac_handle_t mac_handle, uint8_t channel)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005558{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305559 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005560 bool valid = false;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005561 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005562
Jeff Johnson01f2c232018-11-21 19:17:44 -08005563 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305564 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005565
Jeff Johnson01f2c232018-11-21 19:17:44 -08005566 valid = csr_roam_is_channel_valid(mac, channel);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005567
Jeff Johnson01f2c232018-11-21 19:17:44 -08005568 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005569 }
5570
5571 return valid;
5572}
5573
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305574/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305575 * sme_set_max_tx_power_per_band() -
5576 * Set the Maximum Transmit Power specific to band dynamically.
5577 * Note: this setting will not persist over reboots.
5578 *
5579 * band
5580 * power to set in dB
5581 * Return QDF_STATUS
5582 */
Varun Reddy Yeturua48bc412017-11-17 15:33:35 -08005583QDF_STATUS sme_set_max_tx_power_per_band(enum band_info band, int8_t dB)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005584{
Rajeev Kumar37d478b2017-04-17 16:59:28 -07005585 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005586 tpMaxTxPowerPerBandParams pMaxTxPowerPerBandParams = NULL;
5587
5588 pMaxTxPowerPerBandParams =
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305589 qdf_mem_malloc(sizeof(tMaxTxPowerPerBandParams));
Arif Hussain0ef77082018-10-10 16:42:53 -07005590 if (!pMaxTxPowerPerBandParams)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305591 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005592
5593 pMaxTxPowerPerBandParams->power = dB;
5594 pMaxTxPowerPerBandParams->bandInfo = band;
5595
5596 msg.type = WMA_SET_MAX_TX_POWER_PER_BAND_REQ;
5597 msg.reserved = 0;
5598 msg.bodyptr = pMaxTxPowerPerBandParams;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05305599 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
5600 NO_SESSION, msg.type));
gaurank kathpalia36b0c582018-08-28 17:45:43 +05305601 if (QDF_STATUS_SUCCESS != scheduler_post_message(QDF_MODULE_ID_SME,
5602 QDF_MODULE_ID_WMA,
5603 QDF_MODULE_ID_WMA,
5604 &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305605 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005606 "%s:Not able to post WMA_SET_MAX_TX_POWER_PER_BAND_REQ",
5607 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305608 qdf_mem_free(pMaxTxPowerPerBandParams);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305609 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005610 }
5611
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305612 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005613}
5614
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305615/*
5616 * sme_set_max_tx_power() -
5617 * Set the Maximum Transmit Power dynamically. Note: this setting will
5618 * not persist over reboots.
5619 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005620 * mac_handle
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305621 * pBssid BSSID to set the power cap for
5622 * pBssid pSelfMacAddress self MAC Address
5623 * pBssid power to set in dB
5624 * Return QDF_STATUS
5625 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005626QDF_STATUS sme_set_max_tx_power(mac_handle_t mac_handle,
5627 struct qdf_mac_addr pBssid,
Anurag Chouhan6d760662016-02-20 16:05:43 +05305628 struct qdf_mac_addr pSelfMacAddress, int8_t dB)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005629{
Rajeev Kumar37d478b2017-04-17 16:59:28 -07005630 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005631 tpMaxTxPowerParams pMaxTxParams = NULL;
5632
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305633 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005634 TRACE_CODE_SME_RX_HDD_SET_MAXTXPOW, NO_SESSION, 0));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305635 pMaxTxParams = qdf_mem_malloc(sizeof(tMaxTxPowerParams));
Arif Hussain0ef77082018-10-10 16:42:53 -07005636 if (!pMaxTxParams)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305637 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005638
Anurag Chouhanc5548422016-02-24 18:33:27 +05305639 qdf_copy_macaddr(&pMaxTxParams->bssId, &pBssid);
5640 qdf_copy_macaddr(&pMaxTxParams->selfStaMacAddr, &pSelfMacAddress);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005641 pMaxTxParams->power = dB;
5642
5643 msg.type = WMA_SET_MAX_TX_POWER_REQ;
5644 msg.reserved = 0;
5645 msg.bodyptr = pMaxTxParams;
5646
gaurank kathpalia36b0c582018-08-28 17:45:43 +05305647 if (QDF_STATUS_SUCCESS != scheduler_post_message(QDF_MODULE_ID_SME,
5648 QDF_MODULE_ID_WMA,
5649 QDF_MODULE_ID_WMA,
5650 &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305651 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005652 "%s: Not able to post WMA_SET_MAX_TX_POWER_REQ message to WMA",
5653 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305654 qdf_mem_free(pMaxTxParams);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305655 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005656 }
5657
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305658 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005659}
5660
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305661/*
5662 * sme_set_custom_mac_addr() -
5663 * Set the customer Mac Address.
5664 *
5665 * customMacAddr customer MAC Address
5666 * Return QDF_STATUS
5667 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305668QDF_STATUS sme_set_custom_mac_addr(tSirMacAddr customMacAddr)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005669{
Rajeev Kumar37d478b2017-04-17 16:59:28 -07005670 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005671 tSirMacAddr *pBaseMacAddr;
5672
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305673 pBaseMacAddr = qdf_mem_malloc(sizeof(tSirMacAddr));
Arif Hussain0ef77082018-10-10 16:42:53 -07005674 if (!pBaseMacAddr)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305675 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005676
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305677 qdf_mem_copy(*pBaseMacAddr, customMacAddr, sizeof(tSirMacAddr));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005678
5679 msg.type = SIR_HAL_SET_BASE_MACADDR_IND;
5680 msg.reserved = 0;
5681 msg.bodyptr = pBaseMacAddr;
5682
gaurank kathpalia36b0c582018-08-28 17:45:43 +05305683 if (QDF_STATUS_SUCCESS != scheduler_post_message(QDF_MODULE_ID_SME,
5684 QDF_MODULE_ID_WMA,
5685 QDF_MODULE_ID_WMA,
5686 &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305687 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305688 "Not able to post SIR_HAL_SET_BASE_MACADDR_IND message to WMA");
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305689 qdf_mem_free(pBaseMacAddr);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305690 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005691 }
5692
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305693 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005694}
5695
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305696/*
5697 * sme_set_tx_power() -
5698 * Set Transmit Power dynamically.
5699 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005700 * mac_handle
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305701 * sessionId Target Session ID
5702 * BSSID
5703 * dev_mode dev_mode such as station, P2PGO, SAP
5704 * dBm power to set
5705 * Return QDF_STATUS
5706 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005707QDF_STATUS sme_set_tx_power(mac_handle_t mac_handle, uint8_t sessionId,
Anurag Chouhan6d760662016-02-20 16:05:43 +05305708 struct qdf_mac_addr pBSSId,
Jeff Johnsonc1e62782017-11-09 09:50:17 -08005709 enum QDF_OPMODE dev_mode, int dBm)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005710{
Rajeev Kumar37d478b2017-04-17 16:59:28 -07005711 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005712 tpMaxTxPowerParams pTxParams = NULL;
5713 int8_t power = (int8_t) dBm;
5714
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305715 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005716 TRACE_CODE_SME_RX_HDD_SET_TXPOW, sessionId, 0));
5717
5718 /* make sure there is no overflow */
5719 if ((int)power != dBm) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305720 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005721 "%s: error, invalid power = %d", __func__, dBm);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305722 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005723 }
5724
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305725 pTxParams = qdf_mem_malloc(sizeof(tMaxTxPowerParams));
Arif Hussain0ef77082018-10-10 16:42:53 -07005726 if (!pTxParams)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305727 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005728
Anurag Chouhanc5548422016-02-24 18:33:27 +05305729 qdf_copy_macaddr(&pTxParams->bssId, &pBSSId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005730 pTxParams->power = power; /* unit is dBm */
5731 pTxParams->dev_mode = dev_mode;
5732 msg.type = WMA_SET_TX_POWER_REQ;
5733 msg.reserved = 0;
5734 msg.bodyptr = pTxParams;
5735
gaurank kathpalia36b0c582018-08-28 17:45:43 +05305736 if (QDF_STATUS_SUCCESS != scheduler_post_message(QDF_MODULE_ID_SME,
5737 QDF_MODULE_ID_WMA,
5738 QDF_MODULE_ID_WMA,
5739 &msg)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305740 qdf_mem_free(pTxParams);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305741 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005742 }
5743
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305744 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005745}
5746
Jeff Johnsonc7309062018-11-09 20:59:42 -08005747QDF_STATUS sme_update_session_param(mac_handle_t mac_handle, uint8_t session_id,
5748 uint32_t param_type, uint32_t param_val)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005749{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305750 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005751 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005752 uint16_t len;
5753
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05305754 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305755 if (QDF_IS_STATUS_SUCCESS(status)) {
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05305756 struct sir_update_session_param *msg;
gaurank kathpalia14e2f912017-08-31 14:51:45 +05305757 struct csr_roam_session *session = CSR_GET_SESSION(mac_ctx,
5758 session_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005759
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05305760 if (!session) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07005761 sme_err("Session: %d not found", session_id);
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05305762 sme_release_global_lock(&mac_ctx->sme);
5763 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005764 }
5765
Selvaraj, Sridhar5b5a0652017-05-04 11:23:07 +05305766 if (param_type == SIR_PARAM_IGNORE_ASSOC_DISALLOWED)
5767 mac_ctx->ignore_assoc_disallowed = param_val;
5768
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05305769 if (!session->sessionActive)
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305770 QDF_ASSERT(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005771
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05305772 len = sizeof(*msg);
5773 msg = qdf_mem_malloc(len);
5774 if (!msg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305775 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005776 else {
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05305777 msg->message_type = eWNI_SME_SESSION_UPDATE_PARAM;
5778 msg->length = len;
5779 msg->session_id = session_id;
5780 msg->param_type = param_type;
5781 msg->param_val = param_val;
Rajeev Kumard138ac52017-01-30 18:38:37 -08005782 status = umac_send_mb_message_to_mac(msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005783 }
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05305784 sme_release_global_lock(&mac_ctx->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005785 }
5786 return status;
5787}
5788
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305789/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305790 * sme_update_roam_scan_n_probes() -
5791 * Function to update roam scan N probes
5792 * This function is called through dynamic setConfig callback function
5793 * to update roam scan N probes
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08005794 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305795 * sessionId - Session Identifier
5796 * nProbes number of probe requests to be sent out
5797 * Return Success or failure
5798 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005799QDF_STATUS sme_update_roam_scan_n_probes(mac_handle_t mac_handle,
5800 uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005801 const uint8_t nProbes)
5802{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005803 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305804 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005805
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305806 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005807 TRACE_CODE_SME_RX_HDD_UPDATE_ROAM_SCAN_N_PROBES,
5808 NO_SESSION, 0));
Jeff Johnson01f2c232018-11-21 19:17:44 -08005809 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305810 if (QDF_IS_STATUS_SUCCESS(status)) {
Abhishek Singhe4a1f882017-08-10 17:59:44 +05305811 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005812 "%s: gRoamScanNProbes is changed from %d to %d",
Wu Gao51a63562018-11-08 16:29:10 +08005813 __func__, mac->mlme_cfg->lfr.roam_scan_n_probes,
5814 nProbes);
5815 mac->mlme_cfg->lfr.roam_scan_n_probes = nProbes;
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05305816
Wu Gao51a63562018-11-08 16:29:10 +08005817 if (mac->mlme_cfg->lfr.roam_scan_offload_enabled) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08005818 csr_roam_offload_scan(mac, sessionId,
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05305819 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
5820 REASON_NPROBES_CHANGED);
5821 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08005822 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005823 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005824 return status;
5825}
5826
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305827/*
5828 * sme_update_roam_scan_home_away_time() -
5829 * Function to update roam scan Home away time
5830 * This function is called through dynamic setConfig callback function
5831 * to update roam scan home away time
5832 *
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08005833 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305834 * sessionId - Session Identifier
5835 * nRoamScanAwayTime Scan home away time
5836 * bSendOffloadCmd If true then send offload command to firmware
5837 * If false then command is not sent to firmware
5838 * Return Success or failure
5839 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005840QDF_STATUS sme_update_roam_scan_home_away_time(
5841 mac_handle_t mac_handle,
5842 uint8_t sessionId,
5843 const uint16_t nRoamScanHomeAwayTime,
5844 const bool bSendOffloadCmd)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005845{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005846 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305847 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005848
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305849 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005850 TRACE_CODE_SME_RX_HDD_UPDATE_ROAM_SCAN_HOME_AWAY_TIME,
5851 NO_SESSION, 0));
Jeff Johnson01f2c232018-11-21 19:17:44 -08005852 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305853 if (QDF_IS_STATUS_SUCCESS(status)) {
Abhishek Singhe4a1f882017-08-10 17:59:44 +05305854 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005855 "%s: gRoamScanHomeAwayTime is changed from %d to %d",
5856 __func__,
Wu Gao51a63562018-11-08 16:29:10 +08005857 mac->mlme_cfg->lfr.roam_scan_home_away_time,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005858 nRoamScanHomeAwayTime);
Wu Gao51a63562018-11-08 16:29:10 +08005859 mac->mlme_cfg->lfr.roam_scan_home_away_time =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005860 nRoamScanHomeAwayTime;
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05305861
Wu Gao51a63562018-11-08 16:29:10 +08005862 if (mac->mlme_cfg->lfr.roam_scan_offload_enabled &&
5863 bSendOffloadCmd) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08005864 csr_roam_offload_scan(mac, sessionId,
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05305865 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
5866 REASON_HOME_AWAY_TIME_CHANGED);
5867 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08005868 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005869 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005870 return status;
5871}
5872
Abhishek Singh518323d2015-10-19 17:42:01 +05305873/**
5874 * sme_ext_change_channel()- function to post send ECSA
5875 * action frame to csr.
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08005876 * @mac_handle: Opaque handle to the global MAC context
Abhishek Singh518323d2015-10-19 17:42:01 +05305877 * @channel: new channel to switch
5878 * @session_id: senssion it should be sent on.
5879 *
5880 * This function is called to post ECSA frame to csr.
5881 *
5882 * Return: success if msg is sent else return failure
5883 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005884QDF_STATUS sme_ext_change_channel(mac_handle_t mac_handle, uint32_t channel,
Abhishek Singh518323d2015-10-19 17:42:01 +05305885 uint8_t session_id)
5886{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305887 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005888 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Abhishek Singh518323d2015-10-19 17:42:01 +05305889 uint8_t channel_state;
5890
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07005891 sme_err("Set Channel: %d", channel);
Abhishek Singh518323d2015-10-19 17:42:01 +05305892 channel_state =
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07005893 wlan_reg_get_channel_state(mac_ctx->pdev, channel);
Abhishek Singh518323d2015-10-19 17:42:01 +05305894
5895 if (CHANNEL_STATE_DISABLE == channel_state) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07005896 sme_err("Invalid channel: %d", channel);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305897 return QDF_STATUS_E_INVAL;
Abhishek Singh518323d2015-10-19 17:42:01 +05305898 }
5899
5900 status = sme_acquire_global_lock(&mac_ctx->sme);
5901
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305902 if (QDF_STATUS_SUCCESS == status) {
Abhishek Singh518323d2015-10-19 17:42:01 +05305903 /* update the channel list to the firmware */
5904 status = csr_send_ext_change_channel(mac_ctx,
5905 channel, session_id);
5906 sme_release_global_lock(&mac_ctx->sme);
5907 }
5908
5909 return status;
5910}
5911
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305912/*
5913 * sme_get_roam_intra_band() -
5914 * get Intra band roaming
5915 *
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08005916 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305917 * Return Success or failure
5918 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005919bool sme_get_roam_intra_band(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005920{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005921 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305922
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305923 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005924 TRACE_CODE_SME_RX_HDD_GET_ROAMIBAND, NO_SESSION, 0));
Wu Gao51a63562018-11-08 16:29:10 +08005925
5926 return mac->mlme_cfg->lfr.roam_intra_band;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005927}
5928
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305929/*
5930 * sme_get_roam_scan_n_probes() -
5931 * get N Probes
5932 *
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08005933 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305934 * Return Success or failure
5935 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005936uint8_t sme_get_roam_scan_n_probes(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005937{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005938 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305939
Wu Gao51a63562018-11-08 16:29:10 +08005940 return mac->mlme_cfg->lfr.roam_scan_n_probes;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005941}
5942
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305943/*
5944 * sme_get_roam_scan_home_away_time() -
5945 * get Roam scan home away time
5946 *
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08005947 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305948 * Return Success or failure
5949 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005950uint16_t sme_get_roam_scan_home_away_time(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005951{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005952 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305953
Wu Gao51a63562018-11-08 16:29:10 +08005954 return mac->mlme_cfg->lfr.roam_scan_home_away_time;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005955}
5956
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305957/*
5958 * sme_update_roam_rssi_diff() -
5959 * Update RoamRssiDiff
5960 * This function is called through dynamic setConfig callback function
5961 * to configure RoamRssiDiff
5962 * Usage: adb shell iwpriv wlan0 setConfig RoamRssiDiff=[0 .. 125]
5963 *
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08005964 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305965 * sessionId - Session Identifier
5966 * RoamRssiDiff - minimum rssi difference between potential
5967 * candidate and current AP.
5968 * Return Success or failure
5969 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005970
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005971QDF_STATUS sme_update_roam_rssi_diff(mac_handle_t mac_handle, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005972 uint8_t RoamRssiDiff)
5973{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005974 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305975 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005976
Dustin Brownad06be62019-02-04 14:52:56 -08005977 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08005978 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
5979 FL("Invalid sme session id: %d"), sessionId);
5980 return QDF_STATUS_E_INVAL;
5981 }
5982
Jeff Johnson01f2c232018-11-21 19:17:44 -08005983 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305984 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305985 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005986 "LFR runtime successfully set roam rssi diff to %d - old value is %d - roam state is %s",
5987 RoamRssiDiff,
Wu Gao51a63562018-11-08 16:29:10 +08005988 mac->mlme_cfg->lfr.roam_rssi_diff,
Jeff Johnson01f2c232018-11-21 19:17:44 -08005989 mac_trace_get_neighbour_roam_state(mac->roam.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005990 neighborRoamInfo
5991 [sessionId].
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305992 neighborRoamState));
Wu Gao51a63562018-11-08 16:29:10 +08005993 mac->mlme_cfg->lfr.roam_rssi_diff = RoamRssiDiff;
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05305994
Wu Gao51a63562018-11-08 16:29:10 +08005995 if (mac->mlme_cfg->lfr.roam_scan_offload_enabled)
Jeff Johnson01f2c232018-11-21 19:17:44 -08005996 csr_roam_offload_scan(mac, sessionId,
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05305997 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
5998 REASON_RSSI_DIFF_CHANGED);
5999
Jeff Johnson01f2c232018-11-21 19:17:44 -08006000 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006001 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006002 return status;
6003}
6004
Pragaspathi Thilagaraj6695ba92019-04-04 17:59:47 +05306005void sme_update_session_assoc_ie(mac_handle_t mac_handle,
6006 uint8_t vdev_id,
6007 struct csr_roam_profile *src_profile)
6008{
6009 struct mac_context *mac = MAC_CONTEXT(mac_handle);
6010 struct csr_roam_session *session = CSR_GET_SESSION(mac, vdev_id);
6011
6012 if (!session) {
6013 sme_err("Session: %d not found", vdev_id);
6014 return;
6015 }
6016
6017 qdf_mem_free(session->pAddIEAssoc);
6018 session->pAddIEAssoc = NULL;
6019 session->nAddIEAssocLength = 0;
6020
6021 if (!src_profile->nAddIEAssocLength) {
6022 sme_debug("Assoc IE len 0");
6023 return;
6024 }
6025
6026 session->pAddIEAssoc = qdf_mem_malloc(src_profile->nAddIEAssocLength);
6027 if (!session->pAddIEAssoc)
6028 return;
6029
6030 session->nAddIEAssocLength = src_profile->nAddIEAssocLength;
6031 qdf_mem_copy(session->pAddIEAssoc, src_profile->pAddIEAssoc,
6032 src_profile->nAddIEAssocLength);
6033}
6034
6035QDF_STATUS sme_send_rso_connect_params(mac_handle_t mac_handle,
6036 uint8_t vdev_id,
6037 struct csr_roam_profile *src_profile)
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05306038{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006039 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05306040 QDF_STATUS status = QDF_STATUS_SUCCESS;
6041 tpCsrNeighborRoamControlInfo neighbor_roam_info =
Pragaspathi Thilagaraj6695ba92019-04-04 17:59:47 +05306042 &mac->roam.neighborRoamInfo[vdev_id];
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05306043
Pragaspathi Thilagaraj6695ba92019-04-04 17:59:47 +05306044 if (vdev_id >= WLAN_MAX_VDEVS) {
6045 sme_err("Invalid sme vdev id: %d", vdev_id);
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05306046 return QDF_STATUS_E_INVAL;
6047 }
6048
6049 if (!src_profile) {
6050 sme_err("src roam profile NULL");
6051 return QDF_STATUS_E_INVAL;
6052 }
6053
Wu Gao51a63562018-11-08 16:29:10 +08006054 if (!mac->mlme_cfg->lfr.lfr_enabled ||
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05306055 (neighbor_roam_info->neighborRoamState !=
6056 eCSR_NEIGHBOR_ROAM_STATE_CONNECTED)) {
6057 sme_info("Fast roam is disabled or not connected(%d)",
Pragaspathi Thilagaraj6695ba92019-04-04 17:59:47 +05306058 neighbor_roam_info->neighborRoamState);
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05306059 return QDF_STATUS_E_PERM;
6060 }
6061
Jianmin Zhubf845932018-12-17 11:52:50 +08006062 if (csr_is_roam_offload_enabled(mac)) {
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05306063 status = sme_acquire_global_lock(&mac->sme);
6064 if (QDF_IS_STATUS_SUCCESS(status)) {
6065 sme_debug("Updating fils config to fw");
Pragaspathi Thilagaraj6695ba92019-04-04 17:59:47 +05306066 csr_roam_offload_scan(mac, vdev_id,
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05306067 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
6068 REASON_FILS_PARAMS_CHANGED);
6069 sme_release_global_lock(&mac->sme);
6070 } else {
6071 sme_err("Failed to acquire SME lock");
6072 }
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05306073 } else {
6074 sme_info("LFR3 not enabled");
6075 return QDF_STATUS_E_INVAL;
6076 }
6077
6078 return status;
6079}
6080
Pragaspathi Thilagaraj6695ba92019-04-04 17:59:47 +05306081#ifdef WLAN_FEATURE_FILS_SK
6082QDF_STATUS sme_update_fils_config(mac_handle_t mac_handle, uint8_t vdev_id,
6083 struct csr_roam_profile *src_profile)
6084{
6085 QDF_STATUS status = QDF_STATUS_SUCCESS;
6086 struct mac_context *mac = MAC_CONTEXT(mac_handle);
6087
6088 csr_update_fils_config(mac, vdev_id, src_profile);
6089
6090 return status;
6091}
6092
6093void sme_send_hlp_ie_info(mac_handle_t mac_handle, uint8_t vdev_id,
Jeff Johnson66ee8a92018-03-17 15:24:26 -07006094 struct csr_roam_profile *profile, uint32_t if_addr)
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05306095{
6096 int i;
6097 struct scheduler_msg msg;
6098 QDF_STATUS status;
6099 struct hlp_params *params;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006100 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Pragaspathi Thilagaraj6695ba92019-04-04 17:59:47 +05306101 struct csr_roam_session *session = CSR_GET_SESSION(mac, vdev_id);
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05306102 tpCsrNeighborRoamControlInfo neighbor_roam_info =
Pragaspathi Thilagaraj6695ba92019-04-04 17:59:47 +05306103 &mac->roam.neighborRoamInfo[vdev_id];
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05306104
6105 if (!session) {
6106 sme_err("session NULL");
6107 return;
6108 }
6109
Wu Gao51a63562018-11-08 16:29:10 +08006110 if (!mac->mlme_cfg->lfr.lfr_enabled ||
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05306111 (neighbor_roam_info->neighborRoamState !=
6112 eCSR_NEIGHBOR_ROAM_STATE_CONNECTED)) {
6113 sme_debug("Fast roam is disabled or not connected(%d)",
6114 neighbor_roam_info->neighborRoamState);
6115 return;
6116 }
6117
6118 params = qdf_mem_malloc(sizeof(*params));
Arif Hussain0ef77082018-10-10 16:42:53 -07006119 if (!params)
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05306120 return;
Arif Hussain0ef77082018-10-10 16:42:53 -07006121
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05306122 if ((profile->hlp_ie_len +
Srinivas Girigowdad1e45b82019-04-15 15:08:28 -07006123 QDF_IPV4_ADDR_SIZE) > FILS_MAX_HLP_DATA_LEN) {
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05306124 sme_err("HLP IE len exceeds %d",
6125 profile->hlp_ie_len);
6126 qdf_mem_free(params);
6127 return;
6128 }
6129
Pragaspathi Thilagaraj6695ba92019-04-04 17:59:47 +05306130 params->vdev_id = vdev_id;
Srinivas Girigowdad1e45b82019-04-15 15:08:28 -07006131 params->hlp_ie_len = profile->hlp_ie_len + QDF_IPV4_ADDR_SIZE;
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05306132
Srinivas Girigowdad1e45b82019-04-15 15:08:28 -07006133 for (i = 0; i < QDF_IPV4_ADDR_SIZE; i++)
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05306134 params->hlp_ie[i] = (if_addr >> (i * 8)) & 0xFF;
6135
Srinivas Girigowdad1e45b82019-04-15 15:08:28 -07006136 qdf_mem_copy(params->hlp_ie + QDF_IPV4_ADDR_SIZE,
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05306137 profile->hlp_ie, profile->hlp_ie_len);
6138
6139 msg.type = SIR_HAL_HLP_IE_INFO;
6140 msg.reserved = 0;
6141 msg.bodyptr = params;
6142 status = sme_acquire_global_lock(&mac->sme);
6143 if (status != QDF_STATUS_SUCCESS) {
6144 sme_err("sme lock acquire fails");
6145 qdf_mem_free(params);
6146 return;
6147 }
6148
6149 if (!QDF_IS_STATUS_SUCCESS
gaurank kathpalia36b0c582018-08-28 17:45:43 +05306150 (scheduler_post_message(QDF_MODULE_ID_SME,
6151 QDF_MODULE_ID_WMA,
6152 QDF_MODULE_ID_WMA, &msg))) {
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05306153 sme_err("Not able to post WMA_HLP_IE_INFO message to HAL");
6154 sme_release_global_lock(&mac->sme);
6155 qdf_mem_free(params);
6156 return;
6157 }
6158
6159 sme_release_global_lock(&mac->sme);
6160}
6161
Jeff Johnson172237b2017-11-07 15:32:59 -08006162void sme_free_join_rsp_fils_params(struct csr_roam_info *roam_info)
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05306163{
6164 struct fils_join_rsp_params *roam_fils_params;
6165
6166 if (!roam_info) {
6167 sme_err("FILS Roam Info NULL");
6168 return;
6169 }
6170
6171 roam_fils_params = roam_info->fils_join_rsp;
6172 if (!roam_fils_params) {
6173 sme_err("FILS Roam Param NULL");
6174 return;
6175 }
6176
6177 if (roam_fils_params->fils_pmk)
6178 qdf_mem_free(roam_fils_params->fils_pmk);
6179
6180 qdf_mem_free(roam_fils_params);
6181
6182 roam_info->fils_join_rsp = NULL;
6183}
6184
6185#else
Pragaspathi Thilagaraj6695ba92019-04-04 17:59:47 +05306186inline void sme_send_hlp_ie_info(mac_handle_t mac_handle, uint8_t vdev_id,
Jeff Johnson66ee8a92018-03-17 15:24:26 -07006187 struct csr_roam_profile *profile, uint32_t if_addr)
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05306188{}
6189#endif
6190
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306191/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306192 * sme_update_wes_mode() -
6193 * Update WES Mode
6194 * This function is called through dynamic setConfig callback function
6195 * to configure isWESModeEnabled
6196 *
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08006197 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306198 * isWESModeEnabled - WES mode
6199 * sessionId - Session Identifier
6200 * Return QDF_STATUS_SUCCESS - SME update isWESModeEnabled config successfully.
6201 * Other status means SME is failed to update isWESModeEnabled.
6202 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006203
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006204QDF_STATUS sme_update_wes_mode(mac_handle_t mac_handle, bool isWESModeEnabled,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006205 uint8_t sessionId)
6206{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006207 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306208 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006209
Dustin Brownad06be62019-02-04 14:52:56 -08006210 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08006211 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
6212 FL("Invalid sme session id: %d"), sessionId);
6213 return QDF_STATUS_E_INVAL;
6214 }
6215
Jeff Johnson01f2c232018-11-21 19:17:44 -08006216 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306217 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306218 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006219 "LFR runtime successfully set WES Mode to %d - old value is %d - roam state is %s",
6220 isWESModeEnabled,
Wu Gao51a63562018-11-08 16:29:10 +08006221 mac->mlme_cfg->lfr.wes_mode_enabled,
Jeff Johnson01f2c232018-11-21 19:17:44 -08006222 mac_trace_get_neighbour_roam_state(mac->roam.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006223 neighborRoamInfo
6224 [sessionId].
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306225 neighborRoamState));
Wu Gao51a63562018-11-08 16:29:10 +08006226 mac->mlme_cfg->lfr.wes_mode_enabled = isWESModeEnabled;
Jeff Johnson01f2c232018-11-21 19:17:44 -08006227 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006228 }
6229
6230 return status;
6231}
6232
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306233/*
6234 * sme_set_roam_scan_control() -
6235 * Set roam scan control
6236 * This function is called to set roam scan control
6237 * if roam scan control is set to 0, roaming scan cache is cleared
6238 * any value other than 0 is treated as invalid value
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08006239 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306240 * sessionId - Session Identifier
6241 * Return QDF_STATUS_SUCCESS - SME update config successfully.
6242 * Other status means SME failure to update
6243 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006244QDF_STATUS sme_set_roam_scan_control(mac_handle_t mac_handle, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006245 bool roamScanControl)
6246{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006247 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306248 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006249
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306250 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006251 TRACE_CODE_SME_RX_HDD_SET_SCANCTRL, NO_SESSION, 0));
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08006252
Dustin Brownad06be62019-02-04 14:52:56 -08006253 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08006254 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
6255 FL("Invalid sme session id: %d"), sessionId);
6256 return QDF_STATUS_E_INVAL;
6257 }
6258
Jeff Johnson01f2c232018-11-21 19:17:44 -08006259 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306260 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306261 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006262 "LFR runtime successfully set roam scan control to %d - old value is %d - roam state is %s",
6263 roamScanControl,
Jeff Johnson01f2c232018-11-21 19:17:44 -08006264 mac->roam.configParam.nRoamScanControl,
6265 mac_trace_get_neighbour_roam_state(mac->roam.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006266 neighborRoamInfo
6267 [sessionId].
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306268 neighborRoamState));
Jeff Johnson01f2c232018-11-21 19:17:44 -08006269 mac->roam.configParam.nRoamScanControl = roamScanControl;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006270 if (0 == roamScanControl) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306271 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006272 "LFR runtime successfully cleared roam scan cache");
Jeff Johnson01f2c232018-11-21 19:17:44 -08006273 csr_flush_cfg_bg_scan_roam_channel_list(mac,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306274 sessionId);
Wu Gao51a63562018-11-08 16:29:10 +08006275 if (mac->mlme_cfg->lfr.roam_scan_offload_enabled) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08006276 csr_roam_offload_scan(mac, sessionId,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306277 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
6278 REASON_FLUSH_CHANNEL_LIST);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006279 }
6280 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08006281 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006282 }
6283 return status;
6284}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006285
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306286/*
6287 * sme_update_is_fast_roam_ini_feature_enabled() - enable/disable LFR
6288 * support at runtime
6289 * It is used at in the REG_DYNAMIC_VARIABLE macro definition of
6290 * isFastRoamIniFeatureEnabled.
6291 * This is a synchronous call
6292 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006293 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306294 * sessionId - Session Identifier
6295 * Return QDF_STATUS_SUCCESS - SME update isFastRoamIniFeatureEnabled config
6296 * successfully.
6297 * Other status means SME is failed to update isFastRoamIniFeatureEnabled.
6298 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006299QDF_STATUS sme_update_is_fast_roam_ini_feature_enabled(mac_handle_t mac_handle,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306300 uint8_t sessionId, const bool isFastRoamIniFeatureEnabled)
6301{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006302 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006303
Wu Gao51a63562018-11-08 16:29:10 +08006304 if (mac->mlme_cfg->lfr.lfr_enabled ==
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006305 isFastRoamIniFeatureEnabled) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306306 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006307 "%s: FastRoam is already enabled or disabled, nothing to do (returning) old(%d) new(%d)",
6308 __func__,
Wu Gao51a63562018-11-08 16:29:10 +08006309 mac->mlme_cfg->lfr.lfr_enabled,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006310 isFastRoamIniFeatureEnabled);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306311 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006312 }
6313
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306314 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006315 "%s: FastRoamEnabled is changed from %d to %d", __func__,
Wu Gao51a63562018-11-08 16:29:10 +08006316 mac->mlme_cfg->lfr.lfr_enabled,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006317 isFastRoamIniFeatureEnabled);
Wu Gao51a63562018-11-08 16:29:10 +08006318 mac->mlme_cfg->lfr.lfr_enabled = isFastRoamIniFeatureEnabled;
Jeff Johnson01f2c232018-11-21 19:17:44 -08006319 csr_neighbor_roam_update_fast_roaming_enabled(mac, sessionId,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306320 isFastRoamIniFeatureEnabled);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006321
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306322 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006323}
6324
Mukul Sharma69c44cd2016-09-12 18:33:57 +05306325/**
6326 * sme_config_fast_roaming() - enable/disable LFR support at runtime
Jeff Johnsonc7309062018-11-09 20:59:42 -08006327 * @mac_handle - The handle returned by macOpen.
Mukul Sharma69c44cd2016-09-12 18:33:57 +05306328 * @session_id - Session Identifier
6329 * @is_fast_roam_enabled - flag to enable/disable roaming
6330 *
6331 * When Supplicant issues enabled/disable fast roaming on the basis
6332 * of the Bssid modification in network block (e.g. AutoJoin mode N/W block)
6333 *
6334 * Return: QDF_STATUS
6335 */
6336
Jeff Johnsonc7309062018-11-09 20:59:42 -08006337QDF_STATUS sme_config_fast_roaming(mac_handle_t mac_handle, uint8_t session_id,
Mukul Sharma69c44cd2016-09-12 18:33:57 +05306338 const bool is_fast_roam_enabled)
6339{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006340 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
gaurank kathpalia14e2f912017-08-31 14:51:45 +05306341 struct csr_roam_session *session = CSR_GET_SESSION(mac_ctx, session_id);
Mukul Sharma69c44cd2016-09-12 18:33:57 +05306342 QDF_STATUS status;
6343
Varun Reddy Yeturue5a35d12017-10-20 11:26:57 -07006344 /*
6345 * supplicant_disabled_roaming flag is set to true in
6346 * wlan_hdd_cfg80211_connect_start when supplicant initiate connect
6347 * request with BSSID. This flag is reset when supplicant sends
6348 * vendor command to enable roaming after association.
Arif Hussaina48a9c02017-01-31 14:37:45 -08006349 *
6350 * This request from wpa_supplicant will be skipped in this function
Varun Reddy Yeturue5a35d12017-10-20 11:26:57 -07006351 * if roaming is disabled using driver command or INI and
6352 * supplicant_disabled_roaming flag remains set. So make sure to set
6353 * supplicant_disabled_roaming flag as per wpa_supplicant even if roam
6354 * request from wpa_supplicant ignored.
Arif Hussaina48a9c02017-01-31 14:37:45 -08006355 */
6356 if (session && session->pCurRoamProfile)
Varun Reddy Yeturue5a35d12017-10-20 11:26:57 -07006357 session->pCurRoamProfile->supplicant_disabled_roaming =
6358 !is_fast_roam_enabled;
Arif Hussaina48a9c02017-01-31 14:37:45 -08006359
Wu Gao51a63562018-11-08 16:29:10 +08006360 if (!mac_ctx->mlme_cfg->lfr.lfr_enabled) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07006361 sme_debug("Fast roam is disabled through ini");
Mukul Sharma69c44cd2016-09-12 18:33:57 +05306362 if (!is_fast_roam_enabled)
6363 return QDF_STATUS_SUCCESS;
6364 return QDF_STATUS_E_FAILURE;
6365 }
Sreelakshmi Konamkibda5bbf2016-09-12 18:38:10 +05306366
Mukul Sharma69c44cd2016-09-12 18:33:57 +05306367 status = csr_neighbor_roam_update_fast_roaming_enabled(mac_ctx,
6368 session_id, is_fast_roam_enabled);
6369 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07006370 sme_err("update fast roaming failed. status: %d", status);
Mukul Sharma69c44cd2016-09-12 18:33:57 +05306371 return QDF_STATUS_E_FAILURE;
6372 }
6373
6374 return QDF_STATUS_SUCCESS;
6375}
6376
Kiran Kumar Lokere7d6e4c92018-09-19 13:45:47 -07006377#ifdef FEATURE_WLAN_ESE
6378int sme_add_key_krk(mac_handle_t mac_handle, uint8_t session_id,
6379 const uint8_t *key, const int key_len)
6380{
6381 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
6382 struct csr_roam_session *session;
6383
6384 if (key_len < SIR_KRK_KEY_LEN) {
6385 sme_warn("Invalid KRK keylength [= %d]", key_len);
6386 return -EINVAL;
6387 }
6388
6389 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
6390 sme_err("incorrect session/vdev ID");
6391 return -EINVAL;
6392 }
6393
6394 session = CSR_GET_SESSION(mac_ctx, session_id);
6395
6396 qdf_mem_copy(session->eseCckmInfo.krk, key, SIR_KRK_KEY_LEN);
6397 session->eseCckmInfo.reassoc_req_num = 1;
6398 session->eseCckmInfo.krk_plumbed = true;
6399
6400 return 0;
6401}
Pragaspathi Thilagaraj974c27e2019-03-02 22:26:05 +05306402#endif
Kiran Kumar Lokere7d6e4c92018-09-19 13:45:47 -07006403
Pragaspathi Thilagaraj974c27e2019-03-02 22:26:05 +05306404#if defined(FEATURE_WLAN_ESE) && defined(WLAN_FEATURE_ROAM_OFFLOAD)
Kiran Kumar Lokere7d6e4c92018-09-19 13:45:47 -07006405int sme_add_key_btk(mac_handle_t mac_handle, uint8_t session_id,
6406 const uint8_t *key, const int key_len)
6407{
6408 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
6409 struct csr_roam_session *session;
6410
6411 if (key_len < SIR_BTK_KEY_LEN) {
6412 sme_warn("Invalid BTK keylength [= %d]", key_len);
6413 return -EINVAL;
6414 }
6415
6416 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
6417 sme_err("incorrect session/vdev ID");
6418 return -EINVAL;
6419 }
6420
6421 session = CSR_GET_SESSION(mac_ctx, session_id);
6422
6423 qdf_mem_copy(session->eseCckmInfo.btk, key, SIR_BTK_KEY_LEN);
6424 /*
6425 * KRK and BTK are updated by upper layer back to back. Send
6426 * updated KRK and BTK together to FW here.
6427 */
6428 csr_roam_offload_scan(mac_ctx, session_id,
6429 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
6430 REASON_ROAM_PSK_PMK_CHANGED);
6431
6432 return 0;
6433}
6434#endif
6435
Varun Reddy Yeturu66899fe2017-07-11 14:00:12 -07006436/**
6437 * sme_stop_roaming() - Stop roaming for a given sessionId
6438 * This is a synchronous call
6439 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006440 * @mac_handle - The handle returned by mac_open
Varun Reddy Yeturu66899fe2017-07-11 14:00:12 -07006441 * @sessionId - Session Identifier
6442 *
6443 * Return QDF_STATUS_SUCCESS on success
6444 * Other status on failure
6445 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006446QDF_STATUS sme_stop_roaming(mac_handle_t mac_handle, uint8_t session_id,
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08006447 uint8_t reason)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006448{
Naveen Rawat5c35ae42017-04-18 15:35:07 -07006449 struct scheduler_msg wma_msg = {0};
Jeff Johnsonc09caa42018-06-07 22:58:55 -07006450 QDF_STATUS status;
Jeff Johnsone6da4b02019-02-06 22:22:04 -08006451 struct roam_offload_scan_req *req;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006452 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Varun Reddy Yeturu66899fe2017-07-11 14:00:12 -07006453 tpCsrNeighborRoamControlInfo roam_info;
Varun Reddy Yeturue5a35d12017-10-20 11:26:57 -07006454 struct csr_roam_session *session;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006455
Varun Reddy Yeturu66899fe2017-07-11 14:00:12 -07006456 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
Naveen Rawat5c35ae42017-04-18 15:35:07 -07006457 sme_err("incorrect session/vdev ID");
6458 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006459 }
Varun Reddy Yeturue5a35d12017-10-20 11:26:57 -07006460
6461 session = CSR_GET_SESSION(mac_ctx, session_id);
Abhishek Singh1f217ec2017-12-22 11:48:27 +05306462
Padma, Santhosh Kumar86747ec2018-05-29 18:28:29 +05306463 /*
6464 * set the driver_disabled_roaming flag to true even if roaming
6465 * is not enabled on this session so that roam start requests for
6466 * this session can be blocked until driver enables roaming
6467 */
Vignesh Viswanathan3d478032018-08-02 20:18:53 +05306468 if (reason == ecsr_driver_disabled && session->pCurRoamProfile &&
6469 session->pCurRoamProfile->csrPersona == QDF_STA_MODE) {
Padma, Santhosh Kumar86747ec2018-05-29 18:28:29 +05306470 session->pCurRoamProfile->driver_disabled_roaming = true;
6471 sme_debug("driver_disabled_roaming set for session %d",
6472 session_id);
6473 }
6474
Abhishek Singh1f217ec2017-12-22 11:48:27 +05306475 roam_info = &mac_ctx->roam.neighborRoamInfo[session_id];
6476 if (!roam_info->b_roam_scan_offload_started) {
6477 sme_debug("Roaming already disabled for session %d", session_id);
Varun Reddy Yeturue5a35d12017-10-20 11:26:57 -07006478 return QDF_STATUS_SUCCESS;
6479 }
Naveen Rawat5c35ae42017-04-18 15:35:07 -07006480 req = qdf_mem_malloc(sizeof(*req));
Arif Hussain0ef77082018-10-10 16:42:53 -07006481 if (!req)
Naveen Rawat5c35ae42017-04-18 15:35:07 -07006482 return QDF_STATUS_E_NOMEM;
Naveen Rawat5c35ae42017-04-18 15:35:07 -07006483
6484 req->Command = ROAM_SCAN_OFFLOAD_STOP;
Padma, Santhosh Kumar86747ec2018-05-29 18:28:29 +05306485 if ((reason == eCsrForcedDisassoc) || reason == ecsr_driver_disabled)
Abhishek Singh533c9da2017-05-04 10:23:34 +05306486 req->reason = REASON_ROAM_STOP_ALL;
6487 else
Varun Reddy Yeturubc1bea02018-02-01 18:12:34 -08006488 req->reason = REASON_SME_ISSUED;
Varun Reddy Yeturu66899fe2017-07-11 14:00:12 -07006489 req->sessionId = session_id;
6490 if (csr_neighbor_middle_of_roaming(mac_ctx, session_id))
Naveen Rawat5c35ae42017-04-18 15:35:07 -07006491 req->middle_of_roaming = 1;
6492 else
6493 csr_roam_reset_roam_params(mac_ctx);
6494
6495 wma_msg.type = WMA_ROAM_SCAN_OFFLOAD_REQ;
6496 wma_msg.bodyptr = req;
6497
6498 status = wma_post_ctrl_msg(mac_ctx, &wma_msg);
Jeff Johnsonc09caa42018-06-07 22:58:55 -07006499 if (QDF_STATUS_SUCCESS != status) {
Naveen Rawat5c35ae42017-04-18 15:35:07 -07006500 sme_err("WMA_ROAM_SCAN_OFFLOAD_REQ failed, session_id: %d",
Varun Reddy Yeturu66899fe2017-07-11 14:00:12 -07006501 session_id);
gaurank kathpalia6d25c972019-03-07 20:25:28 +05306502 qdf_mem_zero(req, sizeof(*req));
Naveen Rawat5c35ae42017-04-18 15:35:07 -07006503 qdf_mem_free(req);
6504 return QDF_STATUS_E_FAULT;
6505 }
Varun Reddy Yeturu66899fe2017-07-11 14:00:12 -07006506 roam_info->b_roam_scan_offload_started = false;
6507 roam_info->last_sent_cmd = ROAM_SCAN_OFFLOAD_STOP;
Naveen Rawat5c35ae42017-04-18 15:35:07 -07006508
6509 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006510}
6511
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306512/*
6513 * sme_start_roaming() - Start roaming for a given sessionId
6514 * This is a synchronous call
6515 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006516 * mac_handle - The handle returned by mac_open
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306517 * sessionId - Session Identifier
6518 * Return QDF_STATUS_SUCCESS on success
6519 * Other status on failure
6520 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006521QDF_STATUS sme_start_roaming(mac_handle_t mac_handle, uint8_t sessionId,
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08006522 uint8_t reason)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006523{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006524 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306525 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006526
Jeff Johnson01f2c232018-11-21 19:17:44 -08006527 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306528 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08006529 csr_roam_offload_scan(mac, sessionId, ROAM_SCAN_OFFLOAD_START,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006530 reason);
Jeff Johnson01f2c232018-11-21 19:17:44 -08006531 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006532 }
6533
6534 return status;
6535}
6536
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306537/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306538 * sme_set_roam_opportunistic_scan_threshold_diff() -
6539 * Update Opportunistic Scan threshold diff
6540 * This function is called through dynamic setConfig callback function
6541 * to configure nOpportunisticThresholdDiff
6542 *
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08006543 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306544 * sessionId - Session Identifier
6545 * nOpportunisticThresholdDiff - Opportunistic Scan threshold diff
6546 * Return QDF_STATUS_SUCCESS - SME update nOpportunisticThresholdDiff config
6547 * successfully.
6548 * else SME is failed to update nOpportunisticThresholdDiff.
6549 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006550QDF_STATUS sme_set_roam_opportunistic_scan_threshold_diff(
6551 mac_handle_t mac_handle,
6552 uint8_t sessionId,
6553 const uint8_t nOpportunisticThresholdDiff)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006554{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006555 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306556 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006557
Jeff Johnson01f2c232018-11-21 19:17:44 -08006558 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306559 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08006560 status = csr_neighbor_roam_update_config(mac, sessionId,
Varun Reddy Yeturuff4feb02016-04-20 12:26:11 -07006561 nOpportunisticThresholdDiff,
6562 REASON_OPPORTUNISTIC_THRESH_DIFF_CHANGED);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306563 if (QDF_IS_STATUS_SUCCESS(status)) {
Wu Gao51a63562018-11-08 16:29:10 +08006564 mac->mlme_cfg->lfr.opportunistic_scan_threshold_diff =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006565 nOpportunisticThresholdDiff;
6566 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08006567 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006568 }
6569 return status;
6570}
6571
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306572/*
6573 * sme_get_roam_opportunistic_scan_threshold_diff()
6574 * gets Opportunistic Scan threshold diff
6575 * This is a synchronous call
6576 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006577 * mac_handle - The handle returned by mac_open
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306578 * Return uint8_t - nOpportunisticThresholdDiff
6579 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006580uint8_t sme_get_roam_opportunistic_scan_threshold_diff(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006581{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006582 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306583
Wu Gao51a63562018-11-08 16:29:10 +08006584 return mac->mlme_cfg->lfr.opportunistic_scan_threshold_diff;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006585}
6586
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306587/*
6588 * sme_set_roam_rescan_rssi_diff() - Update roam rescan rssi diff
6589 * This function is called through dynamic setConfig callback function
6590 * to configure nRoamRescanRssiDiff
6591 *
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08006592 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306593 * sessionId - Session Identifier
6594 * nRoamRescanRssiDiff - roam rescan rssi diff
6595 * Return QDF_STATUS_SUCCESS - SME update nRoamRescanRssiDiff config
6596 * successfully.
6597 * else SME is failed to update nRoamRescanRssiDiff.
6598 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006599QDF_STATUS sme_set_roam_rescan_rssi_diff(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006600 uint8_t sessionId,
6601 const uint8_t nRoamRescanRssiDiff)
6602{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006603 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306604 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006605
Jeff Johnson01f2c232018-11-21 19:17:44 -08006606 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306607 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08006608 status = csr_neighbor_roam_update_config(mac, sessionId,
Varun Reddy Yeturuff4feb02016-04-20 12:26:11 -07006609 nRoamRescanRssiDiff,
6610 REASON_ROAM_RESCAN_RSSI_DIFF_CHANGED);
Wu Gao51a63562018-11-08 16:29:10 +08006611 if (QDF_IS_STATUS_SUCCESS(status))
6612 mac->mlme_cfg->lfr.roam_rescan_rssi_diff =
6613 nRoamRescanRssiDiff;
6614
Jeff Johnson01f2c232018-11-21 19:17:44 -08006615 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006616 }
6617 return status;
6618}
6619
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306620/*
6621 * sme_get_roam_rescan_rssi_diff()
6622 * gets roam rescan rssi diff
6623 * This is a synchronous call
6624 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006625 * mac_handle - The handle returned by mac_open
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306626 * Return int8_t - nRoamRescanRssiDiff
6627 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006628uint8_t sme_get_roam_rescan_rssi_diff(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006629{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006630 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306631
Wu Gao51a63562018-11-08 16:29:10 +08006632 return mac->mlme_cfg->lfr.roam_rescan_rssi_diff;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006633}
6634
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306635/*
6636 * sme_set_roam_bmiss_first_bcnt() -
6637 * Update Roam count for first beacon miss
6638 * This function is called through dynamic setConfig callback function
6639 * to configure nRoamBmissFirstBcnt
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08006640 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306641 * sessionId - Session Identifier
6642 * nRoamBmissFirstBcnt - Roam first bmiss count
6643 * Return QDF_STATUS_SUCCESS - SME update nRoamBmissFirstBcnt
6644 * successfully.
6645 * else SME is failed to update nRoamBmissFirstBcnt
6646 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006647QDF_STATUS sme_set_roam_bmiss_first_bcnt(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006648 uint8_t sessionId,
6649 const uint8_t nRoamBmissFirstBcnt)
6650{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006651 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306652 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006653
Jeff Johnson01f2c232018-11-21 19:17:44 -08006654 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306655 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08006656 status = csr_neighbor_roam_update_config(mac, sessionId,
Varun Reddy Yeturuff4feb02016-04-20 12:26:11 -07006657 nRoamBmissFirstBcnt,
6658 REASON_ROAM_BMISS_FIRST_BCNT_CHANGED);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306659 if (QDF_IS_STATUS_SUCCESS(status)) {
Wu Gao51a63562018-11-08 16:29:10 +08006660 mac->mlme_cfg->lfr.roam_bmiss_first_bcnt =
6661 nRoamBmissFirstBcnt;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006662 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08006663 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006664 }
6665 return status;
6666}
6667
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306668/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306669 * sme_set_roam_bmiss_final_bcnt() -
6670 * Update Roam count for final beacon miss
6671 * This function is called through dynamic setConfig callback function
6672 * to configure nRoamBmissFinalBcnt
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08006673 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306674 * sessionId - Session Identifier
6675 * nRoamBmissFinalBcnt - Roam final bmiss count
6676 * Return QDF_STATUS_SUCCESS - SME update nRoamBmissFinalBcnt
6677 * successfully.
6678 * else SME is failed to update nRoamBmissFinalBcnt
6679 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006680QDF_STATUS sme_set_roam_bmiss_final_bcnt(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006681 uint8_t sessionId,
6682 const uint8_t nRoamBmissFinalBcnt)
6683{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006684 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306685 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006686
Jeff Johnson01f2c232018-11-21 19:17:44 -08006687 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306688 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08006689 status = csr_neighbor_roam_update_config(mac, sessionId,
Varun Reddy Yeturuff4feb02016-04-20 12:26:11 -07006690 nRoamBmissFinalBcnt,
6691 REASON_ROAM_BMISS_FINAL_BCNT_CHANGED);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306692 if (QDF_IS_STATUS_SUCCESS(status)) {
Wu Gao51a63562018-11-08 16:29:10 +08006693 mac->mlme_cfg->lfr.roam_bmiss_final_bcnt =
6694 nRoamBmissFinalBcnt;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006695 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08006696 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006697 }
6698 return status;
6699}
6700
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306701/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306702 * sme_set_neighbor_lookup_rssi_threshold() - update neighbor lookup
6703 * rssi threshold
6704 * This is a synchronous call
6705 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006706 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306707 * sessionId - Session Identifier
6708 * Return QDF_STATUS_SUCCESS - SME update config successful.
6709 * Other status means SME is failed to update
6710 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006711QDF_STATUS sme_set_neighbor_lookup_rssi_threshold(mac_handle_t mac_handle,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306712 uint8_t sessionId, uint8_t neighborLookupRssiThreshold)
6713{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006714 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306715 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006716
Jeff Johnson01f2c232018-11-21 19:17:44 -08006717 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306718 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08006719 status = csr_neighbor_roam_update_config(mac,
Varun Reddy Yeturuff4feb02016-04-20 12:26:11 -07006720 sessionId, neighborLookupRssiThreshold,
6721 REASON_LOOKUP_THRESH_CHANGED);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306722 if (QDF_IS_STATUS_SUCCESS(status)) {
Wu Gao51a63562018-11-08 16:29:10 +08006723 mac->mlme_cfg->lfr.neighbor_lookup_rssi_threshold =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006724 neighborLookupRssiThreshold;
6725 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08006726 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006727 }
6728 return status;
6729}
6730
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306731/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306732 * sme_get_neighbor_lookup_rssi_threshold() - get neighbor lookup
6733 * rssi threshold
6734 * This is a synchronous call
6735 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006736 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306737 * Return QDF_STATUS_SUCCESS - SME update config successful.
6738 * Other status means SME is failed to update
6739 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006740uint8_t sme_get_neighbor_lookup_rssi_threshold(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006741{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006742 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306743
Wu Gao51a63562018-11-08 16:29:10 +08006744 return mac->mlme_cfg->lfr.neighbor_lookup_rssi_threshold;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006745}
6746
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306747/*
6748 * sme_set_neighbor_scan_refresh_period() - set neighbor scan results
6749 * refresh period
6750 * This is a synchronous call
6751 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006752 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306753 * sessionId - Session Identifier
6754 * Return QDF_STATUS_SUCCESS - SME update config successful.
6755 * Other status means SME is failed to update
6756 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006757QDF_STATUS sme_set_neighbor_scan_refresh_period(mac_handle_t mac_handle,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306758 uint8_t sessionId, uint16_t neighborScanResultsRefreshPeriod)
6759{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006760 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306761 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006762 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
6763
Dustin Brownad06be62019-02-04 14:52:56 -08006764 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08006765 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
6766 FL("Invalid sme session id: %d"), sessionId);
6767 return QDF_STATUS_E_INVAL;
6768 }
6769
Jeff Johnson01f2c232018-11-21 19:17:44 -08006770 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306771 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08006772 pNeighborRoamInfo = &mac->roam.neighborRoamInfo[sessionId];
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306773 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006774 "LFR runtime successfully set roam scan refresh period to %d- old value is %d - roam state is %s",
6775 neighborScanResultsRefreshPeriod,
Wu Gao51a63562018-11-08 16:29:10 +08006776 mac->mlme_cfg->lfr.
6777 neighbor_scan_results_refresh_period,
Jeff Johnson01f2c232018-11-21 19:17:44 -08006778 mac_trace_get_neighbour_roam_state(mac->roam.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006779 neighborRoamInfo
6780 [sessionId].
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306781 neighborRoamState));
Wu Gao51a63562018-11-08 16:29:10 +08006782 mac->mlme_cfg->lfr.neighbor_scan_results_refresh_period =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006783 neighborScanResultsRefreshPeriod;
6784 pNeighborRoamInfo->cfgParams.neighborResultsRefreshPeriod =
6785 neighborScanResultsRefreshPeriod;
6786
Wu Gao51a63562018-11-08 16:29:10 +08006787 if (mac->mlme_cfg->lfr.roam_scan_offload_enabled) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08006788 csr_roam_offload_scan(mac, sessionId,
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05306789 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
6790 REASON_NEIGHBOR_SCAN_REFRESH_PERIOD_CHANGED);
6791 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08006792 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006793 }
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05306794
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006795 return status;
6796}
6797
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306798/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306799 * sme_get_neighbor_scan_refresh_period() - get neighbor scan results
6800 * refresh period
6801 * This is a synchronous call
6802 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006803 * \param mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306804 * \return uint16_t - Neighbor scan results refresh period value
6805 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006806uint16_t sme_get_neighbor_scan_refresh_period(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006807{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006808 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306809
Wu Gao51a63562018-11-08 16:29:10 +08006810 return mac->mlme_cfg->lfr.neighbor_scan_results_refresh_period;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006811}
6812
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306813/*
6814 * sme_get_empty_scan_refresh_period() - get empty scan refresh period
6815 * This is a synchronuous call
6816 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006817 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306818 * Return QDF_STATUS_SUCCESS - SME update config successful.
6819 * Other status means SME is failed to update
6820 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006821uint16_t sme_get_empty_scan_refresh_period(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006822{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006823 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306824
Wu Gao51a63562018-11-08 16:29:10 +08006825 return mac->mlme_cfg->lfr.empty_scan_refresh_period;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006826}
6827
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306828/*
6829 * sme_update_empty_scan_refresh_period
Jeff Johnson96259452019-02-26 20:38:17 -08006830 * Update empty_scan_refresh_period
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306831 * This function is called through dynamic setConfig callback function
Jeff Johnson96259452019-02-26 20:38:17 -08006832 * to configure empty_scan_refresh_period
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306833 * Usage: adb shell iwpriv wlan0 setConfig
Jeff Johnson96259452019-02-26 20:38:17 -08006834 * empty_scan_refresh_period=[0 .. 60]
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306835 *
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08006836 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306837 * sessionId - Session Identifier
Jeff Johnson96259452019-02-26 20:38:17 -08006838 * empty_scan_refresh_period - scan period following empty scan results.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306839 * Return Success or failure
6840 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006841
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006842QDF_STATUS sme_update_empty_scan_refresh_period(mac_handle_t mac_handle,
6843 uint8_t sessionId, uint16_t
Jeff Johnson96259452019-02-26 20:38:17 -08006844 empty_scan_refresh_period)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006845{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006846 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306847 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006848 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
6849
Dustin Brownad06be62019-02-04 14:52:56 -08006850 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08006851 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
6852 FL("Invalid sme session id: %d"), sessionId);
6853 return QDF_STATUS_E_INVAL;
6854 }
6855
Jeff Johnson01f2c232018-11-21 19:17:44 -08006856 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306857 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08006858 pNeighborRoamInfo = &mac->roam.neighborRoamInfo[sessionId];
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306859 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006860 "LFR runtime successfully set roam scan period to %d -old value is %d - roam state is %s",
Jeff Johnson96259452019-02-26 20:38:17 -08006861 empty_scan_refresh_period,
Wu Gao51a63562018-11-08 16:29:10 +08006862 mac->mlme_cfg->lfr.empty_scan_refresh_period,
Jeff Johnson01f2c232018-11-21 19:17:44 -08006863 mac_trace_get_neighbour_roam_state(mac->roam.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006864 neighborRoamInfo
6865 [sessionId].
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306866 neighborRoamState));
Wu Gao51a63562018-11-08 16:29:10 +08006867 mac->mlme_cfg->lfr.empty_scan_refresh_period =
Jeff Johnson96259452019-02-26 20:38:17 -08006868 empty_scan_refresh_period;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006869 pNeighborRoamInfo->cfgParams.emptyScanRefreshPeriod =
Jeff Johnson96259452019-02-26 20:38:17 -08006870 empty_scan_refresh_period;
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05306871
Wu Gao51a63562018-11-08 16:29:10 +08006872 if (mac->mlme_cfg->lfr.roam_scan_offload_enabled) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08006873 csr_roam_offload_scan(mac, sessionId,
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05306874 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
6875 REASON_EMPTY_SCAN_REF_PERIOD_CHANGED);
6876 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08006877 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006878 }
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05306879
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006880 return status;
6881}
6882
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306883/*
6884 * sme_set_neighbor_scan_min_chan_time() -
6885 * Update nNeighborScanMinChanTime
6886 * This function is called through dynamic setConfig callback function
6887 * to configure gNeighborScanChannelMinTime
6888 * Usage: adb shell iwpriv wlan0 setConfig
6889 * gNeighborScanChannelMinTime=[0 .. 60]
6890 *
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08006891 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306892 * nNeighborScanMinChanTime - Channel minimum dwell time
6893 * sessionId - Session Identifier
6894 * Return Success or failure
6895 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006896QDF_STATUS sme_set_neighbor_scan_min_chan_time(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006897 const uint16_t
6898 nNeighborScanMinChanTime,
6899 uint8_t sessionId)
6900{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006901 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306902 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006903
Dustin Brownad06be62019-02-04 14:52:56 -08006904 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08006905 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
6906 FL("Invalid sme session id: %d"), sessionId);
6907 return QDF_STATUS_E_INVAL;
6908 }
6909
Jeff Johnson01f2c232018-11-21 19:17:44 -08006910 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306911 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306912 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006913 "LFR runtime successfully set channel min dwell time to %d - old value is %d - roam state is %s",
6914 nNeighborScanMinChanTime,
Wu Gao51a63562018-11-08 16:29:10 +08006915 mac->mlme_cfg->lfr.neighbor_scan_min_chan_time,
Jeff Johnson01f2c232018-11-21 19:17:44 -08006916 mac_trace_get_neighbour_roam_state(mac->roam.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006917 neighborRoamInfo
6918 [sessionId].
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306919 neighborRoamState));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006920
Wu Gao51a63562018-11-08 16:29:10 +08006921 mac->mlme_cfg->lfr.neighbor_scan_min_chan_time =
6922 nNeighborScanMinChanTime;
Jeff Johnson01f2c232018-11-21 19:17:44 -08006923 mac->roam.neighborRoamInfo[sessionId].cfgParams.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006924 minChannelScanTime = nNeighborScanMinChanTime;
Jeff Johnson01f2c232018-11-21 19:17:44 -08006925 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006926 }
6927
6928 return status;
6929}
6930
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306931/*
6932 * sme_set_neighbor_scan_max_chan_time() -
6933 * Update nNeighborScanMaxChanTime
6934 * This function is called through dynamic setConfig callback function
6935 * to configure gNeighborScanChannelMaxTime
6936 * Usage: adb shell iwpriv wlan0 setConfig
6937 * gNeighborScanChannelMaxTime=[0 .. 60]
6938 *
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08006939 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306940 * sessionId - Session Identifier
6941 * nNeighborScanMinChanTime - Channel maximum dwell time
6942 * Return Success or failure
6943 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006944QDF_STATUS sme_set_neighbor_scan_max_chan_time(mac_handle_t mac_handle,
6945 uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006946 const uint16_t
6947 nNeighborScanMaxChanTime)
6948{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006949 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306950 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006951 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
6952
Dustin Brownad06be62019-02-04 14:52:56 -08006953 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08006954 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
6955 FL("Invalid sme session id: %d"), sessionId);
6956 return QDF_STATUS_E_INVAL;
6957 }
6958
Jeff Johnson01f2c232018-11-21 19:17:44 -08006959 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306960 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08006961 pNeighborRoamInfo = &mac->roam.neighborRoamInfo[sessionId];
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306962 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006963 "LFR runtime successfully set channel max dwell time to %d - old value is %d - roam state is %s",
6964 nNeighborScanMaxChanTime,
Wu Gao51a63562018-11-08 16:29:10 +08006965 mac->mlme_cfg->lfr.neighbor_scan_max_chan_time,
Jeff Johnson01f2c232018-11-21 19:17:44 -08006966 mac_trace_get_neighbour_roam_state(mac->roam.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006967 neighborRoamInfo
6968 [sessionId].
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306969 neighborRoamState));
Wu Gao51a63562018-11-08 16:29:10 +08006970 mac->mlme_cfg->lfr.neighbor_scan_max_chan_time =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006971 nNeighborScanMaxChanTime;
6972 pNeighborRoamInfo->cfgParams.maxChannelScanTime =
6973 nNeighborScanMaxChanTime;
Wu Gao51a63562018-11-08 16:29:10 +08006974 if (mac->mlme_cfg->lfr.roam_scan_offload_enabled) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08006975 csr_roam_offload_scan(mac, sessionId,
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05306976 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
6977 REASON_SCAN_CH_TIME_CHANGED);
6978 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08006979 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006980 }
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05306981
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006982 return status;
6983}
6984
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306985/*
6986 * sme_get_neighbor_scan_min_chan_time() -
6987 * get neighbor scan min channel time
6988 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006989 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306990 * sessionId - Session Identifier
6991 * Return uint16_t - channel min time value
6992 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006993uint16_t sme_get_neighbor_scan_min_chan_time(mac_handle_t mac_handle,
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08006994 uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006995{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006996 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08006997
Dustin Brownad06be62019-02-04 14:52:56 -08006998 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08006999 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7000 FL("Invalid sme session id: %d"), sessionId);
7001 return 0;
7002 }
7003
Jeff Johnson01f2c232018-11-21 19:17:44 -08007004 return mac->roam.neighborRoamInfo[sessionId].cfgParams.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007005 minChannelScanTime;
7006}
7007
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307008/*
7009 * sme_get_neighbor_roam_state() -
7010 * get neighbor roam state
7011 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007012 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307013 * sessionId - Session Identifier
7014 * Return uint32_t - neighbor roam state
7015 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007016uint32_t sme_get_neighbor_roam_state(mac_handle_t mac_handle, uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007017{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007018 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08007019
Dustin Brownad06be62019-02-04 14:52:56 -08007020 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08007021 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7022 FL("Invalid sme session id: %d"), sessionId);
7023 return 0;
7024 }
7025
Jeff Johnson01f2c232018-11-21 19:17:44 -08007026 return mac->roam.neighborRoamInfo[sessionId].neighborRoamState;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007027}
7028
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307029/*
7030 * sme_get_current_roam_state() -
7031 * get current roam state
7032 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007033 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307034 * sessionId - Session Identifier
7035 * Return uint32_t - current roam state
7036 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007037uint32_t sme_get_current_roam_state(mac_handle_t mac_handle, uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007038{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007039 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307040
Jeff Johnson01f2c232018-11-21 19:17:44 -08007041 return mac->roam.curState[sessionId];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007042}
7043
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307044/*
7045 * sme_get_current_roam_sub_state() -
7046 * \brief get neighbor roam sub state
7047 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007048 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307049 * sessionId - Session Identifier
7050 * Return uint32_t - current roam sub state
7051 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007052uint32_t sme_get_current_roam_sub_state(mac_handle_t mac_handle,
7053 uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007054{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007055 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307056
Jeff Johnson01f2c232018-11-21 19:17:44 -08007057 return mac->roam.curSubState[sessionId];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007058}
7059
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307060/*
7061 * sme_get_lim_sme_state() -
7062 * get Lim Sme state
7063 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007064 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307065 * Return uint32_t - Lim Sme state
7066 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007067uint32_t sme_get_lim_sme_state(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007068{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007069 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307070
Jeff Johnson01f2c232018-11-21 19:17:44 -08007071 return mac->lim.gLimSmeState;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007072}
7073
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307074/*
7075 * sme_get_lim_mlm_state() -
7076 * get Lim Mlm state
7077 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007078 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307079 * Return uint32_t - Lim Mlm state
7080 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007081uint32_t sme_get_lim_mlm_state(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007082{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007083 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307084
Jeff Johnson01f2c232018-11-21 19:17:44 -08007085 return mac->lim.gLimMlmState;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007086}
7087
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307088/*
7089 * sme_is_lim_session_valid() -
7090 * is Lim session valid
7091 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007092 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307093 * sessionId - Session Identifier
7094 * Return bool - true or false
7095 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007096bool sme_is_lim_session_valid(mac_handle_t mac_handle, uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007097{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007098 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Hanumantha Reddy Pothula589fd702015-11-17 15:25:16 +05307099
Jeff Johnson01f2c232018-11-21 19:17:44 -08007100 if (sessionId > mac->lim.maxBssId)
Hanumantha Reddy Pothula589fd702015-11-17 15:25:16 +05307101 return false;
7102
Jeff Johnson01f2c232018-11-21 19:17:44 -08007103 return mac->lim.gpSession[sessionId].valid;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007104}
7105
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307106/*
7107 * sme_get_lim_sme_session_state() -
7108 * get Lim Sme session state
7109 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007110 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307111 * sessionId - Session Identifier
7112 * Return uint32_t - Lim Sme session state
7113 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007114uint32_t sme_get_lim_sme_session_state(mac_handle_t mac_handle,
7115 uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007116{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007117 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307118
Jeff Johnson01f2c232018-11-21 19:17:44 -08007119 return mac->lim.gpSession[sessionId].limSmeState;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007120}
7121
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307122/*
7123 * sme_get_lim_mlm_session_state() -
7124 * \brief get Lim Mlm session state
7125 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007126 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307127 * sessionId - Session Identifier
7128 * Return uint32_t - Lim Mlm session state
7129 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007130uint32_t sme_get_lim_mlm_session_state(mac_handle_t mac_handle,
7131 uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007132{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007133 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307134
Jeff Johnson01f2c232018-11-21 19:17:44 -08007135 return mac->lim.gpSession[sessionId].limMlmState;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007136}
7137
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307138/*
7139 * sme_get_neighbor_scan_max_chan_time() -
7140 * get neighbor scan max channel time
7141 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007142 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307143 * sessionId - Session Identifier
7144 * Return uint16_t - channel max time value
7145 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007146uint16_t sme_get_neighbor_scan_max_chan_time(mac_handle_t mac_handle,
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08007147 uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007148{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007149 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08007150
Dustin Brownad06be62019-02-04 14:52:56 -08007151 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08007152 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7153 FL("Invalid sme session id: %d"), sessionId);
7154 return 0;
7155 }
7156
Jeff Johnson01f2c232018-11-21 19:17:44 -08007157 return mac->roam.neighborRoamInfo[sessionId].cfgParams.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007158 maxChannelScanTime;
7159}
7160
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307161/*
7162 * sme_set_neighbor_scan_period() -
7163 * Update nNeighborScanPeriod
7164 * This function is called through dynamic setConfig callback function
7165 * to configure nNeighborScanPeriod
7166 * Usage: adb shell iwpriv wlan0 setConfig
7167 * nNeighborScanPeriod=[0 .. 1000]
7168 *
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08007169 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307170 * sessionId - Session Identifier
7171 * nNeighborScanPeriod - neighbor scan period
7172 * Return Success or failure
7173 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007174QDF_STATUS sme_set_neighbor_scan_period(mac_handle_t mac_handle,
7175 uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007176 const uint16_t nNeighborScanPeriod)
7177{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007178 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307179 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007180 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
7181
Dustin Brownad06be62019-02-04 14:52:56 -08007182 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08007183 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7184 FL("Invalid sme session id: %d"), sessionId);
7185 return QDF_STATUS_E_INVAL;
7186 }
7187
Jeff Johnson01f2c232018-11-21 19:17:44 -08007188 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307189 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08007190 pNeighborRoamInfo = &mac->roam.neighborRoamInfo[sessionId];
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307191 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307192 "LFR runtime successfully set neighbor scan period to %d - old value is %d - roam state is %s",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007193 nNeighborScanPeriod,
Wu Gao51a63562018-11-08 16:29:10 +08007194 mac->mlme_cfg->lfr.neighbor_scan_timer_period,
Jeff Johnson01f2c232018-11-21 19:17:44 -08007195 mac_trace_get_neighbour_roam_state(mac->roam.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007196 neighborRoamInfo
7197 [sessionId].
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307198 neighborRoamState));
Wu Gao51a63562018-11-08 16:29:10 +08007199 mac->mlme_cfg->lfr.neighbor_scan_timer_period =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007200 nNeighborScanPeriod;
7201 pNeighborRoamInfo->cfgParams.neighborScanPeriod =
7202 nNeighborScanPeriod;
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05307203
Wu Gao51a63562018-11-08 16:29:10 +08007204 if (mac->mlme_cfg->lfr.roam_scan_offload_enabled) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08007205 csr_roam_offload_scan(mac, sessionId,
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05307206 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
7207 REASON_SCAN_HOME_TIME_CHANGED);
7208 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08007209 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007210 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007211
7212 return status;
7213}
7214
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307215/*
7216 * sme_get_neighbor_scan_period() -
7217 * get neighbor scan period
7218 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007219 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307220 * sessionId - Session Identifier
7221 * Return uint16_t - neighbor scan period
7222 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007223uint16_t sme_get_neighbor_scan_period(mac_handle_t mac_handle,
7224 uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007225{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007226 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08007227
Dustin Brownad06be62019-02-04 14:52:56 -08007228 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08007229 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7230 FL("Invalid sme session id: %d"), sessionId);
7231 return 0;
7232 }
7233
Jeff Johnson01f2c232018-11-21 19:17:44 -08007234 return mac->roam.neighborRoamInfo[sessionId].cfgParams.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007235 neighborScanPeriod;
7236}
7237
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307238/*
7239 * sme_get_roam_rssi_diff() - get Roam rssi diff
7240 * This is a synchronous call
7241 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007242 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307243 * Return uint16_t - Rssi diff value
7244 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007245uint8_t sme_get_roam_rssi_diff(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007246{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007247 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307248
Wu Gao51a63562018-11-08 16:29:10 +08007249 return mac->mlme_cfg->lfr.roam_rssi_diff;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007250}
7251
7252/**
7253 * sme_change_roam_scan_channel_list() - to change scan channel list
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08007254 * @mac_handle: Opaque handle to the global MAC context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007255 * @sessionId: sme session id
7256 * @pChannelList: Output channel list
7257 * @numChannels: Output number of channels
7258 *
7259 * This routine is called to Change roam scan channel list.
7260 * This is a synchronous call
7261 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307262 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007263 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007264QDF_STATUS sme_change_roam_scan_channel_list(mac_handle_t mac_handle,
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08007265 uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007266 uint8_t *pChannelList,
7267 uint8_t numChannels)
7268{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007269 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307270 QDF_STATUS status = QDF_STATUS_SUCCESS;
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08007271 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
Wu Gao0821b0d2019-01-11 17:31:11 +08007272 uint8_t oldChannelList[CFG_VALID_CHANNEL_LIST_LEN * 2] = { 0 };
7273 uint8_t newChannelList[CFG_VALID_CHANNEL_LIST_LEN * 2] = { 0 };
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007274 uint8_t i = 0, j = 0;
7275 tCsrChannelInfo *chan_info;
7276
Dustin Brownad06be62019-02-04 14:52:56 -08007277 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08007278 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7279 FL("Invalid sme session id: %d"), sessionId);
7280 return QDF_STATUS_E_INVAL;
7281 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007282
Jeff Johnson01f2c232018-11-21 19:17:44 -08007283 pNeighborRoamInfo = &mac->roam.neighborRoamInfo[sessionId];
7284 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307285 if (!QDF_IS_STATUS_SUCCESS(status)) {
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05307286 sme_err("Failed to acquire SME lock");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007287 return status;
7288 }
7289 chan_info = &pNeighborRoamInfo->cfgParams.channelInfo;
7290
Jeff Johnson038efe72019-03-18 13:39:31 -07007291 if (chan_info->ChannelList) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007292 for (i = 0; i < chan_info->numOfChannels; i++) {
7293 if (j < sizeof(oldChannelList))
7294 j += snprintf(oldChannelList + j,
7295 sizeof(oldChannelList) -
7296 j, "%d",
7297 chan_info->ChannelList[i]);
7298 else
7299 break;
7300 }
7301 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08007302 csr_flush_cfg_bg_scan_roam_channel_list(mac, sessionId);
7303 csr_create_bg_scan_roam_channel_list(mac, sessionId, pChannelList,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007304 numChannels);
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007305 sme_set_roam_scan_control(mac_handle, sessionId, 1);
Jeff Johnson038efe72019-03-18 13:39:31 -07007306 if (chan_info->ChannelList) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007307 j = 0;
7308 for (i = 0; i < chan_info->numOfChannels; i++) {
7309 if (j < sizeof(newChannelList))
7310 j += snprintf(newChannelList + j,
7311 sizeof(newChannelList) -
7312 j, " %d",
7313 chan_info->ChannelList[i]);
7314 else
7315 break;
7316 }
7317 }
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307318 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307319 "LFR runtime successfully set roam scan channels to %s - old value is %s - roam state is %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007320 newChannelList, oldChannelList,
Jeff Johnson01f2c232018-11-21 19:17:44 -08007321 mac->roam.neighborRoamInfo[sessionId].neighborRoamState);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007322
Wu Gao51a63562018-11-08 16:29:10 +08007323 if (mac->mlme_cfg->lfr.roam_scan_offload_enabled)
Jeff Johnson01f2c232018-11-21 19:17:44 -08007324 csr_roam_offload_scan(mac, sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007325 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
7326 REASON_CHANNEL_LIST_CHANGED);
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05307327
Jeff Johnson01f2c232018-11-21 19:17:44 -08007328 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007329 return status;
7330}
7331
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007332/**
7333 * sme_get_roam_scan_channel_list() - To get roam scan channel list
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08007334 * @mac_handle: Opaque handle to the global MAC context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007335 * @pChannelList: Output channel list
7336 * @pNumChannels: Output number of channels
7337 * @sessionId: Session Identifier
7338 *
7339 * To get roam scan channel list This is a synchronous call
7340 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307341 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007342 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007343QDF_STATUS sme_get_roam_scan_channel_list(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007344 uint8_t *pChannelList, uint8_t *pNumChannels,
7345 uint8_t sessionId)
7346{
7347 int i = 0;
7348 uint8_t *pOutPtr = pChannelList;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007349 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08007350 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307351 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007352
Dustin Brownad06be62019-02-04 14:52:56 -08007353 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08007354 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7355 FL("Invalid sme session id: %d"), sessionId);
7356 return QDF_STATUS_E_INVAL;
7357 }
7358
Jeff Johnson01f2c232018-11-21 19:17:44 -08007359 pNeighborRoamInfo = &mac->roam.neighborRoamInfo[sessionId];
7360 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307361 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007362 return status;
Jeff Johnson038efe72019-03-18 13:39:31 -07007363 if (!pNeighborRoamInfo->cfgParams.channelInfo.ChannelList) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307364 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_WARN,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007365 FL("Roam Scan channel list is NOT yet initialized"));
7366 *pNumChannels = 0;
Jeff Johnson01f2c232018-11-21 19:17:44 -08007367 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007368 return status;
7369 }
7370
7371 *pNumChannels = pNeighborRoamInfo->cfgParams.channelInfo.numOfChannels;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307372 for (i = 0; i < (*pNumChannels); i++)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007373 pOutPtr[i] =
7374 pNeighborRoamInfo->cfgParams.channelInfo.ChannelList[i];
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307375
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007376 pOutPtr[i] = '\0';
Jeff Johnson01f2c232018-11-21 19:17:44 -08007377 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007378 return status;
7379}
7380
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307381/*
7382 * sme_get_is_ese_feature_enabled() - get ESE feature enabled or not
7383 * This is a synchronuous call
7384 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007385 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307386 * Return true (1) - if the ESE feature is enabled
7387 * false (0) - if feature is disabled (compile or runtime)
7388 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007389bool sme_get_is_ese_feature_enabled(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007390{
7391#ifdef FEATURE_WLAN_ESE
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
Jeff Johnson01f2c232018-11-21 19:17:44 -08007394 return csr_roam_is_ese_ini_feature_enabled(mac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007395#else
7396 return false;
7397#endif
7398}
7399
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307400/*
7401 * sme_get_wes_mode() - get WES Mode
7402 * This is a synchronous call
7403 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007404 * mac_handle - The handle returned by mac_open
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307405 * Return uint8_t - WES Mode Enabled(1)/Disabled(0)
7406 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007407bool sme_get_wes_mode(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007408{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007409 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307410
Wu Gao51a63562018-11-08 16:29:10 +08007411 return mac->mlme_cfg->lfr.wes_mode_enabled;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007412}
7413
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307414/*
7415 * sme_get_roam_scan_control() - get scan control
7416 * This is a synchronous call
7417 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007418 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307419 * Return bool - Enabled(1)/Disabled(0)
7420 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007421bool sme_get_roam_scan_control(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007422{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007423 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307424
Jeff Johnson01f2c232018-11-21 19:17:44 -08007425 return mac->roam.configParam.nRoamScanControl;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007426}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007427
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307428/*
7429 * sme_get_is_lfr_feature_enabled() - get LFR feature enabled or not
7430 * This is a synchronuous call
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007431 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307432 * Return true (1) - if the feature is enabled
7433 * false (0) - if feature is disabled (compile or runtime)
7434 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007435bool sme_get_is_lfr_feature_enabled(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007436{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007437 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307438
Wu Gao51a63562018-11-08 16:29:10 +08007439 return mac->mlme_cfg->lfr.lfr_enabled;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007440}
7441
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307442/*
7443 * sme_get_is_ft_feature_enabled() - get FT feature enabled or not
7444 * This is a synchronuous call
7445 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007446 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307447 * Return true (1) - if the feature is enabled
7448 * false (0) - if feature is disabled (compile or runtime)
7449 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007450bool sme_get_is_ft_feature_enabled(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007451{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007452 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307453
Wu Gao51a63562018-11-08 16:29:10 +08007454 return mac->mlme_cfg->lfr.fast_transition_enabled;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007455}
7456
Krishna Kumaar Natarajand0bbb3c2017-03-13 17:04:58 -07007457/**
7458 * sme_is_feature_supported_by_fw() - check if feature is supported by FW
7459 * @feature: enum value of requested feature.
7460 *
7461 * Retrun: 1 if supported; 0 otherwise
7462 */
7463bool sme_is_feature_supported_by_fw(enum cap_bitmap feature)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007464{
Krishna Kumaar Natarajand0bbb3c2017-03-13 17:04:58 -07007465 return IS_FEATURE_SUPPORTED_BY_FW(feature);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007466}
7467
Jeff Johnsone943bca2019-02-08 22:45:17 -08007468QDF_STATUS sme_get_link_speed(mac_handle_t mac_handle,
7469 struct link_speed_info *req,
7470 void *context,
7471 sme_link_speed_cb cb)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007472{
Jeff Johnsone943bca2019-02-08 22:45:17 -08007473 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007474 struct mac_context *mac;
Mukul Sharmac3886aa2017-05-04 17:53:22 +05307475 void *wma_handle;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007476
Jeff Johnsone943bca2019-02-08 22:45:17 -08007477 if (!mac_handle || !cb || !req) {
Jeff Johnsona5317a62017-01-26 08:51:25 -08007478 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7479 FL("Invalid parameter"));
7480 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007481 }
Jeff Johnsona5317a62017-01-26 08:51:25 -08007482
Mukul Sharmac3886aa2017-05-04 17:53:22 +05307483 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
7484 if (!wma_handle) {
7485 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7486 "wma handle is NULL");
7487 return QDF_STATUS_E_FAILURE;
7488 }
7489
Jeff Johnsona0619e42018-11-28 17:43:00 -08007490 mac = MAC_CONTEXT(mac_handle);
Jeff Johnson01f2c232018-11-21 19:17:44 -08007491 status = sme_acquire_global_lock(&mac->sme);
Jeff Johnsona5317a62017-01-26 08:51:25 -08007492 if (QDF_STATUS_SUCCESS != status) {
Srinivas Girigowda2c263352017-03-17 17:49:53 -07007493 sme_err("Failed to acquire global lock");
Jeff Johnsona5317a62017-01-26 08:51:25 -08007494 return QDF_STATUS_E_FAILURE;
7495 }
7496
Jeff Johnsone943bca2019-02-08 22:45:17 -08007497 mac->sme.link_speed_context = context;
7498 mac->sme.link_speed_cb = cb;
7499 status = wma_get_link_speed(wma_handle, req);
Jeff Johnson01f2c232018-11-21 19:17:44 -08007500 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007501 return status;
7502}
7503
Jeff Johnsonc7309062018-11-09 20:59:42 -08007504QDF_STATUS
7505sme_get_peer_info(mac_handle_t mac_handle,
7506 struct sir_peer_info_req req,
7507 void *context,
7508 void (*callbackfn)(struct sir_peer_info_resp *param,
7509 void *pcontext))
Will Huang558f8082017-05-31 16:22:24 +08007510{
7511
7512 QDF_STATUS status;
7513 QDF_STATUS qdf_status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007514 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar658e8492017-12-13 11:35:41 -08007515 struct scheduler_msg message = {0};
Will Huang558f8082017-05-31 16:22:24 +08007516
7517 status = sme_acquire_global_lock(&mac->sme);
7518 if (QDF_STATUS_SUCCESS == status) {
Jeff Johnson038efe72019-03-18 13:39:31 -07007519 if (!callbackfn) {
Will Huang558f8082017-05-31 16:22:24 +08007520 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7521 "%s: Indication Call back is NULL",
7522 __func__);
7523 sme_release_global_lock(&mac->sme);
7524 return QDF_STATUS_E_FAILURE;
7525 }
7526
7527 mac->sme.pget_peer_info_ind_cb = callbackfn;
7528 mac->sme.pget_peer_info_cb_context = context;
7529
7530 /* serialize the req through MC thread */
7531 message.bodyptr = qdf_mem_malloc(sizeof(req));
Arif Hussain0ef77082018-10-10 16:42:53 -07007532 if (!message.bodyptr) {
Will Huang558f8082017-05-31 16:22:24 +08007533 sme_release_global_lock(&mac->sme);
7534 return QDF_STATUS_E_NOMEM;
7535 }
7536 qdf_mem_copy(message.bodyptr, &req, sizeof(req));
7537 message.type = WMA_GET_PEER_INFO;
Ashish Kumar Dhanotiya443d31f2017-10-13 12:41:19 +05307538 message.reserved = 0;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05307539 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
7540 QDF_MODULE_ID_WMA,
7541 QDF_MODULE_ID_WMA,
7542 &message);
Will Huang558f8082017-05-31 16:22:24 +08007543 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
7544 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7545 "%s: Post get peer info msg fail", __func__);
7546 qdf_mem_free(message.bodyptr);
7547 status = QDF_STATUS_E_FAILURE;
7548 }
7549 sme_release_global_lock(&mac->sme);
7550 }
7551 return status;
7552}
7553
Jeff Johnsonc7309062018-11-09 20:59:42 -08007554QDF_STATUS sme_get_peer_info_ext(mac_handle_t mac_handle,
Will Huang558f8082017-05-31 16:22:24 +08007555 struct sir_peer_info_ext_req *req,
7556 void *context,
7557 void (*callbackfn)(struct sir_peer_info_ext_resp *param,
7558 void *pcontext))
7559{
7560 QDF_STATUS status;
7561 QDF_STATUS qdf_status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007562 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar658e8492017-12-13 11:35:41 -08007563 struct scheduler_msg message = {0};
Will Huang558f8082017-05-31 16:22:24 +08007564
7565 status = sme_acquire_global_lock(&mac->sme);
7566 if (QDF_STATUS_SUCCESS == status) {
Jeff Johnson038efe72019-03-18 13:39:31 -07007567 if (!callbackfn) {
Will Huang558f8082017-05-31 16:22:24 +08007568 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7569 "%s: Indication Call back is NULL",
7570 __func__);
7571 sme_release_global_lock(&mac->sme);
7572 return QDF_STATUS_E_FAILURE;
7573 }
7574
7575 mac->sme.pget_peer_info_ext_ind_cb = callbackfn;
7576 mac->sme.pget_peer_info_ext_cb_context = context;
7577
7578 /* serialize the req through MC thread */
7579 message.bodyptr =
7580 qdf_mem_malloc(sizeof(struct sir_peer_info_ext_req));
Arif Hussain0ef77082018-10-10 16:42:53 -07007581 if (!message.bodyptr) {
Will Huang558f8082017-05-31 16:22:24 +08007582 sme_release_global_lock(&mac->sme);
7583 return QDF_STATUS_E_NOMEM;
7584 }
7585 qdf_mem_copy(message.bodyptr,
7586 req,
7587 sizeof(struct sir_peer_info_ext_req));
7588 message.type = WMA_GET_PEER_INFO_EXT;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05307589 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
7590 QDF_MODULE_ID_WMA,
7591 QDF_MODULE_ID_WMA,
7592 &message);
Will Huang558f8082017-05-31 16:22:24 +08007593 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
7594 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7595 "%s: Post get rssi msg fail", __func__);
7596 qdf_mem_free(message.bodyptr);
7597 status = QDF_STATUS_E_FAILURE;
7598 }
7599 sme_release_global_lock(&mac->sme);
7600 }
7601 return status;
7602}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007603
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007604/*convert the ini value to the ENUM used in csr and MAC for CB state*/
7605ePhyChanBondState sme_get_cb_phy_state_from_cb_ini_value(uint32_t cb_ini_value)
7606{
7607 return csr_convert_cb_ini_value_to_phy_cb_state(cb_ini_value);
7608}
7609
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007610void sme_set_curr_device_mode(mac_handle_t mac_handle,
Jeff Johnson5a6a0c92019-02-17 16:12:02 -08007611 enum QDF_OPMODE curr_device_mode)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007612{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007613 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307614
Jeff Johnson5a6a0c92019-02-17 16:12:02 -08007615 mac->sme.curr_device_mode = curr_device_mode;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007616}
7617
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307618/*
7619 * sme_handoff_request() - a wrapper function to Request a handoff from CSR.
7620 * This is a synchronous call
7621 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007622 * mac_handle - The handle returned by mac_open
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307623 * sessionId - Session Identifier
7624 * pHandoffInfo - info provided by HDD with the handoff request (namely:
7625 * BSSID, channel etc.)
7626 * Return QDF_STATUS_SUCCESS - SME passed the request to CSR successfully.
7627 * Other status means SME is failed to send the request.
7628 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007629
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007630QDF_STATUS sme_handoff_request(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007631 uint8_t sessionId,
7632 tCsrHandoffRequest *pHandoffInfo)
7633{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007634 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307635 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007636
Jeff Johnson01f2c232018-11-21 19:17:44 -08007637 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307638 if (QDF_IS_STATUS_SUCCESS(status)) {
Abhishek Singhe4a1f882017-08-10 17:59:44 +05307639 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007640 "%s: invoked", __func__);
Jeff Johnson01f2c232018-11-21 19:17:44 -08007641 status = csr_handoff_request(mac, sessionId, pHandoffInfo);
7642 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007643 }
7644
7645 return status;
7646}
7647
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007648/**
7649 * sme_add_periodic_tx_ptrn() - Add Periodic TX Pattern
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08007650 * @mac_handle: Opaque handle to the global MAC context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007651 * @addPeriodicTxPtrnParams: request message
7652 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307653 * Return: QDF_STATUS enumeration
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007654 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307655QDF_STATUS
Jeff Johnsonc7309062018-11-09 20:59:42 -08007656sme_add_periodic_tx_ptrn(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007657 struct sSirAddPeriodicTxPtrn *addPeriodicTxPtrnParams)
7658{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307659 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007660 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007661 struct sSirAddPeriodicTxPtrn *req_msg;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07007662 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007663
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07007664 SME_ENTER();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007665
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307666 req_msg = qdf_mem_malloc(sizeof(*req_msg));
Arif Hussain0ef77082018-10-10 16:42:53 -07007667 if (!req_msg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307668 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007669
7670 *req_msg = *addPeriodicTxPtrnParams;
7671
7672 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307673 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07007674 sme_err("sme_acquire_global_lock failed!(status=%d)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007675 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307676 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007677 return status;
7678 }
7679
7680 /* Serialize the req through MC thread */
7681 msg.bodyptr = req_msg;
7682 msg.type = WMA_ADD_PERIODIC_TX_PTRN_IND;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05307683 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
7684 NO_SESSION, msg.type));
gaurank kathpalia36b0c582018-08-28 17:45:43 +05307685 status = scheduler_post_message(QDF_MODULE_ID_SME,
7686 QDF_MODULE_ID_WMA,
7687 QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307688 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07007689 sme_err("scheduler_post_msg failed!(err=%d)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007690 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307691 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007692 }
7693 sme_release_global_lock(&mac->sme);
7694 return status;
7695}
7696
7697/**
7698 * sme_del_periodic_tx_ptrn() - Delete Periodic TX Pattern
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08007699 * @mac_handle: Opaque handle to the global MAC context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007700 * @delPeriodicTxPtrnParams: request message
7701 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307702 * Return: QDF_STATUS enumeration
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007703 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307704QDF_STATUS
Jeff Johnsonc7309062018-11-09 20:59:42 -08007705sme_del_periodic_tx_ptrn(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007706 struct sSirDelPeriodicTxPtrn *delPeriodicTxPtrnParams)
7707{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307708 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007709 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007710 struct sSirDelPeriodicTxPtrn *req_msg;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07007711 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007712
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07007713 SME_ENTER();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007714
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307715 req_msg = qdf_mem_malloc(sizeof(*req_msg));
Arif Hussain0ef77082018-10-10 16:42:53 -07007716 if (!req_msg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307717 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007718
7719 *req_msg = *delPeriodicTxPtrnParams;
7720
7721 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307722 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07007723 sme_err("sme_acquire_global_lock failed!(status=%d)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007724 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307725 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007726 return status;
7727 }
7728
7729 /* Serialize the req through MC thread */
7730 msg.bodyptr = req_msg;
7731 msg.type = WMA_DEL_PERIODIC_TX_PTRN_IND;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05307732 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
7733 NO_SESSION, msg.type));
gaurank kathpalia36b0c582018-08-28 17:45:43 +05307734 status = scheduler_post_message(QDF_MODULE_ID_SME,
7735 QDF_MODULE_ID_WMA,
7736 QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307737 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07007738 sme_err("scheduler_post_msg failed!(err=%d)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007739 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307740 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007741 }
7742 sme_release_global_lock(&mac->sme);
7743 return status;
7744}
7745
Rachit Kankaneee1735c2018-08-02 13:19:34 +05307746#ifdef FEATURE_WLAN_RMC
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307747/*
7748 * sme_enable_rmc() - enables RMC
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08007749 * @mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307750 * @sessionId : Session ID
7751 *
7752 * Return: QDF_STATUS
7753 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007754QDF_STATUS sme_enable_rmc(mac_handle_t mac_handle, uint32_t sessionId)
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007755{
7756 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007757 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07007758 struct scheduler_msg message = {0};
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007759 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
7760
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07007761 SME_ENTER();
7762
Jeff Johnson01f2c232018-11-21 19:17:44 -08007763 status = sme_acquire_global_lock(&mac->sme);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007764 if (QDF_IS_STATUS_SUCCESS(status)) {
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08007765 message.bodyptr = NULL;
7766 message.type = WMA_RMC_ENABLE_IND;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05307767 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
7768 QDF_MODULE_ID_WMA,
7769 QDF_MODULE_ID_WMA,
7770 &message);
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +05307771 if (!QDF_IS_STATUS_SUCCESS(qdf_status))
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007772 status = QDF_STATUS_E_FAILURE;
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +05307773
Jeff Johnson01f2c232018-11-21 19:17:44 -08007774 sme_release_global_lock(&mac->sme);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007775 }
7776 return status;
7777}
7778
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307779/*
7780 * sme_disable_rmc() - disables RMC
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08007781 * @mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307782 * @sessionId : Session ID
7783 *
7784 * Return: QDF_STATUS
7785 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007786QDF_STATUS sme_disable_rmc(mac_handle_t mac_handle, uint32_t sessionId)
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007787{
7788 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007789 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07007790 struct scheduler_msg message = {0};
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007791 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
7792
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07007793 SME_ENTER();
7794
Jeff Johnson01f2c232018-11-21 19:17:44 -08007795 status = sme_acquire_global_lock(&mac->sme);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007796 if (QDF_IS_STATUS_SUCCESS(status)) {
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08007797 message.bodyptr = NULL;
7798 message.type = WMA_RMC_DISABLE_IND;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05307799 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
7800 QDF_MODULE_ID_WMA,
7801 QDF_MODULE_ID_WMA,
7802 &message);
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +05307803 if (!QDF_IS_STATUS_SUCCESS(qdf_status))
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007804 status = QDF_STATUS_E_FAILURE;
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +05307805
Jeff Johnson01f2c232018-11-21 19:17:44 -08007806 sme_release_global_lock(&mac->sme);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007807 }
7808 return status;
7809}
7810
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307811/*
7812 * sme_send_rmc_action_period() - sends RMC action period param to target
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08007813 * @mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307814 * @sessionId : Session ID
7815 *
7816 * Return: QDF_STATUS
7817 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007818QDF_STATUS sme_send_rmc_action_period(mac_handle_t mac_handle,
7819 uint32_t sessionId)
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007820{
7821 QDF_STATUS status = QDF_STATUS_SUCCESS;
7822 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007823 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07007824 struct scheduler_msg message = {0};
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007825
Jeff Johnson01f2c232018-11-21 19:17:44 -08007826 status = sme_acquire_global_lock(&mac->sme);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007827 if (QDF_STATUS_SUCCESS == status) {
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08007828 message.bodyptr = NULL;
7829 message.type = WMA_RMC_ACTION_PERIOD_IND;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05307830 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
7831 QDF_MODULE_ID_WMA,
7832 QDF_MODULE_ID_WMA,
7833 &message);
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +05307834 if (!QDF_IS_STATUS_SUCCESS(qdf_status))
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007835 status = QDF_STATUS_E_FAILURE;
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +05307836
Jeff Johnson01f2c232018-11-21 19:17:44 -08007837 sme_release_global_lock(&mac->sme);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007838 }
7839
7840 return status;
7841}
Rachit Kankaneee1735c2018-08-02 13:19:34 +05307842#endif /* FEATURE_WLAN_RMC */
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007843
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307844/*
7845 * sme_request_ibss_peer_info() - request ibss peer info
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08007846 * @mac_handle: Opaque handle to the global MAC context
Jeff Johnson56ba88a2019-02-17 17:18:43 -08007847 * @cb_context: Pointer to user data
Jeff Johnsond6a23162019-02-17 16:46:37 -08007848 * @peer_info_cb: Peer info callback
7849 * @allPeerInfoReqd: All peer info required or not
7850 * @staIdx: sta index
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307851 *
7852 * Return: QDF_STATUS
7853 */
Jeff Johnson56ba88a2019-02-17 17:18:43 -08007854QDF_STATUS sme_request_ibss_peer_info(mac_handle_t mac_handle, void *cb_context,
Jeff Johnsond6a23162019-02-17 16:46:37 -08007855 ibss_peer_info_cb peer_info_cb,
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007856 bool allPeerInfoReqd, uint8_t staIdx)
7857{
7858 QDF_STATUS status = QDF_STATUS_E_FAILURE;
7859 QDF_STATUS qdf_status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007860 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07007861 struct scheduler_msg message = {0};
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007862 tSirIbssGetPeerInfoReqParams *pIbssInfoReqParams;
Jeff Johnsone7aa5cd2019-02-17 19:36:01 -08007863 struct ibss_peer_info_cb_info *cb_info;
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007864
Jeff Johnson01f2c232018-11-21 19:17:44 -08007865 status = sme_acquire_global_lock(&mac->sme);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007866 if (QDF_STATUS_SUCCESS == status) {
Jeff Johnsone7aa5cd2019-02-17 19:36:01 -08007867 cb_info = &mac->sme.peer_info_cb_info;
7868 cb_info->peer_info_cb = peer_info_cb;
7869 cb_info->peer_info_cb_context = cb_context;
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007870
7871 pIbssInfoReqParams = (tSirIbssGetPeerInfoReqParams *)
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307872 qdf_mem_malloc(sizeof(tSirIbssGetPeerInfoReqParams));
Arif Hussain0ef77082018-10-10 16:42:53 -07007873 if (!pIbssInfoReqParams) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08007874 sme_release_global_lock(&mac->sme);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007875 return QDF_STATUS_E_NOMEM;
7876 }
7877 pIbssInfoReqParams->allPeerInfoReqd = allPeerInfoReqd;
7878 pIbssInfoReqParams->staIdx = staIdx;
7879
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08007880 message.type = WMA_GET_IBSS_PEER_INFO_REQ;
7881 message.bodyptr = pIbssInfoReqParams;
7882 message.reserved = 0;
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007883
gaurank kathpalia36b0c582018-08-28 17:45:43 +05307884 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
7885 QDF_MODULE_ID_WMA,
7886 QDF_MODULE_ID_WMA,
7887 &message);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007888 if (QDF_STATUS_SUCCESS != qdf_status) {
7889 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7890 "%s: Post WMA_GET_IBSS_PEER_INFO_REQ MSG failed",
7891 __func__);
7892 qdf_mem_free(pIbssInfoReqParams);
7893 qdf_status = QDF_STATUS_E_FAILURE;
7894 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08007895 sme_release_global_lock(&mac->sme);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007896 }
7897
7898 return qdf_status;
7899}
7900
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307901/*
7902 * sme_send_cesium_enable_ind() -
7903 * Used to send proprietary cesium enable indication to fw
7904 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007905 * mac_handle
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307906 * sessionId
7907 * Return QDF_STATUS
7908 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007909QDF_STATUS sme_send_cesium_enable_ind(mac_handle_t mac_handle,
7910 uint32_t sessionId)
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007911{
7912 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007913 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07007914 struct scheduler_msg message = {0};
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007915
Jeff Johnson01f2c232018-11-21 19:17:44 -08007916 status = sme_acquire_global_lock(&mac->sme);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007917 if (QDF_STATUS_SUCCESS == status) {
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08007918 message.bodyptr = NULL;
7919 message.type = WMA_IBSS_CESIUM_ENABLE_IND;
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +05307920 status = scheduler_post_message(QDF_MODULE_ID_SME,
7921 QDF_MODULE_ID_WMA,
7922 QDF_MODULE_ID_WMA,
7923 &message);
Jeff Johnson01f2c232018-11-21 19:17:44 -08007924 sme_release_global_lock(&mac->sme);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007925 }
7926
7927 return status;
7928}
7929
Jeff Johnsonc7309062018-11-09 20:59:42 -08007930QDF_STATUS sme_set_wlm_latency_level(mac_handle_t mac_handle,
7931 uint16_t session_id,
Paul Zhang99fe8842017-12-08 14:43:46 +08007932 uint16_t latency_level)
7933{
7934 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007935 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Paul Zhang99fe8842017-12-08 14:43:46 +08007936 struct wlm_latency_level_param params;
7937 void *wma = cds_get_context(QDF_MODULE_ID_WMA);
7938
Bala Venkatesh7cf5b662018-05-10 15:18:53 +05307939 if (!wma)
7940 return QDF_STATUS_E_FAILURE;
7941
Yeshwanth Sriram Guntuka334aa8d2018-08-20 16:49:15 +05307942 if (!mac_ctx->mlme_cfg->wlm_config.latency_enable) {
Paul Zhang99fe8842017-12-08 14:43:46 +08007943 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7944 "%s: WLM latency level setting is disabled",
7945 __func__);
7946 return QDF_STATUS_E_FAILURE;
7947 }
Krunal Soni3fa80e22018-01-09 14:16:02 -08007948 if (!wma) {
7949 sme_err("wma is NULL");
7950 return QDF_STATUS_E_FAILURE;
7951 }
Paul Zhang99fe8842017-12-08 14:43:46 +08007952
7953 params.wlm_latency_level = latency_level;
7954 params.wlm_latency_flags =
Yeshwanth Sriram Guntuka334aa8d2018-08-20 16:49:15 +05307955 mac_ctx->mlme_cfg->wlm_config.latency_flags[latency_level];
Paul Zhang99fe8842017-12-08 14:43:46 +08007956 params.vdev_id = session_id;
7957
7958 status = wma_set_wlm_latency_level(wma, &params);
Paul Zhang99fe8842017-12-08 14:43:46 +08007959
7960 return status;
7961}
7962
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007963void sme_get_command_q_status(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007964{
7965 tSmeCmd *pTempCmd = NULL;
7966 tListElem *pEntry;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007967 struct mac_context *mac;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007968
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +05307969 if (!mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007970 return;
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +05307971
7972 mac = MAC_CONTEXT(mac_handle);
7973
Jeff Johnson01f2c232018-11-21 19:17:44 -08007974 pEntry = csr_nonscan_active_ll_peek_head(mac, LL_ACCESS_LOCK);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307975 if (pEntry)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007976 pTempCmd = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307977
Kabilan Kannan33fcd682018-03-08 14:29:46 -08007978 sme_err("WLAN_BUG_RCA: Currently smeCmdActiveList has command (0x%X)",
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +05307979 (pTempCmd) ? pTempCmd->command : eSmeNoCommand);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007980 if (pTempCmd) {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307981 if (eSmeCsrCommandMask & pTempCmd->command)
7982 /* CSR command is stuck. See what the reason code is
7983 * for that command
7984 */
Jeff Johnson01f2c232018-11-21 19:17:44 -08007985 dump_csr_command_info(mac, pTempCmd);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007986 } /* if(pTempCmd) */
7987
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07007988 sme_err("Currently smeCmdPendingList has %d commands",
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +05307989 csr_nonscan_pending_ll_count(mac));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007990
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007991}
Kiran Kumar Lokere1aa9c9a2016-10-05 18:50:59 -07007992
Agrawal Ashishb141b092016-09-02 19:59:26 +05307993#ifdef WLAN_FEATURE_DSRC
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007994/**
Naveen Rawatb4d37622015-11-13 16:15:25 -08007995 * sme_ocb_gen_timing_advert_frame() - generate TA frame and populate the buffer
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08007996 * @mac_handle: Opaque handle to the global MAC context
Naveen Rawatb4d37622015-11-13 16:15:25 -08007997 * @self_addr: the self MAC address
7998 * @buf: the buffer that will contain the frame
7999 * @timestamp_offset: return for the offset of the timestamp field
8000 * @time_value_offset: return for the time_value field in the TA IE
8001 *
8002 * Return: the length of the buffer.
8003 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008004int sme_ocb_gen_timing_advert_frame(mac_handle_t mac_handle,
Naveen Rawatb4d37622015-11-13 16:15:25 -08008005 tSirMacAddr self_addr, uint8_t **buf,
8006 uint32_t *timestamp_offset,
8007 uint32_t *time_value_offset)
8008{
8009 int template_length;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008010 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Naveen Rawatb4d37622015-11-13 16:15:25 -08008011
8012 template_length = sch_gen_timing_advert_frame(mac_ctx, self_addr, buf,
8013 timestamp_offset,
8014 time_value_offset);
8015 return template_length;
8016}
Agrawal Ashishb141b092016-09-02 19:59:26 +05308017#endif
Arun Khandavalli4b55da72016-07-19 19:55:01 +05308018
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008019QDF_STATUS sme_notify_modem_power_state(mac_handle_t mac_handle, uint32_t value)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008020{
Rajeev Kumar37d478b2017-04-17 16:59:28 -07008021 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008022 tpSirModemPowerStateInd request_buf;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008023 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008024
Jeff Johnson038efe72019-03-18 13:39:31 -07008025 if (!mac)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308026 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008027
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308028 request_buf = qdf_mem_malloc(sizeof(tSirModemPowerStateInd));
Arif Hussain0ef77082018-10-10 16:42:53 -07008029 if (!request_buf)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308030 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008031
8032 request_buf->param = value;
8033
8034 msg.type = WMA_MODEM_POWER_STATE_IND;
8035 msg.reserved = 0;
8036 msg.bodyptr = request_buf;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308037 if (!QDF_IS_STATUS_SUCCESS
gaurank kathpalia36b0c582018-08-28 17:45:43 +05308038 (scheduler_post_message(QDF_MODULE_ID_SME,
8039 QDF_MODULE_ID_WMA,
8040 QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308041 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308042 "%s: Not able to post WMA_MODEM_POWER_STATE_IND message to WMA",
8043 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308044 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308045 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008046 }
8047
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308048 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008049}
8050
8051#ifdef QCA_HT_2040_COEX
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008052QDF_STATUS sme_notify_ht2040_mode(mac_handle_t mac_handle, uint16_t staId,
Anurag Chouhan6d760662016-02-20 16:05:43 +05308053 struct qdf_mac_addr macAddrSTA,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008054 uint8_t sessionId,
8055 uint8_t channel_type)
8056{
Rajeev Kumar37d478b2017-04-17 16:59:28 -07008057 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008058 tUpdateVHTOpMode *pHtOpMode = NULL;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008059 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008060
Jeff Johnson038efe72019-03-18 13:39:31 -07008061 if (!mac)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308062 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008063
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308064 pHtOpMode = qdf_mem_malloc(sizeof(tUpdateVHTOpMode));
Arif Hussain0ef77082018-10-10 16:42:53 -07008065 if (!pHtOpMode)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308066 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008067
8068 switch (channel_type) {
8069 case eHT_CHAN_HT20:
8070 pHtOpMode->opMode = eHT_CHANNEL_WIDTH_20MHZ;
8071 break;
8072
8073 case eHT_CHAN_HT40MINUS:
8074 case eHT_CHAN_HT40PLUS:
8075 pHtOpMode->opMode = eHT_CHANNEL_WIDTH_40MHZ;
8076 break;
8077
8078 default:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308079 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008080 "%s: Invalid OP mode", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308081 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008082 }
8083
8084 pHtOpMode->staId = staId,
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308085 qdf_mem_copy(pHtOpMode->peer_mac, macAddrSTA.bytes,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008086 sizeof(tSirMacAddr));
8087 pHtOpMode->smesessionId = sessionId;
8088
8089 msg.type = WMA_UPDATE_OP_MODE;
8090 msg.reserved = 0;
8091 msg.bodyptr = pHtOpMode;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308092 if (!QDF_IS_STATUS_SUCCESS
gaurank kathpalia36b0c582018-08-28 17:45:43 +05308093 (scheduler_post_message(QDF_MODULE_ID_SME,
8094 QDF_MODULE_ID_WMA,
8095 QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308096 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308097 "%s: Not able to post WMA_UPDATE_OP_MODE message to WMA",
8098 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308099 qdf_mem_free(pHtOpMode);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308100 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008101 }
8102
Abhishek Singhe4a1f882017-08-10 17:59:44 +05308103 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Jeff Johnson698eacd2018-05-12 17:00:03 -07008104 "%s: Notified FW about OP mode: %d for staId=%d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008105 __func__, pHtOpMode->opMode, staId);
8106
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308107 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008108}
8109
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308110/*
8111 * sme_set_ht2040_mode() -
8112 * To update HT Operation beacon IE.
8113 *
8114 * Return QDF_STATUS SUCCESS
8115 * FAILURE or RESOURCES
8116 * The API finished and failed.
8117 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008118QDF_STATUS sme_set_ht2040_mode(mac_handle_t mac_handle, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008119 uint8_t channel_type, bool obssEnabled)
8120{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308121 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008122 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008123 ePhyChanBondState cbMode;
Jeff Johnson01f2c232018-11-21 19:17:44 -08008124 struct csr_roam_session *session = CSR_GET_SESSION(mac, sessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008125
Jeff Johnson01f2c232018-11-21 19:17:44 -08008126 if (!CSR_IS_SESSION_VALID(mac, sessionId)) {
Abhishek Singh9d5f4582017-10-11 17:59:48 +05308127 sme_err("Session not valid for session id %d", sessionId);
8128 return QDF_STATUS_E_INVAL;
8129 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08008130 session = CSR_GET_SESSION(mac, sessionId);
Abhishek Singh9d5f4582017-10-11 17:59:48 +05308131 sme_debug("Update HT operation beacon IE, channel_type=%d cur cbmode %d",
8132 channel_type, session->bssParams.cbMode);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008133
8134 switch (channel_type) {
8135 case eHT_CHAN_HT20:
Abhishek Singh9d5f4582017-10-11 17:59:48 +05308136 if (!session->bssParams.cbMode)
8137 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008138 cbMode = PHY_SINGLE_CHANNEL_CENTERED;
8139 break;
8140 case eHT_CHAN_HT40MINUS:
Abhishek Singh9d5f4582017-10-11 17:59:48 +05308141 if (session->bssParams.cbMode)
8142 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008143 cbMode = PHY_DOUBLE_CHANNEL_HIGH_PRIMARY;
8144 break;
8145 case eHT_CHAN_HT40PLUS:
Abhishek Singh9d5f4582017-10-11 17:59:48 +05308146 if (session->bssParams.cbMode)
8147 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008148 cbMode = PHY_DOUBLE_CHANNEL_LOW_PRIMARY;
8149 break;
8150 default:
Abhishek Singh9d5f4582017-10-11 17:59:48 +05308151 sme_err("Error!!! Invalid HT20/40 mode !");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308152 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008153 }
Abhishek Singh9d5f4582017-10-11 17:59:48 +05308154 session->bssParams.cbMode = cbMode;
Jeff Johnson01f2c232018-11-21 19:17:44 -08008155 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308156 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08008157 status = csr_set_ht2040_mode(mac, sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008158 cbMode, obssEnabled);
Jeff Johnson01f2c232018-11-21 19:17:44 -08008159 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008160 }
8161 return status;
8162}
8163
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008164#endif
8165
8166/*
8167 * SME API to enable/disable idle mode powersave
8168 * This should be called only if powersave offload
8169 * is enabled
8170 */
Arunk Khandavalli847969d2017-09-25 15:15:36 +05308171QDF_STATUS sme_set_idle_powersave_config(bool value)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008172{
Anurag Chouhan6d760662016-02-20 16:05:43 +05308173 void *wmaContext = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008174
Jeff Johnson038efe72019-03-18 13:39:31 -07008175 if (!wmaContext) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308176 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008177 "%s: wmaContext is NULL", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308178 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008179 }
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308180 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008181 " Idle Ps Set Value %d", value);
8182
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308183 if (QDF_STATUS_SUCCESS != wma_set_idle_ps_config(wmaContext, value)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308184 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008185 " Failed to Set Idle Ps Value %d", value);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308186 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008187 }
Arunk Khandavalli847969d2017-09-25 15:15:36 +05308188
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308189 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008190}
8191
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008192int16_t sme_get_ht_config(mac_handle_t mac_handle, uint8_t session_id,
8193 uint16_t ht_capab)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008194{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008195 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Jeff Johnson01f2c232018-11-21 19:17:44 -08008196 struct csr_roam_session *pSession = CSR_GET_SESSION(mac, session_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008197
Jeff Johnson038efe72019-03-18 13:39:31 -07008198 if (!pSession) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308199 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008200 "%s: pSession is NULL", __func__);
8201 return -EIO;
8202 }
8203 switch (ht_capab) {
8204 case WNI_CFG_HT_CAP_INFO_ADVANCE_CODING:
Jeff Johnsonbe119e62019-02-02 12:30:26 -08008205 return pSession->ht_config.ht_rx_ldpc;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008206 case WNI_CFG_HT_CAP_INFO_TX_STBC:
Jeff Johnsonbe119e62019-02-02 12:30:26 -08008207 return pSession->ht_config.ht_tx_stbc;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008208 case WNI_CFG_HT_CAP_INFO_RX_STBC:
Jeff Johnsonbe119e62019-02-02 12:30:26 -08008209 return pSession->ht_config.ht_rx_stbc;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008210 case WNI_CFG_HT_CAP_INFO_SHORT_GI_20MHZ:
Jeff Johnsonbe119e62019-02-02 12:30:26 -08008211 return pSession->ht_config.ht_sgi20;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008212 case WNI_CFG_HT_CAP_INFO_SHORT_GI_40MHZ:
Jeff Johnsonbe119e62019-02-02 12:30:26 -08008213 return pSession->ht_config.ht_sgi40;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008214 default:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308215 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008216 "invalid ht capability");
8217 return -EIO;
8218 }
8219}
8220
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008221int sme_update_ht_config(mac_handle_t mac_handle, uint8_t sessionId,
8222 uint16_t htCapab, int value)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008223{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008224 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Jeff Johnson01f2c232018-11-21 19:17:44 -08008225 struct csr_roam_session *pSession = CSR_GET_SESSION(mac, sessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008226
Jeff Johnson038efe72019-03-18 13:39:31 -07008227 if (!pSession) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308228 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008229 "%s: pSession is NULL", __func__);
8230 return -EIO;
8231 }
8232
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308233 if (QDF_STATUS_SUCCESS != wma_set_htconfig(sessionId, htCapab, value)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308234 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008235 "Failed to set ht capability in target");
8236 return -EIO;
8237 }
8238
8239 switch (htCapab) {
8240 case WNI_CFG_HT_CAP_INFO_ADVANCE_CODING:
Jeff Johnsonbe119e62019-02-02 12:30:26 -08008241 pSession->ht_config.ht_rx_ldpc = value;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008242 break;
8243 case WNI_CFG_HT_CAP_INFO_TX_STBC:
Jeff Johnsonbe119e62019-02-02 12:30:26 -08008244 pSession->ht_config.ht_tx_stbc = value;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008245 break;
8246 case WNI_CFG_HT_CAP_INFO_RX_STBC:
Jeff Johnsonbe119e62019-02-02 12:30:26 -08008247 pSession->ht_config.ht_rx_stbc = value;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008248 break;
8249 case WNI_CFG_HT_CAP_INFO_SHORT_GI_20MHZ:
Krishna Kumaar Natarajana5c5aad2016-12-05 14:12:13 -08008250 value = value ? 1 : 0; /* HT SGI can be only 1 or 0 */
Jeff Johnsonbe119e62019-02-02 12:30:26 -08008251 pSession->ht_config.ht_sgi20 = value;
Sandeep Puligilla607f34a2016-05-25 14:37:47 -07008252 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008253 case WNI_CFG_HT_CAP_INFO_SHORT_GI_40MHZ:
Krishna Kumaar Natarajana5c5aad2016-12-05 14:12:13 -08008254 value = value ? 1 : 0; /* HT SGI can be only 1 or 0 */
Jeff Johnsonbe119e62019-02-02 12:30:26 -08008255 pSession->ht_config.ht_sgi40 = value;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008256 break;
8257 }
8258
Jeff Johnson01f2c232018-11-21 19:17:44 -08008259 csr_roam_update_config(mac, sessionId, htCapab, value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008260 return 0;
8261}
8262
Jeff Johnsonc7309062018-11-09 20:59:42 -08008263int sme_set_addba_accept(mac_handle_t mac_handle, uint8_t session_id, int value)
Kiran Kumar Lokere08195ef2018-01-17 19:25:15 -08008264{
8265 struct sme_addba_accept *addba_accept;
8266 struct scheduler_msg msg = {0};
8267 QDF_STATUS status;
8268
8269 addba_accept = qdf_mem_malloc(sizeof(*addba_accept));
Arif Hussain0ef77082018-10-10 16:42:53 -07008270 if (!addba_accept)
Kiran Kumar Lokere08195ef2018-01-17 19:25:15 -08008271 return -EIO;
Arif Hussain0ef77082018-10-10 16:42:53 -07008272
Kiran Kumar Lokere08195ef2018-01-17 19:25:15 -08008273 addba_accept->session_id = session_id;
8274 addba_accept->addba_accept = value;
8275 qdf_mem_zero(&msg, sizeof(msg));
8276 msg.type = eWNI_SME_SET_ADDBA_ACCEPT;
8277 msg.reserved = 0;
8278 msg.bodyptr = addba_accept;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05308279 status = scheduler_post_message(QDF_MODULE_ID_SME,
8280 QDF_MODULE_ID_PE,
8281 QDF_MODULE_ID_PE, &msg);
Kiran Kumar Lokere08195ef2018-01-17 19:25:15 -08008282 if (status != QDF_STATUS_SUCCESS) {
8283 sme_err("Not able to post addba reject");
8284 qdf_mem_free(addba_accept);
8285 return -EIO;
8286 }
8287 return 0;
8288}
Kiran Kumar Lokerebc87bec2018-02-27 20:06:42 -08008289
Jeff Johnsonc7309062018-11-09 20:59:42 -08008290int sme_set_ba_buff_size(mac_handle_t mac_handle, uint8_t session_id,
8291 uint16_t buff_size)
Kiran Kumar Lokerebc87bec2018-02-27 20:06:42 -08008292{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008293 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokerebc87bec2018-02-27 20:06:42 -08008294 if (!buff_size) {
8295 sme_err("invalid buff size %d", buff_size);
8296 return -EINVAL;
8297 }
8298 mac_ctx->usr_cfg_ba_buff_size = buff_size;
8299 sme_debug("addba buff size is set to %d",
8300 mac_ctx->usr_cfg_ba_buff_size);
8301
8302 return 0;
8303}
8304
8305#define DEFAULT_BA_BUFF_SIZE 64
Jeff Johnsonc7309062018-11-09 20:59:42 -08008306int sme_send_addba_req(mac_handle_t mac_handle, uint8_t session_id, uint8_t tid,
8307 uint16_t buff_size)
Kiran Kumar Lokerebc87bec2018-02-27 20:06:42 -08008308{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008309 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokerebc87bec2018-02-27 20:06:42 -08008310 uint16_t ba_buff = 0;
8311 QDF_STATUS status;
8312 struct scheduler_msg msg = {0};
8313 struct send_add_ba_req *send_ba_req;
8314 struct csr_roam_session *csr_session = NULL;
8315
8316 if (!csr_is_conn_state_connected_infra(mac_ctx, session_id)) {
8317 sme_err("STA not infra/connected state session_id: %d",
8318 session_id);
8319 return -EINVAL;
8320 }
8321 csr_session = CSR_GET_SESSION(mac_ctx, session_id);
8322 if (!csr_session) {
8323 sme_err("CSR session is NULL");
8324 return -EINVAL;
8325 }
8326 send_ba_req = qdf_mem_malloc(sizeof(*send_ba_req));
Arif Hussain0ef77082018-10-10 16:42:53 -07008327 if (!send_ba_req)
Kiran Kumar Lokerebc87bec2018-02-27 20:06:42 -08008328 return -EIO;
Arif Hussain0ef77082018-10-10 16:42:53 -07008329
Kiran Kumar Lokerebc87bec2018-02-27 20:06:42 -08008330 qdf_mem_copy(send_ba_req->mac_addr,
8331 csr_session->connectedProfile.bssid.bytes,
8332 QDF_MAC_ADDR_SIZE);
8333 ba_buff = buff_size;
8334 if (!buff_size) {
8335 if (mac_ctx->usr_cfg_ba_buff_size)
8336 ba_buff = mac_ctx->usr_cfg_ba_buff_size;
8337 else
8338 ba_buff = DEFAULT_BA_BUFF_SIZE;
8339 }
8340 send_ba_req->param.vdev_id = session_id;
8341 send_ba_req->param.tidno = tid;
8342 send_ba_req->param.buffersize = ba_buff;
8343 msg.type = WMA_SEND_ADDBA_REQ;
8344 msg.bodyptr = send_ba_req;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05308345 status = scheduler_post_message(QDF_MODULE_ID_SME,
8346 QDF_MODULE_ID_WMA,
8347 QDF_MODULE_ID_WMA, &msg);
Kiran Kumar Lokerebc87bec2018-02-27 20:06:42 -08008348 if (QDF_STATUS_SUCCESS != status) {
Kiran Kumar Lokerebc87bec2018-02-27 20:06:42 -08008349 qdf_mem_free(send_ba_req);
8350 return -EIO;
8351 }
8352 sme_debug("ADDBA_REQ sent to FW: tid %d buff_size %d", tid, ba_buff);
8353
8354 return 0;
8355}
8356
Jeff Johnsonc7309062018-11-09 20:59:42 -08008357int sme_set_no_ack_policy(mac_handle_t mac_handle, uint8_t session_id,
8358 uint8_t val, uint8_t ac)
Kiran Kumar Lokere3324f632018-03-01 21:43:21 -08008359{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008360 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokere3324f632018-03-01 21:43:21 -08008361 uint8_t i, set_val;
Arif Hussaineb8ba362018-03-07 19:15:13 -08008362 struct scheduler_msg msg = {0};
8363 QDF_STATUS status;
Kiran Kumar Lokere3324f632018-03-01 21:43:21 -08008364
Srinivas Girigowda5b86fbd2019-03-21 14:54:14 -07008365 if (ac > QCA_WLAN_AC_ALL) {
Kiran Kumar Lokere3324f632018-03-01 21:43:21 -08008366 sme_err("invalid ac val %d", ac);
8367 return -EINVAL;
8368 }
8369 if (val)
8370 set_val = 1;
8371 else
8372 set_val = 0;
Srinivas Girigowda5b86fbd2019-03-21 14:54:14 -07008373 if (ac == QCA_WLAN_AC_ALL) {
Kiran Kumar Lokere3324f632018-03-01 21:43:21 -08008374 for (i = 0; i < ac; i++)
8375 mac_ctx->no_ack_policy_cfg[i] = set_val;
8376 } else {
8377 mac_ctx->no_ack_policy_cfg[ac] = set_val;
8378 }
8379 sme_debug("no ack is set to %d for ac %d", set_val, ac);
Arif Hussaineb8ba362018-03-07 19:15:13 -08008380 qdf_mem_zero(&msg, sizeof(msg));
8381 msg.type = eWNI_SME_UPDATE_EDCA_PROFILE;
8382 msg.reserved = 0;
8383 msg.bodyval = session_id;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05308384 status = scheduler_post_message(QDF_MODULE_ID_SME,
8385 QDF_MODULE_ID_PE,
8386 QDF_MODULE_ID_PE, &msg);
Arif Hussaineb8ba362018-03-07 19:15:13 -08008387 if (status != QDF_STATUS_SUCCESS) {
8388 sme_err("Not able to post update edca profile");
8389 return -EIO;
8390 }
Kiran Kumar Lokere3324f632018-03-01 21:43:21 -08008391
8392 return 0;
8393}
8394
Jeff Johnsonc7309062018-11-09 20:59:42 -08008395int sme_set_auto_rate_he_ltf(mac_handle_t mac_handle, uint8_t session_id,
8396 uint8_t cfg_val)
Kiran Kumar Lokerea006a302018-03-07 20:58:13 -08008397{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008398 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokerea006a302018-03-07 20:58:13 -08008399 uint32_t set_val;
8400 uint32_t bit_mask = 0;
8401 int status;
8402
8403 if (cfg_val > QCA_WLAN_HE_LTF_4X) {
8404 sme_err("invalid HE LTF cfg %d", cfg_val);
8405 return -EINVAL;
8406 }
8407
8408 /*set the corresponding HE LTF cfg BIT*/
8409 if (cfg_val == QCA_WLAN_HE_LTF_AUTO)
8410 bit_mask = HE_LTF_ALL;
8411 else
8412 bit_mask = (1 << (cfg_val - 1));
8413
8414 set_val = mac_ctx->he_sgi_ltf_cfg_bit_mask;
8415
8416 SET_AUTO_RATE_HE_LTF_VAL(set_val, bit_mask);
8417
8418 mac_ctx->he_sgi_ltf_cfg_bit_mask = set_val;
8419 status = wma_cli_set_command(session_id,
8420 WMI_VDEV_PARAM_AUTORATE_MISC_CFG,
8421 set_val, VDEV_CMD);
8422 if (status) {
8423 sme_err("failed to set he_ltf_sgi");
8424 return status;
8425 }
8426
8427 sme_debug("HE SGI_LTF is set to 0x%08X",
8428 mac_ctx->he_sgi_ltf_cfg_bit_mask);
8429
8430 return 0;
8431}
8432
Jeff Johnsonc7309062018-11-09 20:59:42 -08008433int sme_set_auto_rate_he_sgi(mac_handle_t mac_handle, uint8_t session_id,
8434 uint8_t cfg_val)
Kiran Kumar Lokerea006a302018-03-07 20:58:13 -08008435{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008436 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokerea006a302018-03-07 20:58:13 -08008437 uint32_t set_val;
8438 uint32_t sgi_bit_mask = 0;
8439 int status;
8440
8441 if ((cfg_val > AUTO_RATE_GI_3200NS) ||
8442 (cfg_val < AUTO_RATE_GI_400NS)) {
8443 sme_err("invalid auto rate GI cfg %d", cfg_val);
8444 return -EINVAL;
8445 }
8446
8447 sgi_bit_mask = (1 << cfg_val);
8448
8449 set_val = mac_ctx->he_sgi_ltf_cfg_bit_mask;
8450 SET_AUTO_RATE_SGI_VAL(set_val, sgi_bit_mask);
8451
8452 mac_ctx->he_sgi_ltf_cfg_bit_mask = set_val;
8453 status = wma_cli_set_command(session_id,
8454 WMI_VDEV_PARAM_AUTORATE_MISC_CFG,
8455 set_val, VDEV_CMD);
8456 if (status) {
8457 sme_err("failed to set he_ltf_sgi");
8458 return status;
8459 }
8460
8461 sme_debug("auto rate HE SGI_LTF is set to 0x%08X",
8462 mac_ctx->he_sgi_ltf_cfg_bit_mask);
8463
8464 return 0;
8465}
8466
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008467#define HT20_SHORT_GI_MCS7_RATE 722
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308468/*
8469 * sme_send_rate_update_ind() -
8470 * API to Update rate
8471 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008472 * mac_handle - The handle returned by mac_open
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308473 * rateUpdateParams - Pointer to rate update params
8474 * Return QDF_STATUS
8475 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008476QDF_STATUS sme_send_rate_update_ind(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008477 tSirRateUpdateInd *rateUpdateParams)
8478{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008479 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308480 QDF_STATUS status;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07008481 struct scheduler_msg msg = {0};
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308482 tSirRateUpdateInd *rate_upd = qdf_mem_malloc(sizeof(tSirRateUpdateInd));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008483
Arif Hussain0ef77082018-10-10 16:42:53 -07008484 if (!rate_upd)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308485 return QDF_STATUS_E_FAILURE;
Arif Hussain0ef77082018-10-10 16:42:53 -07008486
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008487 *rate_upd = *rateUpdateParams;
8488
8489 if (rate_upd->mcastDataRate24GHz == HT20_SHORT_GI_MCS7_RATE)
8490 rate_upd->mcastDataRate24GHzTxFlag =
Naveen Rawatea1564b2018-05-17 15:56:11 -07008491 TX_RATE_HT20 | TX_RATE_SGI;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008492 else if (rate_upd->reliableMcastDataRate ==
8493 HT20_SHORT_GI_MCS7_RATE)
8494 rate_upd->reliableMcastDataRateTxFlag =
Naveen Rawatea1564b2018-05-17 15:56:11 -07008495 TX_RATE_HT20 | TX_RATE_SGI;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008496
Jeff Johnson01f2c232018-11-21 19:17:44 -08008497 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308498 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008499 msg.type = WMA_RATE_UPDATE_IND;
8500 msg.bodyptr = rate_upd;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05308501 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
8502 NO_SESSION, msg.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308503 if (!QDF_IS_STATUS_SUCCESS
gaurank kathpalia36b0c582018-08-28 17:45:43 +05308504 (scheduler_post_message(QDF_MODULE_ID_SME,
8505 QDF_MODULE_ID_WMA,
8506 QDF_MODULE_ID_WMA,
8507 &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308508 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Rachit Kankaneee1735c2018-08-02 13:19:34 +05308509 "%s: Not able to post WMA_RATE_UPDATE_IND to WMA!",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008510 __func__);
8511
Jeff Johnson01f2c232018-11-21 19:17:44 -08008512 sme_release_global_lock(&mac->sme);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308513 qdf_mem_free(rate_upd);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308514 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008515 }
8516
Jeff Johnson01f2c232018-11-21 19:17:44 -08008517 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308518 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008519 }
8520
8521 return status;
8522}
8523
8524/**
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +05308525 * sme_update_access_policy_vendor_ie() - update vendor ie and access policy.
Jeff Johnsonc7309062018-11-09 20:59:42 -08008526 * @mac_handle: Pointer to the mac context
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +05308527 * @session_id: sme session id
8528 * @vendor_ie: vendor ie
8529 * @access_policy: vendor ie access policy
8530 *
8531 * This function updates the vendor ie and access policy to lim.
8532 *
8533 * Return: success or failure.
8534 */
Jeff Johnsonc7309062018-11-09 20:59:42 -08008535QDF_STATUS sme_update_access_policy_vendor_ie(mac_handle_t mac_handle,
8536 uint8_t session_id,
8537 uint8_t *vendor_ie,
8538 int access_policy)
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +05308539{
8540 struct sme_update_access_policy_vendor_ie *msg;
8541 uint16_t msg_len;
8542 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +05308543
8544 msg_len = sizeof(*msg);
8545
8546 msg = qdf_mem_malloc(msg_len);
8547 if (!msg) {
Srinivas Girigowda09625b02018-09-10 15:28:09 -07008548 return QDF_STATUS_E_NOMEM;
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +05308549 }
8550
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +05308551 msg->msg_type = (uint16_t)eWNI_SME_UPDATE_ACCESS_POLICY_VENDOR_IE;
8552 msg->length = (uint16_t)msg_len;
8553
8554 qdf_mem_copy(&msg->ie[0], vendor_ie, sizeof(msg->ie));
8555
8556 msg->sme_session_id = session_id;
8557 msg->access_policy = access_policy;
8558
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07008559 sme_debug("sme_session_id: %hu, access_policy: %d", session_id,
8560 access_policy);
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +05308561
Rajeev Kumard138ac52017-01-30 18:38:37 -08008562 status = umac_send_mb_message_to_mac(msg);
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +05308563
8564 return status;
8565}
8566
8567/**
Agrawal, Ashish4e5fa1c2016-09-21 19:03:43 +05308568 * sme_update_sta_inactivity_timeout(): Update sta_inactivity_timeout to FW
Jeff Johnsonc7309062018-11-09 20:59:42 -08008569 * @mac_handle: Handle returned by mac_open
Agrawal, Ashish4e5fa1c2016-09-21 19:03:43 +05308570 * @session_id: Session ID on which sta_inactivity_timeout needs
8571 * to be updated to FW
8572 * @sta_inactivity_timeout: sta inactivity timeout.
8573 *
8574 * If a station does not send anything in sta_inactivity_timeout seconds, an
8575 * empty data frame is sent to it in order to verify whether it is
8576 * still in range. If this frame is not ACKed, the station will be
8577 * disassociated and then deauthenticated.
8578 *
8579 * Return: QDF_STATUS_SUCCESS or non-zero on failure.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308580 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008581QDF_STATUS sme_update_sta_inactivity_timeout(mac_handle_t mac_handle,
Agrawal, Ashish4e5fa1c2016-09-21 19:03:43 +05308582 struct sme_sta_inactivity_timeout *sta_inactivity_timer)
8583{
8584 struct sme_sta_inactivity_timeout *inactivity_time;
8585 void *wma_handle;
8586
8587 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
8588 inactivity_time = qdf_mem_malloc(sizeof(*inactivity_time));
Arif Hussain0ef77082018-10-10 16:42:53 -07008589 if (!inactivity_time)
Agrawal, Ashish4e5fa1c2016-09-21 19:03:43 +05308590 return QDF_STATUS_E_FAILURE;
Arif Hussain0ef77082018-10-10 16:42:53 -07008591
Abhishek Singhe4a1f882017-08-10 17:59:44 +05308592 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Agrawal, Ashish4e5fa1c2016-09-21 19:03:43 +05308593 FL("sta_inactivity_timeout: %d"),
8594 sta_inactivity_timer->sta_inactivity_timeout);
8595 inactivity_time->session_id = sta_inactivity_timer->session_id;
8596 inactivity_time->sta_inactivity_timeout =
8597 sta_inactivity_timer->sta_inactivity_timeout;
8598
8599 wma_update_sta_inactivity_timeout(wma_handle,
8600 inactivity_time);
8601 return QDF_STATUS_SUCCESS;
8602}
8603
8604/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008605 * sme_get_reg_info() - To get registration info
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08008606 * @mac_handle: Opaque handle to the global MAC context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008607 * @chanId: channel id
8608 * @regInfo1: first reg info to fill
8609 * @regInfo2: second reg info to fill
8610 *
8611 * This routine will give you reg info
8612 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308613 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008614 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008615QDF_STATUS sme_get_reg_info(mac_handle_t mac_handle, uint8_t chanId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008616 uint32_t *regInfo1, uint32_t *regInfo2)
8617{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008618 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308619 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008620 uint8_t i;
8621 bool found = false;
8622
Jeff Johnson01f2c232018-11-21 19:17:44 -08008623 status = sme_acquire_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008624 *regInfo1 = 0;
8625 *regInfo2 = 0;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308626 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008627 return status;
8628
Wu Gao0821b0d2019-01-11 17:31:11 +08008629 for (i = 0; i < CFG_VALID_CHANNEL_LIST_LEN; i++) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08008630 if (mac->scan.defaultPowerTable[i].chan_num == chanId) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008631 SME_SET_CHANNEL_REG_POWER(*regInfo1,
Jeff Johnson01f2c232018-11-21 19:17:44 -08008632 mac->scan.defaultPowerTable[i].tx_power);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008633
8634 SME_SET_CHANNEL_MAX_TX_POWER(*regInfo2,
Jeff Johnson01f2c232018-11-21 19:17:44 -08008635 mac->scan.defaultPowerTable[i].tx_power);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008636 found = true;
8637 break;
8638 }
8639 }
8640 if (!found)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308641 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008642
Jeff Johnson01f2c232018-11-21 19:17:44 -08008643 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008644 return status;
8645}
8646
8647#ifdef FEATURE_WLAN_AUTO_SHUTDOWN
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008648QDF_STATUS sme_set_auto_shutdown_cb(mac_handle_t mac_handle,
Jeff Johnsoneb7bbed2019-02-17 10:34:24 -08008649 void (*callback_fn)(void))
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008650{
Jeff Johnsoneb7bbed2019-02-17 10:34:24 -08008651 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008652 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008653
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308654 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008655 "%s: Plug in Auto shutdown event callback", __func__);
8656
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 Johnson038efe72019-03-18 13:39:31 -07008659 if (callback_fn)
Jeff Johnsoneb7bbed2019-02-17 10:34:24 -08008660 mac->sme.auto_shutdown_cb = callback_fn;
Jeff Johnson01f2c232018-11-21 19:17:44 -08008661 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008662 }
8663
8664 return status;
8665}
8666
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308667/*
8668 * sme_set_auto_shutdown_timer() -
8669 * API to set auto shutdown timer value in FW.
8670 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008671 * mac_handle - The handle returned by mac_open
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308672 * timer_val - The auto shutdown timer value to be set
8673 * Return Configuration message posting status, SUCCESS or Fail
8674 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008675QDF_STATUS sme_set_auto_shutdown_timer(mac_handle_t mac_handle,
8676 uint32_t timer_val)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008677{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308678 QDF_STATUS status = QDF_STATUS_SUCCESS;
8679 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008680 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Jeff Johnsona9ade7d2019-02-17 10:08:17 -08008681 struct auto_shutdown_cmd *auto_sh_cmd;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07008682 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008683
Jeff Johnson01f2c232018-11-21 19:17:44 -08008684 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308685 if (QDF_STATUS_SUCCESS == status) {
Jeff Johnsona9ade7d2019-02-17 10:08:17 -08008686 auto_sh_cmd = qdf_mem_malloc(sizeof(*auto_sh_cmd));
Arif Hussain0ef77082018-10-10 16:42:53 -07008687 if (!auto_sh_cmd) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08008688 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308689 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008690 }
8691
8692 auto_sh_cmd->timer_val = timer_val;
8693
8694 /* serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08008695 message.bodyptr = auto_sh_cmd;
8696 message.type = WMA_SET_AUTO_SHUTDOWN_TIMER_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05308697 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
8698 QDF_MODULE_ID_WMA,
8699 QDF_MODULE_ID_WMA,
8700 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308701 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308702 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008703 "%s: Post Auto shutdown MSG fail", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308704 qdf_mem_free(auto_sh_cmd);
Jeff Johnson01f2c232018-11-21 19:17:44 -08008705 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308706 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008707 }
Abhishek Singhe4a1f882017-08-10 17:59:44 +05308708 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008709 "%s: Posted Auto shutdown MSG", __func__);
Jeff Johnson01f2c232018-11-21 19:17:44 -08008710 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008711 }
8712
8713 return status;
8714}
8715#endif
8716
Nirav Shaheb017be2018-02-15 11:20:58 +05308717#ifdef FEATURE_WLAN_CH_AVOID
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308718/*
8719 * sme_ch_avoid_update_req() -
8720 * API to request channel avoidance update from FW.
8721 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008722 * mac_handle - The handle returned by mac_open
Jeff Johnsonc5927de2018-05-11 09:12:53 -07008723 * update_type - The update_type parameter of this request call
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308724 * Return Configuration message posting status, SUCCESS or Fail
8725 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008726QDF_STATUS sme_ch_avoid_update_req(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008727{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308728 QDF_STATUS status = QDF_STATUS_SUCCESS;
8729 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008730 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008731 tSirChAvoidUpdateReq *cauReq;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07008732 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008733
Jeff Johnson01f2c232018-11-21 19:17:44 -08008734 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308735 if (QDF_STATUS_SUCCESS == status) {
Arif Hussain0ef77082018-10-10 16:42:53 -07008736 cauReq = qdf_mem_malloc(sizeof(tSirChAvoidUpdateReq));
8737 if (!cauReq) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08008738 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308739 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008740 }
8741
8742 cauReq->reserved_param = 0;
8743
8744 /* serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08008745 message.bodyptr = cauReq;
8746 message.type = WMA_CH_AVOID_UPDATE_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05308747 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
8748 QDF_MODULE_ID_WMA,
8749 QDF_MODULE_ID_WMA,
8750 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308751 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308752 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008753 "%s: Post Ch Avoid Update MSG fail",
8754 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308755 qdf_mem_free(cauReq);
Jeff Johnson01f2c232018-11-21 19:17:44 -08008756 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308757 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008758 }
Abhishek Singhe4a1f882017-08-10 17:59:44 +05308759 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008760 "%s: Posted Ch Avoid Update MSG", __func__);
Jeff Johnson01f2c232018-11-21 19:17:44 -08008761 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008762 }
8763
8764 return status;
8765}
Nirav Shaheb017be2018-02-15 11:20:58 +05308766#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008767
8768/**
8769 * sme_set_miracast() - Function to set miracast value to UMAC
Jeff Johnsonc7309062018-11-09 20:59:42 -08008770 * @mac_handle: Handle returned by macOpen
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008771 * @filter_type: 0-Disabled, 1-Source, 2-sink
8772 *
8773 * This function passes down the value of miracast set by
8774 * framework to UMAC
8775 *
8776 * Return: Configuration message posting status, SUCCESS or Fail
8777 *
8778 */
Jeff Johnsonc7309062018-11-09 20:59:42 -08008779QDF_STATUS sme_set_miracast(mac_handle_t mac_handle, uint8_t filter_type)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008780{
Rajeev Kumar37d478b2017-04-17 16:59:28 -07008781 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008782 uint32_t *val;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008783 struct mac_context *mac_ptr = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008784
Arif Hussain0ef77082018-10-10 16:42:53 -07008785 if (!mac_ptr) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308786 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008787 "%s: Invalid pointer", __func__);
Arif Hussain0ef77082018-10-10 16:42:53 -07008788 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008789 }
8790
Arif Hussain0ef77082018-10-10 16:42:53 -07008791 val = qdf_mem_malloc(sizeof(*val));
8792 if (!val)
8793 return QDF_STATUS_E_NOMEM;
8794
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008795 *val = filter_type;
8796
8797 msg.type = SIR_HAL_SET_MIRACAST;
8798 msg.reserved = 0;
8799 msg.bodyptr = val;
8800
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308801 if (!QDF_IS_STATUS_SUCCESS(
gaurank kathpalia36b0c582018-08-28 17:45:43 +05308802 scheduler_post_message(QDF_MODULE_ID_SME,
8803 QDF_MODULE_ID_WMA,
8804 QDF_MODULE_ID_WMA,
8805 &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308806 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008807 "%s: Not able to post WDA_SET_MAS_ENABLE_DISABLE to WMA!",
8808 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308809 qdf_mem_free(val);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308810 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008811 }
8812
8813 mac_ptr->sme.miracast_value = filter_type;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308814 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008815}
8816
8817/**
8818 * sme_set_mas() - Function to set MAS value to UMAC
8819 * @val: 1-Enable, 0-Disable
8820 *
8821 * This function passes down the value of MAS to the UMAC. A
8822 * value of 1 will enable MAS and a value of 0 will disable MAS
8823 *
8824 * Return: Configuration message posting status, SUCCESS or Fail
8825 *
8826 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308827QDF_STATUS sme_set_mas(uint32_t val)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008828{
Rajeev Kumar37d478b2017-04-17 16:59:28 -07008829 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008830 uint32_t *ptr_val;
8831
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308832 ptr_val = qdf_mem_malloc(sizeof(*ptr_val));
Arif Hussain0ef77082018-10-10 16:42:53 -07008833 if (!ptr_val)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308834 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008835
8836 *ptr_val = val;
8837
8838 msg.type = SIR_HAL_SET_MAS;
8839 msg.reserved = 0;
8840 msg.bodyptr = ptr_val;
8841
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308842 if (!QDF_IS_STATUS_SUCCESS(
gaurank kathpalia36b0c582018-08-28 17:45:43 +05308843 scheduler_post_message(QDF_MODULE_ID_SME,
8844 QDF_MODULE_ID_WMA,
8845 QDF_MODULE_ID_WMA,
8846 &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308847 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008848 "%s: Not able to post WDA_SET_MAS_ENABLE_DISABLE to WMA!",
8849 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308850 qdf_mem_free(ptr_val);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308851 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008852 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308853 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008854}
8855
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -08008856/**
8857 * sme_roam_channel_change_req() - Channel change to new target channel
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008858 * @mac_handle: handle returned by mac_open
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -08008859 * @bssid: mac address of BSS
8860 * @ch_params: target channel information
8861 * @profile: CSR profile
8862 *
8863 * API to Indicate Channel change to new target channel
8864 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308865 * Return: QDF_STATUS
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -08008866 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008867QDF_STATUS sme_roam_channel_change_req(mac_handle_t mac_handle,
Amar Singhale4f28ee2015-10-21 14:36:56 -07008868 struct qdf_mac_addr bssid,
Amar Singhal5cccafe2017-02-15 12:42:58 -08008869 struct ch_params *ch_params,
Jeff Johnson66ee8a92018-03-17 15:24:26 -07008870 struct csr_roam_profile *profile)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008871{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308872 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008873 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008874
Jeff Johnson01f2c232018-11-21 19:17:44 -08008875 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308876 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008877
Jeff Johnson01f2c232018-11-21 19:17:44 -08008878 status = csr_roam_channel_change_req(mac, bssid, ch_params,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008879 profile);
Jeff Johnson01f2c232018-11-21 19:17:44 -08008880 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008881 }
8882 return status;
8883}
8884
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308885/*
8886 * sme_process_channel_change_resp() -
8887 * API to Indicate Channel change response message to SAP.
8888 *
8889 * Return QDF_STATUS
8890 */
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008891static QDF_STATUS sme_process_channel_change_resp(struct mac_context *mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008892 uint16_t msg_type, void *pMsgBuf)
8893{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308894 QDF_STATUS status = QDF_STATUS_SUCCESS;
Min Liu3621ede2018-11-07 18:36:00 +08008895 struct csr_roam_info *roam_info;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008896 eCsrRoamResult roamResult;
8897 tpSwitchChannelParams pChnlParams = (tpSwitchChannelParams) pMsgBuf;
8898 uint32_t SessionId = pChnlParams->peSessionId;
8899
Min Liu3621ede2018-11-07 18:36:00 +08008900 roam_info = qdf_mem_malloc(sizeof(*roam_info));
8901 if (!roam_info)
8902 return QDF_STATUS_E_NOMEM;
8903
8904 roam_info->channelChangeRespEvent =
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308905 qdf_mem_malloc(sizeof(tSirChanChangeResponse));
Min Liu3621ede2018-11-07 18:36:00 +08008906 if (!roam_info->channelChangeRespEvent) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308907 status = QDF_STATUS_E_NOMEM;
Min Liu3621ede2018-11-07 18:36:00 +08008908 qdf_mem_free(roam_info);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008909 return status;
8910 }
8911 if (msg_type == eWNI_SME_CHANNEL_CHANGE_RSP) {
Min Liu3621ede2018-11-07 18:36:00 +08008912 roam_info->channelChangeRespEvent->sessionId = SessionId;
8913 roam_info->channelChangeRespEvent->newChannelNumber =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008914 pChnlParams->channelNumber;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008915
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308916 if (pChnlParams->status == QDF_STATUS_SUCCESS) {
Abhishek Singhe4a1f882017-08-10 17:59:44 +05308917 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008918 "sapdfs: Received success eWNI_SME_CHANNEL_CHANGE_RSP for sessionId[%d]",
8919 SessionId);
Min Liu3621ede2018-11-07 18:36:00 +08008920 roam_info->channelChangeRespEvent->channelChangeStatus =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008921 1;
8922 roamResult = eCSR_ROAM_RESULT_CHANNEL_CHANGE_SUCCESS;
8923 } else {
Abhishek Singhe4a1f882017-08-10 17:59:44 +05308924 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008925 "sapdfs: Received failure eWNI_SME_CHANNEL_CHANGE_RSP for sessionId[%d]",
8926 SessionId);
Min Liu3621ede2018-11-07 18:36:00 +08008927 roam_info->channelChangeRespEvent->channelChangeStatus =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008928 0;
8929 roamResult = eCSR_ROAM_RESULT_CHANNEL_CHANGE_FAILURE;
8930 }
8931
Min Liu3621ede2018-11-07 18:36:00 +08008932 csr_roam_call_callback(mac, SessionId, roam_info, 0,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008933 eCSR_ROAM_SET_CHANNEL_RSP, roamResult);
8934
8935 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308936 status = QDF_STATUS_E_FAILURE;
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07008937 sme_err("Invalid Channel Change Resp Message: %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008938 status);
8939 }
Min Liu3621ede2018-11-07 18:36:00 +08008940 qdf_mem_free(roam_info->channelChangeRespEvent);
8941 qdf_mem_free(roam_info);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008942
8943 return status;
8944}
8945
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308946/*
8947 * sme_roam_start_beacon_req() -
8948 * API to Indicate LIM to start Beacon Tx after SAP CAC Wait is completed.
8949 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008950 * mac_handle - The handle returned by mac_open
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308951 * sessionId - session ID
8952 * dfsCacWaitStatus - CAC WAIT status flag
8953 * Return QDF_STATUS
8954 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008955QDF_STATUS sme_roam_start_beacon_req(mac_handle_t mac_handle,
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08008956 struct qdf_mac_addr bssid,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008957 uint8_t dfsCacWaitStatus)
8958{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308959 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008960 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308961
Jeff Johnson01f2c232018-11-21 19:17:44 -08008962 status = sme_acquire_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008963
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308964 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08008965 status = csr_roam_start_beacon_req(mac, bssid,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308966 dfsCacWaitStatus);
Jeff Johnson01f2c232018-11-21 19:17:44 -08008967 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008968 }
8969 return status;
8970}
8971
Abhishek Singh20a8e442018-09-12 15:50:44 +05308972#ifdef CONFIG_VDEV_SM
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008973QDF_STATUS sme_csa_restart(struct mac_context *mac_ctx, uint8_t session_id)
Abhishek Singh20a8e442018-09-12 15:50:44 +05308974{
8975 QDF_STATUS status = QDF_STATUS_E_FAILURE;
8976
8977 status = sme_acquire_global_lock(&mac_ctx->sme);
8978 if (QDF_IS_STATUS_SUCCESS(status)) {
8979 status = csr_csa_restart(mac_ctx, session_id);
8980 sme_release_global_lock(&mac_ctx->sme);
8981 }
8982
8983 return status;
8984}
8985#endif
8986
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -08008987/**
8988 * sme_roam_csa_ie_request() - request CSA IE transmission from PE
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008989 * @mac_handle: handle returned by mac_open
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -08008990 * @bssid: SAP bssid
8991 * @targetChannel: target channel information
8992 * @csaIeReqd: CSA IE Request
8993 * @ch_params: channel information
8994 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308995 * Return: QDF_STATUS
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -08008996 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008997QDF_STATUS sme_roam_csa_ie_request(mac_handle_t mac_handle,
8998 struct qdf_mac_addr bssid,
8999 uint8_t targetChannel, uint8_t csaIeReqd,
9000 struct ch_params *ch_params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009001{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309002 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009003 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309004
Jeff Johnson01f2c232018-11-21 19:17:44 -08009005 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309006 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08009007 status = csr_roam_send_chan_sw_ie_request(mac, bssid,
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -08009008 targetChannel, csaIeReqd, ch_params);
Jeff Johnson01f2c232018-11-21 19:17:44 -08009009 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009010 }
9011 return status;
9012}
9013
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309014/*
9015 * sme_init_thermal_info() -
9016 * SME API to initialize the thermal mitigation parameters
9017 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009018 * mac_handle
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309019 * thermalParam : thermal mitigation parameters
9020 * Return QDF_STATUS
9021 */
Manikandan Mohan9045e2e2018-11-26 16:44:19 -08009022QDF_STATUS sme_init_thermal_info(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009023{
9024 t_thermal_mgmt *pWmaParam;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009025 struct scheduler_msg msg = {0};
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009026 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Manikandan Mohan9045e2e2018-11-26 16:44:19 -08009027 struct wlan_fwol_thermal_temp thermal_temp = {0};
9028 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009029
Arif Hussain0ef77082018-10-10 16:42:53 -07009030 pWmaParam = qdf_mem_malloc(sizeof(t_thermal_mgmt));
9031 if (!pWmaParam)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309032 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009033
Manikandan Mohan9045e2e2018-11-26 16:44:19 -08009034 status = ucfg_fwol_get_thermal_temp(mac->psoc, &thermal_temp);
9035 if (QDF_IS_STATUS_ERROR(status))
9036 return qdf_status_to_os_return(status);
9037
9038 pWmaParam->thermalMgmtEnabled = thermal_temp.thermal_mitigation_enable;
9039 pWmaParam->throttlePeriod = thermal_temp.throttle_period;
Poddar, Siddarth83905022016-04-16 17:56:08 -07009040
9041 pWmaParam->throttle_duty_cycle_tbl[0] =
Manikandan Mohan9045e2e2018-11-26 16:44:19 -08009042 thermal_temp.throttle_dutycycle_level[0];
Poddar, Siddarth83905022016-04-16 17:56:08 -07009043 pWmaParam->throttle_duty_cycle_tbl[1] =
Manikandan Mohan9045e2e2018-11-26 16:44:19 -08009044 thermal_temp.throttle_dutycycle_level[1];
Poddar, Siddarth83905022016-04-16 17:56:08 -07009045 pWmaParam->throttle_duty_cycle_tbl[2] =
Manikandan Mohan9045e2e2018-11-26 16:44:19 -08009046 thermal_temp.throttle_dutycycle_level[2];
Poddar, Siddarth83905022016-04-16 17:56:08 -07009047 pWmaParam->throttle_duty_cycle_tbl[3] =
Manikandan Mohan9045e2e2018-11-26 16:44:19 -08009048 thermal_temp.throttle_dutycycle_level[3];
Poddar, Siddarth83905022016-04-16 17:56:08 -07009049
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009050 pWmaParam->thermalLevels[0].minTempThreshold =
Manikandan Mohan9045e2e2018-11-26 16:44:19 -08009051 thermal_temp.thermal_temp_min_level[0];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009052 pWmaParam->thermalLevels[0].maxTempThreshold =
Manikandan Mohan9045e2e2018-11-26 16:44:19 -08009053 thermal_temp.thermal_temp_max_level[0];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009054 pWmaParam->thermalLevels[1].minTempThreshold =
Manikandan Mohan9045e2e2018-11-26 16:44:19 -08009055 thermal_temp.thermal_temp_min_level[1];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009056 pWmaParam->thermalLevels[1].maxTempThreshold =
Manikandan Mohan9045e2e2018-11-26 16:44:19 -08009057 thermal_temp.thermal_temp_max_level[1];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009058 pWmaParam->thermalLevels[2].minTempThreshold =
Manikandan Mohan9045e2e2018-11-26 16:44:19 -08009059 thermal_temp.thermal_temp_min_level[2];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009060 pWmaParam->thermalLevels[2].maxTempThreshold =
Manikandan Mohan9045e2e2018-11-26 16:44:19 -08009061 thermal_temp.thermal_temp_max_level[2];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009062 pWmaParam->thermalLevels[3].minTempThreshold =
Manikandan Mohan9045e2e2018-11-26 16:44:19 -08009063 thermal_temp.thermal_temp_min_level[3];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009064 pWmaParam->thermalLevels[3].maxTempThreshold =
Manikandan Mohan9045e2e2018-11-26 16:44:19 -08009065 thermal_temp.thermal_temp_max_level[3];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009066
Jeff Johnson01f2c232018-11-21 19:17:44 -08009067 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&mac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009068 msg.type = WMA_INIT_THERMAL_INFO_CMD;
9069 msg.bodyptr = pWmaParam;
9070
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309071 if (!QDF_IS_STATUS_SUCCESS
gaurank kathpalia36b0c582018-08-28 17:45:43 +05309072 (scheduler_post_message(QDF_MODULE_ID_SME,
9073 QDF_MODULE_ID_WMA,
9074 QDF_MODULE_ID_WMA,
9075 &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309076 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009077 "%s: Not able to post WMA_SET_THERMAL_INFO_CMD to WMA!",
9078 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309079 qdf_mem_free(pWmaParam);
Jeff Johnson01f2c232018-11-21 19:17:44 -08009080 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309081 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009082 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08009083 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309084 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009085 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309086 qdf_mem_free(pWmaParam);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309087 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009088}
9089
9090/**
9091 * sme_add_set_thermal_level_callback() - Plug in set thermal level callback
Jeff Johnsonc7309062018-11-09 20:59:42 -08009092 * @mac_handle: Handle returned by macOpen
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009093 * @callback: sme_set_thermal_level_callback
9094 *
9095 * Plug in set thermal level callback
9096 *
9097 * Return: none
9098 */
Jeff Johnsonc7309062018-11-09 20:59:42 -08009099void sme_add_set_thermal_level_callback(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009100 sme_set_thermal_level_callback callback)
9101{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009102 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009103
Jeff Johnson01f2c232018-11-21 19:17:44 -08009104 mac->sme.set_thermal_level_cb = callback;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009105}
9106
9107/**
9108 * sme_set_thermal_level() - SME API to set the thermal mitigation level
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08009109 * @mac_handle: Opaque handle to the global MAC context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009110 * @level: Thermal mitigation level
9111 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309112 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009113 */
Jeff Johnsonc7309062018-11-09 20:59:42 -08009114QDF_STATUS sme_set_thermal_level(mac_handle_t mac_handle, uint8_t level)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009115{
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009116 struct scheduler_msg msg = {0};
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009117 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309118 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009119
Jeff Johnson01f2c232018-11-21 19:17:44 -08009120 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&mac->sme)) {
hangtian127c9532019-01-12 13:29:07 +08009121 qdf_mem_zero(&msg, sizeof(msg));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009122 msg.type = WMA_SET_THERMAL_LEVEL;
9123 msg.bodyval = level;
9124
gaurank kathpalia36b0c582018-08-28 17:45:43 +05309125 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
9126 QDF_MODULE_ID_WMA,
9127 QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309128 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309129 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009130 "%s: Not able to post WMA_SET_THERMAL_LEVEL to WMA!",
9131 __func__);
Jeff Johnson01f2c232018-11-21 19:17:44 -08009132 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309133 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009134 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08009135 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309136 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009137 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309138 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009139}
9140
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309141/*
9142 * sme_txpower_limit() -
9143 * SME API to set txpower limits
9144 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009145 * mac_handle
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309146 * psmetx : power limits for 2g/5g
9147 * Return QDF_STATUS
9148 */
Jeff Johnson19ce8d02019-02-08 22:56:23 -08009149QDF_STATUS sme_txpower_limit(mac_handle_t mac_handle,
9150 struct tx_power_limit *psmetx)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009151{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309152 QDF_STATUS status = QDF_STATUS_SUCCESS;
9153 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009154 struct scheduler_msg message = {0};
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009155 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Jeff Johnson19ce8d02019-02-08 22:56:23 -08009156 struct tx_power_limit *tx_power_limit;
Prashanth Bhatta75fa9a12016-01-11 18:30:08 -08009157
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309158 tx_power_limit = qdf_mem_malloc(sizeof(*tx_power_limit));
Arif Hussain0ef77082018-10-10 16:42:53 -07009159 if (!tx_power_limit)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309160 return QDF_STATUS_E_FAILURE;
Prashanth Bhatta75fa9a12016-01-11 18:30:08 -08009161
9162 *tx_power_limit = *psmetx;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009163
Jeff Johnson01f2c232018-11-21 19:17:44 -08009164 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309165 if (QDF_IS_STATUS_SUCCESS(status)) {
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009166 message.type = WMA_TX_POWER_LIMIT;
9167 message.reserved = 0;
9168 message.bodyptr = tx_power_limit;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009169
gaurank kathpalia36b0c582018-08-28 17:45:43 +05309170 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
9171 QDF_MODULE_ID_WMA,
9172 QDF_MODULE_ID_WMA,
9173 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309174 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309175 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009176 "%s: not able to post WMA_TX_POWER_LIMIT",
9177 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309178 status = QDF_STATUS_E_FAILURE;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309179 qdf_mem_free(tx_power_limit);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009180 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08009181 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009182 }
9183 return status;
9184}
9185
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009186QDF_STATUS sme_update_connect_debug(mac_handle_t mac_handle, uint32_t set_value)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009187{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309188 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009189 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309190
Jeff Johnson01f2c232018-11-21 19:17:44 -08009191 mac->mlme_cfg->gen.debug_packet_log = set_value;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009192 return status;
9193}
9194
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309195/*
9196 * sme_ap_disable_intra_bss_fwd() -
9197 * SME will send message to WMA to set Intra BSS in txrx
9198 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009199 * mac_handle - The handle returned by mac_open
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309200 * sessionId - session id ( vdev id)
9201 * disablefwd - bool value that indicate disable intrabss fwd disable
9202 * Return QDF_STATUS
9203 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009204QDF_STATUS sme_ap_disable_intra_bss_fwd(mac_handle_t mac_handle,
9205 uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009206 bool disablefwd)
9207{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009208 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309209 int status = QDF_STATUS_SUCCESS;
9210 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009211 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009212 tpDisableIntraBssFwd pSapDisableIntraFwd = NULL;
9213
9214 /* Prepare the request to send to SME. */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309215 pSapDisableIntraFwd = qdf_mem_malloc(sizeof(tDisableIntraBssFwd));
Jeff Johnson038efe72019-03-18 13:39:31 -07009216 if (!pSapDisableIntraFwd) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009217 sme_err("Memory Allocation Failure!!!");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309218 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009219 }
9220
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009221 pSapDisableIntraFwd->sessionId = sessionId;
9222 pSapDisableIntraFwd->disableintrabssfwd = disablefwd;
9223
Jeff Johnson01f2c232018-11-21 19:17:44 -08009224 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309225 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009226 /* serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009227 message.bodyptr = pSapDisableIntraFwd;
9228 message.type = WMA_SET_SAP_INTRABSS_DIS;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05309229 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
9230 QDF_MODULE_ID_WMA,
9231 QDF_MODULE_ID_WMA,
9232 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309233 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
9234 status = QDF_STATUS_E_FAILURE;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309235 qdf_mem_free(pSapDisableIntraFwd);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009236 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08009237 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009238 }
9239 return status;
9240}
9241
9242#ifdef WLAN_FEATURE_STATS_EXT
9243
Jeff Johnson45843652018-07-04 12:47:34 -07009244void sme_stats_ext_register_callback(mac_handle_t mac_handle,
9245 stats_ext_cb callback)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009246{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009247 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009248
Jeff Johnson45843652018-07-04 12:47:34 -07009249 if (!mac) {
9250 sme_err("Invalid mac context");
Arun Khandavalli4b55da72016-07-19 19:55:01 +05309251 return;
9252 }
9253
Jeff Johnson45843652018-07-04 12:47:34 -07009254 mac->sme.stats_ext_cb = callback;
Arun Khandavalli4b55da72016-07-19 19:55:01 +05309255}
9256
Jeff Johnson45843652018-07-04 12:47:34 -07009257void sme_stats_ext_deregister_callback(mac_handle_t mac_handle)
9258{
9259 sme_stats_ext_register_callback(mac_handle, NULL);
9260}
9261
9262void sme_stats_ext2_register_callback(mac_handle_t mac_handle,
9263 stats_ext2_cb callback)
9264{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009265 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Jeff Johnson45843652018-07-04 12:47:34 -07009266
9267 if (!mac) {
9268 sme_err("Invalid mac context");
9269 return;
9270 }
9271
9272 mac->sme.stats_ext2_cb = callback;
9273}
Arun Khandavalli4b55da72016-07-19 19:55:01 +05309274
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309275/*
9276 * sme_stats_ext_request() -
9277 * Function called when HDD receives STATS EXT vendor command from userspace
9278 *
9279 * sessionID - vdevID for the stats ext request
9280 * input - Stats Ext Request structure ptr
9281 * Return QDF_STATUS
9282 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309283QDF_STATUS sme_stats_ext_request(uint8_t session_id, tpStatsExtRequestReq input)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009284{
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009285 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009286 tpStatsExtRequest data;
9287 size_t data_len;
9288
9289 data_len = sizeof(tStatsExtRequest) + input->request_data_len;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309290 data = qdf_mem_malloc(data_len);
Arif Hussain0ef77082018-10-10 16:42:53 -07009291 if (!data)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309292 return QDF_STATUS_E_NOMEM;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309293
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009294 data->vdev_id = session_id;
9295 data->request_data_len = input->request_data_len;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309296 if (input->request_data_len)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309297 qdf_mem_copy(data->request_data,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009298 input->request_data, input->request_data_len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009299
9300 msg.type = WMA_STATS_EXT_REQUEST;
9301 msg.reserved = 0;
9302 msg.bodyptr = data;
9303
gaurank kathpalia36b0c582018-08-28 17:45:43 +05309304 if (QDF_STATUS_SUCCESS != scheduler_post_message(QDF_MODULE_ID_SME,
9305 QDF_MODULE_ID_WMA,
9306 QDF_MODULE_ID_WMA,
9307 &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309308 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009309 "%s: Not able to post WMA_STATS_EXT_REQUEST message to WMA",
9310 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309311 qdf_mem_free(data);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309312 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009313 }
9314
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309315 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009316}
9317
Jeff Johnsonfdecd512018-06-10 09:18:32 -07009318/**
9319 * sme_stats_ext_event() - eWNI_SME_STATS_EXT_EVENT processor
9320 * @mac: Global MAC context
9321 * @msg: "stats ext" message
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009322
Jeff Johnsonfdecd512018-06-10 09:18:32 -07009323 * This callback function called when SME received eWNI_SME_STATS_EXT_EVENT
9324 * response from WMA
9325 *
9326 * Return: QDF_STATUS
9327 */
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009328static QDF_STATUS sme_stats_ext_event(struct mac_context *mac,
Jeff Johnson45843652018-07-04 12:47:34 -07009329 struct stats_ext_event *msg)
Jeff Johnsonfdecd512018-06-10 09:18:32 -07009330{
9331 if (!msg) {
9332 sme_err("Null msg");
9333 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009334 }
9335
Jeff Johnson45843652018-07-04 12:47:34 -07009336 if (mac->sme.stats_ext_cb)
9337 mac->sme.stats_ext_cb(mac->hdd_handle, msg);
Jeff Johnsonfdecd512018-06-10 09:18:32 -07009338
9339 return QDF_STATUS_SUCCESS;
9340}
9341
9342#else
9343
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009344static QDF_STATUS sme_stats_ext_event(struct mac_context *mac,
Jeff Johnson45843652018-07-04 12:47:34 -07009345 struct stats_ext_event *msg)
Jeff Johnsonfdecd512018-06-10 09:18:32 -07009346{
9347 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009348}
9349
9350#endif
9351
Qun Zhangef655622019-02-25 10:48:10 +08009352#ifdef FEATURE_FW_STATE
9353QDF_STATUS sme_get_fw_state(mac_handle_t mac_handle,
9354 fw_state_callback callback,
9355 void *context)
9356{
9357 QDF_STATUS status;
9358 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
9359 tp_wma_handle wma_handle;
9360
9361 SME_ENTER();
9362
9363 mac_ctx->sme.fw_state_cb = callback;
9364 mac_ctx->sme.fw_state_context = context;
9365 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
9366 status = wma_get_fw_state(wma_handle);
9367
9368 SME_EXIT();
9369 return status;
9370}
9371
9372/**
9373 * sme_fw_state_resp() - eWNI_SME_FW_STATUS_IND processor
9374 * @mac: Global MAC context
9375
9376 * This callback function called when SME received eWNI_SME_FW_STATUS_IND
9377 * response from WMA
9378 *
9379 * Return: QDF_STATUS
9380 */
9381static QDF_STATUS sme_fw_state_resp(struct mac_context *mac)
9382{
9383 if (mac->sme.fw_state_cb)
9384 mac->sme.fw_state_cb(mac->sme.fw_state_context);
9385 mac->sme.fw_state_cb = NULL;
9386 mac->sme.fw_state_context = NULL;
9387
9388 return QDF_STATUS_SUCCESS;
9389}
9390
9391#else /* FEATURE_FW_STATE */
9392static QDF_STATUS sme_fw_state_resp(struct mac_context *mac)
9393{
9394 return QDF_STATUS_SUCCESS;
9395}
9396
9397#endif /* FEATURE_FW_STATE */
9398
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309399/*
9400 * sme_update_dfs_scan_mode() -
9401 * Update DFS roam scan mode
9402 * This function is called through dynamic setConfig callback function
9403 * to configure allowDFSChannelRoam.
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08009404 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309405 * sessionId - Session Identifier
9406 * allowDFSChannelRoam - DFS roaming scan mode 0 (disable),
9407 * 1 (passive), 2 (active)
9408 * Return QDF_STATUS_SUCCESS - SME update DFS roaming scan config
9409 * successfully.
9410 * Other status means SME failed to update DFS roaming scan config.
9411 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009412QDF_STATUS sme_update_dfs_scan_mode(mac_handle_t mac_handle, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009413 uint8_t allowDFSChannelRoam)
9414{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009415 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309416 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009417
Dustin Brownad06be62019-02-04 14:52:56 -08009418 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08009419 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
9420 FL("Invalid sme session id: %d"), sessionId);
9421 return QDF_STATUS_E_INVAL;
9422 }
9423
Jeff Johnson01f2c232018-11-21 19:17:44 -08009424 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309425 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309426 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309427 "LFR runtime successfully set AllowDFSChannelRoam Mode to %d - old value is %d - roam state is %s",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009428 allowDFSChannelRoam,
Wu Gao51a63562018-11-08 16:29:10 +08009429 mac->mlme_cfg->lfr.roaming_dfs_channel,
Jeff Johnson01f2c232018-11-21 19:17:44 -08009430 mac_trace_get_neighbour_roam_state(mac->roam.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009431 neighborRoamInfo
9432 [sessionId].
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309433 neighborRoamState));
Wu Gao51a63562018-11-08 16:29:10 +08009434 mac->mlme_cfg->lfr.roaming_dfs_channel =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009435 allowDFSChannelRoam;
Wu Gao51a63562018-11-08 16:29:10 +08009436 if (mac->mlme_cfg->lfr.roam_scan_offload_enabled) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08009437 csr_roam_offload_scan(mac, sessionId,
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05309438 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
9439 REASON_ROAM_DFS_SCAN_MODE_CHANGED);
9440 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08009441 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009442 }
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05309443
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009444
9445 return status;
9446}
9447
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309448/*
9449 * sme_get_dfs_scan_mode() - get DFS roam scan mode
9450 * This is a synchronous call
9451 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009452 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309453 * Return DFS roaming scan mode 0 (disable), 1 (passive), 2 (active)
9454 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009455uint8_t sme_get_dfs_scan_mode(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009456{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009457 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309458
Wu Gao51a63562018-11-08 16:29:10 +08009459 return mac->mlme_cfg->lfr.roaming_dfs_channel;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009460}
9461
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309462/*
9463 * sme_modify_add_ie() -
9464 * This function sends msg to updates the additional IE buffers in PE
9465 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009466 * mac_handle - global structure
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309467 * pModifyIE - pointer to tModifyIE structure
9468 * updateType - type of buffer
9469 * Return Success or failure
9470 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009471QDF_STATUS sme_modify_add_ie(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009472 tSirModifyIE *pModifyIE, eUpdateIEsType updateType)
9473{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309474 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009475 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309476
Jeff Johnson01f2c232018-11-21 19:17:44 -08009477 status = sme_acquire_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009478
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309479 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08009480 status = csr_roam_modify_add_ies(mac, pModifyIE, updateType);
9481 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009482 }
9483 return status;
9484}
9485
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309486/*
9487 * sme_update_add_ie() -
9488 * This function sends msg to updates the additional IE buffers in PE
9489 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009490 * mac_handle - global structure
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309491 * pUpdateIE - pointer to structure tUpdateIE
9492 * updateType - type of buffer
9493 * Return Success or failure
9494 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009495QDF_STATUS sme_update_add_ie(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009496 tSirUpdateIE *pUpdateIE, eUpdateIEsType updateType)
9497{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309498 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009499 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309500
Jeff Johnson01f2c232018-11-21 19:17:44 -08009501 status = sme_acquire_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009502
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309503 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08009504 status = csr_roam_update_add_ies(mac, pUpdateIE, updateType);
9505 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009506 }
9507 return status;
9508}
9509
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009510/**
9511 * sme_update_dsc_pto_up_mapping()
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08009512 * @mac_handle: Opaque handle to the global MAC context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009513 * @dscpmapping: pointer to DSCP mapping structure
9514 * @sessionId: SME session id
9515 *
9516 * This routine is called to update dscp mapping
9517 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309518 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009519 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009520QDF_STATUS sme_update_dsc_pto_up_mapping(mac_handle_t mac_handle,
Abhishek Singh12be60f2017-08-11 13:52:42 +05309521 enum sme_qos_wmmuptype *dscpmapping,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009522 uint8_t sessionId)
9523{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009524 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309525 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009526 uint8_t i, j, peSessionId;
gaurank kathpalia14e2f912017-08-31 14:51:45 +05309527 struct csr_roam_session *pCsrSession = NULL;
Jeff Johnson59104482018-11-18 21:30:19 -08009528 struct pe_session *pSession = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009529
Jeff Johnson01f2c232018-11-21 19:17:44 -08009530 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309531 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009532 return status;
Jeff Johnson01f2c232018-11-21 19:17:44 -08009533 pCsrSession = CSR_GET_SESSION(mac, sessionId);
Jeff Johnson038efe72019-03-18 13:39:31 -07009534 if (!pCsrSession) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309535 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009536 FL("Session lookup fails for CSR session"));
Jeff Johnson01f2c232018-11-21 19:17:44 -08009537 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309538 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009539 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08009540 if (!CSR_IS_SESSION_VALID(mac, sessionId)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309541 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009542 FL("Invalid session Id %u"), sessionId);
Jeff Johnson01f2c232018-11-21 19:17:44 -08009543 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309544 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009545 }
9546
Jeff Johnson01f2c232018-11-21 19:17:44 -08009547 pSession = pe_find_session_by_bssid(mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009548 pCsrSession->connectedProfile.bssid.bytes,
9549 &peSessionId);
9550
Jeff Johnson038efe72019-03-18 13:39:31 -07009551 if (!pSession) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309552 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009553 FL(" Session lookup fails for BSSID"));
Jeff Johnson01f2c232018-11-21 19:17:44 -08009554 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309555 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009556 }
9557
9558 if (!pSession->QosMapSet.present) {
Srinivas Girigowda2b5d47c2017-03-29 00:28:46 -07009559 sme_debug("QOS Mapping IE not present");
Jeff Johnson01f2c232018-11-21 19:17:44 -08009560 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309561 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009562 }
9563 for (i = 0; i < SME_QOS_WMM_UP_MAX; i++) {
9564 for (j = pSession->QosMapSet.dscp_range[i][0];
9565 j <= pSession->QosMapSet.dscp_range[i][1];
9566 j++) {
9567 if ((pSession->QosMapSet.dscp_range[i][0] == 255)
9568 && (pSession->QosMapSet.dscp_range[i][1] ==
9569 255)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309570 QDF_TRACE(QDF_MODULE_ID_SME,
Kiran Kumar Lokere1d411bb2017-11-29 15:24:05 -08009571 QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009572 FL("User Priority %d isn't used"), i);
9573 break;
9574 } else {
9575 dscpmapping[j] = i;
9576 }
9577 }
9578 }
9579 for (i = 0; i < pSession->QosMapSet.num_dscp_exceptions; i++)
9580 if (pSession->QosMapSet.dscp_exceptions[i][0] != 255)
9581 dscpmapping[pSession->QosMapSet.dscp_exceptions[i][0]] =
9582 pSession->QosMapSet.dscp_exceptions[i][1];
9583
Jeff Johnson01f2c232018-11-21 19:17:44 -08009584 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009585 return status;
9586}
9587
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309588/*
9589 * sme_abort_roam_scan() -
9590 * API to abort current roam scan cycle by roam scan offload module.
9591 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009592 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309593 * sessionId - Session Identifier
9594 * Return QDF_STATUS
9595 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009596
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009597QDF_STATUS sme_abort_roam_scan(mac_handle_t mac_handle, uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009598{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309599 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009600 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009601
Wu Gao51a63562018-11-08 16:29:10 +08009602 if (mac->mlme_cfg->lfr.roam_scan_offload_enabled) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009603 /* acquire the lock for the sme object */
Jeff Johnson01f2c232018-11-21 19:17:44 -08009604 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309605 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08009606 csr_roam_offload_scan(mac, sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009607 ROAM_SCAN_OFFLOAD_ABORT_SCAN,
9608 REASON_ROAM_ABORT_ROAM_SCAN);
9609 /* release the lock for the sme object */
Jeff Johnson01f2c232018-11-21 19:17:44 -08009610 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009611 }
9612 }
9613
9614 return status;
9615}
9616
9617#ifdef FEATURE_WLAN_EXTSCAN
9618/**
9619 * sme_get_valid_channels_by_band() - to fetch valid channels filtered by band
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08009620 * @mac_handle: Opaque handle to the global MAC context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009621 * @wifiBand: RF band information
9622 * @aValidChannels: output array to store channel info
9623 * @pNumChannels: output number of channels
9624 *
9625 * SME API to fetch all valid channels filtered by band
9626 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309627 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009628 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009629QDF_STATUS sme_get_valid_channels_by_band(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009630 uint8_t wifiBand,
9631 uint32_t *aValidChannels,
9632 uint8_t *pNumChannels)
9633{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309634 QDF_STATUS status = QDF_STATUS_SUCCESS;
Wu Gao0821b0d2019-01-11 17:31:11 +08009635 uint8_t chanList[CFG_VALID_CHANNEL_LIST_LEN] = { 0 };
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009636 uint8_t numChannels = 0;
9637 uint8_t i = 0;
Wu Gao0821b0d2019-01-11 17:31:11 +08009638 uint32_t totValidChannels = CFG_VALID_CHANNEL_LIST_LEN;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009639 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009640
9641 if (!aValidChannels || !pNumChannels) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009642 sme_err("Output channel list/NumChannels is NULL");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309643 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009644 }
9645
Sreelakshmi Konamki0d17c6a2017-06-08 12:58:54 +05309646 if (wifiBand >= WIFI_BAND_MAX) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009647 sme_err("Invalid wifiBand: %d", wifiBand);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309648 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009649 }
9650
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -08009651 status = sme_get_cfg_valid_channels(&chanList[0],
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009652 &totValidChannels);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309653 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009654 sme_err("Fail to get valid channel list (err=%d)", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009655 return status;
9656 }
9657
9658 switch (wifiBand) {
9659 case WIFI_BAND_UNSPECIFIED:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009660 sme_debug("Unspec Band, return all %d valid channels",
9661 totValidChannels);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009662 numChannels = totValidChannels;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309663 for (i = 0; i < totValidChannels; i++)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009664 aValidChannels[i] = cds_chan_to_freq(chanList[i]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009665 break;
9666
9667 case WIFI_BAND_BG:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009668 sme_debug("WIFI_BAND_BG (2.4 GHz)");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009669 for (i = 0; i < totValidChannels; i++) {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309670 if (WLAN_REG_IS_24GHZ_CH(chanList[i]))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009671 aValidChannels[numChannels++] =
9672 cds_chan_to_freq(chanList[i]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009673 }
9674 break;
9675
9676 case WIFI_BAND_A:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009677 sme_debug("WIFI_BAND_A (5 GHz without DFS)");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009678 for (i = 0; i < totValidChannels; i++) {
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07009679 if (WLAN_REG_IS_5GHZ_CH(chanList[i]) &&
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309680 !wlan_reg_is_dfs_ch(mac_ctx->pdev, chanList[i]))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009681 aValidChannels[numChannels++] =
9682 cds_chan_to_freq(chanList[i]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009683 }
9684 break;
9685
9686 case WIFI_BAND_ABG:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009687 sme_debug("WIFI_BAND_ABG (2.4 GHz + 5 GHz; no DFS)");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009688 for (i = 0; i < totValidChannels; i++) {
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07009689 if ((WLAN_REG_IS_24GHZ_CH(chanList[i]) ||
9690 WLAN_REG_IS_5GHZ_CH(chanList[i])) &&
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309691 !wlan_reg_is_dfs_ch(mac_ctx->pdev, chanList[i]))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009692 aValidChannels[numChannels++] =
9693 cds_chan_to_freq(chanList[i]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009694 }
9695 break;
9696
9697 case WIFI_BAND_A_DFS_ONLY:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009698 sme_debug("WIFI_BAND_A_DFS (5 GHz DFS only)");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009699 for (i = 0; i < totValidChannels; i++) {
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07009700 if (WLAN_REG_IS_5GHZ_CH(chanList[i]) &&
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309701 wlan_reg_is_dfs_ch(mac_ctx->pdev, chanList[i]))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009702 aValidChannels[numChannels++] =
9703 cds_chan_to_freq(chanList[i]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009704 }
9705 break;
9706
9707 case WIFI_BAND_A_WITH_DFS:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009708 sme_debug("WIFI_BAND_A_WITH_DFS (5 GHz with DFS)");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009709 for (i = 0; i < totValidChannels; i++) {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309710 if (WLAN_REG_IS_5GHZ_CH(chanList[i]))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009711 aValidChannels[numChannels++] =
9712 cds_chan_to_freq(chanList[i]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009713 }
9714 break;
9715
9716 case WIFI_BAND_ABG_WITH_DFS:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009717 sme_debug("WIFI_BAND_ABG_WITH_DFS (2.4 GHz+5 GHz with DFS)");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009718 for (i = 0; i < totValidChannels; i++) {
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07009719 if (WLAN_REG_IS_24GHZ_CH(chanList[i]) ||
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309720 WLAN_REG_IS_5GHZ_CH(chanList[i]))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009721 aValidChannels[numChannels++] =
9722 cds_chan_to_freq(chanList[i]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009723 }
9724 break;
9725
9726 default:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009727 sme_err("Unknown wifiBand: %d", wifiBand);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309728 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009729 }
9730 *pNumChannels = numChannels;
9731
9732 return status;
9733}
9734
Jeff Johnsonfed9a732018-07-18 12:18:03 -07009735QDF_STATUS
9736sme_ext_scan_get_capabilities(mac_handle_t mac_handle,
9737 struct extscan_capabilities_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009738{
Jeff Johnsonfed9a732018-07-18 12:18:03 -07009739 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009740 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009741 struct scheduler_msg message = {0};
Jeff Johnsonfed9a732018-07-18 12:18:03 -07009742 struct extscan_capabilities_params *bodyptr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009743
Jeff Johnsonfed9a732018-07-18 12:18:03 -07009744 /* per contract must make a copy of the params when messaging */
9745 bodyptr = qdf_mem_malloc(sizeof(*bodyptr));
9746 if (!bodyptr)
9747 return QDF_STATUS_E_NOMEM;
9748 *bodyptr = *params;
9749
9750 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309751 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009752 /* Serialize the req through MC thread */
Jeff Johnsonfed9a732018-07-18 12:18:03 -07009753 message.bodyptr = bodyptr;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009754 message.type = WMA_EXTSCAN_GET_CAPABILITIES_REQ;
Jeff Johnsonfed9a732018-07-18 12:18:03 -07009755 qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
9756 NO_SESSION, message.type);
9757 status = scheduler_post_message(QDF_MODULE_ID_SME,
9758 QDF_MODULE_ID_WMA,
9759 QDF_MODULE_ID_WMA,
9760 &message);
9761 sme_release_global_lock(&mac->sme);
9762 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009763
Jeff Johnsonfed9a732018-07-18 12:18:03 -07009764 if (QDF_IS_STATUS_ERROR(status)) {
9765 sme_err("failure: %d", status);
9766 qdf_mem_free(bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009767 }
9768 return status;
9769}
9770
Jeff Johnsondab58602018-07-14 15:30:24 -07009771QDF_STATUS
9772sme_ext_scan_start(mac_handle_t mac_handle,
9773 struct wifi_scan_cmd_req_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009774{
Jeff Johnsondab58602018-07-14 15:30:24 -07009775 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009776 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009777 struct scheduler_msg message = {0};
Jeff Johnsondab58602018-07-14 15:30:24 -07009778 struct wifi_scan_cmd_req_params *bodyptr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009779
Jeff Johnsondab58602018-07-14 15:30:24 -07009780 /* per contract must make a copy of the params when messaging */
9781 bodyptr = qdf_mem_malloc(sizeof(*bodyptr));
9782 if (!bodyptr)
9783 return QDF_STATUS_E_NOMEM;
9784 *bodyptr = *params;
9785
9786 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309787 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009788 /* Serialize the req through MC thread */
Jeff Johnsondab58602018-07-14 15:30:24 -07009789 message.bodyptr = bodyptr;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009790 message.type = WMA_EXTSCAN_START_REQ;
Jeff Johnsondab58602018-07-14 15:30:24 -07009791 qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
9792 NO_SESSION, message.type);
9793 status = scheduler_post_message(QDF_MODULE_ID_SME,
9794 QDF_MODULE_ID_WMA,
9795 QDF_MODULE_ID_WMA,
9796 &message);
9797 sme_release_global_lock(&mac->sme);
9798 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009799
Jeff Johnsondab58602018-07-14 15:30:24 -07009800 if (QDF_IS_STATUS_ERROR(status)) {
9801 sme_err("failure: %d", status);
9802 qdf_mem_free(bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009803 }
9804 return status;
9805}
9806
Jeff Johnson7272ea72018-07-15 17:22:27 -07009807QDF_STATUS sme_ext_scan_stop(mac_handle_t mac_handle,
9808 struct extscan_stop_req_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009809{
Jeff Johnson7272ea72018-07-15 17:22:27 -07009810 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009811 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009812 struct scheduler_msg message = {0};
Jeff Johnson7272ea72018-07-15 17:22:27 -07009813 struct extscan_stop_req_params *bodyptr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009814
Jeff Johnson7272ea72018-07-15 17:22:27 -07009815 /* per contract must make a copy of the params when messaging */
9816 bodyptr = qdf_mem_malloc(sizeof(*bodyptr));
9817 if (!bodyptr)
9818 return QDF_STATUS_E_NOMEM;
9819 *bodyptr = *params;
9820
9821 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309822 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009823 /* Serialize the req through MC thread */
Jeff Johnson7272ea72018-07-15 17:22:27 -07009824 message.bodyptr = bodyptr;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009825 message.type = WMA_EXTSCAN_STOP_REQ;
Jeff Johnson7272ea72018-07-15 17:22:27 -07009826 qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
9827 NO_SESSION, message.type);
9828 status = scheduler_post_message(QDF_MODULE_ID_SME,
9829 QDF_MODULE_ID_WMA,
9830 QDF_MODULE_ID_WMA,
9831 &message);
9832 sme_release_global_lock(&mac->sme);
9833 }
9834
9835 if (QDF_IS_STATUS_ERROR(status)) {
9836 sme_err("failure: %d", status);
9837 qdf_mem_free(bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009838 }
9839 return status;
9840}
9841
Jeff Johnson1148cb02018-07-13 23:14:32 -07009842QDF_STATUS
9843sme_set_bss_hotlist(mac_handle_t mac_handle,
9844 struct extscan_bssid_hotlist_set_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009845{
Jeff Johnson1148cb02018-07-13 23:14:32 -07009846 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009847 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009848 struct scheduler_msg message = {0};
Jeff Johnson1148cb02018-07-13 23:14:32 -07009849 struct extscan_bssid_hotlist_set_params *bodyptr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009850
Jeff Johnson1148cb02018-07-13 23:14:32 -07009851 /* per contract must make a copy of the params when messaging */
9852 bodyptr = qdf_mem_malloc(sizeof(*bodyptr));
Arif Hussain0ef77082018-10-10 16:42:53 -07009853 if (!bodyptr)
Jeff Johnson1148cb02018-07-13 23:14:32 -07009854 return QDF_STATUS_E_NOMEM;
Arif Hussain0ef77082018-10-10 16:42:53 -07009855
Jeff Johnson1148cb02018-07-13 23:14:32 -07009856 *bodyptr = *params;
9857
9858 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309859 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009860 /* Serialize the req through MC thread */
Jeff Johnson1148cb02018-07-13 23:14:32 -07009861 message.bodyptr = bodyptr;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009862 message.type = WMA_EXTSCAN_SET_BSSID_HOTLIST_REQ;
Jeff Johnson1148cb02018-07-13 23:14:32 -07009863 qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
9864 NO_SESSION, message.type);
gaurank kathpalia36b0c582018-08-28 17:45:43 +05309865 status = scheduler_post_message(QDF_MODULE_ID_SME,
9866 QDF_MODULE_ID_WMA,
9867 QDF_MODULE_ID_WMA, &message);
Jeff Johnson1148cb02018-07-13 23:14:32 -07009868 sme_release_global_lock(&mac->sme);
9869 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009870
Jeff Johnson1148cb02018-07-13 23:14:32 -07009871 if (QDF_IS_STATUS_ERROR(status)) {
9872 sme_err("failure: %d", status);
9873 qdf_mem_free(bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009874 }
9875 return status;
9876}
9877
Jeff Johnson9743eb72018-07-14 10:30:04 -07009878QDF_STATUS
9879sme_reset_bss_hotlist(mac_handle_t mac_handle,
9880 struct extscan_bssid_hotlist_reset_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009881{
Jeff Johnson9743eb72018-07-14 10:30:04 -07009882 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009883 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009884 struct scheduler_msg message = {0};
Jeff Johnson9743eb72018-07-14 10:30:04 -07009885 struct extscan_bssid_hotlist_reset_params *bodyptr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009886
Jeff Johnson9743eb72018-07-14 10:30:04 -07009887 /* per contract must make a copy of the params when messaging */
9888 bodyptr = qdf_mem_malloc(sizeof(*bodyptr));
Arif Hussain0ef77082018-10-10 16:42:53 -07009889 if (!bodyptr)
Jeff Johnson9743eb72018-07-14 10:30:04 -07009890 return QDF_STATUS_E_NOMEM;
Arif Hussain0ef77082018-10-10 16:42:53 -07009891
Jeff Johnson9743eb72018-07-14 10:30:04 -07009892 *bodyptr = *params;
9893
9894 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309895 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009896 /* Serialize the req through MC thread */
Jeff Johnson9743eb72018-07-14 10:30:04 -07009897 message.bodyptr = bodyptr;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009898 message.type = WMA_EXTSCAN_RESET_BSSID_HOTLIST_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05309899 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009900 NO_SESSION, message.type));
gaurank kathpalia36b0c582018-08-28 17:45:43 +05309901 status = scheduler_post_message(QDF_MODULE_ID_SME,
9902 QDF_MODULE_ID_WMA,
9903 QDF_MODULE_ID_WMA, &message);
Jeff Johnson9743eb72018-07-14 10:30:04 -07009904 sme_release_global_lock(&mac->sme);
9905 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009906
Jeff Johnson9743eb72018-07-14 10:30:04 -07009907 if (QDF_IS_STATUS_ERROR(status)) {
9908 sme_err("failure: %d", status);
9909 qdf_mem_free(bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009910 }
9911 return status;
9912}
9913
Jeff Johnsonb43ed032018-07-16 06:59:21 -07009914QDF_STATUS
9915sme_set_significant_change(mac_handle_t mac_handle,
9916 struct extscan_set_sig_changereq_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009917{
Jeff Johnsonb43ed032018-07-16 06:59:21 -07009918 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009919 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009920 struct scheduler_msg message = {0};
Jeff Johnsonb43ed032018-07-16 06:59:21 -07009921 struct extscan_set_sig_changereq_params *bodyptr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009922
Jeff Johnsonb43ed032018-07-16 06:59:21 -07009923 /* per contract must make a copy of the params when messaging */
9924 bodyptr = qdf_mem_malloc(sizeof(*bodyptr));
Arif Hussain0ef77082018-10-10 16:42:53 -07009925 if (!bodyptr)
Jeff Johnsonb43ed032018-07-16 06:59:21 -07009926 return QDF_STATUS_E_NOMEM;
Arif Hussain0ef77082018-10-10 16:42:53 -07009927
Jeff Johnsonb43ed032018-07-16 06:59:21 -07009928 *bodyptr = *params;
9929
9930 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309931 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009932 /* Serialize the req through MC thread */
Jeff Johnsonb43ed032018-07-16 06:59:21 -07009933 message.bodyptr = bodyptr;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009934 message.type = WMA_EXTSCAN_SET_SIGNF_CHANGE_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05309935 status = scheduler_post_message(QDF_MODULE_ID_SME,
9936 QDF_MODULE_ID_WMA,
9937 QDF_MODULE_ID_WMA,
9938 &message);
Jeff Johnsonb43ed032018-07-16 06:59:21 -07009939 sme_release_global_lock(&mac->sme);
9940 }
Jeff Johnsonb43ed032018-07-16 06:59:21 -07009941 if (QDF_IS_STATUS_ERROR(status)) {
9942 sme_err("failure: %d", status);
9943 qdf_mem_free(bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009944 }
9945 return status;
9946}
9947
Jeff Johnson0c8dbc32018-07-16 22:10:48 -07009948QDF_STATUS
9949sme_reset_significant_change(mac_handle_t mac_handle,
9950 struct extscan_capabilities_reset_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009951{
Jeff Johnson0c8dbc32018-07-16 22:10:48 -07009952 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009953 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009954 struct scheduler_msg message = {0};
Jeff Johnson0c8dbc32018-07-16 22:10:48 -07009955 struct extscan_capabilities_reset_params *bodyptr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009956
Jeff Johnson0c8dbc32018-07-16 22:10:48 -07009957 /* per contract must make a copy of the params when messaging */
9958 bodyptr = qdf_mem_malloc(sizeof(*bodyptr));
Arif Hussain0ef77082018-10-10 16:42:53 -07009959 if (!bodyptr)
Jeff Johnson0c8dbc32018-07-16 22:10:48 -07009960 return QDF_STATUS_E_NOMEM;
Arif Hussain0ef77082018-10-10 16:42:53 -07009961
Jeff Johnson0c8dbc32018-07-16 22:10:48 -07009962 *bodyptr = *params;
9963
9964 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309965 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009966 /* Serialize the req through MC thread */
Jeff Johnson0c8dbc32018-07-16 22:10:48 -07009967 message.bodyptr = bodyptr;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009968 message.type = WMA_EXTSCAN_RESET_SIGNF_CHANGE_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05309969 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009970 NO_SESSION, message.type));
gaurank kathpalia36b0c582018-08-28 17:45:43 +05309971 status = scheduler_post_message(QDF_MODULE_ID_SME,
9972 QDF_MODULE_ID_WMA,
9973 QDF_MODULE_ID_WMA,
9974 &message);
Jeff Johnson0c8dbc32018-07-16 22:10:48 -07009975 sme_release_global_lock(&mac->sme);
9976 }
Jeff Johnson0c8dbc32018-07-16 22:10:48 -07009977 if (QDF_IS_STATUS_ERROR(status)) {
9978 sme_err("failure: %d", status);
9979 qdf_mem_free(bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009980 }
gaurank kathpalia36b0c582018-08-28 17:45:43 +05309981
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009982 return status;
9983}
9984
Jeff Johnson2ba60092018-07-17 08:19:37 -07009985QDF_STATUS
9986sme_get_cached_results(mac_handle_t mac_handle,
9987 struct extscan_cached_result_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009988{
Jeff Johnson2ba60092018-07-17 08:19:37 -07009989 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009990 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009991 struct scheduler_msg message = {0};
Jeff Johnson2ba60092018-07-17 08:19:37 -07009992 struct extscan_cached_result_params *bodyptr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009993
Jeff Johnson2ba60092018-07-17 08:19:37 -07009994 /* per contract must make a copy of the params when messaging */
9995 bodyptr = qdf_mem_malloc(sizeof(*bodyptr));
9996 if (!bodyptr)
9997 return QDF_STATUS_E_NOMEM;
9998 *bodyptr = *params;
9999
10000 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010001 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010002 /* Serialize the req through MC thread */
Jeff Johnson2ba60092018-07-17 08:19:37 -070010003 message.bodyptr = bodyptr;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010004 message.type = WMA_EXTSCAN_GET_CACHED_RESULTS_REQ;
Jeff Johnson2ba60092018-07-17 08:19:37 -070010005 qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
10006 NO_SESSION, message.type);
10007 status = scheduler_post_message(QDF_MODULE_ID_SME,
10008 QDF_MODULE_ID_WMA,
10009 QDF_MODULE_ID_WMA,
10010 &message);
10011 sme_release_global_lock(&mac->sme);
10012 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010013
Jeff Johnson2ba60092018-07-17 08:19:37 -070010014 if (QDF_IS_STATUS_ERROR(status)) {
10015 sme_err("failure: %d", status);
10016 qdf_mem_free(bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010017 }
10018 return status;
10019}
10020
Jeff Johnson360135b2018-07-18 20:51:47 -070010021QDF_STATUS sme_set_epno_list(mac_handle_t mac_handle,
10022 struct wifi_enhanced_pno_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010023{
Jeff Johnson360135b2018-07-18 20:51:47 -070010024 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010025 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010026 struct scheduler_msg message = {0};
Jeff Johnson360135b2018-07-18 20:51:47 -070010027 struct wifi_enhanced_pno_params *req_msg;
10028 int len;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010029
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070010030 SME_ENTER();
Jeff Johnson360135b2018-07-18 20:51:47 -070010031
10032 /* per contract must make a copy of the params when messaging */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010033 len = sizeof(*req_msg) +
Jeff Johnson360135b2018-07-18 20:51:47 -070010034 (params->num_networks * sizeof(req_msg->networks[0]));
Mukul Sharmae8c919f2016-10-02 20:35:15 +053010035
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010036 req_msg = qdf_mem_malloc(len);
Arif Hussain0ef77082018-10-10 16:42:53 -070010037 if (!req_msg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010038 return QDF_STATUS_E_NOMEM;
Jeff Johnson360135b2018-07-18 20:51:47 -070010039 qdf_mem_copy(req_msg, params, len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010040
10041 status = sme_acquire_global_lock(&mac->sme);
Vignesh Viswanathancbb5b952017-08-02 14:32:49 +053010042 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070010043 sme_err("sme_acquire_global_lock failed!(status=%d)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010044 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010045 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010046 return status;
10047 }
10048
10049 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010050 message.bodyptr = req_msg;
10051 message.type = WMA_SET_EPNO_LIST_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010052 status = scheduler_post_message(QDF_MODULE_ID_SME,
10053 QDF_MODULE_ID_WMA,
10054 QDF_MODULE_ID_WMA, &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010055 if (!QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson360135b2018-07-18 20:51:47 -070010056 sme_err("scheduler_post_msg failed!(err=%d)", status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010057 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010058 }
10059 sme_release_global_lock(&mac->sme);
Jeff Johnson360135b2018-07-18 20:51:47 -070010060
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010061 return status;
10062}
10063
Jeff Johnson2a7f1012018-07-19 07:21:06 -070010064QDF_STATUS sme_set_passpoint_list(mac_handle_t mac_handle,
10065 struct wifi_passpoint_req_param *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010066{
Jeff Johnson2a7f1012018-07-19 07:21:06 -070010067 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010068 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010069 struct scheduler_msg message = {0};
Jeff Johnson2a7f1012018-07-19 07:21:06 -070010070 struct wifi_passpoint_req_param *req_msg;
10071 int len;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010072
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070010073 SME_ENTER();
Jeff Johnson2a7f1012018-07-19 07:21:06 -070010074
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010075 len = sizeof(*req_msg) +
Jeff Johnson2a7f1012018-07-19 07:21:06 -070010076 (params->num_networks * sizeof(params->networks[0]));
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010077 req_msg = qdf_mem_malloc(len);
Arif Hussain0ef77082018-10-10 16:42:53 -070010078 if (!req_msg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010079 return QDF_STATUS_E_NOMEM;
Jeff Johnson2a7f1012018-07-19 07:21:06 -070010080 qdf_mem_copy(req_msg, params, len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010081
10082 status = sme_acquire_global_lock(&mac->sme);
Vignesh Viswanathancbb5b952017-08-02 14:32:49 +053010083 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070010084 sme_err("sme_acquire_global_lock failed!(status=%d)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010085 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010086 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010087 return status;
10088 }
10089
10090 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010091 message.bodyptr = req_msg;
10092 message.type = WMA_SET_PASSPOINT_LIST_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010093 status = scheduler_post_message(QDF_MODULE_ID_SME,
10094 QDF_MODULE_ID_WMA,
10095 QDF_MODULE_ID_WMA, &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010096 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070010097 sme_err("scheduler_post_msg failed!(err=%d)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010098 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010099 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010100 }
10101 sme_release_global_lock(&mac->sme);
10102 return status;
10103}
10104
Jeff Johnson2a7f1012018-07-19 07:21:06 -070010105QDF_STATUS sme_reset_passpoint_list(mac_handle_t mac_handle,
10106 struct wifi_passpoint_req_param *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010107{
Jeff Johnson2a7f1012018-07-19 07:21:06 -070010108 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010109 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010110 struct scheduler_msg message = {0};
Jeff Johnson2a7f1012018-07-19 07:21:06 -070010111 struct wifi_passpoint_req_param *req_msg;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010112
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070010113 SME_ENTER();
Jeff Johnson2a7f1012018-07-19 07:21:06 -070010114
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010115 req_msg = qdf_mem_malloc(sizeof(*req_msg));
Arif Hussain0ef77082018-10-10 16:42:53 -070010116 if (!req_msg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010117 return QDF_STATUS_E_NOMEM;
Jeff Johnson2a7f1012018-07-19 07:21:06 -070010118 *req_msg = *params;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010119
10120 status = sme_acquire_global_lock(&mac->sme);
Vignesh Viswanathancbb5b952017-08-02 14:32:49 +053010121 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070010122 sme_err("sme_acquire_global_lock failed!(status=%d)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010123 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010124 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010125 return status;
10126 }
10127
10128 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010129 message.bodyptr = req_msg;
10130 message.type = WMA_RESET_PASSPOINT_LIST_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010131 status = scheduler_post_message(QDF_MODULE_ID_SME,
10132 QDF_MODULE_ID_WMA,
10133 QDF_MODULE_ID_WMA, &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010134 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070010135 sme_err("scheduler_post_msg failed!(err=%d)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010136 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010137 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010138 }
10139 sme_release_global_lock(&mac->sme);
10140 return status;
10141}
10142
Jeff Johnson17b12392018-07-03 22:21:15 -070010143QDF_STATUS sme_ext_scan_register_callback(mac_handle_t mac_handle,
10144 ext_scan_ind_cb ext_scan_ind_cb)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010145{
Jeff Johnson17b12392018-07-03 22:21:15 -070010146 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010147 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010148
Jeff Johnson17b12392018-07-03 22:21:15 -070010149 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010150 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson17b12392018-07-03 22:21:15 -070010151 mac->sme.ext_scan_ind_cb = ext_scan_ind_cb;
10152 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010153 }
10154 return status;
10155}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010156#endif /* FEATURE_WLAN_EXTSCAN */
10157
Wen Gong7952fbd2018-04-18 11:27:23 +080010158/**
10159 * sme_send_wisa_params(): Pass WISA mode to WMA
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080010160 * @mac_handle: Opaque handle to the global MAC context
Wen Gong7952fbd2018-04-18 11:27:23 +080010161 * @wisa_params: pointer to WISA params struct
10162 * @sessionId: SME session id
10163 *
10164 * Pass WISA params to WMA
10165 *
10166 * Return: QDF_STATUS
10167 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080010168QDF_STATUS sme_set_wisa_params(mac_handle_t mac_handle,
10169 struct sir_wisa_params *wisa_params)
Wen Gong7952fbd2018-04-18 11:27:23 +080010170{
10171 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010172 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Wen Gong7952fbd2018-04-18 11:27:23 +080010173 struct scheduler_msg message = {0};
10174 struct sir_wisa_params *cds_msg_wisa_params;
10175
10176 cds_msg_wisa_params = qdf_mem_malloc(sizeof(struct sir_wisa_params));
10177 if (!cds_msg_wisa_params)
10178 return QDF_STATUS_E_NOMEM;
10179
10180 *cds_msg_wisa_params = *wisa_params;
10181 status = sme_acquire_global_lock(&mac->sme);
10182 if (QDF_IS_STATUS_SUCCESS(status)) {
10183 message.bodyptr = cds_msg_wisa_params;
10184 message.type = WMA_SET_WISA_PARAMS;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010185 status = scheduler_post_message(QDF_MODULE_ID_SME,
10186 QDF_MODULE_ID_WMA,
10187 QDF_MODULE_ID_WMA, &message);
Wen Gong7952fbd2018-04-18 11:27:23 +080010188 sme_release_global_lock(&mac->sme);
10189 }
10190 return status;
10191}
10192
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010193#ifdef WLAN_FEATURE_LINK_LAYER_STATS
10194
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010195/*
10196 * sme_ll_stats_clear_req() -
10197 * SME API to clear Link Layer Statistics
10198 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010199 * mac_handle
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010200 * pclearStatsReq: Link Layer clear stats request params structure
10201 * Return QDF_STATUS
10202 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010203QDF_STATUS sme_ll_stats_clear_req(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010204 tSirLLStatsClearReq *pclearStatsReq)
10205{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010206 QDF_STATUS status = QDF_STATUS_SUCCESS;
10207 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010208 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010209 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010210 tSirLLStatsClearReq *clear_stats_req;
10211
Abhishek Singhe4a1f882017-08-10 17:59:44 +053010212 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010213 "staId = %u", pclearStatsReq->staId);
Abhishek Singhe4a1f882017-08-10 17:59:44 +053010214 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010215 "statsClearReqMask = 0x%X",
10216 pclearStatsReq->statsClearReqMask);
Abhishek Singhe4a1f882017-08-10 17:59:44 +053010217 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010218 "stopReq = %u", pclearStatsReq->stopReq);
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010219 if (!sme_is_session_id_valid(mac_handle, pclearStatsReq->staId)) {
Deepak Dhamdhere6adc08e2017-07-27 09:33:22 -070010220 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
10221 "%s: invalid staId %d",
10222 __func__, pclearStatsReq->staId);
10223 return QDF_STATUS_E_INVAL;
10224 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010225
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010226 clear_stats_req = qdf_mem_malloc(sizeof(*clear_stats_req));
Arif Hussain0ef77082018-10-10 16:42:53 -070010227 if (!clear_stats_req)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010228 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010229
10230 *clear_stats_req = *pclearStatsReq;
10231
Jeff Johnson01f2c232018-11-21 19:17:44 -080010232 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&mac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010233 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010234 message.bodyptr = clear_stats_req;
10235 message.type = WMA_LINK_LAYER_STATS_CLEAR_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053010236 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010237 NO_SESSION, message.type));
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010238 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
10239 QDF_MODULE_ID_WMA,
10240 QDF_MODULE_ID_WMA,
10241 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010242 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010243 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010244 "%s: not able to post WMA_LL_STATS_CLEAR_REQ",
10245 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010246 qdf_mem_free(clear_stats_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010247 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010248 }
Jeff Johnson01f2c232018-11-21 19:17:44 -080010249 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010250 } else {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010251 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
10252 "%s: sme_acquire_global_lock error", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010253 qdf_mem_free(clear_stats_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010254 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010255 }
10256
10257 return status;
10258}
10259
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010260/*
10261 * sme_ll_stats_set_req() -
10262 * SME API to set the Link Layer Statistics
10263 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010264 * mac_handle
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010265 * psetStatsReq: Link Layer set stats request params structure
10266 * Return QDF_STATUS
10267 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010268QDF_STATUS sme_ll_stats_set_req(mac_handle_t mac_handle, tSirLLStatsSetReq
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010269 *psetStatsReq)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010270{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010271 QDF_STATUS status = QDF_STATUS_SUCCESS;
10272 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010273 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010274 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010275 tSirLLStatsSetReq *set_stats_req;
10276
Abhishek Singhe4a1f882017-08-10 17:59:44 +053010277 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010278 "%s: MPDU Size = %u", __func__,
10279 psetStatsReq->mpduSizeThreshold);
Abhishek Singhe4a1f882017-08-10 17:59:44 +053010280 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010281 " Aggressive Stats Collections = %u",
10282 psetStatsReq->aggressiveStatisticsGathering);
10283
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010284 set_stats_req = qdf_mem_malloc(sizeof(*set_stats_req));
Arif Hussain0ef77082018-10-10 16:42:53 -070010285 if (!set_stats_req)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010286 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010287
10288 *set_stats_req = *psetStatsReq;
10289
Jeff Johnson01f2c232018-11-21 19:17:44 -080010290 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&mac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010291 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010292 message.bodyptr = set_stats_req;
10293 message.type = WMA_LINK_LAYER_STATS_SET_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053010294 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010295 NO_SESSION, message.type));
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010296 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
10297 QDF_MODULE_ID_WMA,
10298 QDF_MODULE_ID_WMA,
10299 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010300 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010301 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010302 "%s: not able to post WMA_LL_STATS_SET_REQ",
10303 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010304 qdf_mem_free(set_stats_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010305 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010306 }
Jeff Johnson01f2c232018-11-21 19:17:44 -080010307 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010308 } else {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010309 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
10310 "%s: sme_acquire_global_lock error", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010311 qdf_mem_free(set_stats_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010312 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010313 }
10314
10315 return status;
10316}
10317
Dundi Ravitejae232cf12018-05-16 18:34:34 +053010318QDF_STATUS sme_ll_stats_get_req(mac_handle_t mac_handle,
10319 tSirLLStatsGetReq *get_stats_req,
10320 void *context)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010321{
Dundi Ravitejae232cf12018-05-16 18:34:34 +053010322 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010323 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010324 struct scheduler_msg message = {0};
Dundi Ravitejae232cf12018-05-16 18:34:34 +053010325 tSirLLStatsGetReq *ll_stats_get_req;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010326
Dundi Ravitejae232cf12018-05-16 18:34:34 +053010327 ll_stats_get_req = qdf_mem_malloc(sizeof(*ll_stats_get_req));
Arif Hussain0ef77082018-10-10 16:42:53 -070010328 if (!ll_stats_get_req)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010329 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010330
Dundi Ravitejae232cf12018-05-16 18:34:34 +053010331 *ll_stats_get_req = *get_stats_req;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010332
Dundi Ravitejae232cf12018-05-16 18:34:34 +053010333 mac->sme.ll_stats_context = context;
10334 if (sme_acquire_global_lock(&mac->sme) == QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010335 /* Serialize the req through MC thread */
Dundi Ravitejae232cf12018-05-16 18:34:34 +053010336 message.bodyptr = ll_stats_get_req;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010337 message.type = WMA_LINK_LAYER_STATS_GET_REQ;
Dundi Ravitejae232cf12018-05-16 18:34:34 +053010338 qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
10339 NO_SESSION, message.type);
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010340 status = scheduler_post_message(QDF_MODULE_ID_SME,
10341 QDF_MODULE_ID_WMA,
10342 QDF_MODULE_ID_WMA, &message);
Dundi Ravitejae232cf12018-05-16 18:34:34 +053010343 if (!QDF_IS_STATUS_SUCCESS(status)) {
10344 sme_err("Not able to post WMA_LL_STATS_GET_REQ");
10345 qdf_mem_free(ll_stats_get_req);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010346 }
Dundi Ravitejae232cf12018-05-16 18:34:34 +053010347 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010348 } else {
Dundi Ravitejae232cf12018-05-16 18:34:34 +053010349 sme_err("sme_acquire_global_lock error");
10350 qdf_mem_free(ll_stats_get_req);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010351 }
10352
10353 return status;
10354}
10355
Jeff Johnson959f3692018-07-03 17:30:40 -070010356QDF_STATUS sme_set_link_layer_stats_ind_cb(mac_handle_t mac_handle,
10357 link_layer_stats_cb callback)
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010358{
Jeff Johnson959f3692018-07-03 17:30:40 -070010359 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010360 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010361
Jeff Johnson959f3692018-07-03 17:30:40 -070010362 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010363 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson959f3692018-07-03 17:30:40 -070010364 mac->sme.link_layer_stats_cb = callback;
10365 sme_release_global_lock(&mac->sme);
10366 } else {
10367 sme_err("sme_acquire_global_lock error");
10368 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010369
10370 return status;
10371}
10372
Arun Khandavalli4b55da72016-07-19 19:55:01 +053010373/**
Zhang Qiana6e9c102016-12-22 16:47:24 +080010374 * sme_set_link_layer_ext_cb() - Register callback for link layer statistics
Jeff Johnsonc7309062018-11-09 20:59:42 -080010375 * @mac_handle: Mac global handle
Zhang Qiana6e9c102016-12-22 16:47:24 +080010376 * @ll_stats_ext_cb: HDD callback which needs to be invoked after getting
10377 * status notification from FW
10378 *
Jeff Johnsonc7309062018-11-09 20:59:42 -080010379 * Return: QDF_STATUS
Zhang Qiana6e9c102016-12-22 16:47:24 +080010380 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080010381QDF_STATUS
10382sme_set_link_layer_ext_cb(mac_handle_t mac_handle,
10383 void (*ll_stats_ext_cb)(hdd_handle_t callback_ctx,
10384 tSirLLStatsResults *rsp))
Zhang Qiana6e9c102016-12-22 16:47:24 +080010385{
10386 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010387 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Zhang Qiana6e9c102016-12-22 16:47:24 +080010388
10389 status = sme_acquire_global_lock(&mac->sme);
10390 if (status == QDF_STATUS_SUCCESS) {
10391 mac->sme.link_layer_stats_ext_cb = ll_stats_ext_cb;
10392 sme_release_global_lock(&mac->sme);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010393 } else
Zhang Qiana6e9c102016-12-22 16:47:24 +080010394 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
10395 "%s: sme_qcquire_global_lock error", __func__);
Zhang Qiana6e9c102016-12-22 16:47:24 +080010396 return status;
10397}
10398
10399/**
Arun Khandavalli4b55da72016-07-19 19:55:01 +053010400 * sme_reset_link_layer_stats_ind_cb() - SME API to reset link layer stats
10401 * indication
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080010402 * @mac_handle: Opaque handle to the global MAC context
Arun Khandavalli4b55da72016-07-19 19:55:01 +053010403 *
10404 * This function reset's the link layer stats indication
10405 *
10406 * Return: QDF_STATUS Enumeration
10407 */
10408
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010409QDF_STATUS sme_reset_link_layer_stats_ind_cb(mac_handle_t mac_handle)
Arun Khandavalli4b55da72016-07-19 19:55:01 +053010410{
10411 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010412 struct mac_context *pmac;
Arun Khandavalli4b55da72016-07-19 19:55:01 +053010413
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010414 if (!mac_handle) {
Arun Khandavalli4b55da72016-07-19 19:55:01 +053010415 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010416 FL("mac_handle is not valid"));
Arun Khandavalli4b55da72016-07-19 19:55:01 +053010417 return QDF_STATUS_E_INVAL;
10418 }
Jeff Johnsona0619e42018-11-28 17:43:00 -080010419 pmac = MAC_CONTEXT(mac_handle);
Arun Khandavalli4b55da72016-07-19 19:55:01 +053010420
10421 status = sme_acquire_global_lock(&pmac->sme);
10422 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson959f3692018-07-03 17:30:40 -070010423 pmac->sme.link_layer_stats_cb = NULL;
Arun Khandavalli4b55da72016-07-19 19:55:01 +053010424 sme_release_global_lock(&pmac->sme);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010425 } else
10426 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
10427 "%s: sme_acquire_global_lock error", __func__);
Arun Khandavalli4b55da72016-07-19 19:55:01 +053010428
10429 return status;
10430}
10431
Zhang Qian73c348a2017-03-13 16:15:55 +080010432/**
10433 * sme_ll_stats_set_thresh - set threshold for mac counters
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080010434 * @mac_handle: Opaque handle to the global MAC context
Zhang Qian73c348a2017-03-13 16:15:55 +080010435 * @threshold, threshold for mac counters
10436 *
10437 * Return: QDF_STATUS Enumeration
10438 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080010439QDF_STATUS sme_ll_stats_set_thresh(mac_handle_t mac_handle,
Zhang Qian73c348a2017-03-13 16:15:55 +080010440 struct sir_ll_ext_stats_threshold *threshold)
10441{
10442 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010443 struct mac_context *mac;
Rajeev Kumar658e8492017-12-13 11:35:41 -080010444 struct scheduler_msg message = {0};
Zhang Qian73c348a2017-03-13 16:15:55 +080010445 struct sir_ll_ext_stats_threshold *thresh;
10446
10447 if (!threshold) {
10448 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
10449 FL("threshold is not valid"));
10450 return QDF_STATUS_E_INVAL;
10451 }
10452
Jeff Johnsonc7309062018-11-09 20:59:42 -080010453 if (!mac_handle) {
Zhang Qian73c348a2017-03-13 16:15:55 +080010454 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Jeff Johnsonc7309062018-11-09 20:59:42 -080010455 FL("mac_handle is not valid"));
Zhang Qian73c348a2017-03-13 16:15:55 +080010456 return QDF_STATUS_E_INVAL;
10457 }
Jeff Johnsona0619e42018-11-28 17:43:00 -080010458 mac = MAC_CONTEXT(mac_handle);
Zhang Qian73c348a2017-03-13 16:15:55 +080010459
10460 thresh = qdf_mem_malloc(sizeof(*thresh));
Arif Hussain0ef77082018-10-10 16:42:53 -070010461 if (!thresh)
Zhang Qian73c348a2017-03-13 16:15:55 +080010462 return QDF_STATUS_E_NOMEM;
Arif Hussain0ef77082018-10-10 16:42:53 -070010463
Zhang Qian73c348a2017-03-13 16:15:55 +080010464 *thresh = *threshold;
10465
10466 status = sme_acquire_global_lock(&mac->sme);
10467 if (QDF_IS_STATUS_SUCCESS(status)) {
10468 /* Serialize the req through MC thread */
10469 message.bodyptr = thresh;
10470 message.type = WDA_LINK_LAYER_STATS_SET_THRESHOLD;
10471 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
10472 NO_SESSION, message.type));
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010473 status = scheduler_post_message(QDF_MODULE_ID_SME,
10474 QDF_MODULE_ID_WMA,
10475 QDF_MODULE_ID_WMA, &message);
Zhang Qian73c348a2017-03-13 16:15:55 +080010476 if (!QDF_IS_STATUS_SUCCESS(status)) {
10477 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
10478 "%s: not able to post WDA_LL_STATS_GET_REQ",
10479 __func__);
10480 qdf_mem_free(thresh);
10481 }
10482 sme_release_global_lock(&mac->sme);
10483 } else {
10484 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
10485 FL("sme_acquire_global_lock error"));
10486 qdf_mem_free(thresh);
10487 }
10488 return status;
10489}
Arun Khandavalli4b55da72016-07-19 19:55:01 +053010490
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010491#endif /* WLAN_FEATURE_LINK_LAYER_STATS */
10492
Sridhar Selvarajdc400d22016-10-18 17:18:03 +053010493#ifdef WLAN_POWER_DEBUGFS
10494/**
10495 * sme_power_debug_stats_req() - SME API to collect Power debug stats
10496 * @callback_fn: Pointer to the callback function for Power stats event
10497 * @power_stats_context: Pointer to context
10498 *
10499 * Return: QDF_STATUS
10500 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080010501QDF_STATUS sme_power_debug_stats_req(
10502 mac_handle_t mac_handle,
10503 void (*callback_fn)(struct power_stats_response *response,
10504 void *context),
10505 void *power_stats_context)
Sridhar Selvarajdc400d22016-10-18 17:18:03 +053010506{
10507 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010508 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010509 struct scheduler_msg msg = {0};
Sridhar Selvarajdc400d22016-10-18 17:18:03 +053010510
10511 status = sme_acquire_global_lock(&mac_ctx->sme);
10512 if (QDF_IS_STATUS_SUCCESS(status)) {
10513 if (!callback_fn) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070010514 sme_err("Indication callback did not registered");
Sridhar Selvarajdc400d22016-10-18 17:18:03 +053010515 sme_release_global_lock(&mac_ctx->sme);
10516 return QDF_STATUS_E_FAILURE;
10517 }
10518
10519 mac_ctx->sme.power_debug_stats_context = power_stats_context;
10520 mac_ctx->sme.power_stats_resp_callback = callback_fn;
10521 msg.bodyptr = NULL;
10522 msg.type = WMA_POWER_DEBUG_STATS_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010523 status = scheduler_post_message(QDF_MODULE_ID_SME,
10524 QDF_MODULE_ID_WMA,
10525 QDF_MODULE_ID_WMA, &msg);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010526 if (!QDF_IS_STATUS_SUCCESS(status))
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070010527 sme_err("not able to post WDA_POWER_DEBUG_STATS_REQ");
Sridhar Selvarajdc400d22016-10-18 17:18:03 +053010528 sme_release_global_lock(&mac_ctx->sme);
10529 }
10530 return status;
10531}
10532#endif
10533
Arunk Khandavallica56d4b2018-11-29 15:46:00 +053010534#ifdef WLAN_FEATURE_BEACON_RECEPTION_STATS
10535QDF_STATUS sme_beacon_debug_stats_req(
10536 mac_handle_t mac_handle, uint32_t vdev_id,
10537 void (*callback_fn)(struct bcn_reception_stats_rsp
10538 *response, void *context),
10539 void *beacon_stats_context)
10540{
10541 QDF_STATUS status;
10542 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
10543 uint32_t *val;
10544 struct scheduler_msg msg = {0};
10545
10546 status = sme_acquire_global_lock(&mac_ctx->sme);
10547 if (QDF_IS_STATUS_SUCCESS(status)) {
10548 if (!callback_fn) {
10549 sme_err("Indication callback did not registered");
10550 sme_release_global_lock(&mac_ctx->sme);
10551 return QDF_STATUS_E_FAILURE;
10552 }
10553
Sourav Mohapatrac55bdf32018-12-13 16:16:50 +053010554 if (!mac_ctx->bcn_reception_stats &&
10555 !mac_ctx->mlme_cfg->gen.enable_beacon_reception_stats) {
10556 sme_err("Beacon Reception stats not supported");
Arunk Khandavallica56d4b2018-11-29 15:46:00 +053010557 sme_release_global_lock(&mac_ctx->sme);
10558 return QDF_STATUS_E_NOSUPPORT;
10559 }
10560
10561 val = qdf_mem_malloc(sizeof(*val));
10562 if (!val) {
10563 sme_release_global_lock(&mac_ctx->sme);
10564 return QDF_STATUS_E_NOMEM;
10565 }
10566
10567 *val = vdev_id;
10568 mac_ctx->sme.beacon_stats_context = beacon_stats_context;
10569 mac_ctx->sme.beacon_stats_resp_callback = callback_fn;
10570 msg.bodyptr = val;
10571 msg.type = WMA_BEACON_DEBUG_STATS_REQ;
10572 status = scheduler_post_message(QDF_MODULE_ID_SME,
10573 QDF_MODULE_ID_WMA,
10574 QDF_MODULE_ID_WMA, &msg);
10575 if (!QDF_IS_STATUS_SUCCESS(status)) {
10576 sme_err("not able to post WMA_BEACON_DEBUG_STATS_REQ");
10577 qdf_mem_free(val);
10578 }
10579 sme_release_global_lock(&mac_ctx->sme);
10580 }
10581 return status;
10582}
10583#endif
10584
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010585#ifdef WLAN_FEATURE_ROAM_OFFLOAD
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070010586/**
10587 * sme_update_roam_key_mgmt_offload_enabled() - enable/disable key mgmt offload
10588 * This is a synchronous call
Jeff Johnsond5fb2db2018-11-08 14:20:28 -080010589 * @mac_handle: The handle returned by mac_open.
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070010590 * @session_id: Session Identifier
10591 * @key_mgmt_offload_enabled: key mgmt enable/disable flag
Deepak Dhamdhere828f1892017-02-09 11:51:19 -080010592 * @pmkid_modes: PMKID modes of PMKSA caching and OKC
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070010593 * Return: QDF_STATUS_SUCCESS - SME updated config successfully.
10594 * Other status means SME is failed to update.
10595 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010596
Jeff Johnsond5fb2db2018-11-08 14:20:28 -080010597QDF_STATUS sme_update_roam_key_mgmt_offload_enabled(mac_handle_t mac_handle,
Deepak Dhamdhere828f1892017-02-09 11:51:19 -080010598 uint8_t session_id,
10599 bool key_mgmt_offload_enabled,
10600 struct pmkid_mode_bits *pmkid_modes)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010601{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010602 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010603 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010604
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070010605 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010606 if (QDF_IS_STATUS_SUCCESS(status)) {
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070010607 if (CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
Abhishek Singhe4a1f882017-08-10 17:59:44 +053010608 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070010609 "%s: LFR3: key_mgmt_offload_enabled changed to %d",
10610 __func__, key_mgmt_offload_enabled);
10611 status = csr_roam_set_key_mgmt_offload(mac_ctx,
10612 session_id,
10613 key_mgmt_offload_enabled,
Deepak Dhamdhere828f1892017-02-09 11:51:19 -080010614 pmkid_modes);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010615 } else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010616 status = QDF_STATUS_E_INVAL;
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070010617 sme_release_global_lock(&mac_ctx->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010618 }
10619
10620 return status;
10621}
Prashanth Bhattabfc25292015-11-05 11:16:21 -080010622#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010623
Jeff Johnson3f3ad252019-02-17 20:44:11 -080010624/**
10625 * sme_get_temperature() - SME API to get the pdev temperature
10626 * @mac_handle: Handle to global MAC context
10627 * @cb_context: temperature callback context
10628 * @cb: callback function with response (temperature)
10629 * Return: QDF_STATUS
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010630 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010631QDF_STATUS sme_get_temperature(mac_handle_t mac_handle,
Jeff Johnson3f3ad252019-02-17 20:44:11 -080010632 void *cb_context,
10633 void (*cb)(int temperature,
10634 void *context))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010635{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010636 QDF_STATUS status = QDF_STATUS_SUCCESS;
10637 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010638 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010639 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010640
Jeff Johnson01f2c232018-11-21 19:17:44 -080010641 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010642 if (QDF_STATUS_SUCCESS == status) {
Jeff Johnson3f3ad252019-02-17 20:44:11 -080010643 if ((!cb) &&
10644 (!mac->sme.temperature_cb)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010645 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010646 "Indication Call back did not registered");
Jeff Johnson01f2c232018-11-21 19:17:44 -080010647 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010648 return QDF_STATUS_E_FAILURE;
Jeff Johnson3f3ad252019-02-17 20:44:11 -080010649 } else if (cb) {
10650 mac->sme.temperature_cb_context = cb_context;
10651 mac->sme.temperature_cb = cb;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010652 }
10653 /* serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010654 message.bodyptr = NULL;
10655 message.type = WMA_GET_TEMPERATURE_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010656 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
10657 QDF_MODULE_ID_WMA,
10658 QDF_MODULE_ID_WMA,
10659 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010660 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010661 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010662 FL("Post Get Temperature msg fail"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010663 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010664 }
Jeff Johnson01f2c232018-11-21 19:17:44 -080010665 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010666 }
10667 return status;
10668}
10669
Jeff Johnsonc7309062018-11-09 20:59:42 -080010670QDF_STATUS sme_set_scanning_mac_oui(mac_handle_t mac_handle,
Jeff Johnson9d45f332019-01-29 08:42:00 -080010671 struct scan_mac_oui *scan_mac_oui)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010672{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010673 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010674 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010675 struct scheduler_msg message = {0};
Jeff Johnson9d45f332019-01-29 08:42:00 -080010676 struct scan_mac_oui *bodyptr;
10677
10678 /* per contract must make a copy of the params when messaging */
10679 bodyptr = qdf_mem_malloc(sizeof(*bodyptr));
10680 if (!bodyptr)
10681 return QDF_STATUS_E_NOMEM;
10682 *bodyptr = *scan_mac_oui;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010683
Jeff Johnson01f2c232018-11-21 19:17:44 -080010684 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010685 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010686 /* Serialize the req through MC thread */
Jeff Johnson9d45f332019-01-29 08:42:00 -080010687 message.bodyptr = bodyptr;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010688 message.type = WMA_SET_SCAN_MAC_OUI_REQ;
Jeff Johnson9d45f332019-01-29 08:42:00 -080010689 status = scheduler_post_message(QDF_MODULE_ID_SME,
10690 QDF_MODULE_ID_WMA,
10691 QDF_MODULE_ID_WMA,
10692 &message);
Jeff Johnson01f2c232018-11-21 19:17:44 -080010693 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010694 }
Jeff Johnson9d45f332019-01-29 08:42:00 -080010695
10696 if (QDF_IS_STATUS_ERROR(status)) {
10697 sme_err("failure: %d", status);
10698 qdf_mem_free(bodyptr);
10699 }
10700
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010701 return status;
10702}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010703
10704#ifdef DHCP_SERVER_OFFLOAD
Jeff Johnson8bfc29e2019-02-15 07:58:15 -080010705QDF_STATUS
10706sme_set_dhcp_srv_offload(mac_handle_t mac_handle,
10707 struct dhcp_offload_info_params *dhcp_srv_info)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010708{
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010709 struct scheduler_msg message = {0};
Jeff Johnson8bfc29e2019-02-15 07:58:15 -080010710 struct dhcp_offload_info_params *payload;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010711 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010712 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010713
Jeff Johnson8bfc29e2019-02-15 07:58:15 -080010714 payload = qdf_mem_malloc(sizeof(*payload));
10715 if (!payload)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010716 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010717
Jeff Johnson8bfc29e2019-02-15 07:58:15 -080010718 *payload = *dhcp_srv_info;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010719
Jeff Johnson01f2c232018-11-21 19:17:44 -080010720 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010721 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010722 /* serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010723 message.type = WMA_SET_DHCP_SERVER_OFFLOAD_CMD;
Jeff Johnson8bfc29e2019-02-15 07:58:15 -080010724 message.bodyptr = payload;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010725
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010726 if (!QDF_IS_STATUS_SUCCESS
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010727 (scheduler_post_message(QDF_MODULE_ID_SME,
10728 QDF_MODULE_ID_WMA,
10729 QDF_MODULE_ID_WMA,
10730 &message))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010731 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Varun Reddy Yeturu7b2a6572017-06-15 11:07:28 -070010732 "%s:WMA_SET_DHCP_SERVER_OFFLOAD_CMD failed",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010733 __func__);
Jeff Johnson8bfc29e2019-02-15 07:58:15 -080010734 qdf_mem_free(payload);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010735 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010736 }
Jeff Johnson01f2c232018-11-21 19:17:44 -080010737 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010738 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010739 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010740 "%s: sme_acquire_global_lock error!", __func__);
Jeff Johnson8bfc29e2019-02-15 07:58:15 -080010741 qdf_mem_free(payload);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010742 }
10743
10744 return status;
10745}
10746#endif /* DHCP_SERVER_OFFLOAD */
10747
Krunal Soniaadaa272017-10-04 16:42:55 -070010748QDF_STATUS sme_send_unit_test_cmd(uint32_t vdev_id, uint32_t module_id,
10749 uint32_t arg_count, uint32_t *arg)
10750{
10751 return wma_form_unit_test_cmd_and_send(vdev_id, module_id,
10752 arg_count, arg);
10753}
10754
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010755#ifdef WLAN_FEATURE_GPIO_LED_FLASHING
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010756/*
10757 * sme_set_led_flashing() -
10758 * API to set the Led flashing parameters.
10759 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010760 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010761 * x0, x1 - led flashing parameters
10762 * Return QDF_STATUS
10763 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010764QDF_STATUS sme_set_led_flashing(mac_handle_t mac_handle, uint8_t type,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010765 uint32_t x0, uint32_t x1)
10766{
Jeff Johnson5a6b6602017-10-04 14:44:30 -070010767 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010768 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010769 struct scheduler_msg message = {0};
Jeff Johnson5a6b6602017-10-04 14:44:30 -070010770 struct flashing_req_params *ledflashing;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010771
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010772 ledflashing = qdf_mem_malloc(sizeof(*ledflashing));
Arif Hussain0ef77082018-10-10 16:42:53 -070010773 if (!ledflashing)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010774 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010775
Jeff Johnson5a6b6602017-10-04 14:44:30 -070010776 ledflashing->req_id = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010777 ledflashing->pattern_id = type;
10778 ledflashing->led_x0 = x0;
10779 ledflashing->led_x1 = x1;
10780
Jeff Johnson01f2c232018-11-21 19:17:44 -080010781 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010782 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010783 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010784 message.bodyptr = ledflashing;
10785 message.type = WMA_LED_FLASHING_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010786 status = scheduler_post_message(QDF_MODULE_ID_SME,
10787 QDF_MODULE_ID_WMA,
10788 QDF_MODULE_ID_WMA, &message);
Jeff Johnson01f2c232018-11-21 19:17:44 -080010789 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010790 }
Jeff Johnson5a6b6602017-10-04 14:44:30 -070010791 if (!QDF_IS_STATUS_SUCCESS(status))
10792 qdf_mem_free(ledflashing);
10793
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010794 return status;
10795}
10796#endif
10797
10798/**
Min Liu5eaf7242018-03-13 17:32:15 +080010799 * sme_enable_dfS_chan_scan() - set DFS channel scan enable/disable
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010800 * @mac_handle: corestack handler
Min Liu5eaf7242018-03-13 17:32:15 +080010801 * @dfs_flag: flag indicating dfs channel enable/disable
10802 * Return: QDF_STATUS
10803 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010804QDF_STATUS sme_enable_dfs_chan_scan(mac_handle_t mac_handle, uint8_t dfs_flag)
Min Liu5eaf7242018-03-13 17:32:15 +080010805{
10806 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010807 struct mac_context *mac;
Min Liu5eaf7242018-03-13 17:32:15 +080010808
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010809 if (!mac_handle) {
Jeff Johnsonc7309062018-11-09 20:59:42 -080010810 sme_err("mac_handle is NULL");
Min Liu5eaf7242018-03-13 17:32:15 +080010811 return QDF_STATUS_E_INVAL;
10812 }
10813
Jeff Johnsona0619e42018-11-28 17:43:00 -080010814 mac = MAC_CONTEXT(mac_handle);
Min Liu5eaf7242018-03-13 17:32:15 +080010815
10816 mac->scan.fEnableDFSChnlScan = dfs_flag;
10817
10818 return status;
10819}
10820
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +053010821#ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH
10822/**
10823 * sme_validate_sap_channel_switch() - validate target channel switch w.r.t
10824 * concurreny rules set to avoid channel interference.
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080010825 * @mac_handle: Opaque handle to the global MAC context
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +053010826 * @sap_ch - channel to switch
10827 * @sap_phy_mode - phy mode of SAP
10828 * @cc_switch_mode - concurreny switch mode
10829 * @session_id - sme session id.
10830 *
10831 * Return: true if there is no channel interference else return false
10832 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080010833bool sme_validate_sap_channel_switch(mac_handle_t mac_handle,
10834 uint16_t sap_ch,
10835 eCsrPhyMode sap_phy_mode,
10836 uint8_t cc_switch_mode,
10837 uint8_t session_id)
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +053010838{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010839 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010840 struct mac_context *mac = MAC_CONTEXT(mac_handle);
gaurank kathpalia14e2f912017-08-31 14:51:45 +053010841 struct csr_roam_session *session = CSR_GET_SESSION(mac, session_id);
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +053010842 uint16_t intf_channel = 0;
10843
10844 if (!session)
10845 return false;
10846
10847 session->ch_switch_in_progress = true;
10848 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010849 if (QDF_IS_STATUS_SUCCESS(status)) {
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +053010850 intf_channel = csr_check_concurrent_channel_overlap(mac, sap_ch,
10851 sap_phy_mode,
10852 cc_switch_mode);
10853 sme_release_global_lock(&mac->sme);
10854 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010855 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +053010856 FL("sme_acquire_global_lock error!"));
10857 session->ch_switch_in_progress = false;
10858 return false;
10859 }
10860
10861 session->ch_switch_in_progress = false;
10862 return (intf_channel == 0) ? true : false;
10863}
10864#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010865
10866/**
10867 * sme_configure_stats_avg_factor() - function to config avg. stats factor
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080010868 * @mac_handle: Opaque handle to the global MAC context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010869 * @session_id: session ID
10870 * @stats_avg_factor: average stats factor
10871 *
10872 * This function configures the stats avg factor in firmware
10873 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010874 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010875 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080010876QDF_STATUS sme_configure_stats_avg_factor(mac_handle_t mac_handle,
10877 uint8_t session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010878 uint16_t stats_avg_factor)
10879{
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010880 struct scheduler_msg msg = {0};
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010881 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010882 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010883 struct sir_stats_avg_factor *stats_factor;
10884
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010885 stats_factor = qdf_mem_malloc(sizeof(*stats_factor));
Arif Hussain0ef77082018-10-10 16:42:53 -070010886 if (!stats_factor)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010887 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010888
10889 status = sme_acquire_global_lock(&mac->sme);
10890
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010891 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010892
10893 stats_factor->vdev_id = session_id;
10894 stats_factor->stats_avg_factor = stats_avg_factor;
10895
10896 /* serialize the req through MC thread */
10897 msg.type = SIR_HAL_CONFIG_STATS_FACTOR;
10898 msg.bodyptr = stats_factor;
10899
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010900 if (!QDF_IS_STATUS_SUCCESS(
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010901 scheduler_post_message(QDF_MODULE_ID_SME,
10902 QDF_MODULE_ID_WMA,
10903 QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010904 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010905 "%s: Not able to post SIR_HAL_CONFIG_STATS_FACTOR to WMA!",
10906 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010907 qdf_mem_free(stats_factor);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010908 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010909 }
10910 sme_release_global_lock(&mac->sme);
10911 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010912 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010913 "%s: sme_acquire_global_lock error!",
10914 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010915 qdf_mem_free(stats_factor);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010916 }
10917
10918 return status;
10919}
10920
10921/**
10922 * sme_configure_guard_time() - function to configure guard time
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080010923 * @mac_handle: Opaque handle to the global MAC context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010924 * @session_id: session id
10925 * @guard_time: guard time
10926 *
10927 * This function configures the guard time in firmware
10928 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010929 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010930 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080010931QDF_STATUS sme_configure_guard_time(mac_handle_t mac_handle, uint8_t session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010932 uint32_t guard_time)
10933{
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010934 struct scheduler_msg msg = {0};
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010935 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010936 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010937 struct sir_guard_time_request *g_time;
10938
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010939 g_time = qdf_mem_malloc(sizeof(*g_time));
Arif Hussain0ef77082018-10-10 16:42:53 -070010940 if (!g_time)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010941 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010942
10943 status = sme_acquire_global_lock(&mac->sme);
10944
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010945 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010946
10947 g_time->vdev_id = session_id;
10948 g_time->guard_time = guard_time;
10949
10950 /* serialize the req through MC thread */
10951 msg.type = SIR_HAL_CONFIG_GUARD_TIME;
10952 msg.bodyptr = g_time;
10953
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010954 if (!QDF_IS_STATUS_SUCCESS(
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010955 scheduler_post_message(QDF_MODULE_ID_SME,
10956 QDF_MODULE_ID_WMA,
10957 QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010958 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010959 "%s: Not able to post SIR_HAL_CONFIG_GUARD_TIME to WMA!",
10960 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010961 qdf_mem_free(g_time);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010962 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010963 }
10964 sme_release_global_lock(&mac->sme);
10965 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010966 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010967 "%s: sme_acquire_global_lock error!",
10968 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010969 qdf_mem_free(g_time);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010970 }
10971
10972 return status;
10973}
10974
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010975/*
10976 * sme_wifi_start_logger() - Send the start/stop logging command to WMA
10977 * to either start/stop logging
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080010978 * @mac_handle: Opaque handle to the global MAC context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010979 * @start_log: Structure containing the wifi start logger params
10980 *
10981 * This function sends the start/stop logging command to WMA
10982 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010983 * Return: QDF_STATUS_SUCCESS on successful posting
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010984 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080010985QDF_STATUS sme_wifi_start_logger(mac_handle_t mac_handle,
10986 struct sir_wifi_start_log start_log)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010987{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010988 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010989 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010990 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010991 struct sir_wifi_start_log *req_msg;
10992 uint32_t len;
10993
10994 len = sizeof(*req_msg);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010995 req_msg = qdf_mem_malloc(len);
Arif Hussain0ef77082018-10-10 16:42:53 -070010996 if (!req_msg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010997 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010998
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010999 req_msg->verbose_level = start_log.verbose_level;
Poddar, Siddartheefe3482016-09-21 18:12:59 +053011000 req_msg->is_iwpriv_command = start_log.is_iwpriv_command;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011001 req_msg->ring_id = start_log.ring_id;
Srinivas Girigowdac34f11d2016-02-25 16:02:42 -080011002 req_msg->ini_triggered = start_log.ini_triggered;
11003 req_msg->user_triggered = start_log.user_triggered;
Poddar, Siddarth176c4362016-10-03 12:25:00 +053011004 req_msg->size = start_log.size;
Poddar, Siddarthab99a272017-04-10 12:53:26 +053011005 req_msg->is_pktlog_buff_clear = start_log.is_pktlog_buff_clear;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011006
11007 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011008 if (status != QDF_STATUS_SUCCESS) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070011009 sme_err("sme_acquire_global_lock failed(status=%d)", status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011010 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011011 return status;
11012 }
11013
11014 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080011015 message.bodyptr = req_msg;
11016 message.type = SIR_HAL_START_STOP_LOGGING;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053011017 status = scheduler_post_message(QDF_MODULE_ID_SME,
11018 QDF_MODULE_ID_WMA,
11019 QDF_MODULE_ID_WMA, &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011020 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070011021 sme_err("scheduler_post_msg failed!(err=%d)", status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011022 qdf_mem_free(req_msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011023 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011024 }
11025 sme_release_global_lock(&mac->sme);
11026
11027 return status;
11028}
11029
11030/**
11031 * sme_neighbor_middle_of_roaming() - Function to know if
11032 * STA is in the middle of roaming states
Jeff Johnsonc7309062018-11-09 20:59:42 -080011033 * @mac_handle: Handle returned by macOpen
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011034 * @sessionId: sessionId of the STA session
11035 *
11036 * This function is a wrapper to call
11037 * csr_neighbor_middle_of_roaming to know STA is in the
11038 * middle of roaming states
11039 *
11040 * Return: True or False
11041 *
11042 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080011043bool sme_neighbor_middle_of_roaming(mac_handle_t mac_handle, uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011044{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011045 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Sandeep Puligillaca631612016-11-08 11:53:52 -080011046 bool val = false;
11047
11048 if (CSR_IS_SESSION_VALID(mac_ctx, sessionId))
11049 val = csr_neighbor_middle_of_roaming(mac_ctx, sessionId);
11050 else
Rajeev Kumar9176ca42018-05-03 09:20:40 -070011051 sme_debug("Invalid Session: %d", sessionId);
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070011052
Sandeep Puligillaca631612016-11-08 11:53:52 -080011053 return val;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011054}
11055
Jeff Johnsonc7309062018-11-09 20:59:42 -080011056bool sme_is_any_session_in_middle_of_roaming(mac_handle_t mac_handle)
Padma, Santhosh Kumar86747ec2018-05-29 18:28:29 +053011057{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011058 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Padma, Santhosh Kumar86747ec2018-05-29 18:28:29 +053011059 uint8_t session_id;
11060
Dustin Brownad06be62019-02-04 14:52:56 -080011061 for (session_id = 0; session_id < WLAN_MAX_VDEVS; session_id++) {
Padma, Santhosh Kumar86747ec2018-05-29 18:28:29 +053011062 if (CSR_IS_SESSION_VALID(mac_ctx, session_id) &&
11063 csr_neighbor_middle_of_roaming(mac_ctx, session_id))
11064 return true;
11065 }
11066
11067 return false;
11068}
11069
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011070/*
11071 * sme_send_flush_logs_cmd_to_fw() - Flush FW logs
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011072 *
11073 * This function is used to send the command that will
11074 * be used to flush the logs in the firmware
11075 *
Deepak Dhamdhere0f076bd2016-06-02 11:29:21 -070011076 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011077 */
Jeff Johnson40894142018-11-17 12:05:54 -080011078QDF_STATUS sme_send_flush_logs_cmd_to_fw(void)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011079{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011080 QDF_STATUS status;
Rajeev Kumar37d478b2017-04-17 16:59:28 -070011081 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011082
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011083 /* Serialize the req through MC thread */
11084 message.bodyptr = NULL;
11085 message.type = SIR_HAL_FLUSH_LOG_TO_FW;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053011086 status = scheduler_post_message(QDF_MODULE_ID_SME,
11087 QDF_MODULE_ID_WMA,
11088 QDF_MODULE_ID_WMA, &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011089 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070011090 sme_err("scheduler_post_msg failed!(err=%d)", status);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011091 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011092 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011093 return status;
11094}
11095
Jeff Johnsona1e92612017-09-24 15:33:44 -070011096QDF_STATUS sme_enable_uapsd_for_ac(uint8_t sta_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011097 sme_ac_enum_type ac, uint8_t tid,
11098 uint8_t pri, uint32_t srvc_int,
11099 uint32_t sus_int,
Abhishek Singh12be60f2017-08-11 13:52:42 +053011100 enum sme_qos_wmm_dir_type dir,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011101 uint8_t psb, uint32_t sessionId,
11102 uint32_t delay_interval)
11103{
11104 void *wma_handle;
11105 t_wma_trigger_uapsd_params uapsd_params;
11106 enum uapsd_ac access_category;
11107
11108 if (!psb) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011109 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011110 "No need to configure auto trigger:psb is 0");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011111 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011112 }
11113
Anurag Chouhan6d760662016-02-20 16:05:43 +053011114 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011115 if (!wma_handle) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011116 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011117 "wma_handle is NULL");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011118 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011119 }
11120
11121 switch (ac) {
11122 case SME_AC_BK:
11123 access_category = UAPSD_BK;
11124 break;
11125 case SME_AC_BE:
11126 access_category = UAPSD_BE;
11127 break;
11128 case SME_AC_VI:
11129 access_category = UAPSD_VI;
11130 break;
11131 case SME_AC_VO:
11132 access_category = UAPSD_VO;
11133 break;
11134 default:
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011135 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011136 }
11137
11138 uapsd_params.wmm_ac = access_category;
11139 uapsd_params.user_priority = pri;
11140 uapsd_params.service_interval = srvc_int;
11141 uapsd_params.delay_interval = delay_interval;
11142 uapsd_params.suspend_interval = sus_int;
11143
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011144 if (QDF_STATUS_SUCCESS !=
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011145 wma_trigger_uapsd_params(wma_handle, sessionId, &uapsd_params)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011146 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011147 "Failed to Trigger Uapsd params for sessionId %d",
11148 sessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011149 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011150 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011151 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011152}
11153
Jeff Johnsona1e92612017-09-24 15:33:44 -070011154QDF_STATUS sme_disable_uapsd_for_ac(uint8_t sta_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011155 sme_ac_enum_type ac,
11156 uint32_t sessionId)
11157{
11158 void *wma_handle;
11159 enum uapsd_ac access_category;
11160
11161 switch (ac) {
11162 case SME_AC_BK:
11163 access_category = UAPSD_BK;
11164 break;
11165 case SME_AC_BE:
11166 access_category = UAPSD_BE;
11167 break;
11168 case SME_AC_VI:
11169 access_category = UAPSD_VI;
11170 break;
11171 case SME_AC_VO:
11172 access_category = UAPSD_VO;
11173 break;
11174 default:
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011175 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011176 }
11177
Anurag Chouhan6d760662016-02-20 16:05:43 +053011178 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011179 if (!wma_handle) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011180 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011181 "wma handle is NULL");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011182 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011183 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011184 if (QDF_STATUS_SUCCESS !=
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011185 wma_disable_uapsd_per_ac(wma_handle, sessionId, access_category)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011186 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011187 "Failed to disable uapsd for ac %d for sessionId %d",
11188 ac, sessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011189 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011190 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011191 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011192}
11193
11194/**
11195 * sme_update_nss() - SME API to change the number for spatial streams
11196 * (1 or 2)
Jeff Johnsonc7309062018-11-09 20:59:42 -080011197 * @mac_handle: Handle returned by mac open
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011198 * @nss: Number of spatial streams
11199 *
11200 * This function is used to update the number of spatial streams supported.
11201 *
11202 * Return: Success upon successfully changing nss else failure
11203 *
11204 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080011205QDF_STATUS sme_update_nss(mac_handle_t mac_handle, uint8_t nss)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011206{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011207 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011208 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Vignesh Viswanathan21c58cb2018-05-24 15:53:58 +053011209 uint32_t i;
11210 struct mlme_ht_capabilities_info *ht_cap_info;
gaurank kathpalia14e2f912017-08-31 14:51:45 +053011211 struct csr_roam_session *csr_session;
Abhinav Kumard4d6eb72018-12-04 20:30:37 +053011212 struct mlme_vht_capabilities_info *vht_cap_info;
Abhinav Kumarb074f2f2018-09-15 15:32:11 +053011213
Abhinav Kumard4d6eb72018-12-04 20:30:37 +053011214 vht_cap_info = &mac_ctx->mlme_cfg->vht_caps.vht_cap_info;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011215
11216 status = sme_acquire_global_lock(&mac_ctx->sme);
11217
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011218 if (QDF_STATUS_SUCCESS == status) {
Abhinav Kumard4d6eb72018-12-04 20:30:37 +053011219 vht_cap_info->enable2x2 = (nss == 1) ? 0 : 1;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011220
11221 /* get the HT capability info*/
Vignesh Viswanathan21c58cb2018-05-24 15:53:58 +053011222 ht_cap_info = &mac_ctx->mlme_cfg->ht_caps.ht_cap_info;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011223
Dustin Brownad06be62019-02-04 14:52:56 -080011224 for (i = 0; i < WLAN_MAX_VDEVS; i++) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011225 if (CSR_IS_SESSION_VALID(mac_ctx, i)) {
11226 csr_session = &mac_ctx->roam.roamSession[i];
Jeff Johnsonbe119e62019-02-02 12:30:26 -080011227 csr_session->ht_config.ht_tx_stbc =
Vignesh Viswanathan78182502018-08-06 15:13:30 +053011228 ht_cap_info->tx_stbc;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011229 }
11230 }
11231
11232 sme_release_global_lock(&mac_ctx->sme);
11233 }
11234 return status;
11235}
11236
11237/**
Archana Ramachandran5041b252016-04-25 14:29:25 -070011238 * sme_update_user_configured_nss() - sets the nss based on user request
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080011239 * @mac_handle: Opaque handle to the global MAC context
Archana Ramachandran5041b252016-04-25 14:29:25 -070011240 * @nss: number of streams
11241 *
11242 * Return: None
11243 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080011244void sme_update_user_configured_nss(mac_handle_t mac_handle, uint8_t nss)
Archana Ramachandran5041b252016-04-25 14:29:25 -070011245{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011246 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Archana Ramachandran5041b252016-04-25 14:29:25 -070011247
11248 mac_ctx->user_configured_nss = nss;
11249}
11250
Jeff Johnsonc7309062018-11-09 20:59:42 -080011251int sme_update_tx_bfee_supp(mac_handle_t mac_handle, uint8_t session_id,
Kiran Kumar Lokere6c7f3fa2018-05-14 18:12:27 -070011252 uint8_t cfg_val)
11253{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011254 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Jeff Johnsonc18469b2018-06-11 06:48:59 -070011255
Abhinav Kumarb074f2f2018-09-15 15:32:11 +053011256 mac_ctx->mlme_cfg->vht_caps.vht_cap_info.su_bformee = cfg_val;
Kiran Kumar Lokere6c7f3fa2018-05-14 18:12:27 -070011257
Jeff Johnsonc7309062018-11-09 20:59:42 -080011258 return sme_update_he_tx_bfee_supp(mac_handle, session_id, cfg_val);
Kiran Kumar Lokere6c7f3fa2018-05-14 18:12:27 -070011259}
Kiran Kumar Lokeref3044852018-06-27 14:14:24 -070011260
Jeff Johnsonc7309062018-11-09 20:59:42 -080011261int sme_update_tx_bfee_nsts(mac_handle_t mac_handle, uint8_t session_id,
Kiran Kumar Lokeref3044852018-06-27 14:14:24 -070011262 uint8_t usr_cfg_val, uint8_t nsts_val)
11263{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011264 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokeref3044852018-06-27 14:14:24 -070011265 uint8_t nsts_set_val;
Abhinav Kumard4d6eb72018-12-04 20:30:37 +053011266 struct mlme_vht_capabilities_info *vht_cap_info;
Kiran Kumar Lokeref3044852018-06-27 14:14:24 -070011267
Abhinav Kumard4d6eb72018-12-04 20:30:37 +053011268 vht_cap_info = &mac_ctx->mlme_cfg->vht_caps.vht_cap_info;
Kiran Kumar Lokeref3044852018-06-27 14:14:24 -070011269 mac_ctx->usr_cfg_tx_bfee_nsts = usr_cfg_val;
11270 if (usr_cfg_val)
11271 nsts_set_val = usr_cfg_val;
11272 else
11273 nsts_set_val = nsts_val;
Dustin Brown48f27fe2018-10-09 12:47:57 -070011274
Abhinav Kumard4d6eb72018-12-04 20:30:37 +053011275 vht_cap_info->tx_bfee_ant_supp = nsts_set_val;
Kiran Kumar Lokeref3044852018-06-27 14:14:24 -070011276
Kiran Kumar Lokere86e85592018-07-18 15:34:24 -070011277 if (usr_cfg_val)
11278 sme_set_he_tx_bf_cbf_rates(session_id);
11279
Jeff Johnsonc7309062018-11-09 20:59:42 -080011280 return sme_update_he_tx_bfee_nsts(mac_handle, session_id, nsts_set_val);
Kiran Kumar Lokeref3044852018-06-27 14:14:24 -070011281}
Kiran Kumar Lokere44a29432018-01-24 16:10:30 -080011282#ifdef WLAN_FEATURE_11AX
Jinwei Chenffaa4672018-08-30 16:55:09 +080011283void sme_update_tgt_he_cap(mac_handle_t mac_handle,
11284 struct wma_tgt_cfg *cfg,
11285 tDot11fIEhe_cap *he_cap_ini)
Jinwei Chen998a1a02018-06-20 17:20:34 +080011286{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011287 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Jinwei Chen998a1a02018-06-20 17:20:34 +080011288
11289 qdf_mem_copy(&mac_ctx->he_cap_2g,
Jinwei Chenef742dc2018-06-27 12:57:50 +080011290 &cfg->he_cap_2g,
11291 sizeof(tDot11fIEhe_cap));
Jinwei Chen998a1a02018-06-20 17:20:34 +080011292
11293 qdf_mem_copy(&mac_ctx->he_cap_5g,
Jinwei Chenef742dc2018-06-27 12:57:50 +080011294 &cfg->he_cap_5g,
11295 sizeof(tDot11fIEhe_cap));
Jinwei Chenffaa4672018-08-30 16:55:09 +080011296
11297 /* modify HE Caps field according to INI setting */
11298 mac_ctx->he_cap_2g.bfee_sts_lt_80 =
11299 QDF_MIN(cfg->he_cap_2g.bfee_sts_lt_80,
11300 he_cap_ini->bfee_sts_lt_80);
11301
11302 mac_ctx->he_cap_5g.bfee_sts_lt_80 =
11303 QDF_MIN(cfg->he_cap_5g.bfee_sts_lt_80,
11304 he_cap_ini->bfee_sts_lt_80);
Jinwei Chen998a1a02018-06-20 17:20:34 +080011305}
11306
Jeff Johnsonc7309062018-11-09 20:59:42 -080011307void sme_update_he_cap_nss(mac_handle_t mac_handle, uint8_t session_id,
11308 uint8_t nss)
Kiran Kumar Lokere44a29432018-01-24 16:10:30 -080011309{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011310 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokere44a29432018-01-24 16:10:30 -080011311 struct csr_roam_session *csr_session;
11312 uint32_t tx_mcs_map = 0;
11313 uint32_t rx_mcs_map = 0;
Kiran Kumar Lokere8dba1892018-07-24 17:09:52 -070011314 uint32_t mcs_map = 0;
Kiran Kumar Lokere44a29432018-01-24 16:10:30 -080011315
11316 if (!nss || (nss > 2)) {
11317 sme_err("invalid Nss value %d", nss);
11318 }
11319 csr_session = CSR_GET_SESSION(mac_ctx, session_id);
Bala Venkatesh6d537092018-09-25 10:38:36 +053011320 rx_mcs_map =
11321 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.rx_he_mcs_map_lt_80;
11322 tx_mcs_map =
11323 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.tx_he_mcs_map_lt_80;
Kiran Kumar Lokere8dba1892018-07-24 17:09:52 -070011324 mcs_map = rx_mcs_map & 0x3;
Bala Venkatesh6d537092018-09-25 10:38:36 +053011325
Kiran Kumar Lokere44a29432018-01-24 16:10:30 -080011326 if (nss == 1) {
11327 tx_mcs_map = HE_SET_MCS_4_NSS(tx_mcs_map, HE_MCS_DISABLE, 2);
11328 rx_mcs_map = HE_SET_MCS_4_NSS(rx_mcs_map, HE_MCS_DISABLE, 2);
11329 } else {
Kiran Kumar Lokere8dba1892018-07-24 17:09:52 -070011330 tx_mcs_map = HE_SET_MCS_4_NSS(tx_mcs_map, mcs_map, 2);
11331 rx_mcs_map = HE_SET_MCS_4_NSS(rx_mcs_map, mcs_map, 2);
Kiran Kumar Lokere44a29432018-01-24 16:10:30 -080011332 }
11333 sme_info("new HE Nss MCS MAP: Rx 0x%0X, Tx: 0x%0X",
11334 rx_mcs_map, tx_mcs_map);
Bala Venkatesh6d537092018-09-25 10:38:36 +053011335 if (cfg_in_range(CFG_HE_RX_MCS_MAP_LT_80, rx_mcs_map))
11336 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.rx_he_mcs_map_lt_80 =
11337 rx_mcs_map;
11338 if (cfg_in_range(CFG_HE_TX_MCS_MAP_LT_80, tx_mcs_map))
11339 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.tx_he_mcs_map_lt_80 =
11340 tx_mcs_map;
Kiran Kumar Lokere44a29432018-01-24 16:10:30 -080011341 csr_update_session_he_cap(mac_ctx, csr_session);
11342
11343}
Kiran Kumar Lokere96246e52018-01-24 16:44:35 -080011344
Jeff Johnsonc7309062018-11-09 20:59:42 -080011345int sme_update_he_mcs(mac_handle_t mac_handle, uint8_t session_id,
11346 uint16_t he_mcs)
Kiran Kumar Lokere96246e52018-01-24 16:44:35 -080011347{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011348 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokere96246e52018-01-24 16:44:35 -080011349 struct csr_roam_session *csr_session;
11350 uint16_t mcs_val = 0;
11351 uint16_t mcs_map = HE_MCS_ALL_DISABLED;
Kiran Kumar Lokere96246e52018-01-24 16:44:35 -080011352
11353 csr_session = CSR_GET_SESSION(mac_ctx, session_id);
11354 if (!csr_session) {
11355 sme_err("No session for id %d", session_id);
11356 return -EINVAL;
11357 }
11358 if ((he_mcs & 0x3) == HE_MCS_DISABLE) {
11359 sme_err("Invalid HE MCS 0x%0x, can't disable 0-7 for 1ss",
11360 he_mcs);
11361 return -EINVAL;
11362 }
11363 mcs_val = he_mcs & 0x3;
11364 switch (he_mcs) {
11365 case HE_80_MCS0_7:
11366 case HE_80_MCS0_9:
11367 case HE_80_MCS0_11:
Abhinav Kumarb074f2f2018-09-15 15:32:11 +053011368 if (mac_ctx->mlme_cfg->vht_caps.vht_cap_info.enable2x2) {
Kiran Kumar Lokere96246e52018-01-24 16:44:35 -080011369 mcs_map = HE_SET_MCS_4_NSS(mcs_map, mcs_val, 1);
11370 mcs_map = HE_SET_MCS_4_NSS(mcs_map, mcs_val, 2);
11371 } else {
11372 mcs_map = HE_SET_MCS_4_NSS(mcs_map, mcs_val, 1);
11373 }
Bala Venkatesh6d537092018-09-25 10:38:36 +053011374 if (cfg_in_range(CFG_HE_TX_MCS_MAP_LT_80, mcs_map))
11375 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.
11376 tx_he_mcs_map_lt_80 = mcs_map;
11377 if (cfg_in_range(CFG_HE_RX_MCS_MAP_LT_80, mcs_map))
11378 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.
11379 rx_he_mcs_map_lt_80 = mcs_map;
Kiran Kumar Lokere96246e52018-01-24 16:44:35 -080011380 break;
11381
11382 case HE_160_MCS0_7:
11383 case HE_160_MCS0_9:
11384 case HE_160_MCS0_11:
11385 mcs_map = HE_SET_MCS_4_NSS(mcs_map, mcs_val, 1);
Bala Venkatesh6d537092018-09-25 10:38:36 +053011386 if (cfg_in_range(CFG_HE_TX_MCS_MAP_160, mcs_map))
11387 qdf_mem_copy(mac_ctx->mlme_cfg->he_caps.dot11_he_cap.
11388 tx_he_mcs_map_160, &mcs_map,
11389 sizeof(uint16_t));
11390 if (cfg_in_range(CFG_HE_RX_MCS_MAP_160, mcs_map))
11391 qdf_mem_copy(mac_ctx->mlme_cfg->he_caps.dot11_he_cap.
11392 rx_he_mcs_map_160, &mcs_map,
11393 sizeof(uint16_t));
Kiran Kumar Lokere96246e52018-01-24 16:44:35 -080011394 break;
11395
11396 case HE_80p80_MCS0_7:
11397 case HE_80p80_MCS0_9:
11398 case HE_80p80_MCS0_11:
11399 mcs_map = HE_SET_MCS_4_NSS(mcs_map, mcs_val, 1);
Bala Venkatesh6d537092018-09-25 10:38:36 +053011400 if (cfg_in_range(CFG_HE_TX_MCS_MAP_80_80, mcs_map))
11401 qdf_mem_copy(mac_ctx->mlme_cfg->he_caps.dot11_he_cap.
11402 tx_he_mcs_map_80_80, &mcs_map,
11403 sizeof(uint16_t));
11404 if (cfg_in_range(CFG_HE_RX_MCS_MAP_80_80, mcs_map))
11405 qdf_mem_copy(mac_ctx->mlme_cfg->he_caps.dot11_he_cap.
11406 rx_he_mcs_map_80_80, &mcs_map,
11407 sizeof(uint16_t));
Kiran Kumar Lokere96246e52018-01-24 16:44:35 -080011408 break;
11409
11410 default:
11411 sme_err("Invalid HE MCS 0x%0x", he_mcs);
11412 return -EINVAL;
11413 }
11414 sme_info("new HE MCS 0x%0x", mcs_map);
Kiran Kumar Lokere96246e52018-01-24 16:44:35 -080011415 csr_update_session_he_cap(mac_ctx, csr_session);
11416
11417 return 0;
11418}
Kiran Kumar Lokere13dedac2018-02-05 19:51:59 -080011419
Jeff Johnsonc7309062018-11-09 20:59:42 -080011420void sme_set_usr_cfg_mu_edca(mac_handle_t mac_handle, bool val)
Kiran Kumar Lokeref54b8552018-07-10 00:53:38 -070011421{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011422 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokeref54b8552018-07-10 00:53:38 -070011423
11424 mac_ctx->usr_cfg_mu_edca_params = val;
11425}
11426
Jeff Johnsonc7309062018-11-09 20:59:42 -080011427int sme_update_mu_edca_params(mac_handle_t mac_handle, uint8_t session_id)
Kiran Kumar Lokerefba20632018-07-05 16:51:27 -070011428{
11429 struct scheduler_msg msg = {0};
11430 QDF_STATUS status;
11431
11432 qdf_mem_zero(&msg, sizeof(msg));
11433 msg.type = WNI_SME_UPDATE_MU_EDCA_PARAMS;
11434 msg.reserved = 0;
11435 msg.bodyval = session_id;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053011436 status = scheduler_post_message(QDF_MODULE_ID_SME,
11437 QDF_MODULE_ID_PE,
11438 QDF_MODULE_ID_PE, &msg);
Kiran Kumar Lokerefba20632018-07-05 16:51:27 -070011439 if (status != QDF_STATUS_SUCCESS) {
11440 sme_err("Not able to post update edca profile");
11441 return -EIO;
11442 }
11443
11444 return 0;
11445}
Jeff Johnsonc7309062018-11-09 20:59:42 -080011446
11447void sme_set_he_mu_edca_def_cfg(mac_handle_t mac_handle)
Kiran Kumar Lokerefba20632018-07-05 16:51:27 -070011448{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011449 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokerefba20632018-07-05 16:51:27 -070011450 uint8_t i;
11451
Kiran Kumar Lokere8dba1892018-07-24 17:09:52 -070011452 sme_debug("Set MU EDCA params to default");
Srinivas Girigowda5b86fbd2019-03-21 14:54:14 -070011453 for (i = 0; i < QCA_WLAN_AC_ALL; i++) {
Kiran Kumar Lokerefba20632018-07-05 16:51:27 -070011454 mac_ctx->usr_mu_edca_params[i].aci.aifsn = MU_EDCA_DEF_AIFSN;
11455 mac_ctx->usr_mu_edca_params[i].aci.aci = i;
11456 mac_ctx->usr_mu_edca_params[i].cw.max = MU_EDCA_DEF_CW_MAX;
11457 mac_ctx->usr_mu_edca_params[i].cw.min = MU_EDCA_DEF_CW_MIN;
11458 mac_ctx->usr_mu_edca_params[i].mu_edca_timer =
11459 MU_EDCA_DEF_TIMER;
11460 }
11461}
11462
Jeff Johnsonc7309062018-11-09 20:59:42 -080011463int sme_update_he_tx_bfee_supp(mac_handle_t mac_handle, uint8_t session_id,
Kiran Kumar Lokere6c7f3fa2018-05-14 18:12:27 -070011464 uint8_t cfg_val)
11465{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011466 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Bala Venkatesh6d537092018-09-25 10:38:36 +053011467 struct csr_roam_session *session;
11468
11469 session = CSR_GET_SESSION(mac_ctx, session_id);
11470
11471 if (!session) {
11472 sme_err("No session for id %d", session_id);
11473 return -EINVAL;
11474 }
11475 if (cfg_val <= 1)
11476 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.su_beamformee = cfg_val;
11477 else
11478 return -EINVAL;
11479
11480 csr_update_session_he_cap(mac_ctx, session);
11481 return 0;
Kiran Kumar Lokere6c7f3fa2018-05-14 18:12:27 -070011482}
11483
Jeff Johnsonc7309062018-11-09 20:59:42 -080011484int sme_update_he_trigger_frm_mac_pad(mac_handle_t mac_handle,
11485 uint8_t session_id,
Kiran Kumar Lokeref54b8552018-07-10 00:53:38 -070011486 uint8_t cfg_val)
11487{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011488 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Bala Venkatesh6d537092018-09-25 10:38:36 +053011489 struct csr_roam_session *session;
11490
11491 session = CSR_GET_SESSION(mac_ctx, session_id);
11492
11493 if (!session) {
11494 sme_err("No session for id %d", session_id);
11495 return -EINVAL;
11496 }
11497 if (cfg_in_range(CFG_HE_TRIG_PAD, cfg_val))
11498 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.trigger_frm_mac_pad =
11499 cfg_val;
11500 else
11501 return -EINVAL;
11502
11503 csr_update_session_he_cap(mac_ctx, session);
11504 return 0;
11505
Kiran Kumar Lokeref54b8552018-07-10 00:53:38 -070011506}
11507
Jeff Johnsonc7309062018-11-09 20:59:42 -080011508int sme_update_he_om_ctrl_supp(mac_handle_t mac_handle, uint8_t session_id,
Kiran Kumar Lokeref1a96f42018-08-29 18:53:47 -070011509 uint8_t cfg_val)
11510{
Bala Venkatesh2fae18a2018-11-14 12:32:45 +053011511
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011512 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Bala Venkatesh2fae18a2018-11-14 12:32:45 +053011513 struct csr_roam_session *session;
11514
11515 session = CSR_GET_SESSION(mac_ctx, session_id);
11516
11517 if (!session) {
11518 sme_err("No session for id %d", session_id);
11519 return -EINVAL;
11520 }
Harprit Chhabada89780bf2019-03-06 14:01:38 -080011521 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.omi_a_ctrl = cfg_val;
Bala Venkatesh2fae18a2018-11-14 12:32:45 +053011522
11523 csr_update_session_he_cap(mac_ctx, session);
11524 return 0;
Kiran Kumar Lokeref1a96f42018-08-29 18:53:47 -070011525}
11526
Kiran Kumar Lokereacd107d2019-01-09 15:02:11 -080011527int sme_update_he_htc_he_supp(mac_handle_t mac_handle, uint8_t session_id,
11528 bool cfg_val)
Kiran Kumar Lokere94634152018-09-24 19:08:35 -070011529{
Kiran Kumar Lokereacd107d2019-01-09 15:02:11 -080011530
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011531 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokereacd107d2019-01-09 15:02:11 -080011532 struct csr_roam_session *session;
11533
11534 session = CSR_GET_SESSION(mac_ctx, session_id);
Kiran Kumar Lokere94634152018-09-24 19:08:35 -070011535
11536 if (!session) {
Kiran Kumar Lokereacd107d2019-01-09 15:02:11 -080011537 sme_err("No session for id %d", session_id);
Kiran Kumar Lokere94634152018-09-24 19:08:35 -070011538 return -EINVAL;
11539 }
Kiran Kumar Lokereacd107d2019-01-09 15:02:11 -080011540
11541 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.htc_he = cfg_val;
11542 csr_update_session_he_cap(mac_ctx, session);
11543
11544 return 0;
11545}
11546
11547static QDF_STATUS
11548sme_validate_session_for_cap_update(struct mac_context *mac_ctx,
11549 uint8_t session_id,
11550 struct csr_roam_session *session)
11551{
11552 if (!session) {
11553 sme_err("Session does not exist, Session_id: %d", session_id);
11554 return QDF_STATUS_E_INVAL;
11555 }
Kiran Kumar Lokere94634152018-09-24 19:08:35 -070011556 if (!csr_is_conn_state_connected_infra(mac_ctx, session_id)) {
11557 sme_info("STA is not connected, Session_id: %d", session_id);
Kiran Kumar Lokereacd107d2019-01-09 15:02:11 -080011558 return QDF_STATUS_E_INVAL;
11559 }
11560
11561 return QDF_STATUS_SUCCESS;
11562}
11563
11564int sme_send_he_om_ctrl_update(mac_handle_t mac_handle, uint8_t session_id)
11565{
11566 QDF_STATUS status = QDF_STATUS_SUCCESS;
11567 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
11568 struct omi_ctrl_tx omi_data = {0};
11569 void *wma_handle;
11570 struct csr_roam_session *session = CSR_GET_SESSION(mac_ctx, session_id);
11571 uint32_t param_val = 0;
11572
11573 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
11574 if (!wma_handle) {
11575 sme_err("wma handle is NULL");
11576 return -EIO;
11577 }
11578
11579 status = sme_validate_session_for_cap_update(mac_ctx, session_id,
11580 session);
11581 if (QDF_IS_STATUS_ERROR(status))
Kiran Kumar Lokere94634152018-09-24 19:08:35 -070011582 return -EINVAL;
Kiran Kumar Lokereacd107d2019-01-09 15:02:11 -080011583
11584 omi_data.a_ctrl_id = A_CTRL_ID_OMI;
11585
11586 if (mac_ctx->he_om_ctrl_cfg_nss_set)
11587 omi_data.rx_nss = mac_ctx->he_om_ctrl_cfg_nss;
11588 else
11589 omi_data.rx_nss = session->nss - 1;
11590
11591 if (mac_ctx->he_om_ctrl_cfg_tx_nsts_set)
11592 omi_data.tx_nsts = mac_ctx->he_om_ctrl_cfg_tx_nsts;
11593 else
11594 omi_data.tx_nsts = session->nss - 1;
11595
11596 if (mac_ctx->he_om_ctrl_cfg_bw_set)
11597 omi_data.ch_bw = mac_ctx->he_om_ctrl_cfg_bw;
11598 else
11599 omi_data.ch_bw = session->connectedProfile.vht_channel_width;
11600
11601 omi_data.ul_mu_dis = mac_ctx->he_om_ctrl_cfg_ul_mu_dis;
Kiran Kumar Lokere49e3aff2019-02-06 17:00:48 -080011602 omi_data.ul_mu_data_dis = mac_ctx->he_om_ctrl_ul_mu_data_dis;
Kiran Kumar Lokereacd107d2019-01-09 15:02:11 -080011603 omi_data.omi_in_vht = 0x1;
11604 omi_data.omi_in_he = 0x1;
11605
11606 sme_info("OMI: BW %d TxNSTS %d RxNSS %d ULMU %d, OMI_VHT %d, OMI_HE %d",
11607 omi_data.ch_bw, omi_data.tx_nsts, omi_data.rx_nss,
11608 omi_data.ul_mu_dis, omi_data.omi_in_vht, omi_data.omi_in_he);
11609 qdf_mem_copy(&param_val, &omi_data, sizeof(omi_data));
Srinivas Girigowdacb7b8b82019-04-10 14:27:47 -070011610 sme_debug("param val %08X, bssid:"QDF_MAC_ADDR_STR, param_val,
Srinivas Girigowda34fbba02019-04-08 12:07:44 -070011611 QDF_MAC_ADDR_ARRAY(session->connectedProfile.bssid.bytes));
Kiran Kumar Lokereacd107d2019-01-09 15:02:11 -080011612 status = wma_set_peer_param(wma_handle,
11613 session->connectedProfile.bssid.bytes,
11614 WMI_PEER_PARAM_XMIT_OMI,
11615 param_val, session_id);
Kiran Kumar Lokere94634152018-09-24 19:08:35 -070011616 if (QDF_STATUS_SUCCESS != status) {
Kiran Kumar Lokereacd107d2019-01-09 15:02:11 -080011617 sme_err("set_peer_param_cmd returned %d", status);
Kiran Kumar Lokere94634152018-09-24 19:08:35 -070011618 return -EIO;
11619 }
11620
11621 return 0;
11622}
11623
Kiran Kumar Lokereacd107d2019-01-09 15:02:11 -080011624int sme_set_he_om_ctrl_param(mac_handle_t mac_handle, uint8_t session_id,
11625 enum qca_wlan_vendor_attr_he_omi_tx param,
11626 uint8_t cfg_val)
Kiran Kumar Lokere94634152018-09-24 19:08:35 -070011627{
Kiran Kumar Lokere94634152018-09-24 19:08:35 -070011628 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011629 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokere94634152018-09-24 19:08:35 -070011630 struct csr_roam_session *session = CSR_GET_SESSION(mac_ctx, session_id);
11631
Kiran Kumar Lokereacd107d2019-01-09 15:02:11 -080011632 status = sme_validate_session_for_cap_update(mac_ctx, session_id,
11633 session);
11634 if (QDF_IS_STATUS_ERROR(status))
Kiran Kumar Lokere94634152018-09-24 19:08:35 -070011635 return -EINVAL;
Kiran Kumar Lokere94634152018-09-24 19:08:35 -070011636
Kiran Kumar Lokereacd107d2019-01-09 15:02:11 -080011637 switch(param) {
11638 case QCA_WLAN_VENDOR_ATTR_HE_OMI_ULMU_DISABLE:
11639 sme_debug("Set OM ctrl UL MU dis to %d", cfg_val);
11640 mac_ctx->he_om_ctrl_cfg_ul_mu_dis = cfg_val;
11641 break;
11642 case QCA_WLAN_VENDOR_ATTR_HE_OMI_RX_NSS:
11643 if ((cfg_val + 1) > session->nss) {
11644 sme_debug("OMI Nss %d is > connected Nss %d",
11645 cfg_val, session->nss);
11646 mac_ctx->he_om_ctrl_cfg_nss_set = false;
11647 return 0;
11648 }
11649 sme_debug("Set OM ctrl Rx Nss cfg to %d", cfg_val);
11650 mac_ctx->he_om_ctrl_cfg_nss_set = true;
11651 mac_ctx->he_om_ctrl_cfg_nss = cfg_val;
11652 break;
11653 case QCA_WLAN_VENDOR_ATTR_HE_OMI_CH_BW:
11654 if (cfg_val >
11655 session->connectedProfile.vht_channel_width) {
11656 sme_info("OMI BW %d is > connected BW %d",
11657 cfg_val,
11658 session->connectedProfile.
11659 vht_channel_width);
11660 mac_ctx->he_om_ctrl_cfg_bw_set = false;
11661 return 0;
11662 }
11663 sme_debug("Set OM ctrl BW cfg to %d", cfg_val);
11664 mac_ctx->he_om_ctrl_cfg_bw_set = true;
11665 mac_ctx->he_om_ctrl_cfg_bw = cfg_val;
11666 break;
11667 case QCA_WLAN_VENDOR_ATTR_HE_OMI_TX_NSTS:
11668 if ((cfg_val + 1) > session->nss) {
11669 sme_debug("OMI NSTS %d is > connected Nss %d",
11670 cfg_val, session->nss);
11671 mac_ctx->he_om_ctrl_cfg_tx_nsts_set = false;
11672 return 0;
11673 }
11674 sme_debug("Set OM ctrl tx nsts cfg to %d", cfg_val);
11675 mac_ctx->he_om_ctrl_cfg_tx_nsts_set = true;
11676 mac_ctx->he_om_ctrl_cfg_tx_nsts = cfg_val;
11677 break;
Kiran Kumar Lokere49e3aff2019-02-06 17:00:48 -080011678 case QCA_WLAN_VENDOR_ATTR_HE_OMI_ULMU_DATA_DISABLE:
11679 sme_debug("Set OM ctrl UL MU data dis to %d", cfg_val);
11680 mac_ctx->he_om_ctrl_ul_mu_data_dis = cfg_val;
11681 break;
Kiran Kumar Lokereacd107d2019-01-09 15:02:11 -080011682 default:
11683 sme_debug("Invalid OMI param %d", param);
11684 return -EINVAL;
Kiran Kumar Lokere94634152018-09-24 19:08:35 -070011685 }
11686
11687 return 0;
11688}
11689
Jeff Johnsonc7309062018-11-09 20:59:42 -080011690void sme_reset_he_om_ctrl(mac_handle_t mac_handle)
Kiran Kumar Lokere94634152018-09-24 19:08:35 -070011691{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011692 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokere94634152018-09-24 19:08:35 -070011693
11694 mac_ctx->he_om_ctrl_cfg_bw_set = false;
11695 mac_ctx->he_om_ctrl_cfg_nss_set = false;
11696 mac_ctx->he_om_ctrl_cfg_bw = 0;
11697 mac_ctx->he_om_ctrl_cfg_nss = 0;
Kiran Kumar Lokereacd107d2019-01-09 15:02:11 -080011698 mac_ctx->he_om_ctrl_cfg_ul_mu_dis = false;
11699 mac_ctx->he_om_ctrl_cfg_tx_nsts_set = false;
11700 mac_ctx->he_om_ctrl_cfg_tx_nsts = 0;
Kiran Kumar Lokere49e3aff2019-02-06 17:00:48 -080011701 mac_ctx->he_om_ctrl_ul_mu_data_dis = false;
Kiran Kumar Lokere94634152018-09-24 19:08:35 -070011702}
11703
Kiran Kumar Lokereee205772018-09-27 00:27:27 -070011704int sme_config_action_tx_in_tb_ppdu(mac_handle_t mac_handle, uint8_t session_id,
11705 uint8_t cfg_val)
11706{
11707 QDF_STATUS status;
11708 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
11709 struct scheduler_msg msg = {0};
11710 struct sir_cfg_action_frm_tb_ppdu *cfg_msg;
11711
11712 if (!csr_is_conn_state_connected_infra(mac_ctx, session_id)) {
11713 sme_info("STA not in connected state Session_id: %d",
11714 session_id);
11715 return -EINVAL;
11716 }
11717
11718 cfg_msg = qdf_mem_malloc(sizeof(*cfg_msg));
11719
11720 if (!cfg_msg)
11721 return -EIO;
11722
11723 cfg_msg->type = WNI_SME_CFG_ACTION_FRM_HE_TB_PPDU;
11724 cfg_msg->session_id = session_id;
11725 cfg_msg->cfg = cfg_val;
11726
11727 msg.bodyptr = cfg_msg;
11728 msg.type = WNI_SME_CFG_ACTION_FRM_HE_TB_PPDU;
11729 status = scheduler_post_message(QDF_MODULE_ID_SME, QDF_MODULE_ID_PE,
11730 QDF_MODULE_ID_PE, &msg);
11731 if (QDF_STATUS_SUCCESS != status) {
11732 sme_err("Failed to send CFG_ACTION_FRAME_IN_TB_PPDU to PE %d",
11733 status);
11734 qdf_mem_free(cfg_msg);
11735 return -EIO;
11736 }
11737
11738 return 0;
11739}
11740
Jeff Johnsonc7309062018-11-09 20:59:42 -080011741int sme_update_he_tx_bfee_nsts(mac_handle_t mac_handle, uint8_t session_id,
Kiran Kumar Lokeref3044852018-06-27 14:14:24 -070011742 uint8_t cfg_val)
11743{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011744 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Bala Venkatesh6d537092018-09-25 10:38:36 +053011745 struct csr_roam_session *session;
11746
11747 session = CSR_GET_SESSION(mac_ctx, session_id);
11748
11749 if (!session) {
11750 sme_err("No session for id %d", session_id);
11751 return -EINVAL;
11752 }
11753 if (cfg_in_range(CFG_HE_BFEE_STS_LT80, cfg_val))
11754 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.bfee_sts_lt_80 =
11755 cfg_val;
11756 else
11757 return -EINVAL;
11758
11759 csr_update_session_he_cap(mac_ctx, session);
11760 return 0;
Kiran Kumar Lokeref3044852018-06-27 14:14:24 -070011761}
11762
Kiran Kumar Lokere86e85592018-07-18 15:34:24 -070011763void sme_set_he_tx_bf_cbf_rates(uint8_t session_id)
11764{
11765 uint32_t tx_bf_cbf_rates_5g[] = {91, 1, 0, 3, 2, 4, 0};
11766 uint32_t tx_bf_cbf_rates_2g[] = {91, 1, 1, 3, 1, 3, 0};
11767 QDF_STATUS status;
11768
11769 status = wma_form_unit_test_cmd_and_send(session_id, 0x48, 7,
11770 tx_bf_cbf_rates_5g);
11771 if (QDF_STATUS_SUCCESS != status)
11772 sme_err("send_unit_test_cmd returned %d", status);
11773
11774 status = wma_form_unit_test_cmd_and_send(session_id, 0x48, 7,
11775 tx_bf_cbf_rates_2g);
11776 if (QDF_STATUS_SUCCESS != status)
11777 sme_err("send_unit_test_cmd returned %d", status);
11778}
11779
Kiran Kumar Lokereefdbd0b2018-09-25 18:53:46 -070011780void sme_config_su_ppdu_queue(uint8_t session_id, bool enable)
11781{
11782 uint32_t su_ppdu_enable[] = {69, 1, 1, 1};
11783 uint32_t su_ppdu_disable[] = {69, 1, 1, 0};
11784 QDF_STATUS status;
11785
11786 if (enable) {
11787 sme_debug("Send Tx SU PPDU queue ENABLE cmd to FW");
11788 status = wma_form_unit_test_cmd_and_send(session_id, 0x48, 4,
11789 su_ppdu_enable);
11790 } else {
11791 sme_debug("Send Tx SU PPDU queue DISABLE cmd to FW");
11792 status = wma_form_unit_test_cmd_and_send(session_id, 0x48, 4,
11793 su_ppdu_disable);
11794 }
11795 if (QDF_STATUS_SUCCESS != status)
11796 sme_err("send_unit_test_cmd returned %d", status);
11797}
11798
Jeff Johnsonc7309062018-11-09 20:59:42 -080011799int sme_update_he_tx_stbc_cap(mac_handle_t mac_handle, uint8_t session_id,
11800 int value)
Kiran Kumar Lokere13dedac2018-02-05 19:51:59 -080011801{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011802 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Bala Venkatesh6d537092018-09-25 10:38:36 +053011803 struct csr_roam_session *session;
Kiran Kumar Lokere5cc2f0d2018-02-08 17:10:05 -080011804 uint32_t he_cap_val = 0;
11805
11806 he_cap_val = value ? 1 : 0;
Bala Venkatesh6d537092018-09-25 10:38:36 +053011807 session = CSR_GET_SESSION(mac_ctx, session_id);
Kiran Kumar Lokere13dedac2018-02-05 19:51:59 -080011808
Bala Venkatesh6d537092018-09-25 10:38:36 +053011809 if (!session) {
11810 sme_err("No session for id %d", session_id);
11811 return -EINVAL;
11812 }
11813 if (he_cap_val <= 1)
Kiran Kumar Lokere9cab5252019-02-04 14:38:08 -080011814 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.tb_ppdu_tx_stbc_lt_80mhz
11815 = he_cap_val;
Bala Venkatesh6d537092018-09-25 10:38:36 +053011816 else
11817 return -EINVAL;
11818 if (he_cap_val <= 1)
Kiran Kumar Lokere9cab5252019-02-04 14:38:08 -080011819 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.tb_ppdu_tx_stbc_gt_80mhz
11820 = he_cap_val;
Bala Venkatesh6d537092018-09-25 10:38:36 +053011821 else
11822 return -EINVAL;
11823 csr_update_session_he_cap(mac_ctx, session);
11824 return 0;
Kiran Kumar Lokere13dedac2018-02-05 19:51:59 -080011825}
11826
Jeff Johnsonc7309062018-11-09 20:59:42 -080011827int sme_update_he_rx_stbc_cap(mac_handle_t mac_handle, uint8_t session_id,
11828 int value)
Kiran Kumar Lokere13dedac2018-02-05 19:51:59 -080011829{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011830 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Bala Venkatesh6d537092018-09-25 10:38:36 +053011831 struct csr_roam_session *session;
Kiran Kumar Lokere5cc2f0d2018-02-08 17:10:05 -080011832 uint32_t he_cap_val = 0;
11833
11834 he_cap_val = value ? 1 : 0;
Bala Venkatesh6d537092018-09-25 10:38:36 +053011835 session = CSR_GET_SESSION(mac_ctx, session_id);
Kiran Kumar Lokere13dedac2018-02-05 19:51:59 -080011836
Bala Venkatesh6d537092018-09-25 10:38:36 +053011837 if (!session) {
11838 sme_err("No session for id %d", session_id);
11839 return -EINVAL;
11840 }
11841 if (he_cap_val <= 1)
11842 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.rx_stbc_lt_80mhz =
11843 he_cap_val;
11844 else
11845 return -EINVAL;
11846 if (he_cap_val <= 1)
11847 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.rx_stbc_gt_80mhz =
11848 he_cap_val;
11849 else
11850 return -EINVAL;
11851 csr_update_session_he_cap(mac_ctx, session);
11852 return 0;
Kiran Kumar Lokere5cc2f0d2018-02-08 17:10:05 -080011853}
11854
Jeff Johnsonc7309062018-11-09 20:59:42 -080011855int sme_update_he_frag_supp(mac_handle_t mac_handle, uint8_t session_id,
11856 uint16_t he_frag)
Kiran Kumar Lokere5cc2f0d2018-02-08 17:10:05 -080011857{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011858 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Bala Venkatesh6d537092018-09-25 10:38:36 +053011859 struct csr_roam_session *session;
11860
11861 session = CSR_GET_SESSION(mac_ctx, session_id);
11862
11863 if (!session) {
11864 sme_err("No session for id %d", session_id);
11865 return -EINVAL;
11866 }
11867 if (cfg_in_range(CFG_HE_FRAGMENTATION, he_frag))
11868 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.fragmentation = he_frag;
11869 else
11870 return -EINVAL;
11871
11872 csr_update_session_he_cap(mac_ctx, session);
11873 return 0;
11874
Kiran Kumar Lokere13dedac2018-02-05 19:51:59 -080011875}
Kiran Kumar Lokeree43a4582018-05-08 19:54:03 -070011876
Jeff Johnsonc7309062018-11-09 20:59:42 -080011877int sme_update_he_ldpc_supp(mac_handle_t mac_handle, uint8_t session_id,
Kiran Kumar Lokeree43a4582018-05-08 19:54:03 -070011878 uint16_t he_ldpc)
11879{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011880 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Bala Venkatesh6d537092018-09-25 10:38:36 +053011881 struct csr_roam_session *session;
11882
11883 session = CSR_GET_SESSION(mac_ctx, session_id);
11884
11885 if (!session) {
11886 sme_err("No session for id %d", session_id);
11887 return -EINVAL;
11888 }
11889 if (he_ldpc <= 1)
11890 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.ldpc_coding = he_ldpc;
11891 else
11892 return -EINVAL;
11893
11894 csr_update_session_he_cap(mac_ctx, session);
11895 return 0;
11896
Kiran Kumar Lokeree43a4582018-05-08 19:54:03 -070011897}
Arif Hussain1f58cbb2019-03-14 17:06:56 -070011898
11899int sme_update_he_twt_req_support(mac_handle_t mac_handle, uint8_t session_id,
11900 uint8_t cfg_val)
11901{
11902 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
11903 struct csr_roam_session *session;
11904
11905 session = CSR_GET_SESSION(mac_ctx, session_id);
11906
11907 if (!session) {
11908 sme_err("No session for id %d", session_id);
11909 return -EINVAL;
11910 }
11911 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.twt_request = cfg_val;
11912
11913 csr_update_session_he_cap(mac_ctx, session);
11914
11915 return 0;
11916}
Kiran Kumar Lokere44a29432018-01-24 16:10:30 -080011917#endif
11918
Archana Ramachandran5041b252016-04-25 14:29:25 -070011919/**
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053011920 * sme_set_nud_debug_stats_cb() - set nud debug stats callback
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080011921 * @mac_handle: Opaque handle to the global MAC context
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053011922 * @cb: callback function pointer
Dundi Raviteja3bcf3a82018-05-22 13:24:18 +053011923 * @context: callback context
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053011924 *
11925 * This function stores nud debug stats callback function.
11926 *
11927 * Return: QDF_STATUS enumeration.
11928 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080011929QDF_STATUS sme_set_nud_debug_stats_cb(mac_handle_t mac_handle,
Dundi Raviteja3bcf3a82018-05-22 13:24:18 +053011930 void (*cb)(void *, struct rsp_stats *, void *),
11931 void *context)
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053011932{
11933 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011934 struct mac_context *mac;
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053011935
Jeff Johnsonc7309062018-11-09 20:59:42 -080011936 if (!mac_handle) {
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053011937 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Jeff Johnsonc7309062018-11-09 20:59:42 -080011938 FL("mac_handle is not valid"));
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053011939 return QDF_STATUS_E_INVAL;
11940 }
Jeff Johnsona0619e42018-11-28 17:43:00 -080011941 mac = MAC_CONTEXT(mac_handle);
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053011942
11943 status = sme_acquire_global_lock(&mac->sme);
11944 if (!QDF_IS_STATUS_SUCCESS(status)) {
11945 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
11946 FL("sme_acquire_global_lock failed!(status=%d)"),
11947 status);
11948 return status;
11949 }
11950
11951 mac->sme.get_arp_stats_cb = cb;
Dundi Raviteja3bcf3a82018-05-22 13:24:18 +053011952 mac->sme.get_arp_stats_context = context;
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053011953 sme_release_global_lock(&mac->sme);
11954 return status;
11955}
11956
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011957/**
11958 * sme_is_any_session_in_connected_state() - SME wrapper API to
11959 * check if any session is in connected state or not.
11960 *
Jeff Johnsonc7309062018-11-09 20:59:42 -080011961 * @mac_handle: Handle returned by mac open
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011962 *
11963 * This function is used to check if any valid sme session is in
11964 * connected state or not.
11965 *
11966 * Return: true if any session is connected, else false.
11967 *
11968 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080011969bool sme_is_any_session_in_connected_state(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011970{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011971 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011972 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011973 bool ret = false;
11974
11975 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011976 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011977 ret = csr_is_any_session_in_connect_state(mac_ctx);
11978 sme_release_global_lock(&mac_ctx->sme);
11979 }
11980 return ret;
11981}
11982
Jeff Johnsonb7fa2562018-07-02 08:36:17 -070011983QDF_STATUS sme_set_chip_pwr_save_fail_cb(mac_handle_t mac_handle,
11984 pwr_save_fail_cb cb)
11985{
11986 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011987 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Ravi Kumar Bokka05c14e52017-03-27 14:48:23 +053011988
11989 status = sme_acquire_global_lock(&mac->sme);
11990 if (status != QDF_STATUS_SUCCESS) {
11991 sme_err("sme_AcquireGlobalLock failed!(status=%d)", status);
11992 return status;
11993 }
11994 mac->sme.chip_power_save_fail_cb = cb;
11995 sme_release_global_lock(&mac->sme);
11996 return status;
11997}
11998
Qiwei Caie689a262018-07-26 15:50:22 +080011999#ifdef FEATURE_RSSI_MONITOR
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012000/**
12001 * sme_set_rssi_monitoring() - set rssi monitoring
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080012002 * @mac_handle: Opaque handle to the global MAC context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012003 * @input: request message
12004 *
12005 * This function constructs the vos message and fill in message type,
12006 * bodyptr with @input and posts it to WDA queue.
12007 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012008 * Return: QDF_STATUS enumeration
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012009 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080012010QDF_STATUS sme_set_rssi_monitoring(mac_handle_t mac_handle,
Jeff Johnson4c6d40f2019-02-22 20:49:56 -080012011 struct rssi_monitor_param *input)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012012{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012013 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012014 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070012015 struct scheduler_msg message = {0};
Jeff Johnson4c6d40f2019-02-22 20:49:56 -080012016 struct rssi_monitor_param *req_msg;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012017
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012018 SME_ENTER();
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012019 req_msg = qdf_mem_malloc(sizeof(*req_msg));
Arif Hussain0ef77082018-10-10 16:42:53 -070012020 if (!req_msg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012021 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012022
12023 *req_msg = *input;
12024
12025 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012026 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012027 sme_err("sme_acquire_global_lock failed!(status=%d)", status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012028 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012029 return status;
12030 }
12031
12032 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080012033 message.bodyptr = req_msg;
12034 message.type = WMA_SET_RSSI_MONITOR_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053012035 status = scheduler_post_message(QDF_MODULE_ID_SME,
12036 QDF_MODULE_ID_WMA,
12037 QDF_MODULE_ID_WMA, &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012038 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012039 sme_err("scheduler_post_msg failed!(err=%d)", status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012040 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012041 }
12042 sme_release_global_lock(&mac->sme);
12043
12044 return status;
12045}
12046
Qiwei Caie689a262018-07-26 15:50:22 +080012047QDF_STATUS sme_set_rssi_threshold_breached_cb(mac_handle_t mac_handle,
12048 rssi_threshold_breached_cb cb)
12049{
12050 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012051 struct mac_context *mac;
Qiwei Caie689a262018-07-26 15:50:22 +080012052
12053 mac = MAC_CONTEXT(mac_handle);
12054 if (!mac) {
12055 sme_err("Invalid mac context");
12056 return QDF_STATUS_E_INVAL;
12057 }
12058
12059 status = sme_acquire_global_lock(&mac->sme);
12060 if (!QDF_IS_STATUS_SUCCESS(status)) {
12061 sme_err("sme_acquire_global_lock failed!(status=%d)",
12062 status);
12063 return status;
12064 }
12065
12066 mac->sme.rssi_threshold_breached_cb = cb;
12067 sme_release_global_lock(&mac->sme);
12068 return status;
12069}
12070#endif /* FEATURE_RSSI_MONITOR */
12071
12072QDF_STATUS sme_reset_rssi_threshold_breached_cb(mac_handle_t mac_handle)
12073{
12074 return sme_set_rssi_threshold_breached_cb(mac_handle, NULL);
12075}
12076
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -070012077static enum band_info sme_get_connected_roaming_vdev_band(void)
12078{
12079 enum band_info band = BAND_ALL;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012080 struct mac_context *mac = sme_get_mac_context();
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -070012081 struct csr_roam_session *session;
12082 uint8_t session_id, channel;
12083
12084 if (!mac) {
12085 sme_debug("MAC Context is NULL");
12086 return band;
12087 }
12088 session_id = csr_get_roam_enabled_sta_sessionid(mac);
Srinivas Girigowdad8697d42019-03-08 15:34:39 -080012089 if (session_id != WLAN_UMAC_VDEV_ID_MAX) {
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -070012090 session = CSR_GET_SESSION(mac, session_id);
12091 channel = session->connectedProfile.operationChannel;
12092 band = csr_get_rf_band(channel);
12093 return band;
12094 }
12095
12096 return band;
12097}
12098
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012099/*
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +053012100 * sme_pdev_set_pcl() - Send WMI_PDEV_SET_PCL_CMDID to the WMA
Jeff Johnsonc7309062018-11-09 20:59:42 -080012101 * @mac_handle: Handle returned by macOpen
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012102 * @msg: PCL channel list and length structure
12103 *
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +053012104 * Sends the command to WMA to send WMI_PDEV_SET_PCL_CMDID to FW
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012105 * Return: QDF_STATUS_SUCCESS on successful posting
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012106 */
Krunal Soni8a090df2018-05-03 15:02:54 -070012107QDF_STATUS sme_pdev_set_pcl(struct policy_mgr_pcl_list *msg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012108{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012109 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012110 struct mac_context *mac = sme_get_mac_context();
Rajeev Kumar37d478b2017-04-17 16:59:28 -070012111 struct scheduler_msg message = {0};
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -070012112 struct set_pcl_req *req_msg;
12113 uint32_t i;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012114
Krunal Soni3fa80e22018-01-09 14:16:02 -080012115 if (!mac) {
12116 sme_err("mac is NULL");
12117 return QDF_STATUS_E_FAILURE;
12118 }
Krunal Soni8a090df2018-05-03 15:02:54 -070012119
12120 if (!msg) {
12121 sme_err("msg is NULL");
12122 return QDF_STATUS_E_FAILURE;
12123 }
12124
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -070012125 req_msg = qdf_mem_malloc(sizeof(*req_msg));
Arif Hussain0ef77082018-10-10 16:42:53 -070012126 if (!req_msg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012127 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012128
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -070012129 req_msg->band = BAND_ALL;
12130 if (CSR_IS_ROAM_INTRA_BAND_ENABLED(mac)) {
12131 req_msg->band = sme_get_connected_roaming_vdev_band();
12132 sme_debug("Connected STA band %d", req_msg->band);
12133 }
Krunal Soni8a090df2018-05-03 15:02:54 -070012134 for (i = 0; i < msg->pcl_len; i++) {
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -070012135 req_msg->chan_weights.pcl_list[i] = msg->pcl_list[i];
12136 req_msg->chan_weights.weight_list[i] = msg->weight_list[i];
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +053012137 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012138
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -070012139 req_msg->chan_weights.pcl_len = msg->pcl_len;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012140
12141 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012142 if (status != QDF_STATUS_SUCCESS) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012143 sme_err("sme_acquire_global_lock failed!(status=%d)", status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012144 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012145 return status;
12146 }
12147
12148 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080012149 message.bodyptr = req_msg;
12150 message.type = SIR_HAL_PDEV_SET_PCL_TO_FW;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053012151 status = scheduler_post_message(QDF_MODULE_ID_SME,
12152 QDF_MODULE_ID_WMA,
12153 QDF_MODULE_ID_WMA, &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012154 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012155 sme_err("scheduler_post_msg failed!(err=%d)", status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012156 qdf_mem_free(req_msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012157 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012158 }
12159 sme_release_global_lock(&mac->sme);
12160
12161 return status;
12162}
12163
12164/*
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +053012165 * sme_pdev_set_hw_mode() - Send WMI_PDEV_SET_HW_MODE_CMDID to the WMA
Jeff Johnsonc7309062018-11-09 20:59:42 -080012166 * @mac_handle: Handle returned by macOpen
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012167 * @msg: HW mode structure containing hw mode and callback details
12168 *
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +053012169 * Sends the command to CSR to send WMI_PDEV_SET_HW_MODE_CMDID to FW
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012170 * Return: QDF_STATUS_SUCCESS on successful posting
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012171 */
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -080012172QDF_STATUS sme_pdev_set_hw_mode(struct policy_mgr_hw_mode msg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012173{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012174 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012175 struct mac_context *mac = sme_get_mac_context();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012176 tSmeCmd *cmd = NULL;
12177
Krunal Soni3fa80e22018-01-09 14:16:02 -080012178 if (!mac) {
12179 sme_err("mac is NULL");
12180 return QDF_STATUS_E_FAILURE;
12181 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012182 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012183 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012184 sme_err("Failed to acquire lock");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012185 return QDF_STATUS_E_RESOURCES;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012186 }
12187
Krunal Soni78618d92017-02-14 21:46:31 -080012188 cmd = csr_get_command_buffer(mac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012189 if (!cmd) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012190 sme_err("Get command buffer failed");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012191 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012192 return QDF_STATUS_E_NULL_VALUE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012193 }
12194
12195 cmd->command = e_sme_command_set_hw_mode;
Ganesh Kondabattiniae1c6a22017-05-02 18:02:11 +053012196 cmd->sessionId = msg.session_id;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012197 cmd->u.set_hw_mode_cmd.hw_mode_index = msg.hw_mode_index;
12198 cmd->u.set_hw_mode_cmd.set_hw_mode_cb = msg.set_hw_mode_cb;
Chandrasekaran, Manishekaref70c0d2015-10-20 19:54:55 +053012199 cmd->u.set_hw_mode_cmd.reason = msg.reason;
12200 cmd->u.set_hw_mode_cmd.session_id = msg.session_id;
Tushnim Bhattacharyyaeab33dd2017-11-15 15:20:02 -080012201 cmd->u.set_hw_mode_cmd.next_action = msg.next_action;
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -080012202 cmd->u.set_hw_mode_cmd.context = msg.context;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012203
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012204 sme_debug("Queuing set hw mode to CSR, session: %d reason: %d",
Chandrasekaran, Manishekarce2172e2016-02-18 16:12:43 +053012205 cmd->u.set_hw_mode_cmd.session_id,
12206 cmd->u.set_hw_mode_cmd.reason);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012207 csr_queue_sme_command(mac, cmd, false);
12208
12209 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012210 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012211}
12212
12213/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012214 * sme_nss_update_request() - Send beacon templete update to FW with new
12215 * nss value
Jeff Johnsonc7309062018-11-09 20:59:42 -080012216 * @mac_handle: Handle returned by macOpen
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012217 * @vdev_id: the session id
12218 * @new_nss: the new nss value
12219 * @cback: hdd callback
12220 * @next_action: next action to happen at policy mgr after beacon update
Liangwei Dong1ba99482018-10-19 02:57:29 -040012221 * @original_vdev_id: original request hwmode change vdev id
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012222 *
12223 * Sends the command to CSR to send to PE
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012224 * Return: QDF_STATUS_SUCCESS on successful posting
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012225 */
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -080012226QDF_STATUS sme_nss_update_request(uint32_t vdev_id,
12227 uint8_t new_nss, policy_mgr_nss_update_cback cback,
12228 uint8_t next_action, struct wlan_objmgr_psoc *psoc,
Liangwei Dong1ba99482018-10-19 02:57:29 -040012229 enum policy_mgr_conn_update_reason reason,
12230 uint32_t original_vdev_id)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012231{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012232 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012233 struct mac_context *mac = sme_get_mac_context();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012234 tSmeCmd *cmd = NULL;
12235
Krunal Soni3fa80e22018-01-09 14:16:02 -080012236 if (!mac) {
12237 sme_err("mac is null");
12238 return status;
12239 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012240 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012241 if (QDF_IS_STATUS_SUCCESS(status)) {
Krunal Soni78618d92017-02-14 21:46:31 -080012242 cmd = csr_get_command_buffer(mac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012243 if (!cmd) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012244 sme_err("Get command buffer failed");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012245 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012246 return QDF_STATUS_E_NULL_VALUE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012247 }
12248 cmd->command = e_sme_command_nss_update;
12249 /* Sessionized modules may require this info */
12250 cmd->sessionId = vdev_id;
12251 cmd->u.nss_update_cmd.new_nss = new_nss;
12252 cmd->u.nss_update_cmd.session_id = vdev_id;
12253 cmd->u.nss_update_cmd.nss_update_cb = cback;
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -080012254 cmd->u.nss_update_cmd.context = psoc;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012255 cmd->u.nss_update_cmd.next_action = next_action;
Chandrasekaran, Manishekarce2172e2016-02-18 16:12:43 +053012256 cmd->u.nss_update_cmd.reason = reason;
Liangwei Dong1ba99482018-10-19 02:57:29 -040012257 cmd->u.nss_update_cmd.original_vdev_id = original_vdev_id;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012258
Liangwei Dong1ba99482018-10-19 02:57:29 -040012259 sme_debug("Queuing e_sme_command_nss_update to CSR:vdev (%d %d) ss %d r %d",
12260 vdev_id, original_vdev_id, new_nss, reason);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012261 csr_queue_sme_command(mac, cmd, false);
12262 sme_release_global_lock(&mac->sme);
12263 }
12264 return status;
12265}
12266
12267/**
12268 * sme_soc_set_dual_mac_config() - Set dual mac configurations
Jeff Johnsonc7309062018-11-09 20:59:42 -080012269 * @mac_handle: Handle returned by macOpen
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012270 * @msg: Structure containing the dual mac config parameters
12271 *
12272 * Queues configuration information to CSR to configure
12273 * WLAN firmware for the dual MAC features
12274 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012275 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012276 */
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -080012277QDF_STATUS sme_soc_set_dual_mac_config(struct policy_mgr_dual_mac_config msg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012278{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012279 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012280 struct mac_context *mac = sme_get_mac_context();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012281 tSmeCmd *cmd;
12282
Krunal Soni3fa80e22018-01-09 14:16:02 -080012283 if (!mac) {
12284 sme_err("mac is null");
12285 return QDF_STATUS_E_FAILURE;
12286 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012287 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012288 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012289 sme_err("Failed to acquire lock");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012290 return QDF_STATUS_E_RESOURCES;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012291 }
12292
Krunal Soni78618d92017-02-14 21:46:31 -080012293 cmd = csr_get_command_buffer(mac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012294 if (!cmd) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012295 sme_err("Get command buffer failed");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012296 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012297 return QDF_STATUS_E_NULL_VALUE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012298 }
12299
12300 cmd->command = e_sme_command_set_dual_mac_config;
12301 cmd->u.set_dual_mac_cmd.scan_config = msg.scan_config;
12302 cmd->u.set_dual_mac_cmd.fw_mode_config = msg.fw_mode_config;
12303 cmd->u.set_dual_mac_cmd.set_dual_mac_cb = msg.set_dual_mac_cb;
12304
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012305 sme_debug("set_dual_mac_config scan_config: %x fw_mode_config: %x",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012306 cmd->u.set_dual_mac_cmd.scan_config,
12307 cmd->u.set_dual_mac_cmd.fw_mode_config);
12308 csr_queue_sme_command(mac, cmd, false);
12309
12310 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012311 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012312}
12313
Ravi Joshi9e891ba2015-11-09 19:03:46 -080012314#ifdef FEATURE_LFR_SUBNET_DETECTION
12315/**
12316 * sme_gateway_param_update() - to update gateway parameters with WMA
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080012317 * @mac_handle: Opaque handle to the global MAC context
Ravi Joshi9e891ba2015-11-09 19:03:46 -080012318 * @gw_params: request parameters from HDD
12319 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012320 * Return: QDF_STATUS
Ravi Joshi9e891ba2015-11-09 19:03:46 -080012321 *
12322 * This routine will update gateway parameters to WMA
12323 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080012324QDF_STATUS sme_gateway_param_update(mac_handle_t mac_handle,
Jeff Johnson38d0ce62019-02-22 17:05:14 -080012325 struct gateway_update_req_param *gw_params)
Ravi Joshi9e891ba2015-11-09 19:03:46 -080012326{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012327 QDF_STATUS qdf_status;
Rajeev Kumar37d478b2017-04-17 16:59:28 -070012328 struct scheduler_msg message = {0};
Jeff Johnson38d0ce62019-02-22 17:05:14 -080012329 struct gateway_update_req_param *request_buf;
Ravi Joshi9e891ba2015-11-09 19:03:46 -080012330
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012331 request_buf = qdf_mem_malloc(sizeof(*request_buf));
Arif Hussain0ef77082018-10-10 16:42:53 -070012332 if (!request_buf)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012333 return QDF_STATUS_E_NOMEM;
Ravi Joshi9e891ba2015-11-09 19:03:46 -080012334
12335 *request_buf = *gw_params;
12336
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080012337 message.type = WMA_GW_PARAM_UPDATE_REQ;
12338 message.reserved = 0;
12339 message.bodyptr = request_buf;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053012340 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
12341 QDF_MODULE_ID_WMA,
12342 QDF_MODULE_ID_WMA, &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012343 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012344 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053012345 "Not able to post WMA_GW_PARAM_UPDATE_REQ message to HAL");
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012346 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012347 return QDF_STATUS_E_FAILURE;
Ravi Joshi9e891ba2015-11-09 19:03:46 -080012348 }
12349
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012350 return QDF_STATUS_SUCCESS;
Ravi Joshi9e891ba2015-11-09 19:03:46 -080012351}
12352#endif /* FEATURE_LFR_SUBNET_DETECTION */
12353
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012354/**
Archana Ramachandrana20ef812015-11-13 16:12:13 -080012355 * sme_soc_set_antenna_mode() - set antenna mode
Jeff Johnsonc7309062018-11-09 20:59:42 -080012356 * @mac_handle: Handle returned by macOpen
Archana Ramachandrana20ef812015-11-13 16:12:13 -080012357 * @msg: Structure containing the antenna mode parameters
12358 *
12359 * Send the command to CSR to send
12360 * WMI_SOC_SET_ANTENNA_MODE_CMDID to FW
12361 *
12362 * Return: QDF_STATUS
12363 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080012364QDF_STATUS sme_soc_set_antenna_mode(mac_handle_t mac_handle,
12365 struct sir_antenna_mode_param *msg)
Archana Ramachandrana20ef812015-11-13 16:12:13 -080012366{
12367 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012368 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Archana Ramachandrana20ef812015-11-13 16:12:13 -080012369 tSmeCmd *cmd;
12370
Jeff Johnson038efe72019-03-18 13:39:31 -070012371 if (!msg) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012372 sme_err("antenna mode mesg is NULL");
Archana Ramachandrana20ef812015-11-13 16:12:13 -080012373 return QDF_STATUS_E_FAILURE;
12374 }
12375
12376 status = sme_acquire_global_lock(&mac->sme);
12377 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012378 sme_err("Failed to acquire lock");
Archana Ramachandrana20ef812015-11-13 16:12:13 -080012379 return QDF_STATUS_E_RESOURCES;
12380 }
12381
Krunal Soni78618d92017-02-14 21:46:31 -080012382 cmd = csr_get_command_buffer(mac);
Archana Ramachandrana20ef812015-11-13 16:12:13 -080012383 if (!cmd) {
12384 sme_release_global_lock(&mac->sme);
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012385 sme_err("Get command buffer failed");
Archana Ramachandrana20ef812015-11-13 16:12:13 -080012386 return QDF_STATUS_E_NULL_VALUE;
12387 }
12388
12389 cmd->command = e_sme_command_set_antenna_mode;
12390 cmd->u.set_antenna_mode_cmd = *msg;
12391
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012392 sme_debug("Antenna mode rx_chains: %d tx_chains: %d",
Archana Ramachandrana20ef812015-11-13 16:12:13 -080012393 cmd->u.set_antenna_mode_cmd.num_rx_chains,
12394 cmd->u.set_antenna_mode_cmd.num_tx_chains);
12395
12396 csr_queue_sme_command(mac, cmd, false);
12397 sme_release_global_lock(&mac->sme);
12398
12399 return QDF_STATUS_SUCCESS;
12400}
12401
12402/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012403 * sme_set_peer_authorized() - call peer authorized callback
12404 * @peer_addr: peer mac address
12405 * @auth_cb: auth callback
12406 * @vdev_id: vdev id
12407 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +053012408 * Return: QDF Status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012409 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012410QDF_STATUS sme_set_peer_authorized(uint8_t *peer_addr,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012411 sme_peer_authorized_fp auth_cb,
12412 uint32_t vdev_id)
12413{
12414 void *wma_handle;
12415
Anurag Chouhan6d760662016-02-20 16:05:43 +053012416 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012417 if (!wma_handle) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012418 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012419 "wma handle is NULL");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012420 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012421 }
12422
12423 wma_set_peer_authorized_cb(wma_handle, auth_cb);
12424 return wma_set_peer_param(wma_handle, peer_addr, WMI_PEER_AUTHORIZE,
12425 1, vdev_id);
12426}
12427
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012428/**
Jeff Johnson01f2c232018-11-21 19:17:44 -080012429 * sme_setdef_dot11mode() - Updates mac with default dot11mode
Jeff Johnsonc7309062018-11-09 20:59:42 -080012430 * @mac_handle: Global MAC pointer
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012431 *
12432 * Return: NULL.
12433 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080012434void sme_setdef_dot11mode(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012435{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012436 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053012437
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012438 csr_set_default_dot11_mode(mac_ctx);
12439}
12440
12441/**
Krishna Kumaar Natarajan052c6e62015-09-28 15:32:55 -070012442 * sme_update_tgt_services() - update the target services config.
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080012443 * @mac_handle: Opaque handle to the global MAC context.
Krishna Kumaar Natarajan052c6e62015-09-28 15:32:55 -070012444 * @cfg: wma_tgt_services parameters.
12445 *
12446 * update the target services config.
12447 *
12448 * Return: None.
12449 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080012450void sme_update_tgt_services(mac_handle_t mac_handle,
12451 struct wma_tgt_services *cfg)
Krishna Kumaar Natarajan052c6e62015-09-28 15:32:55 -070012452{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012453 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Krishna Kumaar Natarajan052c6e62015-09-28 15:32:55 -070012454
Liangwei Dong0da14262018-07-03 03:30:23 -040012455 mac_ctx->obss_scan_offload = cfg->obss_scan_offload;
12456 sme_debug("obss_scan_offload: %d", mac_ctx->obss_scan_offload);
Krunal Sonie6a1cda2017-09-27 15:23:02 -070012457 mac_ctx->lteCoexAntShare = cfg->lte_coex_ant_share;
Krishna Kumaar Natarajan052c6e62015-09-28 15:32:55 -070012458 mac_ctx->beacon_offload = cfg->beacon_offload;
mukul sharma72c8b222015-09-04 17:02:01 +053012459 mac_ctx->pmf_offload = cfg->pmf_offload;
Abhishek Singhe4a1f882017-08-10 17:59:44 +053012460 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
mukul sharma72c8b222015-09-04 17:02:01 +053012461 FL("mac_ctx->pmf_offload: %d"), mac_ctx->pmf_offload);
Vignesh Viswanathan731186f2017-09-18 13:47:37 +053012462 mac_ctx->is_fils_roaming_supported =
12463 cfg->is_fils_roaming_supported;
Vignesh Viswanathan694e28e2018-01-18 20:53:57 +053012464 mac_ctx->is_11k_offload_supported =
12465 cfg->is_11k_offload_supported;
12466 sme_debug("pmf_offload: %d fils_roam support %d 11k_offload %d",
12467 mac_ctx->pmf_offload, mac_ctx->is_fils_roaming_supported,
12468 mac_ctx->is_11k_offload_supported);
Arunk Khandavallica56d4b2018-11-29 15:46:00 +053012469 mac_ctx->bcn_reception_stats = cfg->bcn_reception_stats;
Krishna Kumaar Natarajan052c6e62015-09-28 15:32:55 -070012470}
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053012471
Chandrasekaran, Manishekar2859de42016-02-11 16:17:38 +053012472/**
12473 * sme_is_session_id_valid() - Check if the session id is valid
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080012474 * @mac_handle: Opaque handle to the global MAC context
Chandrasekaran, Manishekar2859de42016-02-11 16:17:38 +053012475 * @session_id: Session id
12476 *
12477 * Checks if the session id is valid or not
12478 *
12479 * Return: True is the session id is valid, false otherwise
12480 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080012481bool sme_is_session_id_valid(mac_handle_t mac_handle, uint32_t session_id)
Chandrasekaran, Manishekar2859de42016-02-11 16:17:38 +053012482{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012483 struct mac_context *mac;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053012484
Jeff Johnson038efe72019-03-18 13:39:31 -070012485 if (mac_handle) {
Jeff Johnsona0619e42018-11-28 17:43:00 -080012486 mac = MAC_CONTEXT(mac_handle);
Pragaspathi Thilagarajb11dbe42018-07-23 16:42:17 +053012487 } else {
Chandrasekaran, Manishekard3cb4772016-02-22 22:21:10 +053012488 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
12489 "%s: null mac pointer", __func__);
Chandrasekaran, Manishekar2859de42016-02-11 16:17:38 +053012490 return false;
12491 }
12492
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053012493 if (CSR_IS_SESSION_VALID(mac, session_id))
Chandrasekaran, Manishekar2859de42016-02-11 16:17:38 +053012494 return true;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053012495
12496 return false;
Chandrasekaran, Manishekar2859de42016-02-11 16:17:38 +053012497}
12498
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053012499#ifdef FEATURE_WLAN_TDLS
12500
12501/**
12502 * sme_get_opclass() - determine operating class
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080012503 * @mac_handle: Opaque handle to the global MAC context
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053012504 * @channel: channel id
12505 * @bw_offset: bandwidth offset
12506 * @opclass: pointer to operating class
12507 *
12508 * Function will determine operating class from regdm_get_opclass_from_channel
12509 *
12510 * Return: none
12511 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080012512void sme_get_opclass(mac_handle_t mac_handle, uint8_t channel,
12513 uint8_t bw_offset, uint8_t *opclass)
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053012514{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012515 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053012516
12517 /* redgm opclass table contains opclass for 40MHz low primary,
12518 * 40MHz high primary and 20MHz. No support for 80MHz yet. So
12519 * first we will check if bit for 40MHz is set and if so find
12520 * matching opclass either with low primary or high primary
12521 * (a channel would never be in both) and then search for opclass
12522 * matching 20MHz, else for any BW.
12523 */
12524 if (bw_offset & (1 << BW_40_OFFSET_BIT)) {
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070012525 *opclass = wlan_reg_dmn_get_opclass_from_channel(
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053012526 mac_ctx->scan.countryCodeCurrent,
12527 channel, BW40_LOW_PRIMARY);
12528 if (!(*opclass)) {
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070012529 *opclass = wlan_reg_dmn_get_opclass_from_channel(
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053012530 mac_ctx->scan.countryCodeCurrent,
12531 channel, BW40_HIGH_PRIMARY);
12532 }
12533 } else if (bw_offset & (1 << BW_20_OFFSET_BIT)) {
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070012534 *opclass = wlan_reg_dmn_get_opclass_from_channel(
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053012535 mac_ctx->scan.countryCodeCurrent,
12536 channel, BW20);
12537 } else {
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070012538 *opclass = wlan_reg_dmn_get_opclass_from_channel(
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053012539 mac_ctx->scan.countryCodeCurrent,
12540 channel, BWALL);
12541 }
12542}
12543#endif
Ryan Hsu3c8f79f2015-12-02 16:45:09 -080012544
Sandeep Puligillae0875662016-02-12 16:09:21 -080012545/**
Anurag Chouhanbf5e0e22016-09-12 12:54:09 +053012546 * sme_set_fw_test() - set fw test
12547 * @fw_test: fw test param
12548 *
12549 * Return: Return QDF_STATUS, otherwise appropriate failure code
12550 */
12551QDF_STATUS sme_set_fw_test(struct set_fwtest_params *fw_test)
12552{
12553 void *wma_handle;
12554
12555 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
12556 if (!wma_handle) {
12557 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
12558 "wma handle is NULL");
12559 return QDF_STATUS_E_FAILURE;
12560 }
Bala Venkateshe45f03d2019-03-25 16:00:42 +053012561
12562 return wma_process_fw_test_cmd(wma_handle, fw_test);
Anurag Chouhanbf5e0e22016-09-12 12:54:09 +053012563}
12564
12565/**
Sandeep Puligillae0875662016-02-12 16:09:21 -080012566 * sme_ht40_stop_obss_scan() - ht40 obss stop scan
Jeff Johnsonc7309062018-11-09 20:59:42 -080012567 * @mac_handle: mac handel
Sandeep Puligillae0875662016-02-12 16:09:21 -080012568 * @vdev_id: vdev identifier
12569 *
12570 * Return: Return QDF_STATUS, otherwise appropriate failure code
12571 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080012572QDF_STATUS sme_ht40_stop_obss_scan(mac_handle_t mac_handle, uint32_t vdev_id)
Sandeep Puligillae0875662016-02-12 16:09:21 -080012573{
12574 void *wma_handle;
12575
12576 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
12577 if (!wma_handle) {
12578 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
12579 "wma handle is NULL");
12580 return QDF_STATUS_E_FAILURE;
12581 }
12582 wma_ht40_stop_obss_scan(wma_handle, vdev_id);
12583 return QDF_STATUS_SUCCESS;
12584}
Archana Ramachandran20d2e232016-02-11 16:58:40 -080012585
12586/**
12587 * sme_update_mimo_power_save() - Update MIMO power save
12588 * configuration
Jeff Johnsonc7309062018-11-09 20:59:42 -080012589 * @mac_handle: The handle returned by macOpen
Archana Ramachandran20d2e232016-02-11 16:58:40 -080012590 * @is_ht_smps_enabled: enable/disable ht smps
12591 * @ht_smps_mode: smps mode disabled/static/dynamic
Archana Ramachandranfec24812016-02-16 16:31:56 -080012592 * @send_smps_action: flag to send smps force mode command
12593 * to FW
Archana Ramachandran20d2e232016-02-11 16:58:40 -080012594 *
12595 * Return: QDF_STATUS if SME update mimo power save
Jeff Johnson698eacd2018-05-12 17:00:03 -070012596 * configuration success else failure status
Archana Ramachandran20d2e232016-02-11 16:58:40 -080012597 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080012598QDF_STATUS sme_update_mimo_power_save(mac_handle_t mac_handle,
Archana Ramachandran20d2e232016-02-11 16:58:40 -080012599 uint8_t is_ht_smps_enabled,
Archana Ramachandranfec24812016-02-16 16:31:56 -080012600 uint8_t ht_smps_mode,
12601 bool send_smps_action)
Archana Ramachandran20d2e232016-02-11 16:58:40 -080012602{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012603 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Archana Ramachandranfec24812016-02-16 16:31:56 -080012604
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012605 sme_debug("SMPS enable: %d mode: %d send action: %d",
Archana Ramachandranfec24812016-02-16 16:31:56 -080012606 is_ht_smps_enabled, ht_smps_mode,
12607 send_smps_action);
Vignesh Viswanathanddc89e52018-11-02 18:43:42 +053012608 mac_ctx->mlme_cfg->ht_caps.enable_smps =
Archana Ramachandran20d2e232016-02-11 16:58:40 -080012609 is_ht_smps_enabled;
Vignesh Viswanathanddc89e52018-11-02 18:43:42 +053012610 mac_ctx->mlme_cfg->ht_caps.smps = ht_smps_mode;
Archana Ramachandranfec24812016-02-16 16:31:56 -080012611 mac_ctx->roam.configParam.send_smps_action =
12612 send_smps_action;
Archana Ramachandran20d2e232016-02-11 16:58:40 -080012613
12614 return QDF_STATUS_SUCCESS;
12615}
12616
Abhinav Kumardbbfd2c2019-05-07 12:22:06 +053012617#ifdef WLAN_BCN_RECV_FEATURE
12618QDF_STATUS sme_handle_bcn_recv_start(mac_handle_t mac_handle,
12619 uint32_t vdev_id)
12620{
12621 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
12622 struct csr_roam_session *session;
12623 QDF_STATUS status;
12624
12625 if (!CSR_IS_SESSION_VALID(mac_ctx, vdev_id)) {
12626 sme_err("CSR session not valid: %d", vdev_id);
12627 return QDF_STATUS_E_FAILURE;
12628 }
12629
12630 session = CSR_GET_SESSION(mac_ctx, vdev_id);
12631 if (!session) {
12632 sme_err("vdev_id %d not found", vdev_id);
12633 return QDF_STATUS_E_FAILURE;
12634 }
12635
12636 status = sme_acquire_global_lock(&mac_ctx->sme);
12637 if (QDF_IS_STATUS_SUCCESS(status)) {
12638 if (session->is_bcn_recv_start) {
12639 sme_release_global_lock(&mac_ctx->sme);
12640 sme_err("Beacon receive already started");
12641 return QDF_STATUS_SUCCESS;
12642 }
12643 session->is_bcn_recv_start = true;
12644 sme_release_global_lock(&mac_ctx->sme);
12645
12646 /*
12647 * Remove beacon filter. It allows fw to send all
12648 * beacons of connected AP to driver.
12649 */
12650 status = sme_remove_beacon_filter(mac_handle, vdev_id);
12651 if (!QDF_IS_STATUS_SUCCESS(status)) {
12652 status = sme_acquire_global_lock(&mac_ctx->sme);
12653 if (QDF_IS_STATUS_SUCCESS(status)) {
12654 session->is_bcn_recv_start = false;
12655 sme_release_global_lock(&mac_ctx->sme);
12656 }
12657 sme_err("sme_remove_beacon_filter() failed");
12658 }
12659 }
12660
12661 return status;
12662}
12663#endif
12664
Archana Ramachandran20d2e232016-02-11 16:58:40 -080012665/**
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012666 * sme_add_beacon_filter() - set the beacon filter configuration
Jeff Johnsonc7309062018-11-09 20:59:42 -080012667 * @mac_handle: The handle returned by macOpen
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012668 * @session_id: session id
12669 * @ie_map: bitwise array of IEs
12670 *
12671 * Return: Return QDF_STATUS, otherwise appropriate failure code
12672 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080012673QDF_STATUS sme_add_beacon_filter(mac_handle_t mac_handle,
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012674 uint32_t session_id,
12675 uint32_t *ie_map)
12676{
Rajeev Kumar37d478b2017-04-17 16:59:28 -070012677 struct scheduler_msg message = {0};
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012678 QDF_STATUS qdf_status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012679 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012680 struct beacon_filter_param *filter_param;
12681
12682 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012683 sme_err("CSR session not valid: %d", session_id);
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012684 return QDF_STATUS_E_FAILURE;
12685 }
12686
12687 filter_param = qdf_mem_malloc(sizeof(*filter_param));
Arif Hussain0ef77082018-10-10 16:42:53 -070012688 if (!filter_param)
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012689 return QDF_STATUS_E_FAILURE;
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012690
12691 filter_param->vdev_id = session_id;
12692
12693 qdf_mem_copy(filter_param->ie_map, ie_map,
12694 BCN_FLT_MAX_ELEMS_IE_LIST * sizeof(uint32_t));
12695
12696 message.type = WMA_ADD_BCN_FILTER_CMDID;
12697 message.bodyptr = filter_param;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053012698 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
12699 QDF_MODULE_ID_WMA,
12700 QDF_MODULE_ID_WMA,
12701 &message);
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012702 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
12703 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
12704 "%s: Not able to post msg to WDA!",
12705 __func__);
12706
12707 qdf_mem_free(filter_param);
12708 }
12709 return qdf_status;
12710}
12711
12712/**
12713 * sme_remove_beacon_filter() - set the beacon filter configuration
Jeff Johnsonc7309062018-11-09 20:59:42 -080012714 * @mac_handle: The handle returned by macOpen
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012715 * @session_id: session id
12716 *
12717 * Return: Return QDF_STATUS, otherwise appropriate failure code
12718 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080012719QDF_STATUS sme_remove_beacon_filter(mac_handle_t mac_handle,
12720 uint32_t session_id)
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012721{
Rajeev Kumar37d478b2017-04-17 16:59:28 -070012722 struct scheduler_msg message = {0};
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012723 QDF_STATUS qdf_status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012724 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012725 struct beacon_filter_param *filter_param;
12726
12727 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012728 sme_err("CSR session not valid: %d", session_id);
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012729 return QDF_STATUS_E_FAILURE;
12730 }
12731
12732 filter_param = qdf_mem_malloc(sizeof(*filter_param));
Arif Hussain0ef77082018-10-10 16:42:53 -070012733 if (!filter_param)
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012734 return QDF_STATUS_E_FAILURE;
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012735
12736 filter_param->vdev_id = session_id;
12737
12738 message.type = WMA_REMOVE_BCN_FILTER_CMDID;
12739 message.bodyptr = filter_param;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053012740 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
12741 QDF_MODULE_ID_WMA,
12742 QDF_MODULE_ID_WMA,
12743 &message);
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012744 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
12745 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
12746 "%s: Not able to post msg to WDA!",
12747 __func__);
12748
12749 qdf_mem_free(filter_param);
12750 }
12751 return qdf_status;
12752}
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012753
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012754/**
Kondabattini, Ganesh3f2d02c2016-09-13 12:23:47 +053012755 * sme_send_disassoc_req_frame - send disassoc req
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080012756 * @mac_handle: Opaque handle to the global MAC context
Kondabattini, Ganesh3f2d02c2016-09-13 12:23:47 +053012757 * @session_id: session id
12758 * @peer_mac: peer mac address
12759 * @reason: reason for disassociation
12760 * wait_for_ack: wait for acknowledgment
12761 *
12762 * function to send disassoc request to lim
12763 *
12764 * return: none
12765 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080012766void sme_send_disassoc_req_frame(mac_handle_t mac_handle, uint8_t session_id,
12767 uint8_t *peer_mac, uint16_t reason,
12768 uint8_t wait_for_ack)
Kondabattini, Ganesh3f2d02c2016-09-13 12:23:47 +053012769{
12770 struct sme_send_disassoc_frm_req *msg;
12771 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Kondabattini, Ganesh3f2d02c2016-09-13 12:23:47 +053012772
Jeff Johnson0e1e7682019-02-20 13:36:04 -080012773 msg = qdf_mem_malloc(sizeof(*msg));
Arif Hussain0ef77082018-10-10 16:42:53 -070012774 if (!msg)
Kondabattini, Ganesh3f2d02c2016-09-13 12:23:47 +053012775 return;
12776
Jeff Johnson0e1e7682019-02-20 13:36:04 -080012777 msg->msg_type = eWNI_SME_SEND_DISASSOC_FRAME;
12778 msg->length = sizeof(*msg);
12779 msg->session_id = session_id;
12780 qdf_mem_copy(msg->peer_mac, peer_mac, QDF_MAC_ADDR_SIZE);
12781 msg->reason = reason;
12782 msg->wait_for_ack = wait_for_ack;
Kondabattini, Ganesh3f2d02c2016-09-13 12:23:47 +053012783
Rajeev Kumard138ac52017-01-30 18:38:37 -080012784 qdf_status = umac_send_mb_message_to_mac(msg);
Jeff Johnson0e1e7682019-02-20 13:36:04 -080012785 if (QDF_IS_STATUS_ERROR(qdf_status))
12786 sme_err("umac_send_mb_message_to_mac failed, %d",
12787 qdf_status);
Kondabattini, Ganesh3f2d02c2016-09-13 12:23:47 +053012788}
12789
Nachiket Kukade177b5b02018-05-22 20:52:17 +053012790#ifdef FEATURE_WLAN_APF
Jeff Johnsonc7309062018-11-09 20:59:42 -080012791QDF_STATUS sme_get_apf_capabilities(mac_handle_t mac_handle,
Nachiket Kukade177b5b02018-05-22 20:52:17 +053012792 apf_get_offload_cb callback,
12793 void *context)
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012794{
12795 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012796 struct mac_context * mac_ctx = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070012797 struct scheduler_msg cds_msg = {0};
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012798
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012799 SME_ENTER();
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012800
12801 status = sme_acquire_global_lock(&mac_ctx->sme);
12802 if (QDF_STATUS_SUCCESS == status) {
12803 /* Serialize the req through MC thread */
Nachiket Kukadee547a482018-05-22 16:43:30 +053012804 mac_ctx->sme.apf_get_offload_cb = callback;
12805 mac_ctx->sme.apf_get_offload_context = context;
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012806 cds_msg.bodyptr = NULL;
Nachiket Kukadee547a482018-05-22 16:43:30 +053012807 cds_msg.type = WDA_APF_GET_CAPABILITIES_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053012808 status = scheduler_post_message(QDF_MODULE_ID_SME,
12809 QDF_MODULE_ID_WMA,
12810 QDF_MODULE_ID_WMA, &cds_msg);
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012811 if (!QDF_IS_STATUS_SUCCESS(status)) {
12812 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Nachiket Kukadee547a482018-05-22 16:43:30 +053012813 FL("Post apf get offload msg fail"));
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012814 status = QDF_STATUS_E_FAILURE;
12815 }
12816 sme_release_global_lock(&mac_ctx->sme);
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012817 }
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +053012818
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012819 SME_EXIT();
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012820 return status;
12821}
12822
Jeff Johnsonc7309062018-11-09 20:59:42 -080012823QDF_STATUS sme_set_apf_instructions(mac_handle_t mac_handle,
Nachiket Kukadee547a482018-05-22 16:43:30 +053012824 struct sir_apf_set_offload *req)
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012825{
Nachiket Kukade4f686582018-11-19 19:18:27 +053012826 void *wma_handle;
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012827
Nachiket Kukade4f686582018-11-19 19:18:27 +053012828 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
12829 if (!wma_handle) {
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012830 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Nachiket Kukade4f686582018-11-19 19:18:27 +053012831 "wma handle is NULL");
12832 return QDF_STATUS_E_FAILURE;
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012833 }
Nachiket Kukade4f686582018-11-19 19:18:27 +053012834
12835 return wma_set_apf_instructions(wma_handle, req);
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012836}
12837
Jeff Johnsonc7309062018-11-09 20:59:42 -080012838QDF_STATUS sme_set_apf_enable_disable(mac_handle_t mac_handle, uint8_t vdev_id,
Nachiket Kukade177b5b02018-05-22 20:52:17 +053012839 bool apf_enable)
12840{
12841 void *wma_handle;
12842
12843 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
12844 if (!wma_handle) {
12845 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
12846 "wma handle is NULL");
12847 return QDF_STATUS_E_FAILURE;
12848 }
12849
12850 return wma_send_apf_enable_cmd(wma_handle, vdev_id, apf_enable);
12851}
12852
12853QDF_STATUS
Jeff Johnsonc7309062018-11-09 20:59:42 -080012854sme_apf_write_work_memory(mac_handle_t mac_handle,
Nachiket Kukade177b5b02018-05-22 20:52:17 +053012855 struct wmi_apf_write_memory_params *write_params)
12856{
12857 void *wma_handle;
12858
12859 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
12860 if (!wma_handle) {
12861 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
12862 "wma handle is NULL");
12863 return QDF_STATUS_E_FAILURE;
12864 }
12865
12866 return wma_send_apf_write_work_memory_cmd(wma_handle, write_params);
12867}
12868
12869QDF_STATUS
Jeff Johnsonc7309062018-11-09 20:59:42 -080012870sme_apf_read_work_memory(mac_handle_t mac_handle,
Nachiket Kukade177b5b02018-05-22 20:52:17 +053012871 struct wmi_apf_read_memory_params *read_params,
12872 apf_read_mem_cb callback)
12873{
12874 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012875 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Nachiket Kukade177b5b02018-05-22 20:52:17 +053012876 void *wma_handle;
12877
12878 status = sme_acquire_global_lock(&mac->sme);
12879 if (QDF_IS_STATUS_SUCCESS(status)) {
12880 mac->sme.apf_read_mem_cb = callback;
12881 sme_release_global_lock(&mac->sme);
12882 } else {
12883 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
12884 FL("sme_acquire_global_lock failed"));
12885 }
12886
12887 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
12888 if (!wma_handle) {
12889 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
12890 "wma handle is NULL");
12891 return QDF_STATUS_E_FAILURE;
12892 }
12893
12894 return wma_send_apf_read_work_memory_cmd(wma_handle, read_params);
12895}
12896#endif /* FEATURE_WLAN_APF */
12897
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012898/**
Abhishek Singh1c676222016-05-09 14:20:28 +053012899 * sme_get_wni_dot11_mode() - return configured wni dot11mode
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080012900 * @mac_handle: Opaque handle to the global MAC context
Abhishek Singh1c676222016-05-09 14:20:28 +053012901 *
12902 * Return: wni dot11 mode.
12903 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080012904uint32_t sme_get_wni_dot11_mode(mac_handle_t mac_handle)
Abhishek Singh1c676222016-05-09 14:20:28 +053012905{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012906 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Abhishek Singh1c676222016-05-09 14:20:28 +053012907
12908 return csr_translate_to_wni_cfg_dot11_mode(mac_ctx,
12909 mac_ctx->roam.configParam.uCfgDot11Mode);
12910}
12911
12912/**
Manjunathappa Prakash59f861d2016-04-21 10:33:31 -070012913 * sme_create_mon_session() - post message to create PE session for monitormode
12914 * operation
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080012915 * @mac_handle: Opaque handle to the global MAC context
Manjunathappa Prakash59f861d2016-04-21 10:33:31 -070012916 * @bssid: pointer to bssid
Rajeev Kumar Sirasanagandlae3b59912018-08-24 15:53:31 +053012917 * @vdev_id: sme session id
Manjunathappa Prakash59f861d2016-04-21 10:33:31 -070012918 *
12919 * Return: QDF_STATUS_SUCCESS on success, non-zero error code on failure.
12920 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080012921QDF_STATUS sme_create_mon_session(mac_handle_t mac_handle, tSirMacAddr bss_id,
Rajeev Kumar Sirasanagandlae3b59912018-08-24 15:53:31 +053012922 uint8_t vdev_id)
Manjunathappa Prakash59f861d2016-04-21 10:33:31 -070012923{
12924 QDF_STATUS status = QDF_STATUS_E_FAILURE;
12925 struct sir_create_session *msg;
12926
12927 msg = qdf_mem_malloc(sizeof(*msg));
chenguo92af4bf2018-10-25 13:54:58 +080012928 if (msg) {
Manjunathappa Prakash59f861d2016-04-21 10:33:31 -070012929 msg->type = eWNI_SME_MON_INIT_SESSION;
Rajeev Kumar Sirasanagandlae3b59912018-08-24 15:53:31 +053012930 msg->vdev_id = vdev_id;
Manjunathappa Prakash59f861d2016-04-21 10:33:31 -070012931 msg->msg_len = sizeof(*msg);
12932 qdf_mem_copy(msg->bss_id.bytes, bss_id, QDF_MAC_ADDR_SIZE);
Rajeev Kumard138ac52017-01-30 18:38:37 -080012933 status = umac_send_mb_message_to_mac(msg);
Manjunathappa Prakash59f861d2016-04-21 10:33:31 -070012934 }
12935 return status;
12936}
Gupta, Kapil96c7f2f2016-04-25 19:13:41 +053012937
Jeff Johnsonb460dd72018-11-08 10:26:51 -080012938void sme_set_chan_info_callback(mac_handle_t mac_handle,
Kapil Gupta4f0c0c12017-02-07 15:21:15 +053012939 void (*callback)(struct scan_chan_info *chan_info))
12940{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012941 struct mac_context *mac;
Kapil Gupta4f0c0c12017-02-07 15:21:15 +053012942
Jeff Johnson038efe72019-03-18 13:39:31 -070012943 if (!mac_handle) {
Kapil Gupta4f0c0c12017-02-07 15:21:15 +053012944 QDF_ASSERT(0);
12945 return;
12946 }
Jeff Johnsona0619e42018-11-28 17:43:00 -080012947 mac = MAC_CONTEXT(mac_handle);
Kapil Gupta4f0c0c12017-02-07 15:21:15 +053012948 mac->chan_info_cb = callback;
12949}
12950
Gupta, Kapil96c7f2f2016-04-25 19:13:41 +053012951/**
Naveen Rawata410c5a2016-09-19 14:22:33 -070012952 * sme_set_vdev_ies_per_band() - sends the per band IEs to vdev
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080012953 * @mac_handle: Opaque handle to the global MAC context
Naveen Rawata410c5a2016-09-19 14:22:33 -070012954 * @vdev_id: vdev_id for which IE is targeted
12955 *
12956 * Return: None
12957 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080012958void sme_set_vdev_ies_per_band(mac_handle_t mac_handle, uint8_t vdev_id)
Naveen Rawata410c5a2016-09-19 14:22:33 -070012959{
Naveen Rawata410c5a2016-09-19 14:22:33 -070012960 struct sir_set_vdev_ies_per_band *p_msg;
12961 QDF_STATUS status = QDF_STATUS_E_FAILURE;
12962
12963 p_msg = qdf_mem_malloc(sizeof(*p_msg));
Arif Hussain0ef77082018-10-10 16:42:53 -070012964 if (!p_msg)
Naveen Rawata410c5a2016-09-19 14:22:33 -070012965 return;
Naveen Rawata410c5a2016-09-19 14:22:33 -070012966
12967 p_msg->vdev_id = vdev_id;
12968 p_msg->msg_type = eWNI_SME_SET_VDEV_IES_PER_BAND;
12969 p_msg->len = sizeof(*p_msg);
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012970 sme_debug("sending eWNI_SME_SET_VDEV_IES_PER_BAND: vdev_id: %d",
Naveen Rawata410c5a2016-09-19 14:22:33 -070012971 vdev_id);
Rajeev Kumard138ac52017-01-30 18:38:37 -080012972 status = umac_send_mb_message_to_mac(p_msg);
Naveen Rawata410c5a2016-09-19 14:22:33 -070012973 if (QDF_STATUS_SUCCESS != status)
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012974 sme_err("Send eWNI_SME_SET_VDEV_IES_PER_BAND fail");
Naveen Rawata410c5a2016-09-19 14:22:33 -070012975}
12976
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070012977/**
12978 * sme_set_pdev_ht_vht_ies() - sends the set pdev IE req
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080012979 * @mac_handle: Opaque handle to the global MAC context
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070012980 * @enable2x2: 1x1 or 2x2 mode.
12981 *
12982 * Sends the set pdev IE req with Nss value.
12983 *
12984 * Return: None
12985 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080012986void sme_set_pdev_ht_vht_ies(mac_handle_t mac_handle, bool enable2x2)
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070012987{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012988 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070012989 struct sir_set_ht_vht_cfg *ht_vht_cfg;
12990 QDF_STATUS status = QDF_STATUS_E_FAILURE;
12991
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070012992 if (!((mac_ctx->roam.configParam.uCfgDot11Mode ==
12993 eCSR_CFG_DOT11_MODE_AUTO) ||
12994 (mac_ctx->roam.configParam.uCfgDot11Mode ==
12995 eCSR_CFG_DOT11_MODE_11N) ||
12996 (mac_ctx->roam.configParam.uCfgDot11Mode ==
12997 eCSR_CFG_DOT11_MODE_11N_ONLY) ||
12998 (mac_ctx->roam.configParam.uCfgDot11Mode ==
12999 eCSR_CFG_DOT11_MODE_11AC) ||
13000 (mac_ctx->roam.configParam.uCfgDot11Mode ==
13001 eCSR_CFG_DOT11_MODE_11AC_ONLY)))
13002 return;
13003
13004 status = sme_acquire_global_lock(&mac_ctx->sme);
13005 if (QDF_STATUS_SUCCESS == status) {
13006 ht_vht_cfg = qdf_mem_malloc(sizeof(*ht_vht_cfg));
Arif Hussain0ef77082018-10-10 16:42:53 -070013007 if (!ht_vht_cfg) {
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070013008 sme_release_global_lock(&mac_ctx->sme);
13009 return;
13010 }
13011
13012 ht_vht_cfg->pdev_id = 0;
13013 if (enable2x2)
13014 ht_vht_cfg->nss = 2;
13015 else
13016 ht_vht_cfg->nss = 1;
13017 ht_vht_cfg->dot11mode =
13018 (uint8_t)csr_translate_to_wni_cfg_dot11_mode(mac_ctx,
13019 mac_ctx->roam.configParam.uCfgDot11Mode);
13020
13021 ht_vht_cfg->msg_type = eWNI_SME_PDEV_SET_HT_VHT_IE;
13022 ht_vht_cfg->len = sizeof(*ht_vht_cfg);
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070013023 sme_debug("SET_HT_VHT_IE with nss: %d, dot11mode: %d",
13024 ht_vht_cfg->nss,
13025 ht_vht_cfg->dot11mode);
Rajeev Kumard138ac52017-01-30 18:38:37 -080013026 status = umac_send_mb_message_to_mac(ht_vht_cfg);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053013027 if (QDF_STATUS_SUCCESS != status)
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070013028 sme_err("Send SME_PDEV_SET_HT_VHT_IE fail");
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053013029
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070013030 sme_release_global_lock(&mac_ctx->sme);
13031 }
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070013032}
13033
Jeff Johnsonc7309062018-11-09 20:59:42 -080013034void sme_update_vdev_type_nss(mac_handle_t mac_handle, uint8_t max_supp_nss,
gaurank kathpalia651abcd2018-11-12 22:41:23 +053013035 enum nss_chains_band_info band)
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070013036{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080013037 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070013038 struct vdev_type_nss *vdev_nss;
13039
gaurank kathpalia651abcd2018-11-12 22:41:23 +053013040 struct wlan_mlme_nss_chains *nss_chains_ini_cfg =
13041 &mac_ctx->mlme_cfg->nss_chains_ini_cfg;
13042
13043 if (band == NSS_CHAINS_BAND_5GHZ)
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070013044 vdev_nss = &mac_ctx->vdev_type_nss_5g;
13045 else
13046 vdev_nss = &mac_ctx->vdev_type_nss_2g;
13047
gaurank kathpalia651abcd2018-11-12 22:41:23 +053013048 vdev_nss->sta = QDF_MIN(max_supp_nss, GET_VDEV_NSS_CHAIN(
13049 nss_chains_ini_cfg->
gaurank kathpalia42911082019-01-22 17:39:49 +053013050 rx_nss[band],
gaurank kathpalia651abcd2018-11-12 22:41:23 +053013051 STA_NSS_CHAINS_SHIFT));
13052 vdev_nss->sap = QDF_MIN(max_supp_nss, GET_VDEV_NSS_CHAIN(
13053 nss_chains_ini_cfg->
gaurank kathpalia42911082019-01-22 17:39:49 +053013054 rx_nss[band],
gaurank kathpalia651abcd2018-11-12 22:41:23 +053013055 SAP_NSS_CHAINS_SHIFT));
13056 vdev_nss->p2p_go = QDF_MIN(max_supp_nss, GET_VDEV_NSS_CHAIN(
13057 nss_chains_ini_cfg->
gaurank kathpalia42911082019-01-22 17:39:49 +053013058 rx_nss[band],
gaurank kathpalia651abcd2018-11-12 22:41:23 +053013059 P2P_GO_NSS_CHAINS_SHIFT));
13060 vdev_nss->p2p_cli = QDF_MIN(max_supp_nss, GET_VDEV_NSS_CHAIN(
13061 nss_chains_ini_cfg->
gaurank kathpalia42911082019-01-22 17:39:49 +053013062 rx_nss[band],
gaurank kathpalia651abcd2018-11-12 22:41:23 +053013063 P2P_CLI_CHAINS_SHIFT));
13064 vdev_nss->p2p_dev = QDF_MIN(max_supp_nss, GET_VDEV_NSS_CHAIN(
13065 nss_chains_ini_cfg->
gaurank kathpalia42911082019-01-22 17:39:49 +053013066 rx_nss[band],
gaurank kathpalia651abcd2018-11-12 22:41:23 +053013067 P2P_DEV_NSS_CHAINS_SHIFT));
13068 vdev_nss->ibss = QDF_MIN(max_supp_nss, GET_VDEV_NSS_CHAIN(
13069 nss_chains_ini_cfg->
gaurank kathpalia42911082019-01-22 17:39:49 +053013070 rx_nss[band],
gaurank kathpalia651abcd2018-11-12 22:41:23 +053013071 IBSS_NSS_CHAINS_SHIFT));
13072 vdev_nss->tdls = QDF_MIN(max_supp_nss, GET_VDEV_NSS_CHAIN(
13073 nss_chains_ini_cfg->
gaurank kathpalia42911082019-01-22 17:39:49 +053013074 rx_nss[band],
gaurank kathpalia651abcd2018-11-12 22:41:23 +053013075 TDLS_NSS_CHAINS_SHIFT));
13076 vdev_nss->ocb = QDF_MIN(max_supp_nss, GET_VDEV_NSS_CHAIN(
13077 nss_chains_ini_cfg->
gaurank kathpalia42911082019-01-22 17:39:49 +053013078 rx_nss[band],
gaurank kathpalia651abcd2018-11-12 22:41:23 +053013079 OCB_NSS_CHAINS_SHIFT));
Nachiket Kukadecf941602018-12-12 14:32:35 +053013080 vdev_nss->nan = QDF_MIN(max_supp_nss, GET_VDEV_NSS_CHAIN(
13081 nss_chains_ini_cfg->
gaurank kathpalia42911082019-01-22 17:39:49 +053013082 rx_nss[band],
Nachiket Kukadecf941602018-12-12 14:32:35 +053013083 NAN_NSS_CHAIN_SHIFT));
Nachiket Kukade413c5fa2019-02-19 17:57:19 +053013084 vdev_nss->ndi = QDF_MIN(max_supp_nss, GET_VDEV_NSS_CHAIN(
13085 nss_chains_ini_cfg->
13086 rx_nss[band],
13087 NAN_NSS_CHAIN_SHIFT));
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070013088
Nachiket Kukadecf941602018-12-12 14:32:35 +053013089 sme_debug("band %d NSS:sta %d sap %d cli %d go %d dev %d ibss %d tdls %d ocb %d nan %d",
13090 band, vdev_nss->sta, vdev_nss->sap, vdev_nss->p2p_cli,
13091 vdev_nss->p2p_go, vdev_nss->p2p_dev, vdev_nss->ibss,
13092 vdev_nss->tdls, vdev_nss->ocb, vdev_nss->nan);
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070013093}
Peng Xu8fdaa492016-06-22 10:20:47 -070013094
Kiran Kumar Lokeree6476b22017-10-16 23:40:32 -070013095#ifdef WLAN_FEATURE_11AX_BSS_COLOR
13096#define MAX_BSS_COLOR_VAL 63
13097#define MIN_BSS_COLOR_VAL 1
13098
Jeff Johnsonc7309062018-11-09 20:59:42 -080013099QDF_STATUS sme_set_he_bss_color(mac_handle_t mac_handle, uint8_t session_id,
13100 uint8_t bss_color)
Kiran Kumar Lokeree6476b22017-10-16 23:40:32 -070013101
13102{
13103 struct sir_set_he_bss_color *bss_color_msg;
13104 uint8_t len;
13105
Jeff Johnsonc7309062018-11-09 20:59:42 -080013106 if (!mac_handle) {
13107 sme_err("Invalid mac_handle pointer");
Kiran Kumar Lokeree6476b22017-10-16 23:40:32 -070013108 return QDF_STATUS_E_FAULT;
13109 }
13110
13111 sme_debug("Set HE bss_color %d", bss_color);
13112
13113 if (bss_color < MIN_BSS_COLOR_VAL || bss_color > MAX_BSS_COLOR_VAL) {
13114 sme_debug("Invalid HE bss_color %d", bss_color);
13115 return QDF_STATUS_E_INVAL;
13116 }
13117 len = sizeof(*bss_color_msg);
13118 bss_color_msg = qdf_mem_malloc(len);
Arif Hussain0ef77082018-10-10 16:42:53 -070013119 if (!bss_color_msg)
Kiran Kumar Lokeree6476b22017-10-16 23:40:32 -070013120 return QDF_STATUS_E_NOMEM;
Arif Hussain0ef77082018-10-10 16:42:53 -070013121
Kiran Kumar Lokeree6476b22017-10-16 23:40:32 -070013122 bss_color_msg->message_type = eWNI_SME_SET_HE_BSS_COLOR;
13123 bss_color_msg->length = len;
13124 bss_color_msg->session_id = session_id;
13125 bss_color_msg->bss_color = bss_color;
13126 return umac_send_mb_message_to_mac(bss_color_msg);
13127}
13128#endif
13129
Rachit Kankane026e77a2018-07-31 16:21:09 +053013130#ifdef FEATURE_P2P_LISTEN_OFFLOAD
Nitesh Shahdb5ea0d2017-03-22 15:17:47 +053013131/**
Peng Xu8fdaa492016-06-22 10:20:47 -070013132 * sme_register_p2p_lo_event() - Register for the p2p lo event
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080013133 * @mac_handle: Opaque handle to the global MAC context
Peng Xu8fdaa492016-06-22 10:20:47 -070013134 * @context: the context of the call
13135 * @callback: the callback to hdd
13136 *
13137 * This function registers the callback function for P2P listen
13138 * offload stop event.
13139 *
13140 * Return: none
13141 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080013142void sme_register_p2p_lo_event(mac_handle_t mac_handle, void *context,
Jeff Johnsonf7e36d62018-07-04 21:14:02 -070013143 p2p_lo_callback callback)
Peng Xu8fdaa492016-06-22 10:20:47 -070013144{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080013145 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Peng Xu8fdaa492016-06-22 10:20:47 -070013146 QDF_STATUS status = QDF_STATUS_E_FAILURE;
13147
Jeff Johnson01f2c232018-11-21 19:17:44 -080013148 status = sme_acquire_global_lock(&mac->sme);
13149 mac->sme.p2p_lo_event_callback = callback;
13150 mac->sme.p2p_lo_event_context = context;
13151 sme_release_global_lock(&mac->sme);
Peng Xu8fdaa492016-06-22 10:20:47 -070013152}
Rachit Kankane026e77a2018-07-31 16:21:09 +053013153#endif
Manjeet Singhf82ed072016-07-08 11:40:00 +053013154
13155/**
13156 * sme_process_mac_pwr_dbg_cmd() - enable mac pwr debugging
Jeff Johnsonc7309062018-11-09 20:59:42 -080013157 * @mac_handle: The handle returned by macOpen
Manjeet Singhf82ed072016-07-08 11:40:00 +053013158 * @session_id: session id
13159 * @dbg_args: args for mac pwr debug command
13160 * Return: Return QDF_STATUS, otherwise appropriate failure code
13161 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080013162QDF_STATUS sme_process_mac_pwr_dbg_cmd(mac_handle_t mac_handle,
13163 uint32_t session_id,
13164 struct sir_mac_pwr_dbg_cmd *dbg_args)
Manjeet Singhf82ed072016-07-08 11:40:00 +053013165{
Rajeev Kumar37d478b2017-04-17 16:59:28 -070013166 struct scheduler_msg message = {0};
Jeff Johnson0a8786a2018-12-02 10:49:01 -080013167 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Manjeet Singhf82ed072016-07-08 11:40:00 +053013168 struct sir_mac_pwr_dbg_cmd *req;
13169 int i;
13170
13171 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070013172 sme_err("CSR session not valid: %d", session_id);
Manjeet Singhf82ed072016-07-08 11:40:00 +053013173 return QDF_STATUS_E_FAILURE;
13174 }
13175
13176 req = qdf_mem_malloc(sizeof(*req));
Arif Hussain0ef77082018-10-10 16:42:53 -070013177 if (!req)
Manjeet Singhf82ed072016-07-08 11:40:00 +053013178 return QDF_STATUS_E_FAILURE;
Arif Hussain0ef77082018-10-10 16:42:53 -070013179
Manjeet Singhf82ed072016-07-08 11:40:00 +053013180 req->module_id = dbg_args->module_id;
13181 req->pdev_id = dbg_args->pdev_id;
13182 req->num_args = dbg_args->num_args;
13183 for (i = 0; i < req->num_args; i++)
13184 req->args[i] = dbg_args->args[i];
13185
13186 message.type = SIR_HAL_POWER_DBG_CMD;
13187 message.bodyptr = req;
13188
gaurank kathpalia36b0c582018-08-28 17:45:43 +053013189 if (!QDF_IS_STATUS_SUCCESS(scheduler_post_message(QDF_MODULE_ID_SME,
13190 QDF_MODULE_ID_WMA,
13191 QDF_MODULE_ID_WMA,
13192 &message))) {
Manjeet Singhf82ed072016-07-08 11:40:00 +053013193 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
13194 "%s: Not able to post msg to WDA!",
13195 __func__);
13196 qdf_mem_free(req);
13197 }
13198 return QDF_STATUS_SUCCESS;
13199}
Tushnim Bhattacharyyaf44a9d82016-07-05 10:52:06 -070013200/**
13201 * sme_get_vdev_type_nss() - gets the nss per vdev type
Tushnim Bhattacharyyaf44a9d82016-07-05 10:52:06 -070013202 * @dev_mode: connection type.
13203 * @nss2g: Pointer to the 2G Nss parameter.
13204 * @nss5g: Pointer to the 5G Nss parameter.
13205 *
13206 * Fills the 2G and 5G Nss values based on connection type.
13207 *
13208 * Return: None
13209 */
Jeff Johnsonc1e62782017-11-09 09:50:17 -080013210void sme_get_vdev_type_nss(enum QDF_OPMODE dev_mode,
13211 uint8_t *nss_2g, uint8_t *nss_5g)
Tushnim Bhattacharyyaf44a9d82016-07-05 10:52:06 -070013212{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080013213 struct mac_context *mac_ctx = sme_get_mac_context();
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -080013214
Jeff Johnson038efe72019-03-18 13:39:31 -070013215 if (!mac_ctx) {
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -080013216 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
13217 FL("Invalid MAC context"));
13218 return;
13219 }
Tushnim Bhattacharyyaf44a9d82016-07-05 10:52:06 -070013220 csr_get_vdev_type_nss(mac_ctx, dev_mode, nss_2g, nss_5g);
13221}
Agrawal Ashish21ba2572016-09-03 16:40:10 +053013222
13223/**
13224 * sme_update_sta_roam_policy() - update sta roam policy for
13225 * unsafe and DFS channels.
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080013226 * @mac_handle: Opaque handle to the global MAC context
Agrawal Ashish21ba2572016-09-03 16:40:10 +053013227 * @dfs_mode: dfs mode which tell if dfs channel needs to be
13228 * skipped or not
13229 * @skip_unsafe_channels: Param to tell if driver needs to
13230 * skip unsafe channels or not.
13231 * @param session_id: sme_session_id
Agrawal, Ashish9f84c402016-11-30 16:19:44 +053013232 * @sap_operating_band: Band on which SAP is operating
Agrawal Ashish21ba2572016-09-03 16:40:10 +053013233 *
13234 * sme_update_sta_roam_policy update sta rome policies to csr
13235 * this function will call csrUpdateChannelList as well
13236 * to include/exclude DFS channels and unsafe channels.
13237 *
13238 * Return: eHAL_STATUS_SUCCESS or non-zero on failure.
13239 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080013240QDF_STATUS sme_update_sta_roam_policy(mac_handle_t mac_handle,
Jeff Johnsonc7309062018-11-09 20:59:42 -080013241 enum sta_roam_policy_dfs_mode dfs_mode,
13242 bool skip_unsafe_channels,
13243 uint8_t session_id,
13244 uint8_t sap_operating_band)
Agrawal Ashish21ba2572016-09-03 16:40:10 +053013245{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080013246 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Agrawal Ashish21ba2572016-09-03 16:40:10 +053013247 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson46b4f0e2019-03-08 10:48:35 -080013248 struct sme_config_params *sme_config;
Agrawal Ashish21ba2572016-09-03 16:40:10 +053013249
13250 if (!mac_ctx) {
13251 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_FATAL,
13252 "%s: mac_ctx is null", __func__);
13253 return QDF_STATUS_E_FAILURE;
13254 }
Agrawal Ashish21ba2572016-09-03 16:40:10 +053013255
Sridhar Selvaraj48c47092017-07-31 18:18:14 +053013256 sme_config = qdf_mem_malloc(sizeof(*sme_config));
Arif Hussain0ef77082018-10-10 16:42:53 -070013257 if (!sme_config)
Sridhar Selvaraj48c47092017-07-31 18:18:14 +053013258 return QDF_STATUS_E_FAILURE;
Arif Hussain0ef77082018-10-10 16:42:53 -070013259
Sridhar Selvaraj48c47092017-07-31 18:18:14 +053013260 qdf_mem_zero(sme_config, sizeof(*sme_config));
Jeff Johnsonb460dd72018-11-08 10:26:51 -080013261 sme_get_config_param(mac_handle, sme_config);
Sridhar Selvaraj48c47092017-07-31 18:18:14 +053013262
Jeff Johnsone94ccd02019-04-02 15:02:56 -070013263 sme_config->csr_config.sta_roam_policy_params.dfs_mode =
Agrawal Ashish21ba2572016-09-03 16:40:10 +053013264 dfs_mode;
Jeff Johnsone94ccd02019-04-02 15:02:56 -070013265 sme_config->csr_config.sta_roam_policy_params.skip_unsafe_channels =
Agrawal Ashish21ba2572016-09-03 16:40:10 +053013266 skip_unsafe_channels;
Jeff Johnsone94ccd02019-04-02 15:02:56 -070013267 sme_config->csr_config.sta_roam_policy_params.sap_operating_band =
Agrawal, Ashish9f84c402016-11-30 16:19:44 +053013268 sap_operating_band;
Agrawal Ashish21ba2572016-09-03 16:40:10 +053013269
Jeff Johnsonb460dd72018-11-08 10:26:51 -080013270 sme_update_config(mac_handle, sme_config);
Agrawal Ashish21ba2572016-09-03 16:40:10 +053013271
13272 status = csr_update_channel_list(mac_ctx);
13273 if (QDF_STATUS_SUCCESS != status) {
13274 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
13275 FL("failed to update the supported channel list"));
13276 }
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +053013277
Wu Gao51a63562018-11-08 16:29:10 +080013278 if (mac_ctx->mlme_cfg->lfr.roam_scan_offload_enabled) {
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +053013279 status = sme_acquire_global_lock(&mac_ctx->sme);
13280 if (QDF_IS_STATUS_SUCCESS(status)) {
13281 csr_roam_offload_scan(mac_ctx, session_id,
Agrawal Ashish21ba2572016-09-03 16:40:10 +053013282 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
13283 REASON_ROAM_SCAN_STA_ROAM_POLICY_CHANGED);
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +053013284 sme_release_global_lock(&mac_ctx->sme);
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +053013285 }
13286 }
Sridhar Selvaraj48c47092017-07-31 18:18:14 +053013287 qdf_mem_free(sme_config);
Selvaraj, Sridharebda0f22016-08-29 16:05:23 +053013288 return status;
13289}
13290
13291/**
13292 * sme_enable_disable_chanavoidind_event - configure ca event ind
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080013293 * @mac_handle: Opaque handle to the global MAC context
Selvaraj, Sridharebda0f22016-08-29 16:05:23 +053013294 * @set_value: enable/disable
13295 *
13296 * function to enable/disable chan avoidance indication
13297 *
13298 * Return: QDF_STATUS
13299 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080013300QDF_STATUS sme_enable_disable_chanavoidind_event(mac_handle_t mac_handle,
13301 uint8_t set_value)
Selvaraj, Sridharebda0f22016-08-29 16:05:23 +053013302{
13303 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080013304 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070013305 struct scheduler_msg msg = {0};
Selvaraj, Sridharebda0f22016-08-29 16:05:23 +053013306
Vignesh Viswanathana1f3a1a2018-10-04 13:10:46 +053013307 if (!mac_ctx->mlme_cfg->gen.optimize_ca_event) {
13308 sme_err("optimize_ca_event not enabled in ini");
13309 return QDF_STATUS_E_NOSUPPORT;
13310 }
13311
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070013312 sme_debug("set_value: %d", set_value);
Selvaraj, Sridharebda0f22016-08-29 16:05:23 +053013313 status = sme_acquire_global_lock(&mac_ctx->sme);
13314 if (QDF_STATUS_SUCCESS == status) {
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080013315 qdf_mem_zero(&msg, sizeof(struct scheduler_msg));
Selvaraj, Sridharebda0f22016-08-29 16:05:23 +053013316 msg.type = WMA_SEND_FREQ_RANGE_CONTROL_IND;
13317 msg.bodyval = set_value;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053013318 status = scheduler_post_message(QDF_MODULE_ID_SME,
13319 QDF_MODULE_ID_WMA,
13320 QDF_MODULE_ID_WMA, &msg);
Selvaraj, Sridharebda0f22016-08-29 16:05:23 +053013321 sme_release_global_lock(&mac_ctx->sme);
13322 return status;
13323 }
Deepak Dhamdhereb106ae52016-08-10 20:55:30 +053013324 return status;
13325}
Agrawal Ashish21ba2572016-09-03 16:40:10 +053013326
Deepak Dhamdhereb106ae52016-08-10 20:55:30 +053013327/*
13328 * sme_set_default_scan_ie() - API to send default scan IE to LIM
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080013329 * @mac_handle: Opaque handle to the global MAC context
Deepak Dhamdhereb106ae52016-08-10 20:55:30 +053013330 * @session_id: current session ID
13331 * @ie_data: Pointer to Scan IE data
13332 * @ie_len: Length of @ie_data
13333 *
13334 * Return: QDF_STATUS
13335 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080013336QDF_STATUS sme_set_default_scan_ie(mac_handle_t mac_handle, uint16_t session_id,
13337 uint8_t *ie_data, uint16_t ie_len)
Deepak Dhamdhereb106ae52016-08-10 20:55:30 +053013338{
13339 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080013340 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Deepak Dhamdhereb106ae52016-08-10 20:55:30 +053013341 struct hdd_default_scan_ie *set_ie_params;
13342
Rajeev Kumar5d17dd52017-12-19 16:17:42 -080013343 if (!ie_data)
13344 return QDF_STATUS_E_INVAL;
13345
Deepak Dhamdhereb106ae52016-08-10 20:55:30 +053013346 status = sme_acquire_global_lock(&mac_ctx->sme);
13347 if (QDF_IS_STATUS_SUCCESS(status)) {
13348 set_ie_params = qdf_mem_malloc(sizeof(*set_ie_params));
13349 if (!set_ie_params)
13350 status = QDF_STATUS_E_NOMEM;
13351 else {
13352 set_ie_params->message_type = eWNI_SME_DEFAULT_SCAN_IE;
13353 set_ie_params->length = sizeof(*set_ie_params);
13354 set_ie_params->session_id = session_id;
13355 set_ie_params->ie_len = ie_len;
13356 qdf_mem_copy(set_ie_params->ie_data, ie_data, ie_len);
Rajeev Kumard138ac52017-01-30 18:38:37 -080013357 status = umac_send_mb_message_to_mac(set_ie_params);
Deepak Dhamdhereb106ae52016-08-10 20:55:30 +053013358 }
13359 sme_release_global_lock(&mac_ctx->sme);
13360 }
Agrawal Ashish21ba2572016-09-03 16:40:10 +053013361 return status;
13362}
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +053013363
Jeff Johnsonc7309062018-11-09 20:59:42 -080013364QDF_STATUS sme_get_sar_power_limits(mac_handle_t mac_handle,
Jeff Johnsonf0e54b02017-12-18 15:22:25 -080013365 wma_sar_cb callback, void *context)
13366{
13367 void *wma_handle;
13368
13369 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
13370 if (!wma_handle) {
13371 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
13372 "wma handle is NULL");
13373 return QDF_STATUS_E_FAILURE;
13374 }
13375
13376 return wma_get_sar_limit(wma_handle, callback, context);
13377}
13378
Jeff Johnsonc7309062018-11-09 20:59:42 -080013379QDF_STATUS sme_set_sar_power_limits(mac_handle_t mac_handle,
Kabilan Kannan3c0a7352016-12-02 18:49:38 -080013380 struct sar_limit_cmd_params *sar_limit_cmd)
13381{
13382 void *wma_handle;
13383
13384 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
13385 if (!wma_handle) {
13386 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
13387 "wma handle is NULL");
13388 return QDF_STATUS_E_FAILURE;
13389 }
13390
13391 return wma_set_sar_limit(wma_handle, sar_limit_cmd);
13392}
13393
Dundi Raviteja3b637092018-09-12 13:42:50 +053013394QDF_STATUS sme_send_coex_config_cmd(struct coex_config_params *coex_cfg_params)
13395{
13396 void *wma_handle;
13397
13398 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
13399 if (!wma_handle) {
13400 sme_err("wma handle is NULL");
13401 return QDF_STATUS_E_FAILURE;
13402 }
13403 return wma_send_coex_config_cmd(wma_handle, coex_cfg_params);
13404}
13405
Jeff Johnson6136fb92017-03-30 15:21:49 -070013406#ifdef WLAN_FEATURE_FIPS
Jeff Johnsonc7309062018-11-09 20:59:42 -080013407QDF_STATUS sme_fips_request(mac_handle_t mac_handle, struct fips_params *param,
Jeff Johnson6136fb92017-03-30 15:21:49 -070013408 wma_fips_cb callback, void *context)
13409{
13410 void *wma_handle;
13411
13412 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
13413 if (!wma_handle) {
13414 sme_err("wma handle is NULL");
13415 return QDF_STATUS_E_FAILURE;
13416 }
13417
13418 return wma_fips_request(wma_handle, param, callback, context);
13419}
13420#endif
13421
Jeff Johnsonb460dd72018-11-08 10:26:51 -080013422QDF_STATUS sme_set_cts2self_for_p2p_go(mac_handle_t mac_handle)
Agrawal Ashishb2d1a452016-05-05 12:23:58 +053013423{
Agrawal Ashishb2d1a452016-05-05 12:23:58 +053013424 void *wma_handle;
13425
13426 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
13427 if (!wma_handle) {
13428 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
13429 "wma_handle is NULL");
13430 return QDF_STATUS_E_FAILURE;
13431 }
Agrawal Ashishb2d1a452016-05-05 12:23:58 +053013432 if (QDF_STATUS_SUCCESS !=
13433 wma_set_cts2self_for_p2p_go(wma_handle, true)) {
13434 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
13435 "%s: Failed to set cts2self for p2p GO to firmware",
13436 __func__);
13437 return QDF_STATUS_E_FAILURE;
13438 }
13439 return QDF_STATUS_SUCCESS;
13440}
Yingying Tang95409972016-10-20 15:16:15 +080013441
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053013442/**
13443 * sme_update_tx_fail_cnt_threshold() - update tx fail count Threshold
Jeff Johnsonb460dd72018-11-08 10:26:51 -080013444 * @mac_handle: Handle returned by mac_open
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053013445 * @session_id: Session ID on which tx fail count needs to be updated to FW
13446 * @tx_fail_count: Count for tx fail threshold after which FW will disconnect
13447 *
13448 * This function is used to set tx fail count threshold to firmware.
13449 * firmware will issue disocnnect with peer device once this threshold is
13450 * reached.
13451 *
13452 * Return: Return QDF_STATUS, otherwise appropriate failure code
13453 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080013454QDF_STATUS sme_update_tx_fail_cnt_threshold(mac_handle_t mac_handle,
Jeff Johnsonc7309062018-11-09 20:59:42 -080013455 uint8_t session_id,
13456 uint32_t tx_fail_count)
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053013457{
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053013458 QDF_STATUS status = QDF_STATUS_E_FAILURE;
13459 struct sme_tx_fail_cnt_threshold *tx_fail_cnt;
Rajeev Kumar37d478b2017-04-17 16:59:28 -070013460 struct scheduler_msg msg = {0};
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053013461
13462 tx_fail_cnt = qdf_mem_malloc(sizeof(*tx_fail_cnt));
Arif Hussain0ef77082018-10-10 16:42:53 -070013463 if (!tx_fail_cnt)
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053013464 return QDF_STATUS_E_FAILURE;
Arif Hussain0ef77082018-10-10 16:42:53 -070013465
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070013466 sme_debug("session_id: %d tx_fail_count: %d",
13467 session_id, tx_fail_count);
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053013468 tx_fail_cnt->session_id = session_id;
13469 tx_fail_cnt->tx_fail_cnt_threshold = tx_fail_count;
13470
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080013471 qdf_mem_zero(&msg, sizeof(struct scheduler_msg));
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053013472 msg.type = SIR_HAL_UPDATE_TX_FAIL_CNT_TH;
13473 msg.reserved = 0;
13474 msg.bodyptr = tx_fail_cnt;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053013475 status = scheduler_post_message(QDF_MODULE_ID_SME,
13476 QDF_MODULE_ID_WMA,
13477 QDF_MODULE_ID_WMA, &msg);
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053013478
13479 if (!QDF_IS_STATUS_SUCCESS(status)) {
13480 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053013481 FL("Not able to post Tx fail count message to WDA"));
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053013482 qdf_mem_free(tx_fail_cnt);
13483 }
Sreelakshmi Konamki58c72432016-11-09 17:06:44 +053013484 return status;
13485}
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053013486
Jeff Johnsondc198ec2018-07-04 17:39:53 -070013487QDF_STATUS sme_set_lost_link_info_cb(mac_handle_t mac_handle,
13488 lost_link_info_cb cb)
Sreelakshmi Konamki58c72432016-11-09 17:06:44 +053013489{
Jeff Johnsondc198ec2018-07-04 17:39:53 -070013490 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080013491 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Sreelakshmi Konamki58c72432016-11-09 17:06:44 +053013492
13493 status = sme_acquire_global_lock(&mac->sme);
13494 if (QDF_IS_STATUS_SUCCESS(status)) {
13495 mac->sme.lost_link_info_cb = cb;
13496 sme_release_global_lock(&mac->sme);
Sreelakshmi Konamki58c72432016-11-09 17:06:44 +053013497 }
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053013498
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053013499 return status;
13500}
Yingying Tang95409972016-10-20 15:16:15 +080013501
yeshwanth sriram guntukaa1ba9a22017-02-28 16:17:32 +053013502#ifdef FEATURE_WLAN_ESE
Jeff Johnson172237b2017-11-07 15:32:59 -080013503bool sme_roam_is_ese_assoc(struct csr_roam_info *roam_info)
yeshwanth sriram guntukaa1ba9a22017-02-28 16:17:32 +053013504{
13505 return roam_info->isESEAssoc;
13506}
Manjeet Singh2f785062017-03-08 18:14:18 +053013507#endif
yeshwanth sriram guntukaa1ba9a22017-02-28 16:17:32 +053013508
Jeff Johnsond5fb2db2018-11-08 14:20:28 -080013509bool sme_neighbor_roam_is11r_assoc(mac_handle_t mac_handle, uint8_t session_id)
yeshwanth sriram guntukaa1ba9a22017-02-28 16:17:32 +053013510{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080013511 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053013512
yeshwanth sriram guntukaa1ba9a22017-02-28 16:17:32 +053013513 return csr_neighbor_roam_is11r_assoc(mac_ctx, session_id);
13514}
Yingying Tang95409972016-10-20 15:16:15 +080013515
13516#ifdef WLAN_FEATURE_WOW_PULSE
13517/**
13518 * sme_set_wow_pulse() - set wow pulse info
13519 * @wow_pulse_set_info: wow_pulse_mode structure pointer
13520 *
13521 * Return: QDF_STATUS
13522 */
13523QDF_STATUS sme_set_wow_pulse(struct wow_pulse_mode *wow_pulse_set_info)
13524{
Rajeev Kumar37d478b2017-04-17 16:59:28 -070013525 struct scheduler_msg message = {0};
Yingying Tang95409972016-10-20 15:16:15 +080013526 QDF_STATUS status;
13527 struct wow_pulse_mode *wow_pulse_set_cmd;
13528
13529 if (!wow_pulse_set_info) {
13530 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
13531 "%s: invalid wow_pulse_set_info pointer", __func__);
13532 return QDF_STATUS_E_FAILURE;
13533 }
13534
13535 wow_pulse_set_cmd = qdf_mem_malloc(sizeof(*wow_pulse_set_cmd));
Arif Hussain0ef77082018-10-10 16:42:53 -070013536 if (!wow_pulse_set_cmd)
Yingying Tang95409972016-10-20 15:16:15 +080013537 return QDF_STATUS_E_NOMEM;
Yingying Tang95409972016-10-20 15:16:15 +080013538
13539 *wow_pulse_set_cmd = *wow_pulse_set_info;
13540
13541 message.type = WMA_SET_WOW_PULSE_CMD;
13542 message.bodyptr = wow_pulse_set_cmd;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053013543 status = scheduler_post_message(QDF_MODULE_ID_SME,
13544 QDF_MODULE_ID_WMA,
13545 QDF_MODULE_ID_WMA,
Yingying Tang95409972016-10-20 15:16:15 +080013546 &message);
13547 if (!QDF_IS_STATUS_SUCCESS(status)) {
13548 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
13549 "%s: Not able to post msg to WDA!",
13550 __func__);
13551 qdf_mem_free(wow_pulse_set_cmd);
13552 status = QDF_STATUS_E_FAILURE;
13553 }
13554
13555 return status;
13556}
13557#endif
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013558
13559/**
13560 * sme_prepare_beacon_from_bss_descp() - prepares beacon frame by populating
13561 * different fields and IEs from bss descriptor.
13562 * @frame_buf: frame buffer to populate
13563 * @bss_descp: bss descriptor
13564 * @bssid: bssid of the beacon frame to populate
13565 * @ie_len: length of IE fields
13566 *
13567 * Return: None
13568 */
13569static void sme_prepare_beacon_from_bss_descp(uint8_t *frame_buf,
13570 tSirBssDescription *bss_descp,
13571 const tSirMacAddr bssid,
Naveen Rawat6dabf4e2017-02-08 15:55:49 -080013572 uint32_t ie_len)
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013573{
13574 tDot11fBeacon1 *bcn_fixed;
13575 tpSirMacMgmtHdr mac_hdr = (tpSirMacMgmtHdr)frame_buf;
13576
13577 /* populate mac header first to indicate beacon */
13578 mac_hdr->fc.protVer = SIR_MAC_PROTOCOL_VERSION;
13579 mac_hdr->fc.type = SIR_MAC_MGMT_FRAME;
13580 mac_hdr->fc.subType = SIR_MAC_MGMT_BEACON;
13581 qdf_mem_copy((uint8_t *) mac_hdr->da,
13582 (uint8_t *) "\xFF\xFF\xFF\xFF\xFF\xFF",
13583 sizeof(struct qdf_mac_addr));
13584 qdf_mem_copy((uint8_t *) mac_hdr->sa, bssid,
13585 sizeof(struct qdf_mac_addr));
13586 qdf_mem_copy((uint8_t *) mac_hdr->bssId, bssid,
13587 sizeof(struct qdf_mac_addr));
13588
13589 /* now populate fixed params */
13590 bcn_fixed = (tDot11fBeacon1 *)(frame_buf + SIR_MAC_HDR_LEN_3A);
13591 /* populate timestamp */
13592 qdf_mem_copy(&bcn_fixed->TimeStamp.timestamp, &bss_descp->timeStamp,
13593 sizeof(bss_descp->timeStamp));
13594 /* populate beacon interval */
13595 bcn_fixed->BeaconInterval.interval = bss_descp->beaconInterval;
13596 /* populate capability */
13597 qdf_mem_copy(&bcn_fixed->Capabilities, &bss_descp->capabilityInfo,
13598 sizeof(bss_descp->capabilityInfo));
13599
13600 /* copy IEs now */
13601 qdf_mem_copy(frame_buf + SIR_MAC_HDR_LEN_3A
13602 + SIR_MAC_B_PR_SSID_OFFSET,
13603 &bss_descp->ieFields, ie_len);
13604}
13605
Jeff Johnsonc7309062018-11-09 20:59:42 -080013606QDF_STATUS sme_get_rssi_snr_by_bssid(mac_handle_t mac_handle,
13607 struct csr_roam_profile *profile,
13608 const uint8_t *bssid,
13609 int8_t *rssi, int8_t *snr)
Hanumanth Reddy Pothula90051782017-05-04 22:14:43 +053013610{
13611 tSirBssDescription *bss_descp;
13612 tCsrScanResultFilter *scan_filter;
13613 struct scan_result_list *bss_list;
13614 tScanResultHandle result_handle = NULL;
13615 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080013616 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Hanumanth Reddy Pothula90051782017-05-04 22:14:43 +053013617
13618 scan_filter = qdf_mem_malloc(sizeof(tCsrScanResultFilter));
Arif Hussain0ef77082018-10-10 16:42:53 -070013619 if (!scan_filter) {
Hanumanth Reddy Pothula90051782017-05-04 22:14:43 +053013620 status = QDF_STATUS_E_NOMEM;
13621 goto free_scan_flter;
13622 }
13623
13624 status = csr_roam_prepare_filter_from_profile(mac_ctx,
13625 profile, scan_filter);
13626 if (QDF_STATUS_SUCCESS != status) {
13627 sme_err("prepare_filter failed");
13628 goto free_scan_flter;
13629 }
13630
13631 /* update filter to get scan result with just target BSSID */
Jeff Johnson038efe72019-03-18 13:39:31 -070013632 if (!scan_filter->BSSIDs.bssid) {
Hanumanth Reddy Pothula90051782017-05-04 22:14:43 +053013633 scan_filter->BSSIDs.bssid =
13634 qdf_mem_malloc(sizeof(struct qdf_mac_addr));
Arif Hussain0ef77082018-10-10 16:42:53 -070013635 if (!scan_filter->BSSIDs.bssid) {
Hanumanth Reddy Pothula90051782017-05-04 22:14:43 +053013636 status = QDF_STATUS_E_NOMEM;
13637 goto free_scan_flter;
13638 }
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) {
Jianmin Zhucc6b3d02019-03-07 14:19:34 +080013647 sme_debug("parse_scan_result failed");
Hanumanth Reddy Pothula90051782017-05-04 22:14:43 +053013648 goto free_scan_flter;
13649 }
13650
13651 bss_list = (struct scan_result_list *)result_handle;
13652 bss_descp = csr_get_fst_bssdescr_ptr(bss_list);
13653 if (!bss_descp) {
13654 sme_err("unable to fetch bss descriptor");
13655 status = QDF_STATUS_E_FAULT;
13656 goto free_scan_flter;
13657 }
13658
13659 sme_debug("snr: %d, rssi: %d, raw_rssi: %d",
13660 bss_descp->sinr, bss_descp->rssi, bss_descp->rssi_raw);
13661
13662 if (rssi)
13663 *rssi = bss_descp->rssi;
13664 if (snr)
13665 *snr = bss_descp->sinr;
13666
13667free_scan_flter:
13668 /* free scan filter and exit */
13669 if (scan_filter) {
13670 csr_free_scan_filter(mac_ctx, scan_filter);
13671 qdf_mem_free(scan_filter);
13672 }
13673
13674 if (result_handle)
13675 csr_scan_result_purge(mac_ctx, result_handle);
13676
13677 return status;
13678}
13679
Jeff Johnsonc7309062018-11-09 20:59:42 -080013680QDF_STATUS sme_get_beacon_frm(mac_handle_t mac_handle,
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080013681 struct csr_roam_profile *profile,
Jeff Johnson66ee8a92018-03-17 15:24:26 -070013682 const tSirMacAddr bssid,
13683 uint8_t **frame_buf, uint32_t *frame_len,
13684 int *channel)
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013685{
13686 QDF_STATUS status = QDF_STATUS_SUCCESS;
Naveen Rawat56b4de82017-02-17 14:38:49 -080013687 tScanResultHandle result_handle = NULL;
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013688 tCsrScanResultFilter *scan_filter;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080013689 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013690 tSirBssDescription *bss_descp;
Yeshwanth Sriram Guntuka36c09902017-09-26 11:34:26 +053013691 struct scan_result_list *bss_list;
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013692 uint32_t ie_len;
13693
13694 scan_filter = qdf_mem_malloc(sizeof(tCsrScanResultFilter));
Arif Hussain0ef77082018-10-10 16:42:53 -070013695 if (!scan_filter) {
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013696 status = QDF_STATUS_E_NOMEM;
13697 goto free_scan_flter;
13698 }
13699 status = csr_roam_prepare_filter_from_profile(mac_ctx,
13700 profile, scan_filter);
13701 if (QDF_IS_STATUS_ERROR(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070013702 sme_err("prepare_filter failed");
Selvaraj, Sridhar64b0a9c2017-05-11 16:50:15 +053013703 status = QDF_STATUS_E_FAULT;
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013704 goto free_scan_flter;
13705 }
13706
13707 /* update filter to get scan result with just target BSSID */
Jeff Johnson038efe72019-03-18 13:39:31 -070013708 if (!scan_filter->BSSIDs.bssid) {
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013709 scan_filter->BSSIDs.bssid =
13710 qdf_mem_malloc(sizeof(struct qdf_mac_addr));
Arif Hussain0ef77082018-10-10 16:42:53 -070013711 if (!scan_filter->BSSIDs.bssid) {
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013712 status = QDF_STATUS_E_NOMEM;
13713 goto free_scan_flter;
13714 }
13715 }
13716 scan_filter->BSSIDs.numOfBSSIDs = 1;
13717 qdf_mem_copy(scan_filter->BSSIDs.bssid[0].bytes,
13718 bssid, sizeof(struct qdf_mac_addr));
13719
13720 status = csr_scan_get_result(mac_ctx, scan_filter, &result_handle);
13721 if (QDF_STATUS_SUCCESS != status) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070013722 sme_err("parse_scan_result failed");
Selvaraj, Sridhar64b0a9c2017-05-11 16:50:15 +053013723 status = QDF_STATUS_E_FAULT;
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013724 goto free_scan_flter;
13725 }
13726
Yeshwanth Sriram Guntuka36c09902017-09-26 11:34:26 +053013727 bss_list = (struct scan_result_list *)result_handle;
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013728 bss_descp = csr_get_fst_bssdescr_ptr(bss_list);
Naveen Rawatae0aaa82017-02-17 14:41:19 -080013729 if (!bss_descp) {
Srinivas Girigowda2c263352017-03-17 17:49:53 -070013730 sme_err("unable to fetch bss descriptor");
Naveen Rawatae0aaa82017-02-17 14:41:19 -080013731 status = QDF_STATUS_E_FAULT;
13732 goto free_scan_flter;
13733 }
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013734
Naveen Rawat81f058c2017-06-02 16:02:39 -070013735 /**
13736 * Length of BSS descriptor is without length of
13737 * length itself and length of pointer that holds ieFields.
13738 *
13739 * tSirBssDescription
13740 * +--------+---------------------------------+---------------+
13741 * | length | other fields | pointer to IEs|
13742 * +--------+---------------------------------+---------------+
13743 * ^
13744 * ieFields
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013745 */
Naveen Rawat81f058c2017-06-02 16:02:39 -070013746 ie_len = bss_descp->length + sizeof(bss_descp->length)
13747 - (uint16_t)(offsetof(tSirBssDescription, ieFields[0]));
Selvaraj, Sridhar64b0a9c2017-05-11 16:50:15 +053013748 sme_debug("found bss_descriptor ie_len: %d channel %d",
13749 ie_len, bss_descp->channelId);
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013750
13751 /* include mac header and fixed params along with IEs in frame */
13752 *frame_len = SIR_MAC_HDR_LEN_3A + SIR_MAC_B_PR_SSID_OFFSET + ie_len;
13753 *frame_buf = qdf_mem_malloc(*frame_len);
Arif Hussain0ef77082018-10-10 16:42:53 -070013754 if (!*frame_buf) {
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013755 status = QDF_STATUS_E_NOMEM;
13756 goto free_scan_flter;
13757 }
13758
13759 sme_prepare_beacon_from_bss_descp(*frame_buf, bss_descp, bssid, ie_len);
13760
Selvaraj, Sridhar64b0a9c2017-05-11 16:50:15 +053013761 if (!*channel)
13762 *channel = bss_descp->channelId;
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013763free_scan_flter:
13764 /* free scan filter and exit */
13765 if (scan_filter) {
13766 csr_free_scan_filter(mac_ctx, scan_filter);
13767 qdf_mem_free(scan_filter);
13768 }
Arif Hussainfdb25e22017-02-05 17:38:16 -080013769 if (result_handle)
13770 csr_scan_result_purge(mac_ctx, result_handle);
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013771
Naveen Rawatae0aaa82017-02-17 14:41:19 -080013772 return status;
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013773}
13774
Paul Zhangc3fc0a82018-01-09 16:38:20 +080013775#ifdef WLAN_FEATURE_ROAM_OFFLOAD
Jeff Johnsonc7309062018-11-09 20:59:42 -080013776QDF_STATUS sme_fast_reassoc(mac_handle_t mac_handle,
13777 struct csr_roam_profile *profile,
Naveen Rawat4195c5e2017-05-22 17:07:45 -070013778 const tSirMacAddr bssid, int channel,
Krunal Soni332f4af2017-06-01 14:36:17 -070013779 uint8_t vdev_id, const tSirMacAddr connected_bssid)
Naveen Rawat4195c5e2017-05-22 17:07:45 -070013780{
13781 QDF_STATUS status;
13782 struct wma_roam_invoke_cmd *fastreassoc;
13783 struct scheduler_msg msg = {0};
Jeff Johnson0a8786a2018-12-02 10:49:01 -080013784 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Abhinav Kumareab25932018-07-13 11:48:43 +053013785 struct csr_roam_session *session;
13786 struct csr_roam_profile *roam_profile;
Naveen Rawat4195c5e2017-05-22 17:07:45 -070013787
Abhinav Kumareab25932018-07-13 11:48:43 +053013788 session = CSR_GET_SESSION(mac_ctx, vdev_id);
13789 if (!session || !session->pCurRoamProfile) {
13790 sme_err("session %d not found", vdev_id);
13791 return QDF_STATUS_E_FAILURE;
13792 }
13793
13794 roam_profile = session->pCurRoamProfile;
Abhinav Kumarcd737de2019-03-05 17:01:24 +053013795 if (roam_profile->driver_disabled_roaming) {
13796 sme_debug("roaming status in driver %d",
Abhinav Kumareab25932018-07-13 11:48:43 +053013797 roam_profile->driver_disabled_roaming);
13798 return QDF_STATUS_E_FAILURE;
13799 }
Naveen Rawat4195c5e2017-05-22 17:07:45 -070013800 fastreassoc = qdf_mem_malloc(sizeof(*fastreassoc));
Arif Hussain0ef77082018-10-10 16:42:53 -070013801 if (!fastreassoc)
Naveen Rawat4195c5e2017-05-22 17:07:45 -070013802 return QDF_STATUS_E_NOMEM;
Arif Hussain0ef77082018-10-10 16:42:53 -070013803
Krunal Soni332f4af2017-06-01 14:36:17 -070013804 /* if both are same then set the flag */
13805 if (!qdf_mem_cmp(connected_bssid, bssid, ETH_ALEN)) {
13806 fastreassoc->is_same_bssid = true;
13807 sme_debug("bssid same, bssid[%pM]", bssid);
13808 }
Naveen Rawat4195c5e2017-05-22 17:07:45 -070013809 fastreassoc->vdev_id = vdev_id;
Naveen Rawat4195c5e2017-05-22 17:07:45 -070013810 fastreassoc->bssid[0] = bssid[0];
13811 fastreassoc->bssid[1] = bssid[1];
13812 fastreassoc->bssid[2] = bssid[2];
13813 fastreassoc->bssid[3] = bssid[3];
13814 fastreassoc->bssid[4] = bssid[4];
13815 fastreassoc->bssid[5] = bssid[5];
13816
Jeff Johnsonc7309062018-11-09 20:59:42 -080013817 status = sme_get_beacon_frm(mac_handle, profile, bssid,
Naveen Rawat4195c5e2017-05-22 17:07:45 -070013818 &fastreassoc->frame_buf,
Selvaraj, Sridhar64b0a9c2017-05-11 16:50:15 +053013819 &fastreassoc->frame_len,
13820 &channel);
Naveen Rawat4195c5e2017-05-22 17:07:45 -070013821
Selvaraj, Sridhar64b0a9c2017-05-11 16:50:15 +053013822 if (!channel) {
13823 sme_err("channel retrieval from BSS desc fails!");
13824 qdf_mem_free(fastreassoc);
13825 return QDF_STATUS_E_FAULT;
13826 }
13827
13828 fastreassoc->channel = channel;
Naveen Rawat4195c5e2017-05-22 17:07:45 -070013829 if (QDF_STATUS_SUCCESS != status) {
13830 sme_warn("sme_get_beacon_frm failed");
13831 fastreassoc->frame_buf = NULL;
13832 fastreassoc->frame_len = 0;
13833 }
13834
Padma, Santhosh Kumar5bc0c242017-11-29 15:44:27 +053013835 if (csr_is_auth_type_ese(mac_ctx->roam.roamSession[vdev_id].
13836 connectedProfile.AuthType)) {
13837 sme_debug("Beacon is not required for ESE");
13838 if (fastreassoc->frame_len) {
13839 qdf_mem_free(fastreassoc->frame_buf);
13840 fastreassoc->frame_buf = NULL;
13841 fastreassoc->frame_len = 0;
13842 }
13843 }
13844
Paul Zhang624f88d2018-11-07 15:29:45 +080013845 msg.type = eWNI_SME_ROAM_INVOKE;
Naveen Rawat4195c5e2017-05-22 17:07:45 -070013846 msg.reserved = 0;
13847 msg.bodyptr = fastreassoc;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053013848 status = scheduler_post_message(QDF_MODULE_ID_SME,
Paul Zhang624f88d2018-11-07 15:29:45 +080013849 QDF_MODULE_ID_PE,
13850 QDF_MODULE_ID_PE, &msg);
Naveen Rawat4195c5e2017-05-22 17:07:45 -070013851 if (QDF_STATUS_SUCCESS != status) {
Paul Zhang624f88d2018-11-07 15:29:45 +080013852 sme_err("Not able to post ROAM_INVOKE_CMD message to PE");
Naveen Rawat4195c5e2017-05-22 17:07:45 -070013853 qdf_mem_free(fastreassoc);
13854 }
13855
13856 return status;
13857}
Paul Zhangc3fc0a82018-01-09 16:38:20 +080013858#endif
Naveen Rawat4195c5e2017-05-22 17:07:45 -070013859
Jeff Johnsonc7309062018-11-09 20:59:42 -080013860QDF_STATUS sme_set_del_pmkid_cache(mac_handle_t mac_handle, uint8_t session_id,
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +053013861 tPmkidCacheInfo *pmk_cache_info,
13862 bool is_add)
13863{
13864 struct wmi_unified_pmk_cache *pmk_cache;
13865 struct scheduler_msg msg;
13866
13867 pmk_cache = qdf_mem_malloc(sizeof(*pmk_cache));
Arif Hussain0ef77082018-10-10 16:42:53 -070013868 if (!pmk_cache)
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +053013869 return QDF_STATUS_E_NOMEM;
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +053013870
hangtian127c9532019-01-12 13:29:07 +080013871 qdf_mem_zero(pmk_cache, sizeof(*pmk_cache));
Vignesh Viswanathane8a26b22017-10-11 20:38:47 +053013872
Jeff Johnson622aad62018-12-07 15:05:37 -080013873 pmk_cache->vdev_id = session_id;
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +053013874
Vignesh Viswanathane8a26b22017-10-11 20:38:47 +053013875 if (!pmk_cache_info)
13876 goto send_flush_cmd;
13877
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +053013878 if (!pmk_cache_info->ssid_len) {
13879 pmk_cache->cat_flag = WMI_PMK_CACHE_CAT_FLAG_BSSID;
13880 WMI_CHAR_ARRAY_TO_MAC_ADDR(pmk_cache_info->BSSID.bytes,
13881 &pmk_cache->bssid);
13882 } else {
13883 pmk_cache->cat_flag = WMI_PMK_CACHE_CAT_FLAG_SSID_CACHE_ID;
13884 pmk_cache->ssid.length = pmk_cache_info->ssid_len;
13885 qdf_mem_copy(pmk_cache->ssid.mac_ssid,
13886 pmk_cache_info->ssid,
13887 pmk_cache->ssid.length);
13888 }
13889 pmk_cache->cache_id = (uint32_t) (pmk_cache_info->cache_id[0] << 8 |
13890 pmk_cache_info->cache_id[1]);
13891
13892 if (is_add)
13893 pmk_cache->action_flag = WMI_PMK_CACHE_ACTION_FLAG_ADD_ENTRY;
13894 else
13895 pmk_cache->action_flag = WMI_PMK_CACHE_ACTION_FLAG_DEL_ENTRY;
13896
Srinivas Girigowdaff8f5ef2019-03-26 17:20:55 -070013897 pmk_cache->pmkid_len = PMKID_LEN;
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +053013898 qdf_mem_copy(pmk_cache->pmkid, pmk_cache_info->PMKID,
Srinivas Girigowdaff8f5ef2019-03-26 17:20:55 -070013899 PMKID_LEN);
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +053013900
13901 pmk_cache->pmk_len = pmk_cache_info->pmk_len;
13902 qdf_mem_copy(pmk_cache->pmk, pmk_cache_info->pmk,
13903 pmk_cache->pmk_len);
13904
Vignesh Viswanathane8a26b22017-10-11 20:38:47 +053013905send_flush_cmd:
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +053013906 msg.type = SIR_HAL_SET_DEL_PMKID_CACHE;
13907 msg.reserved = 0;
13908 msg.bodyptr = pmk_cache;
13909 if (QDF_STATUS_SUCCESS !=
gaurank kathpalia36b0c582018-08-28 17:45:43 +053013910 scheduler_post_message(QDF_MODULE_ID_SME,
13911 QDF_MODULE_ID_WMA,
13912 QDF_MODULE_ID_WMA, &msg)) {
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +053013913 sme_err("Not able to post message to WDA");
Ashish Kumar Dhanotiya36510832019-02-20 22:13:25 +053013914 if (pmk_cache) {
13915 qdf_mem_zero(pmk_cache, sizeof(*pmk_cache));
13916 qdf_mem_free(pmk_cache);
13917 }
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +053013918 return QDF_STATUS_E_FAILURE;
13919 }
13920
13921 return QDF_STATUS_SUCCESS;
13922}
13923
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053013924/* ARP DEBUG STATS */
13925
13926/**
13927 * sme_set_nud_debug_stats() - sme api to set nud debug stats
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080013928 * @mac_handle: Opaque handle to the global MAC context
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053013929 * @set_stats_param: pointer to set stats param
13930 *
13931 * Return: Return QDF_STATUS.
13932 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080013933QDF_STATUS sme_set_nud_debug_stats(mac_handle_t mac_handle,
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053013934 struct set_arp_stats_params
13935 *set_stats_param)
13936{
13937 struct set_arp_stats_params *arp_set_param;
13938 struct scheduler_msg msg;
13939
13940 arp_set_param = qdf_mem_malloc(sizeof(*arp_set_param));
Arif Hussain0ef77082018-10-10 16:42:53 -070013941 if (!arp_set_param)
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053013942 return QDF_STATUS_E_NOMEM;
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053013943
13944 qdf_mem_copy(arp_set_param, set_stats_param, sizeof(*arp_set_param));
13945
13946 msg.type = WMA_SET_ARP_STATS_REQ;
13947 msg.reserved = 0;
13948 msg.bodyptr = arp_set_param;
13949
13950 if (QDF_STATUS_SUCCESS !=
gaurank kathpalia36b0c582018-08-28 17:45:43 +053013951 scheduler_post_message(QDF_MODULE_ID_SME,
13952 QDF_MODULE_ID_WMA,
13953 QDF_MODULE_ID_WMA, &msg)) {
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053013954 sme_err("Not able to post message to WDA");
13955 qdf_mem_free(arp_set_param);
13956 return QDF_STATUS_E_FAILURE;
13957 }
13958
13959 return QDF_STATUS_SUCCESS;
13960}
13961
13962/**
13963 * sme_get_nud_debug_stats() - sme api to get nud debug stats
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080013964 * @mac_handle: Opaque handle to the global MAC context
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053013965 * @get_stats_param: pointer to set stats param
13966 *
13967 * Return: Return QDF_STATUS.
13968 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080013969QDF_STATUS sme_get_nud_debug_stats(mac_handle_t mac_handle,
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053013970 struct get_arp_stats_params
13971 *get_stats_param)
13972{
13973 struct get_arp_stats_params *arp_get_param;
13974 struct scheduler_msg msg;
13975
13976 arp_get_param = qdf_mem_malloc(sizeof(*arp_get_param));
Arif Hussain0ef77082018-10-10 16:42:53 -070013977 if (!arp_get_param)
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053013978 return QDF_STATUS_E_NOMEM;
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053013979
13980 qdf_mem_copy(arp_get_param, get_stats_param, sizeof(*arp_get_param));
13981
13982 msg.type = WMA_GET_ARP_STATS_REQ;
13983 msg.reserved = 0;
13984 msg.bodyptr = arp_get_param;
13985
13986 if (QDF_STATUS_SUCCESS !=
gaurank kathpalia36b0c582018-08-28 17:45:43 +053013987 scheduler_post_message(QDF_MODULE_ID_SME,
13988 QDF_MODULE_ID_WMA,
13989 QDF_MODULE_ID_WMA, &msg)) {
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053013990 sme_err("Not able to post message to WDA");
13991 qdf_mem_free(arp_get_param);
13992 return QDF_STATUS_E_FAILURE;
13993 }
13994
13995 return QDF_STATUS_SUCCESS;
13996}
13997
Krishna Kumaar Natarajanf1581df2017-02-21 13:42:08 -080013998QDF_STATUS sme_set_peer_param(uint8_t *peer_addr, uint32_t param_id,
13999 uint32_t param_value, uint32_t vdev_id)
14000{
14001 void *wma_handle;
14002
14003 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
14004 if (!wma_handle) {
Srinivas Girigowda2c263352017-03-17 17:49:53 -070014005 sme_err("wma handle is NULL");
Krishna Kumaar Natarajanf1581df2017-02-21 13:42:08 -080014006 return QDF_STATUS_E_FAILURE;
14007 }
14008
14009 return wma_set_peer_param(wma_handle, peer_addr, param_id,
14010 param_value, vdev_id);
14011}
Tushnim Bhattacharyya9e81b4c2017-02-15 17:11:14 -080014012
Jeff Johnsonb460dd72018-11-08 10:26:51 -080014013QDF_STATUS sme_register_set_connection_info_cb(mac_handle_t mac_handle,
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -080014014 bool (*set_connection_info_cb)(bool),
14015 bool (*get_connection_info_cb)(uint8_t *session_id,
14016 enum scan_reject_states *reason))
Tushnim Bhattacharyya9e81b4c2017-02-15 17:11:14 -080014017{
14018 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014019 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Tushnim Bhattacharyya9e81b4c2017-02-15 17:11:14 -080014020
Jeff Johnson01f2c232018-11-21 19:17:44 -080014021 status = sme_acquire_global_lock(&mac->sme);
Tushnim Bhattacharyya9e81b4c2017-02-15 17:11:14 -080014022 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -080014023 mac->sme.set_connection_info_cb = set_connection_info_cb;
14024 mac->sme.get_connection_info_cb = get_connection_info_cb;
14025 sme_release_global_lock(&mac->sme);
Tushnim Bhattacharyya9e81b4c2017-02-15 17:11:14 -080014026 }
14027 return status;
14028}
Sreelakshmi Konamki88a2a412017-04-14 15:11:55 +053014029
Jeff Johnson43975142018-07-04 15:33:47 -070014030QDF_STATUS sme_rso_cmd_status_cb(mac_handle_t mac_handle,
14031 rso_cmd_status_cb cb)
Sreelakshmi Konamki88a2a412017-04-14 15:11:55 +053014032{
14033 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014034 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Sreelakshmi Konamki88a2a412017-04-14 15:11:55 +053014035
14036 mac->sme.rso_cmd_status_cb = cb;
Srinivas Girigowda2c263352017-03-17 17:49:53 -070014037 sme_debug("Registered RSO command status callback");
Sreelakshmi Konamki88a2a412017-04-14 15:11:55 +053014038 return status;
14039}
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070014040
Jeff Johnsonc7309062018-11-09 20:59:42 -080014041QDF_STATUS sme_set_dbs_scan_selection_config(mac_handle_t mac_handle,
Nitesh Shahf9a09ff2017-05-22 15:46:25 +053014042 struct wmi_dbs_scan_sel_params *params)
14043{
14044 struct scheduler_msg message = {0};
14045 QDF_STATUS status;
14046 struct wmi_dbs_scan_sel_params *dbs_scan_params;
14047 uint32_t i;
14048
14049 if (0 == params->num_clients) {
14050 sme_err("Num of clients is 0");
14051 return QDF_STATUS_E_FAILURE;
14052 }
14053
14054 dbs_scan_params = qdf_mem_malloc(sizeof(*dbs_scan_params));
Arif Hussain0ef77082018-10-10 16:42:53 -070014055 if (!dbs_scan_params)
Nitesh Shahf9a09ff2017-05-22 15:46:25 +053014056 return QDF_STATUS_E_NOMEM;
Nitesh Shahf9a09ff2017-05-22 15:46:25 +053014057
14058 dbs_scan_params->num_clients = params->num_clients;
14059 dbs_scan_params->pdev_id = params->pdev_id;
14060 for (i = 0; i < params->num_clients; i++) {
14061 dbs_scan_params->module_id[i] = params->module_id[i];
14062 dbs_scan_params->num_dbs_scans[i] = params->num_dbs_scans[i];
14063 dbs_scan_params->num_non_dbs_scans[i] =
14064 params->num_non_dbs_scans[i];
14065 }
14066 message.type = WMA_SET_DBS_SCAN_SEL_CONF_PARAMS;
14067 message.bodyptr = dbs_scan_params;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053014068 status = scheduler_post_message(QDF_MODULE_ID_SME,
14069 QDF_MODULE_ID_WMA,
14070 QDF_MODULE_ID_WMA, &message);
Nitesh Shahf9a09ff2017-05-22 15:46:25 +053014071 if (!QDF_IS_STATUS_SUCCESS(status)) {
14072 sme_err("Not able to post msg to WMA!");
14073 qdf_mem_free(dbs_scan_params);
14074 }
14075
14076 return status;
14077}
14078
Jeff Johnsonc7309062018-11-09 20:59:42 -080014079QDF_STATUS sme_get_rcpi(mac_handle_t mac_handle, struct sme_rcpi_req *rcpi)
Rajeev Kumar Sirasanagandla996e5292016-11-22 21:20:33 +053014080{
14081 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014082 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Naveen Rawatb7be1ed2017-11-16 16:52:08 -080014083 struct scheduler_msg msg = {0};
Rajeev Kumar Sirasanagandla996e5292016-11-22 21:20:33 +053014084 struct sme_rcpi_req *rcpi_req;
14085
14086 rcpi_req = qdf_mem_malloc(sizeof(*rcpi_req));
Arif Hussain0ef77082018-10-10 16:42:53 -070014087 if (!rcpi_req)
Rajeev Kumar Sirasanagandla996e5292016-11-22 21:20:33 +053014088 return QDF_STATUS_E_NOMEM;
Arif Hussain0ef77082018-10-10 16:42:53 -070014089
Rajeev Kumar Sirasanagandla996e5292016-11-22 21:20:33 +053014090 qdf_mem_copy(rcpi_req, rcpi, sizeof(*rcpi_req));
14091
Jeff Johnson01f2c232018-11-21 19:17:44 -080014092 status = sme_acquire_global_lock(&mac->sme);
Rajeev Kumar Sirasanagandla996e5292016-11-22 21:20:33 +053014093 if (QDF_IS_STATUS_SUCCESS(status)) {
14094 msg.bodyptr = rcpi_req;
14095 msg.type = WMA_GET_RCPI_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053014096 status = scheduler_post_message(QDF_MODULE_ID_SME,
14097 QDF_MODULE_ID_WMA,
14098 QDF_MODULE_ID_WMA, &msg);
Jeff Johnson01f2c232018-11-21 19:17:44 -080014099 sme_release_global_lock(&mac->sme);
Rajeev Kumar Sirasanagandla996e5292016-11-22 21:20:33 +053014100 if (!QDF_IS_STATUS_SUCCESS(status)) {
14101 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
14102 FL("post get rcpi req failed"));
14103 status = QDF_STATUS_E_FAILURE;
14104 qdf_mem_free(rcpi_req);
14105 }
14106 } else {
Rajeev Kumar Sirasanagandla996e5292016-11-22 21:20:33 +053014107 qdf_mem_free(rcpi_req);
14108 }
14109
14110 return status;
14111}
14112
Jeff Johnsonc7309062018-11-09 20:59:42 -080014113void sme_store_pdev(mac_handle_t mac_handle, struct wlan_objmgr_pdev *pdev)
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070014114{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014115 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070014116 void *wma_handle;
14117 QDF_STATUS status;
14118
Kiran Kumar Lokeref089a3a2017-04-20 21:39:26 -070014119 status = wlan_objmgr_pdev_try_get_ref(pdev, WLAN_LEGACY_MAC_ID);
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070014120 if (QDF_STATUS_SUCCESS != status) {
14121 mac_ctx->pdev = NULL;
14122 return;
14123 }
14124 mac_ctx->pdev = pdev;
14125 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
14126 if (!wma_handle) {
14127 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Kiran Kumar Lokeref089a3a2017-04-20 21:39:26 -070014128 FL("wma handle is NULL"));
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070014129 return;
14130 }
14131 wma_store_pdev(wma_handle, pdev);
Kiran Kumar Lokere4ce40482018-08-30 16:31:00 -070014132 pdev->pdev_nif.pdev_fw_caps |= SUPPORTED_CRYPTO_CAPS;
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070014133}
14134
Jeff Johnsonc7309062018-11-09 20:59:42 -080014135QDF_STATUS sme_congestion_register_callback(mac_handle_t mac_handle,
Jeff Johnsonf6182e42018-07-03 14:46:17 -070014136 congestion_cb congestion_cb)
Padma, Santhosh Kumar16dacfb2017-03-21 19:05:40 +053014137{
14138 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014139 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Padma, Santhosh Kumar16dacfb2017-03-21 19:05:40 +053014140
14141 status = sme_acquire_global_lock(&mac->sme);
14142 if (QDF_IS_STATUS_SUCCESS(status)) {
14143 mac->sme.congestion_cb = congestion_cb;
14144 sme_release_global_lock(&mac->sme);
Srinivas Girigowda2c263352017-03-17 17:49:53 -070014145 sme_debug("congestion callback set");
Padma, Santhosh Kumar16dacfb2017-03-21 19:05:40 +053014146 }
14147
14148 return status;
14149}
Sandeep Puligillaf587adf2017-04-27 19:53:21 -070014150
Jeff Johnsonda2afa42018-07-04 10:25:42 -070014151QDF_STATUS sme_register_tx_queue_cb(mac_handle_t mac_handle,
14152 tx_queue_cb tx_queue_cb)
Varun Reddy Yeturu076eaa82018-01-16 12:16:14 -080014153{
14154 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014155 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Varun Reddy Yeturu076eaa82018-01-16 12:16:14 -080014156
14157 status = sme_acquire_global_lock(&mac->sme);
14158 if (QDF_IS_STATUS_SUCCESS(status)) {
14159 mac->sme.tx_queue_cb = tx_queue_cb;
14160 sme_release_global_lock(&mac->sme);
14161 sme_debug("Tx queue callback set");
Varun Reddy Yeturu076eaa82018-01-16 12:16:14 -080014162 }
14163
14164 return status;
14165}
14166
Jeff Johnsonda2afa42018-07-04 10:25:42 -070014167QDF_STATUS sme_deregister_tx_queue_cb(mac_handle_t mac_handle)
Varun Reddy Yeturu076eaa82018-01-16 12:16:14 -080014168{
Jeff Johnsonda2afa42018-07-04 10:25:42 -070014169 return sme_register_tx_queue_cb(mac_handle, NULL);
Varun Reddy Yeturu076eaa82018-01-16 12:16:14 -080014170}
14171
Varun Reddy Yeturud33033f2018-06-11 10:58:30 -070014172#ifdef WLAN_SUPPORT_TWT
Jeff Johnson3a08ff92018-07-03 19:40:44 -070014173QDF_STATUS sme_register_twt_enable_complete_cb(mac_handle_t mac_handle,
14174 twt_enable_cb twt_enable_cb)
Varun Reddy Yeturu3c9f89c2018-04-18 19:10:34 -070014175{
14176 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014177 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Varun Reddy Yeturu3c9f89c2018-04-18 19:10:34 -070014178
14179 status = sme_acquire_global_lock(&mac->sme);
14180 if (QDF_IS_STATUS_SUCCESS(status)) {
14181 mac->sme.twt_enable_cb = twt_enable_cb;
14182 sme_release_global_lock(&mac->sme);
14183 sme_debug("TWT: enable callback set");
Varun Reddy Yeturu3c9f89c2018-04-18 19:10:34 -070014184 }
14185
14186 return status;
14187}
14188
Jeff Johnson3a08ff92018-07-03 19:40:44 -070014189QDF_STATUS sme_register_twt_disable_complete_cb(mac_handle_t mac_handle,
14190 twt_disable_cb twt_disable_cb)
Varun Reddy Yeturu3c9f89c2018-04-18 19:10:34 -070014191{
14192 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014193 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Varun Reddy Yeturu3c9f89c2018-04-18 19:10:34 -070014194
14195 status = sme_acquire_global_lock(&mac->sme);
14196 if (QDF_IS_STATUS_SUCCESS(status)) {
14197 mac->sme.twt_disable_cb = twt_disable_cb;
14198 sme_release_global_lock(&mac->sme);
14199 sme_debug("TWT: disable callback set");
Varun Reddy Yeturu3c9f89c2018-04-18 19:10:34 -070014200 }
14201
14202 return status;
14203}
14204
Jeff Johnson3a08ff92018-07-03 19:40:44 -070014205QDF_STATUS sme_deregister_twt_enable_complete_cb(mac_handle_t mac_handle)
Varun Reddy Yeturu3c9f89c2018-04-18 19:10:34 -070014206{
Jeff Johnson3a08ff92018-07-03 19:40:44 -070014207 return sme_register_twt_enable_complete_cb(mac_handle, NULL);
Varun Reddy Yeturu3c9f89c2018-04-18 19:10:34 -070014208}
14209
Jeff Johnson3a08ff92018-07-03 19:40:44 -070014210QDF_STATUS sme_deregister_twt_disable_complete_cb(mac_handle_t mac_handle)
Varun Reddy Yeturu3c9f89c2018-04-18 19:10:34 -070014211{
Jeff Johnson3a08ff92018-07-03 19:40:44 -070014212 return sme_register_twt_disable_complete_cb(mac_handle, NULL);
Varun Reddy Yeturu3c9f89c2018-04-18 19:10:34 -070014213}
14214#endif
14215
Ashish Kumar Dhanotiyab28338c2017-07-21 20:12:34 +053014216QDF_STATUS sme_set_smps_cfg(uint32_t vdev_id, uint32_t param_id,
14217 uint32_t param_val)
14218{
14219 return wma_configure_smps_params(vdev_id, param_id, param_val);
14220}
14221
Jeff Johnsonc7309062018-11-09 20:59:42 -080014222QDF_STATUS sme_set_reorder_timeout(mac_handle_t mac_handle,
14223 struct sir_set_rx_reorder_timeout_val *req)
lifeng66831662017-05-19 16:01:35 +080014224{
14225 QDF_STATUS status;
Zhang Qian1e7649e2018-06-04 13:07:18 +080014226 tp_wma_handle wma_handle;
lifeng66831662017-05-19 16:01:35 +080014227
Zhang Qian1e7649e2018-06-04 13:07:18 +080014228 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
14229 status = wma_set_rx_reorder_timeout_val(wma_handle, req);
lifeng66831662017-05-19 16:01:35 +080014230
14231 return status;
14232}
14233
Jeff Johnsonc7309062018-11-09 20:59:42 -080014234QDF_STATUS sme_set_rx_set_blocksize(mac_handle_t mac_handle,
14235 struct sir_peer_set_rx_blocksize *req)
lifeng66831662017-05-19 16:01:35 +080014236{
14237 QDF_STATUS status;
Zhang Qian1e7649e2018-06-04 13:07:18 +080014238 tp_wma_handle wma_handle;
lifeng66831662017-05-19 16:01:35 +080014239
Zhang Qian1e7649e2018-06-04 13:07:18 +080014240 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
14241 status = wma_set_rx_blocksize(wma_handle, req);
lifeng66831662017-05-19 16:01:35 +080014242
14243 return status;
14244}
Naveen Rawat247a8682017-06-05 15:00:31 -070014245
14246int sme_cli_set_command(int vdev_id, int param_id, int sval, int vpdev)
14247{
14248 return wma_cli_set_command(vdev_id, param_id, sval, vpdev);
14249}
Vidyullatha Kanchanapallybe0ebb32017-03-23 14:36:21 +053014250
Vignesh Viswanathana851d752018-10-03 19:44:38 +053014251int sme_set_enable_mem_deep_sleep(mac_handle_t mac_handle, int vdev_id)
14252{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014253 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Vignesh Viswanathana851d752018-10-03 19:44:38 +053014254
14255 return wma_cli_set_command(vdev_id, WMI_PDEV_PARAM_HYST_EN,
14256 mac_ctx->mlme_cfg->gen.memory_deep_sleep,
14257 PDEV_CMD);
14258}
14259
14260int sme_set_cck_tx_fir_override(mac_handle_t mac_handle, int vdev_id)
14261{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014262 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Vignesh Viswanathana851d752018-10-03 19:44:38 +053014263
14264 return wma_cli_set_command(vdev_id,
14265 WMI_PDEV_PARAM_ENABLE_CCK_TXFIR_OVERRIDE,
14266 mac_ctx->mlme_cfg->gen.cck_tx_fir_override,
14267 PDEV_CMD);
14268}
14269
Jeff Johnsond0b6c7e2018-07-04 14:53:06 -070014270QDF_STATUS sme_set_bt_activity_info_cb(mac_handle_t mac_handle,
14271 bt_activity_info_cb cb)
Vidyullatha Kanchanapallybe0ebb32017-03-23 14:36:21 +053014272{
14273 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014274 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Vidyullatha Kanchanapallybe0ebb32017-03-23 14:36:21 +053014275
14276 status = sme_acquire_global_lock(&mac->sme);
14277 if (QDF_IS_STATUS_SUCCESS(status)) {
14278 mac->sme.bt_activity_info_cb = cb;
14279 sme_release_global_lock(&mac->sme);
14280 sme_debug("bt activity info callback set");
Vidyullatha Kanchanapallybe0ebb32017-03-23 14:36:21 +053014281 }
14282
14283 return status;
14284}
lifengd217d192017-05-09 19:44:16 +080014285
Jeff Johnsonc7309062018-11-09 20:59:42 -080014286QDF_STATUS sme_get_chain_rssi(mac_handle_t mac_handle,
lifengd217d192017-05-09 19:44:16 +080014287 struct get_chain_rssi_req_params *input,
14288 get_chain_rssi_callback callback,
14289 void *context)
14290{
14291 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014292 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Zhang Qian1e7649e2018-06-04 13:07:18 +080014293 tp_wma_handle wma_handle;
lifengd217d192017-05-09 19:44:16 +080014294
14295 SME_ENTER();
14296
Jeff Johnson038efe72019-03-18 13:39:31 -070014297 if (!input) {
lifengd217d192017-05-09 19:44:16 +080014298 sme_err("Invalid req params");
14299 return QDF_STATUS_E_INVAL;
14300 }
14301
14302 mac_ctx->sme.get_chain_rssi_cb = callback;
14303 mac_ctx->sme.get_chain_rssi_context = context;
Zhang Qian1e7649e2018-06-04 13:07:18 +080014304 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
14305 wma_get_chain_rssi(wma_handle, input);
lifengd217d192017-05-09 19:44:16 +080014306
14307 SME_EXIT();
14308 return status;
14309}
Vignesh Viswanathan66c951d2017-09-06 12:23:42 +053014310
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014311QDF_STATUS sme_process_msg_callback(struct mac_context *mac,
Jeff Johnson5f9ce2d2018-06-09 21:20:45 -070014312 struct scheduler_msg *msg)
Sandeep Puligilla1426d612017-04-12 18:22:06 -070014313{
14314 QDF_STATUS status = QDF_STATUS_E_FAILURE;
14315
Jeff Johnson038efe72019-03-18 13:39:31 -070014316 if (!msg) {
Sandeep Puligilla1426d612017-04-12 18:22:06 -070014317 sme_err("Empty message for SME Msg callback");
14318 return status;
14319 }
Jeff Johnson5f9ce2d2018-06-09 21:20:45 -070014320 status = sme_process_msg(mac, msg);
Sandeep Puligilla1426d612017-04-12 18:22:06 -070014321 return status;
14322}
14323
Jeff Johnsonc7309062018-11-09 20:59:42 -080014324void sme_display_disconnect_stats(mac_handle_t mac_handle, uint8_t session_id)
Vignesh Viswanathan66c951d2017-09-06 12:23:42 +053014325{
14326 struct csr_roam_session *session;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014327 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Vignesh Viswanathan66c951d2017-09-06 12:23:42 +053014328
14329 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
14330 sme_err("%s Invalid session id: %d", __func__, session_id);
14331 return;
14332 }
14333
14334 session = CSR_GET_SESSION(mac_ctx, session_id);
14335 if (!session) {
14336 sme_err("%s Failed to get session for id: %d",
14337 __func__, session_id);
14338 return;
14339 }
14340
Nirav Shahe6194ac2018-07-13 11:04:41 +053014341 sme_nofl_info("Total No. of Disconnections: %d",
14342 session->disconnect_stats.disconnection_cnt);
Vignesh Viswanathan66c951d2017-09-06 12:23:42 +053014343
Nirav Shahe6194ac2018-07-13 11:04:41 +053014344 sme_nofl_info("No. of Diconnects Triggered by Application: %d",
14345 session->disconnect_stats.disconnection_by_app);
Vignesh Viswanathan66c951d2017-09-06 12:23:42 +053014346
Nirav Shahe6194ac2018-07-13 11:04:41 +053014347 sme_nofl_info("No. of Disassoc Sent by Peer: %d",
14348 session->disconnect_stats.disassoc_by_peer);
Vignesh Viswanathan66c951d2017-09-06 12:23:42 +053014349
Nirav Shahe6194ac2018-07-13 11:04:41 +053014350 sme_nofl_info("No. of Deauth Sent by Peer: %d",
14351 session->disconnect_stats.deauth_by_peer);
Vignesh Viswanathan66c951d2017-09-06 12:23:42 +053014352
Nirav Shahe6194ac2018-07-13 11:04:41 +053014353 sme_nofl_info("No. of Disconnections due to Beacon Miss: %d",
14354 session->disconnect_stats.bmiss);
Vignesh Viswanathan66c951d2017-09-06 12:23:42 +053014355
Nirav Shahe6194ac2018-07-13 11:04:41 +053014356 sme_nofl_info("No. of Disconnections due to Peer Kickout: %d",
14357 session->disconnect_stats.peer_kickout);
Vignesh Viswanathan66c951d2017-09-06 12:23:42 +053014358}
Nachiket Kukadeaaf8a712017-07-27 19:15:36 +053014359
Rachit Kankanef6834c42018-08-02 18:47:50 +053014360#ifdef FEATURE_WLAN_DYNAMIC_CVM
Nachiket Kukade8983cf62017-10-12 18:14:48 +053014361 /**
14362 * sme_set_vc_mode_config() - Set voltage corner config to FW
14363 * @bitmap: Bitmap that referes to voltage corner config with
14364 * different phymode and bw configuration
14365 *
14366 * Return: QDF_STATUS
14367 */
14368QDF_STATUS sme_set_vc_mode_config(uint32_t vc_bitmap)
14369{
14370 void *wma_handle;
14371
14372 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
14373 if (!wma_handle) {
14374 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
14375 "wma_handle is NULL");
14376 return QDF_STATUS_E_FAILURE;
14377 }
14378 if (QDF_STATUS_SUCCESS !=
14379 wma_set_vc_mode_config(wma_handle, vc_bitmap)) {
14380 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
14381 "%s: Failed to set Voltage Control config to FW",
14382 __func__);
14383 return QDF_STATUS_E_FAILURE;
14384 }
14385 return QDF_STATUS_SUCCESS;
14386}
Rachit Kankanef6834c42018-08-02 18:47:50 +053014387#endif
Nachiket Kukade8983cf62017-10-12 18:14:48 +053014388
Nachiket Kukadeaaf8a712017-07-27 19:15:36 +053014389/**
14390 * sme_set_bmiss_bcnt() - set bmiss config parameters
14391 * @vdev_id: virtual device for the command
14392 * @first_cnt: bmiss first value
14393 * @final_cnt: bmiss final value
14394 *
14395 * Return: QDF_STATUS_SUCCESS or non-zero on failure
14396 */
14397QDF_STATUS sme_set_bmiss_bcnt(uint32_t vdev_id, uint32_t first_cnt,
14398 uint32_t final_cnt)
14399{
14400 return wma_config_bmiss_bcnt_params(vdev_id, first_cnt, final_cnt);
14401}
Ganesh Kondabattini479a8ae2017-10-03 16:49:24 +053014402
Jeff Johnsonc7309062018-11-09 20:59:42 -080014403QDF_STATUS sme_send_limit_off_channel_params(mac_handle_t mac_handle,
14404 uint8_t vdev_id,
14405 bool is_tos_active,
14406 uint32_t max_off_chan_time,
14407 uint32_t rest_time,
14408 bool skip_dfs_chan)
Ganesh Kondabattini479a8ae2017-10-03 16:49:24 +053014409{
14410 struct sir_limit_off_chan *cmd;
14411 struct scheduler_msg msg = {0};
14412
14413 cmd = qdf_mem_malloc(sizeof(*cmd));
Arif Hussain0ef77082018-10-10 16:42:53 -070014414 if (!cmd)
Ganesh Kondabattini479a8ae2017-10-03 16:49:24 +053014415 return QDF_STATUS_E_NOMEM;
Ganesh Kondabattini479a8ae2017-10-03 16:49:24 +053014416
14417 cmd->vdev_id = vdev_id;
14418 cmd->is_tos_active = is_tos_active;
14419 cmd->max_off_chan_time = max_off_chan_time;
14420 cmd->rest_time = rest_time;
14421 cmd->skip_dfs_chans = skip_dfs_chan;
14422
14423 msg.type = WMA_SET_LIMIT_OFF_CHAN;
14424 msg.reserved = 0;
14425 msg.bodyptr = cmd;
14426
gaurank kathpalia36b0c582018-08-28 17:45:43 +053014427 if (!QDF_IS_STATUS_SUCCESS(scheduler_post_message(QDF_MODULE_ID_SME,
14428 QDF_MODULE_ID_WMA,
14429 QDF_MODULE_ID_WMA,
14430 &msg))) {
Ganesh Kondabattini479a8ae2017-10-03 16:49:24 +053014431 sme_err("Not able to post WMA_SET_LIMIT_OFF_CHAN to WMA");
14432 qdf_mem_free(cmd);
14433 return QDF_STATUS_E_FAILURE;
14434 }
14435
14436 return QDF_STATUS_SUCCESS;
14437}
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014438
Jeff Johnsonc7309062018-11-09 20:59:42 -080014439uint32_t sme_unpack_rsn_ie(mac_handle_t mac_handle, uint8_t *buf,
Qiwei Caie689a262018-07-26 15:50:22 +080014440 uint8_t buf_len, tDot11fIERSN *rsn_ie,
14441 bool append_ie)
14442{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014443 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Qiwei Caie689a262018-07-26 15:50:22 +080014444
14445 return dot11f_unpack_ie_rsn(mac_ctx, buf, buf_len, rsn_ie, append_ie);
14446}
14447
14448#ifdef FEATURE_BSS_TRANSITION
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014449/**
14450 * sme_get_status_for_candidate() - Get bss transition status for candidate
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080014451 * @mac_handle: Opaque handle to the global MAC context
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014452 * @conn_bss_desc: connected bss descriptor
14453 * @bss_desc: candidate bss descriptor
14454 * @info: candiadate bss information
14455 * @trans_reason: transition reason code
14456 * @is_bt_in_progress: bt activity indicator
14457 *
14458 * Return : true if candidate is rejected and reject reason is filled
14459 * @info->status. Otherwise returns false.
14460 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080014461static bool sme_get_status_for_candidate(mac_handle_t mac_handle,
14462 tSirBssDescription *conn_bss_desc,
14463 tSirBssDescription *bss_desc,
14464 struct bss_candidate_info *info,
14465 uint8_t trans_reason,
14466 bool is_bt_in_progress)
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014467{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014468 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Pragaspathi Thilagarajcd6aef02018-09-11 20:30:23 +053014469 struct wlan_mlme_mbo *mbo_cfg;
14470 int8_t current_rssi_mcc_thres;
14471
14472 if (!(mac_ctx->mlme_cfg)) {
14473 pe_err("mlme cfg is NULL");
14474 return false;
14475 }
14476 mbo_cfg = &mac_ctx->mlme_cfg->mbo_cfg;
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014477
14478 /*
14479 * Low RSSI based rejection
14480 * If candidate rssi is less than mbo_candidate_rssi_thres and connected
14481 * bss rssi is greater than mbo_current_rssi_thres, then reject the
14482 * candidate with MBO reason code 4.
14483 */
Pragaspathi Thilagarajcd6aef02018-09-11 20:30:23 +053014484 if ((bss_desc->rssi < mbo_cfg->mbo_candidate_rssi_thres) &&
14485 (conn_bss_desc->rssi > mbo_cfg->mbo_current_rssi_thres)) {
Srinivas Girigowdacb7b8b82019-04-10 14:27:47 -070014486 sme_err("Candidate BSS "QDF_MAC_ADDR_STR" has LOW RSSI(%d), hence reject",
Srinivas Girigowda34fbba02019-04-08 12:07:44 -070014487 QDF_MAC_ADDR_ARRAY(bss_desc->bssId), bss_desc->rssi);
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014488 info->status = QCA_STATUS_REJECT_LOW_RSSI;
14489 return true;
14490 }
14491
14492 if (trans_reason == MBO_TRANSITION_REASON_LOAD_BALANCING ||
14493 trans_reason == MBO_TRANSITION_REASON_TRANSITIONING_TO_PREMIUM_AP) {
14494 /*
14495 * MCC rejection
14496 * If moving to candidate's channel will result in MCC scenario
14497 * and the rssi of connected bss is greater than
14498 * mbo_current_rssi_mss_thres, then reject the candidate with
14499 * MBO reason code 3.
14500 */
Pragaspathi Thilagarajcd6aef02018-09-11 20:30:23 +053014501 current_rssi_mcc_thres = mbo_cfg->mbo_current_rssi_mcc_thres;
14502 if ((conn_bss_desc->rssi > current_rssi_mcc_thres) &&
Jeff Johnson9d118852018-06-10 16:54:59 -070014503 csr_is_mcc_channel(mac_ctx, bss_desc->channelId)) {
Srinivas Girigowdacb7b8b82019-04-10 14:27:47 -070014504 sme_err("Candidate BSS "QDF_MAC_ADDR_STR" causes MCC, hence reject",
Srinivas Girigowda34fbba02019-04-08 12:07:44 -070014505 QDF_MAC_ADDR_ARRAY(bss_desc->bssId));
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014506 info->status =
14507 QCA_STATUS_REJECT_INSUFFICIENT_QOS_CAPACITY;
14508 return true;
14509 }
14510
14511 /*
14512 * BT coex rejection
14513 * If AP is trying to move the client from 5G to 2.4G and moving
14514 * to 2.4G will result in BT coex and candidate channel rssi is
14515 * less than mbo_candidate_rssi_btc_thres, then reject the
14516 * candidate with MBO reason code 2.
14517 */
14518 if (WLAN_REG_IS_5GHZ_CH(conn_bss_desc->channelId) &&
14519 WLAN_REG_IS_24GHZ_CH(bss_desc->channelId) &&
14520 is_bt_in_progress &&
Pragaspathi Thilagarajcd6aef02018-09-11 20:30:23 +053014521 (bss_desc->rssi < mbo_cfg->mbo_candidate_rssi_btc_thres)) {
Srinivas Girigowdacb7b8b82019-04-10 14:27:47 -070014522 sme_err("Candidate BSS "QDF_MAC_ADDR_STR" causes BT coex, hence reject",
Srinivas Girigowda34fbba02019-04-08 12:07:44 -070014523 QDF_MAC_ADDR_ARRAY(bss_desc->bssId));
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014524 info->status =
14525 QCA_STATUS_REJECT_EXCESSIVE_DELAY_EXPECTED;
14526 return true;
14527 }
14528
14529 /*
14530 * LTE coex rejection
14531 * If moving to candidate's channel can cause LTE coex, then
14532 * reject the candidate with MBO reason code 5.
14533 */
14534 if (policy_mgr_is_safe_channel(mac_ctx->psoc,
14535 conn_bss_desc->channelId) &&
14536 !(policy_mgr_is_safe_channel(mac_ctx->psoc,
14537 bss_desc->channelId))) {
14538 sme_err("High interference expected if transitioned to BSS "
Srinivas Girigowdacb7b8b82019-04-10 14:27:47 -070014539 QDF_MAC_ADDR_STR" hence reject",
Srinivas Girigowda34fbba02019-04-08 12:07:44 -070014540 QDF_MAC_ADDR_ARRAY(bss_desc->bssId));
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014541 info->status =
14542 QCA_STATUS_REJECT_HIGH_INTERFERENCE;
14543 return true;
14544 }
14545 }
14546
14547 return false;
14548}
14549
Jeff Johnson62737252018-11-17 10:59:43 -080014550QDF_STATUS sme_get_bss_transition_status(mac_handle_t mac_handle,
14551 uint8_t transition_reason,
14552 struct qdf_mac_addr *bssid,
14553 struct bss_candidate_info *info,
14554 uint16_t n_candidates,
14555 bool is_bt_in_progress)
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014556{
14557 QDF_STATUS status = QDF_STATUS_SUCCESS;
14558 tSirBssDescription *bss_desc, *conn_bss_desc;
14559 tCsrScanResultInfo *res, *conn_res;
14560 uint16_t i;
14561
14562 if (!n_candidates || !info) {
14563 sme_err("No candidate info available");
14564 return QDF_STATUS_E_INVAL;
14565 }
14566
14567 conn_res = qdf_mem_malloc(sizeof(tCsrScanResultInfo));
Arif Hussain0ef77082018-10-10 16:42:53 -070014568 if (!conn_res)
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014569 return QDF_STATUS_E_NOMEM;
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014570
14571 res = qdf_mem_malloc(sizeof(tCsrScanResultInfo));
14572 if (!res) {
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014573 status = QDF_STATUS_E_NOMEM;
14574 goto free;
14575 }
14576
14577 /* Get the connected BSS descriptor */
Jeff Johnsonc7309062018-11-09 20:59:42 -080014578 status = sme_scan_get_result_for_bssid(mac_handle, bssid, conn_res);
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014579 if (!QDF_IS_STATUS_SUCCESS(status)) {
14580 sme_err("Failed to find connected BSS in scan list");
14581 goto free;
14582 }
14583 conn_bss_desc = &conn_res->BssDescriptor;
14584
14585 for (i = 0; i < n_candidates; i++) {
14586 /* Get candidate BSS descriptors */
Jeff Johnsonc7309062018-11-09 20:59:42 -080014587 status = sme_scan_get_result_for_bssid(mac_handle,
14588 &info[i].bssid,
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014589 res);
14590 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowdacb7b8b82019-04-10 14:27:47 -070014591 sme_err("BSS "QDF_MAC_ADDR_STR" not present in scan list",
Srinivas Girigowda34fbba02019-04-08 12:07:44 -070014592 QDF_MAC_ADDR_ARRAY(info[i].bssid.bytes));
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014593 info[i].status = QCA_STATUS_REJECT_UNKNOWN;
14594 continue;
14595 }
14596
14597 bss_desc = &res->BssDescriptor;
Jeff Johnsonc7309062018-11-09 20:59:42 -080014598 if (!sme_get_status_for_candidate(mac_handle, conn_bss_desc,
14599 bss_desc, &info[i],
14600 transition_reason,
14601 is_bt_in_progress)) {
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014602 /*
14603 * If status is not over written, it means it is a
14604 * candidate for accept.
14605 */
14606 info[i].status = QCA_STATUS_ACCEPT;
14607 }
14608 }
14609
14610 /* success */
14611 status = QDF_STATUS_SUCCESS;
14612
14613free:
14614 /* free allocated memory */
14615 if (conn_res)
14616 qdf_mem_free(conn_res);
14617 if (res)
14618 qdf_mem_free(res);
14619
14620 return status;
14621}
Qiwei Caie689a262018-07-26 15:50:22 +080014622#endif /* FEATURE_BSS_TRANSITION */
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014623
Jeff Johnsonc7309062018-11-09 20:59:42 -080014624bool sme_is_conn_state_connected(mac_handle_t mac_handle, uint8_t session_id)
Vignesh Viswanathan79f7e3f2018-09-30 23:56:10 +053014625{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014626 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Vignesh Viswanathan79f7e3f2018-09-30 23:56:10 +053014627
14628 return csr_is_conn_state_connected(mac_ctx, session_id);
14629}
14630
Jeff Johnsonc7309062018-11-09 20:59:42 -080014631void sme_enable_roaming_on_connected_sta(mac_handle_t mac_handle)
Abhishek Singh1f217ec2017-12-22 11:48:27 +053014632{
14633 uint8_t session_id;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014634 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Abhishek Singh1f217ec2017-12-22 11:48:27 +053014635 QDF_STATUS status;
14636
14637 session_id = csr_get_roam_enabled_sta_sessionid(mac_ctx);
Srinivas Girigowdad8697d42019-03-08 15:34:39 -080014638 if (session_id != WLAN_UMAC_VDEV_ID_MAX)
Abhishek Singh1f217ec2017-12-22 11:48:27 +053014639 return;
14640
14641 session_id = csr_get_connected_infra(mac_ctx);
Srinivas Girigowdad8697d42019-03-08 15:34:39 -080014642 if (session_id == WLAN_UMAC_VDEV_ID_MAX) {
Abhishek Singh1f217ec2017-12-22 11:48:27 +053014643 sme_debug("No STA in conencted state");
14644 return;
14645 }
14646
14647 sme_debug("Roaming not enabled on any STA, enable roaming on session %d",
14648 session_id);
14649 status = sme_acquire_global_lock(&mac_ctx->sme);
14650 if (QDF_IS_STATUS_SUCCESS(status)) {
14651 csr_roam_offload_scan(mac_ctx, session_id,
14652 ROAM_SCAN_OFFLOAD_START,
14653 REASON_CTX_INIT);
14654 sme_release_global_lock(&mac_ctx->sme);
14655 }
Sandeep Puligilla063a4342018-01-10 02:50:14 -080014656}
Abhishek Singh1f217ec2017-12-22 11:48:27 +053014657
Sandeep Puligilla063a4342018-01-10 02:50:14 -080014658int16_t sme_get_oper_chan_freq(struct wlan_objmgr_vdev *vdev)
14659{
14660 uint8_t vdev_id, chan;
14661 struct csr_roam_session *session;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014662 struct mac_context *mac_ctx;
Jeff Johnsonb460dd72018-11-08 10:26:51 -080014663 mac_handle_t mac_handle;
Sandeep Puligilla063a4342018-01-10 02:50:14 -080014664 int16_t freq = 0;
14665
Jeff Johnson038efe72019-03-18 13:39:31 -070014666 if (!vdev) {
Sandeep Puligilla063a4342018-01-10 02:50:14 -080014667 sme_err("Invalid vdev id is passed");
14668 return 0;
14669 }
14670
Jeff Johnsonb460dd72018-11-08 10:26:51 -080014671 mac_handle = cds_get_context(QDF_MODULE_ID_SME);
14672 if (!mac_handle) {
14673 sme_err("mac_handle is null");
Arif Hussaind15902c2018-03-02 00:08:29 -080014674 return 0;
14675 }
Jeff Johnsona0619e42018-11-28 17:43:00 -080014676 mac_ctx = MAC_CONTEXT(mac_handle);
Sandeep Puligilla063a4342018-01-10 02:50:14 -080014677 vdev_id = wlan_vdev_get_id(vdev);
14678 if (!CSR_IS_SESSION_VALID(mac_ctx, vdev_id)) {
14679 sme_err("Invalid vdev id is passed");
14680 return 0;
14681 }
14682
14683 session = CSR_GET_SESSION(mac_ctx, vdev_id);
14684 chan = csr_get_infra_operation_channel(mac_ctx, vdev_id);
14685 if (chan)
14686 freq = cds_chan_to_freq(chan);
14687
14688 return freq;
14689}
14690
14691enum phy_ch_width sme_get_oper_ch_width(struct wlan_objmgr_vdev *vdev)
14692{
14693 uint8_t vdev_id;
14694 struct csr_roam_session *session;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014695 struct mac_context *mac_ctx;
Jeff Johnsonb460dd72018-11-08 10:26:51 -080014696 mac_handle_t mac_handle;
Sandeep Puligilla063a4342018-01-10 02:50:14 -080014697 enum phy_ch_width ch_width = CH_WIDTH_20MHZ;
14698
Jeff Johnson038efe72019-03-18 13:39:31 -070014699 if (!vdev) {
Sandeep Puligilla063a4342018-01-10 02:50:14 -080014700 sme_err("Invalid vdev id is passed");
14701 return CH_WIDTH_INVALID;
14702 }
14703
Jeff Johnsonb460dd72018-11-08 10:26:51 -080014704 mac_handle = cds_get_context(QDF_MODULE_ID_SME);
14705 if (!mac_handle) {
14706 sme_err("mac_handle is null");
Arif Hussaind15902c2018-03-02 00:08:29 -080014707 return CH_WIDTH_INVALID;
14708 }
Jeff Johnsona0619e42018-11-28 17:43:00 -080014709 mac_ctx = MAC_CONTEXT(mac_handle);
Sandeep Puligilla063a4342018-01-10 02:50:14 -080014710 vdev_id = wlan_vdev_get_id(vdev);
14711 if (!CSR_IS_SESSION_VALID(mac_ctx, vdev_id)) {
14712 sme_err("Invalid vdev id is passed");
14713 return CH_WIDTH_INVALID;
14714 }
14715
14716 session = CSR_GET_SESSION(mac_ctx, vdev_id);
14717
14718 if (csr_is_conn_state_connected(mac_ctx, vdev_id))
14719 ch_width = session->connectedProfile.vht_channel_width;
14720
14721 return ch_width;
14722}
14723
14724int sme_get_sec20chan_freq_mhz(struct wlan_objmgr_vdev *vdev,
14725 uint16_t *sec20chan_freq)
14726{
14727 uint8_t vdev_id;
14728
14729 vdev_id = wlan_vdev_get_id(vdev);
14730 /* Need to extend */
14731 return 0;
Abhishek Singh1f217ec2017-12-22 11:48:27 +053014732}
14733
Padma, Santhosh Kumardd3f4852018-01-16 18:51:51 +053014734#ifdef WLAN_FEATURE_SAE
Srinivas Dasarie854ff02019-02-11 17:24:48 +053014735QDF_STATUS sme_handle_sae_msg(mac_handle_t mac_handle,
14736 uint8_t session_id,
14737 uint8_t sae_status,
14738 struct qdf_mac_addr peer_mac_addr)
Padma, Santhosh Kumardd3f4852018-01-16 18:51:51 +053014739{
14740 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014741 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Padma, Santhosh Kumardd3f4852018-01-16 18:51:51 +053014742 struct sir_sae_msg *sae_msg;
14743 struct scheduler_msg sch_msg = {0};
14744
14745 qdf_status = sme_acquire_global_lock(&mac->sme);
14746 if (QDF_IS_STATUS_SUCCESS(qdf_status)) {
14747 sae_msg = qdf_mem_malloc(sizeof(*sae_msg));
14748 if (!sae_msg) {
14749 qdf_status = QDF_STATUS_E_NOMEM;
Padma, Santhosh Kumardd3f4852018-01-16 18:51:51 +053014750 } else {
14751 sae_msg->message_type = eWNI_SME_SEND_SAE_MSG;
14752 sae_msg->length = sizeof(*sae_msg);
14753 sae_msg->session_id = session_id;
14754 sae_msg->sae_status = sae_status;
Srinivas Dasarie854ff02019-02-11 17:24:48 +053014755 qdf_mem_copy(sae_msg->peer_mac_addr,
14756 peer_mac_addr.bytes,
14757 QDF_MAC_ADDR_SIZE);
14758 sme_debug("SAE: sae_status %d session_id %d Peer: "
Srinivas Girigowdacb7b8b82019-04-10 14:27:47 -070014759 QDF_MAC_ADDR_STR, sae_msg->sae_status,
Srinivas Dasarie854ff02019-02-11 17:24:48 +053014760 sae_msg->session_id,
Srinivas Girigowda34fbba02019-04-08 12:07:44 -070014761 QDF_MAC_ADDR_ARRAY(sae_msg->peer_mac_addr));
Padma, Santhosh Kumardd3f4852018-01-16 18:51:51 +053014762
14763 sch_msg.type = eWNI_SME_SEND_SAE_MSG;
14764 sch_msg.bodyptr = sae_msg;
14765
14766 qdf_status =
gaurank kathpalia36b0c582018-08-28 17:45:43 +053014767 scheduler_post_message(QDF_MODULE_ID_SME,
14768 QDF_MODULE_ID_PE,
14769 QDF_MODULE_ID_PE,
Jeff Johnsonc7309062018-11-09 20:59:42 -080014770 &sch_msg);
Padma, Santhosh Kumardd3f4852018-01-16 18:51:51 +053014771 }
14772 sme_release_global_lock(&mac->sme);
14773 }
14774
14775 return qdf_status;
14776}
14777#endif
Vignesh Viswanathan0a569292018-02-14 15:34:47 +053014778
Jeff Johnsonc7309062018-11-09 20:59:42 -080014779bool sme_is_sta_key_exchange_in_progress(mac_handle_t mac_handle,
14780 uint8_t session_id)
Vignesh Viswanathan0a569292018-02-14 15:34:47 +053014781{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014782 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Vignesh Viswanathan0a569292018-02-14 15:34:47 +053014783
14784 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
14785 sme_err("Invalid session id: %d", session_id);
14786 return false;
14787 }
14788
14789 return CSR_IS_WAIT_FOR_KEY(mac_ctx, session_id);
14790}
Vignesh Viswanathana2f5ce582018-05-09 20:38:39 +053014791
Jeff Johnsonc7309062018-11-09 20:59:42 -080014792bool sme_validate_channel_list(mac_handle_t mac_handle,
14793 uint8_t *chan_list,
14794 uint8_t num_channels)
Vignesh Viswanathana2f5ce582018-05-09 20:38:39 +053014795{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014796 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Vignesh Viswanathana2f5ce582018-05-09 20:38:39 +053014797 uint8_t i = 0;
14798 uint8_t j;
14799 bool found;
14800 struct csr_channel *ch_lst_info = &mac_ctx->scan.base_channels;
14801
14802 if (!chan_list || !num_channels) {
14803 sme_err("Chan list empty %pK or num_channels is 0", chan_list);
14804 return false;
14805 }
14806
14807 while (i < num_channels) {
14808 found = false;
14809 for (j = 0; j < ch_lst_info->numChannels; j++) {
14810 if (ch_lst_info->channelList[j] == chan_list[i]) {
14811 found = true;
14812 break;
14813 }
14814 }
14815
14816 if (!found) {
14817 sme_debug("Invalid channel %d", chan_list[i]);
14818 return false;
14819 }
14820
14821 i++;
14822 }
Arif Hussain0e246802018-05-01 18:13:44 -070014823
Vignesh Viswanathana2f5ce582018-05-09 20:38:39 +053014824 return true;
14825}
Arif Hussain0e246802018-05-01 18:13:44 -070014826
Jeff Johnsonc7309062018-11-09 20:59:42 -080014827void sme_set_amsdu(mac_handle_t mac_handle, bool enable)
Arif Hussain0e246802018-05-01 18:13:44 -070014828{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014829 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Arif Hussain0e246802018-05-01 18:13:44 -070014830 mac_ctx->is_usr_cfg_amsdu_enabled = enable;
14831}
Naveen Rawatfa2a1002018-05-17 16:06:37 -070014832
Kiran Kumar Lokere921b5a52019-02-24 21:53:20 -080014833#ifdef WLAN_FEATURE_11AX
14834void sme_set_he_testbed_def(mac_handle_t mac_handle, uint8_t vdev_id)
14835{
14836 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
14837 struct csr_roam_session *session;
14838
14839 session = CSR_GET_SESSION(mac_ctx, vdev_id);
14840
14841 if (!session) {
14842 sme_debug("No session for id %d", vdev_id);
14843 return;
14844 }
14845 sme_debug("set HE testbed defaults");
14846 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.amsdu_in_ampdu = 0;
14847 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.twt_request = 0;
14848 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.omi_a_ctrl = 0;
14849 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.he_ppdu_20_in_160_80p80Mhz = 0;
14850 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.he_ppdu_20_in_40Mhz_2G = 0;
14851 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.he_ppdu_80_in_160_80p80Mhz = 0;
14852 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.dcm_enc_tx = 0;
14853 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.dcm_enc_rx = 0;
14854 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.max_nc = 0;
14855 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.trigger_frm_mac_pad =
14856 QCA_WLAN_HE_16US_OF_PROCESS_TIME;
Kiran Kumar Lokere05a61852019-04-02 18:39:19 -070014857 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.flex_twt_sched = 0;
14858 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.ofdma_ra = 0;
14859 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.he_4x_ltf_3200_gi_ndp = 0;
14860 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.qtp = 0;
14861 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.bsrp_ampdu_aggr = 0;
14862 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.a_bqr = 0;
14863 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.he_sub_ch_sel_tx_supp = 0;
14864 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.ndp_feedback_supp = 0;
14865 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.ops_supp = 0;
14866 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.srp = 0;
14867 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.power_boost = 0;
14868 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.num_sounding_lt_80 = 0;
14869 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.num_sounding_gt_80 = 0;
14870 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.dl_mu_mimo_part_bw = 0;
14871 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.non_trig_cqi_feedback = 0;
14872 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.tx_1024_qam_lt_242_tone_ru = 0;
14873 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.rx_1024_qam_lt_242_tone_ru = 0;
14874 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.rx_full_bw_su_he_mu_compress_sigb = 0;
14875 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.rx_full_bw_su_he_mu_non_cmpr_sigb = 0;
14876 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.su_beamformer = 0;
14877 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.multi_tid_aggr_rx_supp = 0;
14878 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.multi_tid_aggr_tx_supp = 0;
14879 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.he_dynamic_smps = 0;
14880 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.punctured_sounding_supp = 0;
14881 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.ht_vht_trg_frm_rx_supp = 0;
14882 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.su_feedback_tone16 = 0;
14883 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.mu_feedback_tone16 = 0;
14884 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.codebook_su = 0;
14885 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.codebook_mu = 0;
14886 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.ul_2x996_tone_ru_supp = 0;
14887 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.beamforming_feedback = 0;
14888 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.he_er_su_ppdu = 0;
14889 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.dl_mu_mimo_part_bw = 0;
Kiran Kumar Lokere921b5a52019-02-24 21:53:20 -080014890 csr_update_session_he_cap(mac_ctx, session);
14891}
14892
14893void sme_reset_he_caps(mac_handle_t mac_handle, uint8_t vdev_id)
14894{
14895 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
14896 struct csr_roam_session *session;
14897
14898 session = CSR_GET_SESSION(mac_ctx, vdev_id);
14899
14900 if (!session) {
14901 sme_err("No session for id %d", vdev_id);
14902 return;
14903 }
14904 sme_debug("reset HE caps");
14905 mac_ctx->mlme_cfg->he_caps.dot11_he_cap =
14906 mac_ctx->mlme_cfg->he_caps.he_cap_orig;
14907 csr_update_session_he_cap(mac_ctx, session);
14908}
14909#endif
14910
Naveen Rawatfa2a1002018-05-17 16:06:37 -070014911uint8_t sme_get_mcs_idx(uint16_t max_rate, uint8_t rate_flags,
Hanumanth Reddy Pothula834f9432018-05-30 14:20:32 +053014912 uint8_t *nss, uint8_t *mcs_rate_flags)
Naveen Rawatfa2a1002018-05-17 16:06:37 -070014913{
14914 return wma_get_mcs_idx(max_rate, rate_flags, nss, mcs_rate_flags);
14915}
Chaoli Zhou75b062f2018-06-11 12:36:54 +080014916
Jeff Johnsonc7309062018-11-09 20:59:42 -080014917bool sme_find_session_by_bssid(mac_handle_t mac_handle, uint8_t *bssid)
Chaoli Zhou75b062f2018-06-11 12:36:54 +080014918{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014919 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Chaoli Zhou75b062f2018-06-11 12:36:54 +080014920 bool ret;
14921
14922 ret = csr_find_session_by_bssid(mac_ctx, bssid);
14923
14924 return ret;
14925}
Rajeev Kumar Sirasanagandla4f20b672018-03-12 13:52:50 +053014926
Krunal Soni5e483782018-10-25 15:42:44 -070014927#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
14928QDF_STATUS sme_get_sta_cxn_info(mac_handle_t mac_handle, uint32_t session_id,
14929 char *buf, uint32_t buf_sz)
14930{
14931 QDF_STATUS status;
14932 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
14933 struct tagCsrRoamConnectedProfile *conn_profile;
14934 struct csr_roam_session *session = CSR_GET_SESSION(mac_ctx, session_id);
14935
14936 status = sme_acquire_global_lock(&mac_ctx->sme);
14937 if (!QDF_IS_STATUS_SUCCESS(status))
14938 return status;
14939 if (!session || !session->pCurRoamProfile) {
14940 status = QDF_STATUS_E_FAILURE;
14941 goto end;
14942 }
14943 conn_profile = &session->connectedProfile;
14944 if (!conn_profile) {
14945 status = QDF_STATUS_E_FAILURE;
14946 goto end;
14947 }
14948 csr_get_sta_cxn_info(mac_ctx, session, conn_profile, buf, buf_sz);
14949end:
14950 sme_release_global_lock(&mac_ctx->sme);
14951
14952 return status;
14953}
14954#endif
Rajeev Kumar Sirasanagandla4f20b672018-03-12 13:52:50 +053014955QDF_STATUS
Jeff Johnsonc7309062018-11-09 20:59:42 -080014956sme_get_roam_scan_stats(mac_handle_t mac_handle,
14957 roam_scan_stats_cb cb, void *context,
Rajeev Kumar Sirasanagandla4f20b672018-03-12 13:52:50 +053014958 uint32_t vdev_id)
14959{
14960 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014961 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar Sirasanagandla4f20b672018-03-12 13:52:50 +053014962 struct scheduler_msg msg = {0};
14963 struct sir_roam_scan_stats *req;
14964
14965 req = qdf_mem_malloc(sizeof(*req));
Arif Hussain0ef77082018-10-10 16:42:53 -070014966 if (!req)
Rajeev Kumar Sirasanagandla4f20b672018-03-12 13:52:50 +053014967 return QDF_STATUS_E_NOMEM;
Rajeev Kumar Sirasanagandla4f20b672018-03-12 13:52:50 +053014968
14969 req->vdev_id = vdev_id;
14970 req->cb = cb;
14971 req->context = context;
14972
14973 status = sme_acquire_global_lock(&mac->sme);
14974 if (QDF_IS_STATUS_SUCCESS(status)) {
14975 msg.bodyptr = req;
14976 msg.type = WMA_GET_ROAM_SCAN_STATS;
14977 msg.reserved = 0;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053014978 status = scheduler_post_message(QDF_MODULE_ID_SME,
14979 QDF_MODULE_ID_WMA,
14980 QDF_MODULE_ID_WMA,
14981 &msg);
Rajeev Kumar Sirasanagandla4f20b672018-03-12 13:52:50 +053014982 sme_release_global_lock(&mac->sme);
14983 if (!QDF_IS_STATUS_SUCCESS(status)) {
14984 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
14985 FL("post roam scan stats req failed"));
14986 status = QDF_STATUS_E_FAILURE;
14987 qdf_mem_free(req);
14988 }
14989 } else {
Rajeev Kumar Sirasanagandla4f20b672018-03-12 13:52:50 +053014990 qdf_mem_free(req);
14991 }
14992
14993 return status;
14994}
Vignesh Viswanathan987f0bb2018-09-17 17:00:29 +053014995
Jeff Johnsonc7309062018-11-09 20:59:42 -080014996void sme_update_score_config(mac_handle_t mac_handle,
Vignesh Viswanathan987f0bb2018-09-17 17:00:29 +053014997 struct scoring_config *score_config)
14998{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014999 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Vignesh Viswanathan987f0bb2018-09-17 17:00:29 +053015000 struct wlan_mlme_scoring_cfg *mlme_scoring_cfg;
15001
15002 mlme_scoring_cfg = &mac_ctx->mlme_cfg->scoring;
15003
15004 score_config->weight_cfg.rssi_weightage =
15005 mlme_scoring_cfg->weight_cfg.rssi_weightage;
15006 score_config->weight_cfg.ht_caps_weightage =
15007 mlme_scoring_cfg->weight_cfg.ht_caps_weightage;
15008 score_config->weight_cfg.vht_caps_weightage =
15009 mlme_scoring_cfg->weight_cfg.vht_caps_weightage;
15010 score_config->weight_cfg.he_caps_weightage =
15011 mlme_scoring_cfg->weight_cfg.he_caps_weightage;
15012 score_config->weight_cfg.chan_width_weightage =
15013 mlme_scoring_cfg->weight_cfg.chan_width_weightage;
15014 score_config->weight_cfg.chan_band_weightage =
15015 mlme_scoring_cfg->weight_cfg.chan_band_weightage;
15016 score_config->weight_cfg.nss_weightage =
15017 mlme_scoring_cfg->weight_cfg.nss_weightage;
15018 score_config->weight_cfg.beamforming_cap_weightage =
15019 mlme_scoring_cfg->weight_cfg.beamforming_cap_weightage;
15020 score_config->weight_cfg.pcl_weightage =
15021 mlme_scoring_cfg->weight_cfg.pcl_weightage;
15022 score_config->weight_cfg.channel_congestion_weightage =
15023 mlme_scoring_cfg->weight_cfg.channel_congestion_weightage;
15024 score_config->weight_cfg.oce_wan_weightage =
15025 mlme_scoring_cfg->weight_cfg.oce_wan_weightage;
15026
15027 score_config->bandwidth_weight_per_index =
15028 mlme_scoring_cfg->bandwidth_weight_per_index;
15029 score_config->nss_weight_per_index =
15030 mlme_scoring_cfg->nss_weight_per_index;
15031 score_config->band_weight_per_index =
15032 mlme_scoring_cfg->band_weight_per_index;
15033
15034 score_config->rssi_score.best_rssi_threshold =
15035 mlme_scoring_cfg->rssi_score.best_rssi_threshold;
15036 score_config->rssi_score.good_rssi_threshold =
15037 mlme_scoring_cfg->rssi_score.good_rssi_threshold;
15038 score_config->rssi_score.bad_rssi_threshold =
15039 mlme_scoring_cfg->rssi_score.bad_rssi_threshold;
15040 score_config->rssi_score.good_rssi_pcnt =
15041 mlme_scoring_cfg->rssi_score.good_rssi_pcnt;
15042 score_config->rssi_score.bad_rssi_pcnt =
15043 mlme_scoring_cfg->rssi_score.bad_rssi_pcnt;
15044 score_config->rssi_score.good_rssi_bucket_size =
15045 mlme_scoring_cfg->rssi_score.good_rssi_bucket_size;
15046 score_config->rssi_score.bad_rssi_bucket_size =
15047 mlme_scoring_cfg->rssi_score.bad_rssi_bucket_size;
15048 score_config->rssi_score.rssi_pref_5g_rssi_thresh =
15049 mlme_scoring_cfg->rssi_score.rssi_pref_5g_rssi_thresh;
15050
15051 score_config->esp_qbss_scoring.num_slot =
15052 mlme_scoring_cfg->esp_qbss_scoring.num_slot;
15053 score_config->esp_qbss_scoring.score_pcnt3_to_0 =
15054 mlme_scoring_cfg->esp_qbss_scoring.score_pcnt3_to_0;
15055 score_config->esp_qbss_scoring.score_pcnt7_to_4 =
15056 mlme_scoring_cfg->esp_qbss_scoring.score_pcnt7_to_4;
15057 score_config->esp_qbss_scoring.score_pcnt11_to_8 =
15058 mlme_scoring_cfg->esp_qbss_scoring.score_pcnt11_to_8;
15059 score_config->esp_qbss_scoring.score_pcnt15_to_12 =
15060 mlme_scoring_cfg->esp_qbss_scoring.score_pcnt15_to_12;
15061
15062 score_config->oce_wan_scoring.num_slot =
15063 mlme_scoring_cfg->oce_wan_scoring.num_slot;
15064 score_config->oce_wan_scoring.score_pcnt3_to_0 =
15065 mlme_scoring_cfg->oce_wan_scoring.score_pcnt3_to_0;
15066 score_config->oce_wan_scoring.score_pcnt7_to_4 =
15067 mlme_scoring_cfg->oce_wan_scoring.score_pcnt7_to_4;
15068 score_config->oce_wan_scoring.score_pcnt11_to_8 =
15069 mlme_scoring_cfg->oce_wan_scoring.score_pcnt11_to_8;
15070 score_config->oce_wan_scoring.score_pcnt15_to_12 =
15071 mlme_scoring_cfg->oce_wan_scoring.score_pcnt15_to_12;
15072}
lifengfaa83cb2018-11-24 01:53:56 +080015073
15074void sme_enable_fw_module_log_level(mac_handle_t mac_handle, int vdev_id)
15075{
15076 QDF_STATUS status;
15077 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
15078 uint8_t *enable_fw_module_log_level;
15079 uint8_t enable_fw_module_log_level_num;
15080 uint8_t count = 0;
15081 uint32_t value = 0;
15082 int ret;
15083
15084 status = ucfg_fwol_get_enable_fw_module_log_level(
15085 mac_ctx->psoc, &enable_fw_module_log_level,
15086 &enable_fw_module_log_level_num);
15087 if (QDF_IS_STATUS_ERROR(status))
15088 return;
15089
15090 while (count < enable_fw_module_log_level_num) {
15091 /*
15092 * FW module log level input array looks like
15093 * below:
15094 * enable_fw_module_log_level = {<FW Module ID>,
15095 * <Log Level>,...}
15096 * For example:
15097 * enable_fw_module_log_level=
15098 * {1,0,2,1,3,2,4,3,5,4,6,5,7,6}
15099 * Above input array means :
15100 * For FW module ID 1 enable log level 0
15101 * For FW module ID 2 enable log level 1
15102 * For FW module ID 3 enable log level 2
15103 * For FW module ID 4 enable log level 3
15104 * For FW module ID 5 enable log level 4
15105 * For FW module ID 6 enable log level 5
15106 * For FW module ID 7 enable log level 6
15107 */
15108
15109 if ((enable_fw_module_log_level[count] > WLAN_MODULE_ID_MAX) ||
15110 (enable_fw_module_log_level[count + 1] > DBGLOG_LVL_MAX)) {
15111 sme_err("Module id %d or dbglog level %d input value is more than max",
15112 enable_fw_module_log_level[count],
15113 enable_fw_module_log_level[count + 1]);
wadesongeb865bb2019-01-09 19:01:06 +080015114 count += 2;
lifengfaa83cb2018-11-24 01:53:56 +080015115 continue;
15116 }
15117
15118 value = enable_fw_module_log_level[count] << 16;
15119 value |= enable_fw_module_log_level[count + 1];
15120 ret = sme_cli_set_command(vdev_id,
15121 WMI_DBGLOG_MOD_LOG_LEVEL,
15122 value, DBG_CMD);
15123 if (ret != 0)
15124 sme_err("Failed to enable FW module log level %d ret %d",
15125 value, ret);
15126
15127 count += 2;
15128 }
15129}
Visweswara Tanuku633976b2019-01-07 16:13:12 +053015130
15131#ifdef WLAN_FEATURE_MOTION_DETECTION
15132/**
15133 * sme_set_md_host_evt_cb - Register/set motion detection callback
15134 * @mac_handle: mac handle
15135 * @callback_fn: motion detection callback function pointer
15136 * @hdd_ctx: hdd context
15137 *
15138 * Return: QDF_STATUS_SUCCESS or non-zero on failure
15139 */
15140QDF_STATUS sme_set_md_host_evt_cb(
15141 mac_handle_t mac_handle,
15142 QDF_STATUS (*callback_fn)(void *ctx, struct sir_md_evt *event),
15143 void *hdd_ctx
15144)
15145{
15146 struct mac_context *mac = MAC_CONTEXT(mac_handle);
15147 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
15148
15149 qdf_status = sme_acquire_global_lock(&mac->sme);
15150 if (QDF_IS_STATUS_SUCCESS(qdf_status)) {
15151 mac->sme.md_host_evt_cb = callback_fn;
15152 mac->sme.md_ctx = hdd_ctx;
15153 sme_release_global_lock(&mac->sme);
15154 }
15155 return qdf_status;
15156}
15157
15158/**
15159 * sme_motion_det_config - Post motion detection configuration msg to scheduler
15160 * @mac_handle: mac handle
15161 * @motion_det_config: motion detection configuration
15162 *
15163 * Return: QDF_STATUS_SUCCESS or non-zero on failure
15164 */
15165QDF_STATUS sme_motion_det_config(mac_handle_t mac_handle,
15166 struct sme_motion_det_cfg *motion_det_config)
15167{
Visweswara Tanuku025f5862019-01-08 17:35:33 +053015168 struct scheduler_msg msg;
Visweswara Tanuku633976b2019-01-07 16:13:12 +053015169 struct sme_motion_det_cfg *motion_det_cfg;
15170 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
15171 struct mac_context *mac = MAC_CONTEXT(mac_handle);
15172
15173 qdf_status = sme_acquire_global_lock(&mac->sme);
15174 if (QDF_IS_STATUS_SUCCESS(qdf_status)) {
15175 motion_det_cfg =
15176 qdf_mem_malloc(sizeof(*motion_det_cfg));
15177 if (!motion_det_cfg) {
15178 sme_release_global_lock(&mac->sme);
15179 return QDF_STATUS_E_NOMEM;
15180 }
15181
15182 *motion_det_cfg = *motion_det_config;
15183
15184 qdf_mem_set(&msg, sizeof(msg), 0);
15185 msg.type = WMA_SET_MOTION_DET_CONFIG;
15186 msg.bodyptr = motion_det_cfg;
15187
15188 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
15189 QDF_MODULE_ID_WMA,
15190 QDF_MODULE_ID_WMA,
15191 &msg);
15192 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
15193 qdf_mem_free(motion_det_cfg);
15194 qdf_status = QDF_STATUS_E_FAILURE;
15195 }
15196 sme_release_global_lock(&mac->sme);
15197 }
15198 return qdf_status;
15199}
15200
15201/**
15202 * sme_motion_det_enable - Post motion detection start/stop msg to scheduler
15203 * @mac_handle: mac handle
15204 * @motion_det_enable: motion detection start/stop
15205 *
15206 * Return: QDF_STATUS_SUCCESS or non-zero on failure
15207 */
15208QDF_STATUS sme_motion_det_enable(mac_handle_t mac_handle,
15209 struct sme_motion_det_en *motion_det_enable)
15210{
Visweswara Tanuku025f5862019-01-08 17:35:33 +053015211 struct scheduler_msg msg;
Visweswara Tanuku633976b2019-01-07 16:13:12 +053015212 struct sme_motion_det_en *motion_det_en;
15213 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
15214 struct mac_context *mac = MAC_CONTEXT(mac_handle);
15215
15216 qdf_status = sme_acquire_global_lock(&mac->sme);
15217 if (QDF_IS_STATUS_SUCCESS(qdf_status)) {
15218 motion_det_en = qdf_mem_malloc(sizeof(*motion_det_en));
15219 if (!motion_det_en) {
15220 sme_release_global_lock(&mac->sme);
15221 return QDF_STATUS_E_NOMEM;
15222 }
15223
15224 *motion_det_en = *motion_det_enable;
15225
15226 qdf_mem_set(&msg, sizeof(msg), 0);
15227 msg.type = WMA_SET_MOTION_DET_ENABLE;
15228 msg.bodyptr = motion_det_en;
15229
15230 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
15231 QDF_MODULE_ID_WMA,
15232 QDF_MODULE_ID_WMA,
15233 &msg);
15234 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
15235 qdf_mem_free(motion_det_en);
15236 qdf_status = QDF_STATUS_E_FAILURE;
15237 }
15238 sme_release_global_lock(&mac->sme);
15239 }
15240 return qdf_status;
15241}
15242
15243/**
15244 * sme_motion_det_base_line_config - Post md baselining cfg msg to scheduler
15245 * @mac_handle: mac handle
15246 * @motion_det_base_line_config: motion detection baselining configuration
15247 *
15248 * Return: QDF_STATUS_SUCCESS or non-zero on failure
15249 */
15250QDF_STATUS sme_motion_det_base_line_config(
15251 mac_handle_t mac_handle,
15252 struct sme_motion_det_base_line_cfg *motion_det_base_line_config)
15253{
Visweswara Tanuku025f5862019-01-08 17:35:33 +053015254 struct scheduler_msg msg;
Visweswara Tanuku633976b2019-01-07 16:13:12 +053015255 struct sme_motion_det_base_line_cfg *motion_det_base_line_cfg;
15256 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
15257 struct mac_context *mac = MAC_CONTEXT(mac_handle);
15258
15259 qdf_status = sme_acquire_global_lock(&mac->sme);
15260 if (QDF_IS_STATUS_SUCCESS(qdf_status)) {
15261 motion_det_base_line_cfg =
15262 qdf_mem_malloc(sizeof(*motion_det_base_line_cfg));
15263
15264 if (!motion_det_base_line_cfg) {
15265 sme_release_global_lock(&mac->sme);
15266 return QDF_STATUS_E_NOMEM;
15267 }
15268
15269 *motion_det_base_line_cfg = *motion_det_base_line_config;
15270
Visweswara Tanuku025f5862019-01-08 17:35:33 +053015271 qdf_mem_set(&msg, sizeof(msg), 0);
Visweswara Tanuku633976b2019-01-07 16:13:12 +053015272 msg.type = WMA_SET_MOTION_DET_BASE_LINE_CONFIG;
15273 msg.bodyptr = motion_det_base_line_cfg;
15274
15275 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
15276 QDF_MODULE_ID_WMA,
15277 QDF_MODULE_ID_WMA,
15278 &msg);
15279 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
15280 qdf_mem_free(motion_det_base_line_cfg);
15281 qdf_status = QDF_STATUS_E_FAILURE;
15282 }
15283 sme_release_global_lock(&mac->sme);
15284 }
15285 return qdf_status;
15286}
15287
15288/**
15289 * sme_motion_det_base_line_enable - Post md baselining enable msg to scheduler
15290 * @mac_handle: mac handle
15291 * @motion_det_base_line_enable: motion detection baselining start/stop
15292 *
15293 * Return: QDF_STATUS_SUCCESS or non-zero on failure
15294 */
15295QDF_STATUS sme_motion_det_base_line_enable(
15296 mac_handle_t mac_handle,
15297 struct sme_motion_det_base_line_en *motion_det_base_line_enable)
15298{
Visweswara Tanuku025f5862019-01-08 17:35:33 +053015299 struct scheduler_msg msg;
Visweswara Tanuku633976b2019-01-07 16:13:12 +053015300 struct sme_motion_det_base_line_en *motion_det_base_line_en;
15301 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
15302 struct mac_context *mac = MAC_CONTEXT(mac_handle);
15303
15304 qdf_status = sme_acquire_global_lock(&mac->sme);
15305 if (QDF_IS_STATUS_SUCCESS(qdf_status)) {
15306 motion_det_base_line_en =
15307 qdf_mem_malloc(sizeof(*motion_det_base_line_en));
15308
15309 if (!motion_det_base_line_en) {
15310 sme_release_global_lock(&mac->sme);
15311 return QDF_STATUS_E_NOMEM;
15312 }
15313
15314 *motion_det_base_line_en = *motion_det_base_line_enable;
15315
Visweswara Tanuku025f5862019-01-08 17:35:33 +053015316 qdf_mem_set(&msg, sizeof(msg), 0);
Visweswara Tanuku633976b2019-01-07 16:13:12 +053015317 msg.type = WMA_SET_MOTION_DET_BASE_LINE_ENABLE;
15318 msg.bodyptr = motion_det_base_line_en;
15319
15320 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
15321 QDF_MODULE_ID_WMA,
15322 QDF_MODULE_ID_WMA,
15323 &msg);
15324 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
15325 qdf_mem_free(motion_det_base_line_en);
15326 qdf_status = QDF_STATUS_E_FAILURE;
15327 }
15328 sme_release_global_lock(&mac->sme);
15329 }
15330 return qdf_status;
15331}
15332#endif /* WLAN_FEATURE_MOTION_DETECTION */
Visweswara Tanuku025f5862019-01-08 17:35:33 +053015333#ifdef FW_THERMAL_THROTTLE_SUPPORT
15334/**
15335 * sme_set_thermal_throttle_cfg() - SME API to set the thermal throttle
15336 * configuration parameters
15337 * @mac_handle: Opaque handle to the global MAC context
15338 * @enable: Enable Throttle
15339 * @dc: duty cycle in msecs
15340 * @dc_off_percent: duty cycle off percentage
15341 * @prio: Disables the transmit queues in fw that have lower priority
15342 * than value defined by prio
15343 * @target_temp: Target temperature
15344 *
15345 * Return: QDF_STATUS
15346 */
15347QDF_STATUS sme_set_thermal_throttle_cfg(mac_handle_t mac_handle, bool enable,
15348 uint32_t dc, uint32_t dc_off_percent,
15349 uint32_t prio, uint32_t target_temp)
15350{
15351 struct scheduler_msg msg;
15352 struct mac_context *mac = MAC_CONTEXT(mac_handle);
15353 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
15354 struct thermal_mitigation_params *therm_cfg_params;
15355
15356 qdf_status = sme_acquire_global_lock(&mac->sme);
15357 if (QDF_STATUS_SUCCESS == qdf_status) {
15358 therm_cfg_params = qdf_mem_malloc(sizeof(*therm_cfg_params));
15359 if (!therm_cfg_params) {
15360 sme_release_global_lock(&mac->sme);
15361 return QDF_STATUS_E_NOMEM;
15362 }
15363
15364 therm_cfg_params->enable = enable;
15365 therm_cfg_params->dc = dc;
15366 therm_cfg_params->levelconf[0].dcoffpercent = dc_off_percent;
15367 therm_cfg_params->levelconf[0].priority = prio;
15368 therm_cfg_params->levelconf[0].tmplwm = target_temp;
15369
15370 qdf_mem_set(&msg, sizeof(msg), 0);
15371 msg.type = WMA_SET_THERMAL_THROTTLE_CFG;
15372 msg.reserved = 0;
15373 msg.bodyptr = therm_cfg_params;
15374
15375 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
15376 QDF_MODULE_ID_WMA,
15377 QDF_MODULE_ID_WMA, &msg);
15378 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
15379 qdf_mem_free(therm_cfg_params);
15380 qdf_status = QDF_STATUS_E_FAILURE;
15381 }
15382 sme_release_global_lock(&mac->sme);
15383 }
15384 return qdf_status;
15385}
15386
15387/**
15388 * sme_set_thermal_mgmt() - SME API to set the thermal management params
15389 * @mac_handle: Opaque handle to the global MAC context
15390 * @lower_thresh_deg: Lower threshold value of Temperature
15391 * @higher_thresh_deg: Higher threshold value of Temperature
15392 *
15393 * Return: QDF_STATUS
15394 */
15395QDF_STATUS sme_set_thermal_mgmt(mac_handle_t mac_handle,
15396 uint16_t lower_thresh_deg,
15397 uint16_t higher_thresh_deg)
15398{
15399 struct scheduler_msg msg;
15400 struct mac_context *mac = MAC_CONTEXT(mac_handle);
15401 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
15402 t_thermal_cmd_params *therm_mgmt_cmd;
15403
15404 qdf_status = sme_acquire_global_lock(&mac->sme);
15405 if (QDF_STATUS_SUCCESS == qdf_status) {
15406 therm_mgmt_cmd = qdf_mem_malloc(sizeof(*therm_mgmt_cmd));
15407 if (!therm_mgmt_cmd) {
15408 sme_release_global_lock(&mac->sme);
15409 return QDF_STATUS_E_NOMEM;
15410 }
15411
15412 therm_mgmt_cmd->minTemp = lower_thresh_deg;
15413 therm_mgmt_cmd->maxTemp = higher_thresh_deg;
15414 therm_mgmt_cmd->thermalEnable = 1;
15415
15416 qdf_mem_set(&msg, sizeof(msg), 0);
15417 msg.type = WMA_SET_THERMAL_MGMT;
15418 msg.reserved = 0;
15419 msg.bodyptr = therm_mgmt_cmd;
15420
15421 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
15422 QDF_MODULE_ID_WMA,
15423 QDF_MODULE_ID_WMA, &msg);
15424 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
15425 qdf_mem_free(therm_mgmt_cmd);
15426 qdf_status = QDF_STATUS_E_FAILURE;
15427 }
15428 sme_release_global_lock(&mac->sme);
15429 }
15430 return qdf_status;
15431}
15432#endif /* FW_THERMAL_THROTTLE_SUPPORT */
Abhinav Kumar338e57d2019-02-04 17:30:10 +053015433
15434QDF_STATUS sme_update_hidden_ssid_status_cb(mac_handle_t mac_handle,
15435 hidden_ssid_cb cb)
15436{
15437 QDF_STATUS status;
15438 struct mac_context *mac = MAC_CONTEXT(mac_handle);
15439
15440 status = sme_acquire_global_lock(&mac->sme);
15441 if (QDF_IS_STATUS_SUCCESS(status)) {
15442 mac->sme.hidden_ssid_cb = cb;
15443 sme_release_global_lock(&mac->sme);
15444 }
15445
15446 return status;
15447}
Min Liu0daa0982019-02-01 17:50:44 +080015448
15449QDF_STATUS sme_update_owe_info(struct mac_context *mac,
15450 struct assoc_ind *assoc_ind)
15451{
15452 QDF_STATUS status;
15453
15454 status = sme_acquire_global_lock(&mac->sme);
15455 if (QDF_IS_STATUS_SUCCESS(status)) {
15456 status = csr_update_owe_info(mac, assoc_ind);
15457 sme_release_global_lock(&mac->sme);
15458 }
15459
15460 return status;
15461}
Arun Kumar Khandavallideda5a82019-03-11 15:32:19 +053015462
15463#ifdef WLAN_MWS_INFO_DEBUGFS
15464QDF_STATUS
15465sme_get_mws_coex_info(mac_handle_t mac_handle, uint32_t vdev_id,
15466 uint32_t cmd_id, void (*callback_fn)(void *coex_info_data,
15467 void *context,
15468 wmi_mws_coex_cmd_id
15469 cmd_id),
15470 void *context)
15471{
15472 QDF_STATUS status = QDF_STATUS_E_FAILURE;
15473 struct mac_context *mac = MAC_CONTEXT(mac_handle);
15474 struct scheduler_msg msg = {0};
15475 struct sir_get_mws_coex_info *req;
15476
15477 req = qdf_mem_malloc(sizeof(*req));
15478 if (!req) {
15479 sme_err("Failed allocate memory for MWS coex info req");
15480 return QDF_STATUS_E_NOMEM;
15481 }
15482
15483 req->vdev_id = vdev_id;
15484 req->cmd_id = cmd_id;
15485 mac->sme.mws_coex_info_state_resp_callback = callback_fn;
15486 mac->sme.mws_coex_info_ctx = context;
15487 status = sme_acquire_global_lock(&mac->sme);
15488 if (QDF_IS_STATUS_SUCCESS(status)) {
15489 msg.bodyptr = req;
15490 msg.type = WMA_GET_MWS_COEX_INFO_REQ;
15491 status = scheduler_post_message(QDF_MODULE_ID_SME,
15492 QDF_MODULE_ID_WMA,
15493 QDF_MODULE_ID_WMA,
15494 &msg);
15495 sme_release_global_lock(&mac->sme);
15496 if (!QDF_IS_STATUS_SUCCESS(status)) {
15497 sme_err("post MWS coex info req failed");
15498 status = QDF_STATUS_E_FAILURE;
15499 qdf_mem_free(req);
15500 }
15501 } else {
15502 sme_err("sme_acquire_global_lock failed");
15503 qdf_mem_free(req);
15504 }
15505
15506 return status;
15507}
15508#endif /* WLAN_MWS_INFO_DEBUGFS */