blob: 09c1895b83c33270ad4a4169279e6296c972ece5 [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"
57#include <qca_vendor.h>
Sandeep Puligilla063a4342018-01-10 02:50:14 -080058#include <wlan_spectral_utils_api.h>
Vignesh Viswanathan21c58cb2018-05-24 15:53:58 +053059#include "wlan_mlme_public_struct.h"
gaurank kathpalia24ed0f42018-11-13 15:37:49 +053060#include "wlan_mlme_main.h"
Bala Venkatesh6d537092018-09-25 10:38:36 +053061#include "cfg_ucfg_api.h"
Manikandan Mohan9045e2e2018-11-26 16:44:19 -080062#include "wlan_fwol_ucfg_api.h"
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080063
Jeff Johnson0a8786a2018-12-02 10:49:01 -080064static QDF_STATUS init_sme_cmd_list(struct mac_context *mac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080065
Jeff Johnson0a8786a2018-12-02 10:49:01 -080066static void sme_disconnect_connected_sessions(struct mac_context *mac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080067
Jeff Johnson0a8786a2018-12-02 10:49:01 -080068static QDF_STATUS sme_handle_generic_change_country_code(struct mac_context *mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080069 void *pMsgBuf);
70
Jeff Johnson0a8786a2018-12-02 10:49:01 -080071static QDF_STATUS sme_process_nss_update_resp(struct mac_context *mac, uint8_t *msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080072
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080073/* Channel Change Response Indication Handler */
Jeff Johnson0a8786a2018-12-02 10:49:01 -080074static QDF_STATUS sme_process_channel_change_resp(struct mac_context *mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080075 uint16_t msg_type, void *pMsgBuf);
76
Jeff Johnson0a8786a2018-12-02 10:49:01 -080077static QDF_STATUS sme_stats_ext_event(struct mac_context *mac,
Jeff Johnson45843652018-07-04 12:47:34 -070078 struct stats_ext_event *msg);
Jeff Johnsonfdecd512018-06-10 09:18:32 -070079
Qun Zhangef655622019-02-25 10:48:10 +080080static QDF_STATUS sme_fw_state_resp(struct mac_context *mac);
81
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080082/* Internal SME APIs */
Jeff Johnson50980e12019-02-17 11:38:30 -080083QDF_STATUS sme_acquire_global_lock(struct sme_context *sme)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080084{
Jeff Johnson50980e12019-02-17 11:38:30 -080085 if (!sme)
86 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080087
Jeff Johnson3e7a4932019-02-17 12:11:36 -080088 return qdf_mutex_acquire(&sme->sme_global_lock);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080089}
90
Jeff Johnson50980e12019-02-17 11:38:30 -080091QDF_STATUS sme_release_global_lock(struct sme_context *sme)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080092{
Jeff Johnson50980e12019-02-17 11:38:30 -080093 if (!sme)
94 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080095
Jeff Johnson3e7a4932019-02-17 12:11:36 -080096 return qdf_mutex_release(&sme->sme_global_lock);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080097}
98
Jeff Johnson0a8786a2018-12-02 10:49:01 -080099struct mac_context *sme_get_mac_context(void)
Archana Ramachandran2eb7a612017-03-23 22:58:42 -0700100{
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800101 struct mac_context *mac_ctx;
Jeff Johnsonb460dd72018-11-08 10:26:51 -0800102 mac_handle_t mac_handle;
Archana Ramachandran2eb7a612017-03-23 22:58:42 -0700103
Jeff Johnsonb460dd72018-11-08 10:26:51 -0800104 mac_handle = cds_get_context(QDF_MODULE_ID_SME);
105 if (NULL == mac_handle) {
Archana Ramachandran2eb7a612017-03-23 22:58:42 -0700106 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_FATAL,
Jeff Johnsonb460dd72018-11-08 10:26:51 -0800107 FL("invalid mac_handle"));
Archana Ramachandran2eb7a612017-03-23 22:58:42 -0700108 return NULL;
109 }
110
Jeff Johnsona0619e42018-11-28 17:43:00 -0800111 mac_ctx = MAC_CONTEXT(mac_handle);
Archana Ramachandran2eb7a612017-03-23 22:58:42 -0700112
113 return mac_ctx;
114}
115
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800116/**
117 * sme_process_set_hw_mode_resp() - Process set HW mode response
118 * @mac: Global MAC pointer
119 * @msg: HW mode response
120 *
121 * Processes the HW mode response and invokes the HDD callback
122 * to process further
123 */
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800124static QDF_STATUS sme_process_set_hw_mode_resp(struct mac_context *mac, uint8_t *msg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800125{
Krunal Sonia8270f52017-02-23 19:51:25 -0800126 tListElem *entry;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800127 tSmeCmd *command = NULL;
128 bool found;
Tushnim Bhattacharyyaeab33dd2017-11-15 15:20:02 -0800129 policy_mgr_pdev_set_hw_mode_cback callback = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800130 struct sir_set_hw_mode_resp *param;
Tushnim Bhattacharyya3b99f4b2018-03-26 14:19:24 -0700131 enum policy_mgr_conn_update_reason reason;
gaurank kathpalia14e2f912017-08-31 14:51:45 +0530132 struct csr_roam_session *session;
Sandeep Puligillaa330c8c2017-03-09 18:03:21 -0800133 uint32_t session_id;
Sandeep Puligilla344d7252017-09-15 16:23:33 -0700134
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800135 param = (struct sir_set_hw_mode_resp *)msg;
136 if (!param) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700137 sme_err("HW mode resp param is NULL");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800138 /* Not returning. Need to check if active command list
139 * needs to be freed
140 */
141 }
142
Krunal Sonia8270f52017-02-23 19:51:25 -0800143 entry = csr_nonscan_active_ll_peek_head(mac, LL_ACCESS_LOCK);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800144 if (!entry) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700145 sme_err("No cmd found in active list");
Tushnim Bhattacharyya4a03db82017-11-10 17:58:28 -0800146 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800147 }
148
149 command = GET_BASE_ADDR(entry, tSmeCmd, Link);
150 if (!command) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700151 sme_err("Base address is NULL");
Tushnim Bhattacharyya4a03db82017-11-10 17:58:28 -0800152 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800153 }
154
155 if (e_sme_command_set_hw_mode != command->command) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700156 sme_err("Command mismatch!");
Tushnim Bhattacharyya4a03db82017-11-10 17:58:28 -0800157 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800158 }
159
160 callback = command->u.set_hw_mode_cmd.set_hw_mode_cb;
Chandrasekaran, Manishekaref70c0d2015-10-20 19:54:55 +0530161 reason = command->u.set_hw_mode_cmd.reason;
Sandeep Puligillaa330c8c2017-03-09 18:03:21 -0800162 session_id = command->u.set_hw_mode_cmd.session_id;
Chandrasekaran, Manishekarce2172e2016-02-18 16:12:43 +0530163
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700164 sme_debug("reason: %d session: %d",
Chandrasekaran, Manishekarce2172e2016-02-18 16:12:43 +0530165 command->u.set_hw_mode_cmd.reason,
166 command->u.set_hw_mode_cmd.session_id);
167
Chandrasekaran, Manishekar4dd215e2016-04-16 18:48:34 -0700168 if (!callback) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700169 sme_err("Callback does not exist");
Chandrasekaran, Manishekar4dd215e2016-04-16 18:48:34 -0700170 goto end;
171 }
172
173 if (!param) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700174 sme_err("Callback failed since HW mode params is NULL");
Chandrasekaran, Manishekar4dd215e2016-04-16 18:48:34 -0700175 goto end;
176 }
177
178 /* Irrespective of the reason for which the hw mode change request
179 * was issued, the policy manager connection table needs to be updated
180 * with the new vdev-mac id mapping, tx/rx spatial streams etc., if the
181 * set hw mode was successful.
182 */
183 callback(param->status,
184 param->cfgd_hw_mode_index,
185 param->num_vdev_mac_entries,
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -0800186 param->vdev_mac_map,
Tushnim Bhattacharyyaeab33dd2017-11-15 15:20:02 -0800187 command->u.set_hw_mode_cmd.next_action,
188 command->u.set_hw_mode_cmd.reason,
189 command->u.set_hw_mode_cmd.session_id,
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -0800190 command->u.set_hw_mode_cmd.context);
Krunal Soni3fa80e22018-01-09 14:16:02 -0800191 if (!CSR_IS_SESSION_VALID(mac, session_id)) {
192 sme_err("session %d is invalid", session_id);
193 goto end;
194 }
Sandeep Puligillaa330c8c2017-03-09 18:03:21 -0800195 session = CSR_GET_SESSION(mac, session_id);
Tushnim Bhattacharyya3b99f4b2018-03-26 14:19:24 -0700196 if (reason == POLICY_MGR_UPDATE_REASON_HIDDEN_STA) {
Chandrasekaran, Manishekar4dd215e2016-04-16 18:48:34 -0700197 /* In the case of hidden SSID, connection update
198 * (set hw mode) is done after the scan with reason
199 * code eCsrScanForSsid completes. The connect/failure
200 * needs to be handled after the response of set hw
201 * mode
202 */
Sandeep Puligillaa330c8c2017-03-09 18:03:21 -0800203 if (param->status == SET_HW_MODE_STATUS_OK) {
Srinivas Girigowda2c263352017-03-17 17:49:53 -0700204 sme_debug("search for ssid success");
Sandeep Puligillaa330c8c2017-03-09 18:03:21 -0800205 csr_scan_handle_search_for_ssid(mac,
206 session_id);
207 } else {
Srinivas Girigowda2c263352017-03-17 17:49:53 -0700208 sme_debug("search for ssid failure");
Sandeep Puligillaa330c8c2017-03-09 18:03:21 -0800209 csr_scan_handle_search_for_ssid_failure(mac,
210 session_id);
211 }
Deepak Dhamdhere6f7fbbe2017-02-28 13:35:52 -0800212 csr_saved_scan_cmd_free_fields(mac, session);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800213 }
214
Chandrasekaran, Manishekaref70c0d2015-10-20 19:54:55 +0530215end:
Krunal Soni72dba662017-02-15 20:13:17 -0800216 found = csr_nonscan_active_ll_remove_entry(mac, entry,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800217 LL_ACCESS_LOCK);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530218 if (found)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800219 /* Now put this command back on the avilable command list */
Krunal Soni78618d92017-02-14 21:46:31 -0800220 csr_release_command(mac, command);
Krunal Sonia8270f52017-02-23 19:51:25 -0800221
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530222 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800223}
224
225/**
226 * sme_process_hw_mode_trans_ind() - Process HW mode transition indication
227 * @mac: Global MAC pointer
228 * @msg: HW mode transition response
229 *
230 * Processes the HW mode transition indication and invoke the HDD callback
231 * to process further
232 */
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800233static QDF_STATUS sme_process_hw_mode_trans_ind(struct mac_context *mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800234 uint8_t *msg)
235{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800236 struct sir_hw_mode_trans_ind *param;
237
238 param = (struct sir_hw_mode_trans_ind *)msg;
239 if (!param) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700240 sme_err("HW mode trans ind param is NULL");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530241 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800242 }
243
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -0800244 policy_mgr_hw_mode_transition_cb(param->old_hw_mode_index,
Tushnim Bhattacharyya9e81b4c2017-02-15 17:11:14 -0800245 param->new_hw_mode_index,
246 param->num_vdev_mac_entries,
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -0800247 param->vdev_mac_map, mac->psoc);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800248
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530249 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800250}
251
Abhishek Singh0d0568a2018-11-22 15:01:51 +0530252void sme_purge_pdev_all_ser_cmd_list(mac_handle_t mac_handle)
253{
254 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800255 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Abhishek Singh0d0568a2018-11-22 15:01:51 +0530256
257 status = sme_acquire_global_lock(&mac_ctx->sme);
258 if (QDF_IS_STATUS_ERROR(status))
259 return;
260
261 csr_purge_pdev_all_ser_cmd_list(mac_ctx);
262 sme_release_global_lock(&mac_ctx->sme);
263}
264
Naveen Rawate7d86052015-11-13 12:01:43 -0800265/**
266 * free_sme_cmds() - This function frees memory allocated for SME commands
267 * @mac_ctx: Pointer to Global MAC structure
268 *
269 * This function frees memory allocated for SME commands
270 *
271 * @Return: void
272 */
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800273static void free_sme_cmds(struct mac_context *mac_ctx)
Naveen Rawate7d86052015-11-13 12:01:43 -0800274{
275 uint32_t idx;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530276
Jeff Johnson19353172019-02-17 12:53:46 -0800277 if (!mac_ctx->sme.sme_cmd_buf_addr)
Naveen Rawate7d86052015-11-13 12:01:43 -0800278 return;
279
Jeff Johnson2a84c532019-02-17 12:22:04 -0800280 for (idx = 0; idx < mac_ctx->sme.sme_cmd_count; idx++)
Jeff Johnson19353172019-02-17 12:53:46 -0800281 qdf_mem_free(mac_ctx->sme.sme_cmd_buf_addr[idx]);
Naveen Rawate7d86052015-11-13 12:01:43 -0800282
Jeff Johnson19353172019-02-17 12:53:46 -0800283 qdf_mem_free(mac_ctx->sme.sme_cmd_buf_addr);
284 mac_ctx->sme.sme_cmd_buf_addr = NULL;
Naveen Rawate7d86052015-11-13 12:01:43 -0800285}
286
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800287static QDF_STATUS init_sme_cmd_list(struct mac_context *mac)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800288{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530289 QDF_STATUS status;
Jeff Johnson19353172019-02-17 12:53:46 -0800290 tSmeCmd *cmd;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800291 uint32_t cmd_idx;
Naveen Rawate7d86052015-11-13 12:01:43 -0800292 uint32_t sme_cmd_ptr_ary_sz;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800293
Jeff Johnson2a84c532019-02-17 12:22:04 -0800294 mac->sme.sme_cmd_count = SME_TOTAL_COMMAND;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800295
Jeff Johnsonea9f3d72019-02-17 13:27:55 -0800296 status = csr_ll_open(&mac->sme.sme_cmd_freelist);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530297 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800298 goto end;
299
Naveen Rawate7d86052015-11-13 12:01:43 -0800300 /* following pointer contains array of pointers for tSmeCmd* */
Jeff Johnson2a84c532019-02-17 12:22:04 -0800301 sme_cmd_ptr_ary_sz = sizeof(void *) * mac->sme.sme_cmd_count;
Jeff Johnson19353172019-02-17 12:53:46 -0800302 mac->sme.sme_cmd_buf_addr = qdf_mem_malloc(sme_cmd_ptr_ary_sz);
303 if (!mac->sme.sme_cmd_buf_addr) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530304 status = QDF_STATUS_E_NOMEM;
Naveen Rawate7d86052015-11-13 12:01:43 -0800305 goto end;
306 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800307
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530308 status = QDF_STATUS_SUCCESS;
Jeff Johnson2a84c532019-02-17 12:22:04 -0800309 for (cmd_idx = 0; cmd_idx < mac->sme.sme_cmd_count; cmd_idx++) {
Naveen Rawate7d86052015-11-13 12:01:43 -0800310 /*
311 * Since total size of all commands together can be huge chunk
312 * of memory, allocate SME cmd individually. These SME CMDs are
313 * moved between pending and active queues. And these freeing of
314 * these queues just manipulates the list but does not actually
315 * frees SME CMD pointers. Hence store each SME CMD address in
Jeff Johnson19353172019-02-17 12:53:46 -0800316 * the array, sme.sme_cmd_buf_addr. This will later facilitate
Naveen Rawate7d86052015-11-13 12:01:43 -0800317 * freeing up of all SME CMDs with just a for loop.
318 */
Jeff Johnson19353172019-02-17 12:53:46 -0800319 cmd = qdf_mem_malloc(sizeof(*cmd));
320 if (!cmd) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530321 status = QDF_STATUS_E_NOMEM;
Jeff Johnson01f2c232018-11-21 19:17:44 -0800322 free_sme_cmds(mac);
Naveen Rawate7d86052015-11-13 12:01:43 -0800323 goto end;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800324 }
Jeff Johnson19353172019-02-17 12:53:46 -0800325 mac->sme.sme_cmd_buf_addr[cmd_idx] = cmd;
Jeff Johnsonea9f3d72019-02-17 13:27:55 -0800326 csr_ll_insert_tail(&mac->sme.sme_cmd_freelist,
Jeff Johnson19353172019-02-17 12:53:46 -0800327 &cmd->Link, LL_ACCESS_LOCK);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800328 }
329
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800330end:
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530331 if (!QDF_IS_STATUS_SUCCESS(status))
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700332 sme_err("Failed to initialize sme command list: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800333
334 return status;
335}
336
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800337void sme_release_command(struct mac_context *mac_ctx, tSmeCmd *sme_cmd)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800338{
Krunal Sonia8270f52017-02-23 19:51:25 -0800339 sme_cmd->command = eSmeNoCommand;
Jeff Johnsonea9f3d72019-02-17 13:27:55 -0800340 csr_ll_insert_tail(&mac_ctx->sme.sme_cmd_freelist, &sme_cmd->Link,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530341 LL_ACCESS_LOCK);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800342}
343
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800344static QDF_STATUS free_sme_cmd_list(struct mac_context *mac)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800345{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530346 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800347
Jeff Johnsonea9f3d72019-02-17 13:27:55 -0800348 csr_ll_close(&mac->sme.sme_cmd_freelist);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800349
Jeff Johnson3e7a4932019-02-17 12:11:36 -0800350 status = sme_acquire_global_lock(&mac->sme);
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +0530351 if (status != QDF_STATUS_SUCCESS)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800352 goto done;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800353
Jeff Johnson01f2c232018-11-21 19:17:44 -0800354 free_sme_cmds(mac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800355
Jeff Johnson3e7a4932019-02-17 12:11:36 -0800356 status = sme_release_global_lock(&mac->sme);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530357 if (status != QDF_STATUS_SUCCESS)
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700358 sme_err("Failed to release the lock status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800359done:
360 return status;
361}
362
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800363static void dump_csr_command_info(struct mac_context *mac, tSmeCmd *pCmd)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800364{
365 switch (pCmd->command) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800366 case eSmeCommandRoam:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700367 sme_debug("roam command reason is %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800368 pCmd->u.roamCmd.roamReason);
369 break;
370
371 case eSmeCommandWmStatusChange:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700372 sme_debug("WMStatusChange command type is %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800373 pCmd->u.wmStatusChangeCmd.Type);
374 break;
375
Pragaspathi Thilagarajb37dad32018-07-01 16:48:01 +0530376 case e_sme_command_del_sta_session:
377 sme_debug("Issue del STA command for session:%d",
378 pCmd->sessionId);
379 break;
380
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800381 default:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700382 sme_debug("default: Unhandled command %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800383 pCmd->command);
384 break;
385 }
386}
387
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800388tSmeCmd *sme_get_command_buffer(struct mac_context *mac)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800389{
390 tSmeCmd *pRetCmd = NULL, *pTempCmd = NULL;
391 tListElem *pEntry;
392 static int sme_command_queue_full;
393
Jeff Johnsonea9f3d72019-02-17 13:27:55 -0800394 pEntry = csr_ll_remove_head(&mac->sme.sme_cmd_freelist, LL_ACCESS_LOCK);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800395
Jeff Johnsonea9f3d72019-02-17 13:27:55 -0800396 /* If we can get another MS Msg buffer, then we are ok. Just
397 * link the entry onto the linked list. (We are using the
398 * linked list to keep track of the message buffers).
399 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800400 if (pEntry) {
401 pRetCmd = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
402 /* reset when free list is available */
403 sme_command_queue_full = 0;
404 } else {
405 int idx = 1;
406
407 /* Cannot change pRetCmd here since it needs to return later. */
Jeff Johnson01f2c232018-11-21 19:17:44 -0800408 pEntry = csr_nonscan_active_ll_peek_head(mac, LL_ACCESS_LOCK);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530409 if (pEntry)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800410 pTempCmd = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530411
412 sme_err("Out of command buffer.... command (0x%X) stuck",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800413 (pTempCmd) ? pTempCmd->command : eSmeNoCommand);
414 if (pTempCmd) {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530415 if (eSmeCsrCommandMask & pTempCmd->command)
416 /* CSR command is stuck. See what the reason
417 * code is for that command
418 */
Jeff Johnson01f2c232018-11-21 19:17:44 -0800419 dump_csr_command_info(mac, pTempCmd);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800420 } /* if(pTempCmd) */
421
422 /* dump what is in the pending queue */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800423 pEntry =
Jeff Johnson01f2c232018-11-21 19:17:44 -0800424 csr_nonscan_pending_ll_peek_head(mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800425 LL_ACCESS_NOLOCK);
426 while (pEntry && !sme_command_queue_full) {
427 pTempCmd = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
428 /* Print only 1st five commands from pending queue. */
429 if (idx <= 5)
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530430 sme_err("Out of command buffer.... SME pending command #%d (0x%X)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800431 idx, pTempCmd->command);
432 idx++;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530433 if (eSmeCsrCommandMask & pTempCmd->command)
434 /* CSR command is stuck. See what the reason
435 * code is for that command
436 */
Jeff Johnson01f2c232018-11-21 19:17:44 -0800437 dump_csr_command_info(mac, pTempCmd);
438 pEntry = csr_nonscan_pending_ll_next(mac, pEntry,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800439 LL_ACCESS_NOLOCK);
440 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800441
Jeff Johnson01f2c232018-11-21 19:17:44 -0800442 if (mac->mlme_cfg->gen.fatal_event_trigger)
Abhishek Singh5ea86532016-04-27 14:10:53 +0530443 cds_flush_logs(WLAN_LOG_TYPE_FATAL,
444 WLAN_LOG_INDICATOR_HOST_DRIVER,
445 WLAN_LOG_REASON_SME_OUT_OF_CMD_BUF,
446 false,
Jeff Johnson01f2c232018-11-21 19:17:44 -0800447 mac->mlme_cfg->gen.self_recovery);
Abhishek Singh5ea86532016-04-27 14:10:53 +0530448 else
Anurag Chouhan4085ff72017-10-05 18:09:56 +0530449 cds_trigger_recovery(QDF_GET_MSG_BUFF_FAILURE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800450 }
451
452 /* memset to zero */
453 if (pRetCmd) {
hangtian127c9532019-01-12 13:29:07 +0800454 qdf_mem_zero((uint8_t *)&pRetCmd->command,
455 sizeof(pRetCmd->command));
456 qdf_mem_zero((uint8_t *)&pRetCmd->sessionId,
457 sizeof(pRetCmd->sessionId));
458 qdf_mem_zero((uint8_t *)&pRetCmd->u, sizeof(pRetCmd->u));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800459 }
460
461 return pRetCmd;
462}
463
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800464/**
Krunal Sonia8270f52017-02-23 19:51:25 -0800465 * sme_ser_handle_active_cmd() - handle command activation callback from
466 * new serialization module
467 * @cmd: pointer to new serialization command
468 *
469 * This API is to handle command activation callback from new serialization
470 * callback
471 *
472 * Return: QDF_STATUS_SUCCESS
473 */
474static
475QDF_STATUS sme_ser_handle_active_cmd(struct wlan_serialization_command *cmd)
476{
477 tSmeCmd *sme_cmd;
Jeff Johnsonc7309062018-11-09 20:59:42 -0800478 mac_handle_t mac_handle;
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800479 struct mac_context *mac_ctx;
Krunal Sonia8270f52017-02-23 19:51:25 -0800480 QDF_STATUS status = QDF_STATUS_SUCCESS;
481 bool do_continue;
482
483 if (!cmd) {
Srinivas Girigowda2c263352017-03-17 17:49:53 -0700484 sme_err("No serialization command found");
Krunal Sonia8270f52017-02-23 19:51:25 -0800485 return QDF_STATUS_E_FAILURE;
486 }
487
Jeff Johnsonc7309062018-11-09 20:59:42 -0800488 mac_handle = cds_get_context(QDF_MODULE_ID_SME);
489 if (NULL != mac_handle) {
Jeff Johnsona0619e42018-11-28 17:43:00 -0800490 mac_ctx = MAC_CONTEXT(mac_handle);
Pragaspathi Thilagarajb11dbe42018-07-23 16:42:17 +0530491 } else {
Jeff Johnsonc7309062018-11-09 20:59:42 -0800492 sme_err("No mac_handle found");
Krunal Sonia8270f52017-02-23 19:51:25 -0800493 return QDF_STATUS_E_FAILURE;
494 }
495 sme_cmd = cmd->umac_cmd;
496 if (!sme_cmd) {
Srinivas Girigowda2c263352017-03-17 17:49:53 -0700497 sme_err("No SME command found");
Krunal Sonia8270f52017-02-23 19:51:25 -0800498 return QDF_STATUS_E_FAILURE;
499 }
500
501 switch (sme_cmd->command) {
502 case eSmeCommandRoam:
503 status = csr_roam_process_command(mac_ctx, sme_cmd);
504 break;
505 case eSmeCommandWmStatusChange:
506 csr_roam_process_wm_status_change_command(mac_ctx,
507 sme_cmd);
508 break;
Pragaspathi Thilagarajb37dad32018-07-01 16:48:01 +0530509 case e_sme_command_del_sta_session:
510 csr_process_del_sta_session_command(mac_ctx, sme_cmd);
511 break;
Krunal Sonia8270f52017-02-23 19:51:25 -0800512 case eSmeCommandAddTs:
513 case eSmeCommandDelTs:
514#ifndef WLAN_MDM_CODE_REDUCTION_OPT
515 do_continue = qos_process_command(mac_ctx, sme_cmd);
516 if (do_continue)
517 status = QDF_STATUS_E_FAILURE;
518#endif
519 break;
Krunal Sonia8270f52017-02-23 19:51:25 -0800520 case e_sme_command_set_hw_mode:
521 csr_process_set_hw_mode(mac_ctx, sme_cmd);
522 break;
523 case e_sme_command_nss_update:
524 csr_process_nss_update_req(mac_ctx, sme_cmd);
525 break;
526 case e_sme_command_set_dual_mac_config:
527 csr_process_set_dual_mac_config(mac_ctx, sme_cmd);
528 break;
529 case e_sme_command_set_antenna_mode:
530 csr_process_set_antenna_mode(mac_ctx, sme_cmd);
531 break;
532 default:
533 /* something is wrong */
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700534 sme_err("unknown command %d", sme_cmd->command);
Krunal Sonia8270f52017-02-23 19:51:25 -0800535 status = QDF_STATUS_E_FAILURE;
536 break;
537 }
Krunal Sonia8270f52017-02-23 19:51:25 -0800538 return status;
539}
540
541QDF_STATUS sme_ser_cmd_callback(void *buf,
542 enum wlan_serialization_cb_reason reason)
543{
544 struct wlan_serialization_command *cmd = buf;
Jeff Johnsonc7309062018-11-09 20:59:42 -0800545 mac_handle_t mac_handle;
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800546 struct mac_context *mac_ctx;
Krunal Sonia8270f52017-02-23 19:51:25 -0800547 QDF_STATUS status = QDF_STATUS_SUCCESS;
548 tSmeCmd *sme_cmd;
549
Jeff Johnsonc7309062018-11-09 20:59:42 -0800550 mac_handle = cds_get_context(QDF_MODULE_ID_SME);
551 if (mac_handle != NULL) {
Jeff Johnsona0619e42018-11-28 17:43:00 -0800552 mac_ctx = MAC_CONTEXT(mac_handle);
Pragaspathi Thilagarajb11dbe42018-07-23 16:42:17 +0530553 } else {
Jeff Johnsonc7309062018-11-09 20:59:42 -0800554 sme_err("mac_handle is null");
Krunal Sonia8270f52017-02-23 19:51:25 -0800555 return QDF_STATUS_E_FAILURE;
556 }
557 /*
558 * Do not acquire lock here as sme global lock is already acquired in
559 * caller or MC thread context
560 */
561 if (!cmd) {
Srinivas Girigowda2c263352017-03-17 17:49:53 -0700562 sme_err("serialization command is null");
Krunal Sonia8270f52017-02-23 19:51:25 -0800563 return QDF_STATUS_E_FAILURE;
564 }
565
566 switch (reason) {
567 case WLAN_SER_CB_ACTIVATE_CMD:
Srinivas Girigowda2c263352017-03-17 17:49:53 -0700568 sme_debug("WLAN_SER_CB_ACTIVATE_CMD callback");
Krunal Sonia8270f52017-02-23 19:51:25 -0800569 status = sme_ser_handle_active_cmd(cmd);
570 break;
571 case WLAN_SER_CB_CANCEL_CMD:
Srinivas Girigowda2c263352017-03-17 17:49:53 -0700572 sme_debug("WLAN_SER_CB_CANCEL_CMD callback");
Krunal Sonia8270f52017-02-23 19:51:25 -0800573 break;
574 case WLAN_SER_CB_RELEASE_MEM_CMD:
Srinivas Girigowda2c263352017-03-17 17:49:53 -0700575 sme_debug("WLAN_SER_CB_RELEASE_MEM_CMD callback");
Vignesh Viswanathan062b5162018-10-11 17:18:41 +0530576 if (cmd->vdev)
577 wlan_objmgr_vdev_release_ref(cmd->vdev,
578 WLAN_LEGACY_SME_ID);
Krunal Sonia8270f52017-02-23 19:51:25 -0800579 sme_cmd = cmd->umac_cmd;
580 csr_release_command_buffer(mac_ctx, sme_cmd);
581 break;
582 case WLAN_SER_CB_ACTIVE_CMD_TIMEOUT:
Srinivas Girigowda2c263352017-03-17 17:49:53 -0700583 sme_debug("WLAN_SER_CB_ACTIVE_CMD_TIMEOUT callback");
Krunal Sonia8270f52017-02-23 19:51:25 -0800584 break;
585 default:
Srinivas Girigowda2c263352017-03-17 17:49:53 -0700586 sme_debug("STOP: unknown reason code");
Krunal Sonia8270f52017-02-23 19:51:25 -0800587 return QDF_STATUS_E_FAILURE;
588 }
589 return status;
590}
591
Wen Gong3f003382018-05-14 14:26:37 +0800592#ifdef WLAN_FEATURE_MEMDUMP_ENABLE
Krunal Sonia8270f52017-02-23 19:51:25 -0800593/**
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +0530594 * sme_get_sessionid_from_activelist() - gets session id
595 * @mac: mac context
596 *
597 * This function is used to get session id from sme command
598 * active list
599 *
600 * Return: returns session id
601 */
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800602static uint32_t sme_get_sessionid_from_activelist(struct mac_context *mac)
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +0530603{
604 tListElem *entry;
605 tSmeCmd *command;
606 uint32_t session_id = CSR_SESSION_ID_INVALID;
607
Krunal Sonia8270f52017-02-23 19:51:25 -0800608 entry = csr_nonscan_active_ll_peek_head(mac, LL_ACCESS_LOCK);
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +0530609 if (entry) {
610 command = GET_BASE_ADDR(entry, tSmeCmd, Link);
611 session_id = command->sessionId;
612 }
613
614 return session_id;
615}
616
617/**
618 * sme_state_info_dump() - prints state information of sme layer
619 * @buf: buffer pointer
620 * @size: size of buffer to be filled
621 *
622 * This function is used to dump state information of sme layer
623 *
624 * Return: None
625 */
626static void sme_state_info_dump(char **buf_ptr, uint16_t *size)
627{
628 uint32_t session_id, active_session_id;
Jeff Johnsonc7309062018-11-09 20:59:42 -0800629 mac_handle_t mac_handle;
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800630 struct mac_context *mac;
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +0530631 uint16_t len = 0;
632 char *buf = *buf_ptr;
633 eCsrConnectState connect_state;
634
Jeff Johnsonc7309062018-11-09 20:59:42 -0800635 mac_handle = cds_get_context(QDF_MODULE_ID_SME);
636 if (mac_handle == NULL) {
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +0530637 QDF_ASSERT(0);
638 return;
639 }
640
Jeff Johnsona0619e42018-11-28 17:43:00 -0800641 mac = MAC_CONTEXT(mac_handle);
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +0530642
643 active_session_id = sme_get_sessionid_from_activelist(mac);
644 if (active_session_id != CSR_SESSION_ID_INVALID) {
645 len += qdf_scnprintf(buf + len, *size - len,
646 "\n active command sessionid %d", active_session_id);
647 }
648
Dustin Brownad06be62019-02-04 14:52:56 -0800649 for (session_id = 0; session_id < WLAN_MAX_VDEVS; session_id++) {
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +0530650 if (CSR_IS_SESSION_VALID(mac, session_id)) {
651 connect_state =
652 mac->roam.roamSession[session_id].connectState;
653 if ((eCSR_ASSOC_STATE_TYPE_INFRA_ASSOCIATED ==
654 connect_state)
655 || (eCSR_ASSOC_STATE_TYPE_INFRA_CONNECTED ==
656 connect_state)) {
657 len += qdf_scnprintf(buf + len, *size - len,
658 "\n NeighborRoamState: %d",
659 mac->roam.neighborRoamInfo[session_id].
660 neighborRoamState);
661 len += qdf_scnprintf(buf + len, *size - len,
662 "\n RoamState: %d", mac->roam.
663 curState[session_id]);
664 len += qdf_scnprintf(buf + len, *size - len,
665 "\n RoamSubState: %d", mac->roam.
666 curSubState[session_id]);
667 len += qdf_scnprintf(buf + len, *size - len,
668 "\n ConnectState: %d",
669 connect_state);
670 }
671 }
672 }
673
674 *size -= len;
675 *buf_ptr += len;
676}
677
678/**
679 * sme_register_debug_callback() - registration function sme layer
680 * to print sme state information
681 *
682 * Return: None
683 */
684static void sme_register_debug_callback(void)
685{
686 qdf_register_debug_callback(QDF_MODULE_ID_SME, &sme_state_info_dump);
687}
Wen Gong3f003382018-05-14 14:26:37 +0800688#else /* WLAN_FEATURE_MEMDUMP_ENABLE */
Wen Gongaa6d55d2018-04-26 16:33:21 +0800689static void sme_register_debug_callback(void)
690{
691}
Wen Gong3f003382018-05-14 14:26:37 +0800692#endif /* WLAN_FEATURE_MEMDUMP_ENABLE */
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +0530693
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800694/* Global APIs */
695
696/**
697 * sme_open() - Initialze all SME modules and put them at idle state
Jeff Johnsonb460dd72018-11-08 10:26:51 -0800698 * @mac_handle: The handle returned by mac_open
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800699 *
700 * The function initializes each module inside SME, PMC, CSR, etc. Upon
701 * successfully return, all modules are at idle state ready to start.
702 * smeOpen must be called before any other SME APIs can be involved.
703 * smeOpen must be called after mac_open.
704 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530705 * Return: QDF_STATUS_SUCCESS - SME is successfully initialized.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800706 * Other status means SME is failed to be initialized
707 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -0800708QDF_STATUS sme_open(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800709{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530710 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800711 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800712
Jeff Johnson01f2c232018-11-21 19:17:44 -0800713 mac->sme.state = SME_STATE_STOP;
Jeff Johnson5a6a0c92019-02-17 16:12:02 -0800714 mac->sme.curr_device_mode = QDF_STA_MODE;
Anurag Chouhana37b5b72016-02-21 14:53:42 +0530715 if (!QDF_IS_STATUS_SUCCESS(qdf_mutex_create(
Jeff Johnson3e7a4932019-02-17 12:11:36 -0800716 &mac->sme.sme_global_lock))) {
Srinivas Girigowda09625b02018-09-10 15:28:09 -0700717 sme_err("Init lock failed");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530718 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800719 }
Jeff Johnson01f2c232018-11-21 19:17:44 -0800720 status = csr_open(mac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530721 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700722 sme_err("csr_open failed, status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800723 return status;
724 }
725
Jeff Johnsonb460dd72018-11-08 10:26:51 -0800726 status = sme_ps_open(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530727 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700728 sme_err("sme_ps_open failed with status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800729 return status;
730 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800731
732#ifndef WLAN_MDM_CODE_REDUCTION_OPT
Jeff Johnson01f2c232018-11-21 19:17:44 -0800733 status = sme_qos_open(mac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530734 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700735 sme_err("Qos open, status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800736 return status;
737 }
738#endif
Jeff Johnson01f2c232018-11-21 19:17:44 -0800739 status = init_sme_cmd_list(mac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530740 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800741 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800742
Jeff Johnson01f2c232018-11-21 19:17:44 -0800743 status = rrm_open(mac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530744 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700745 sme_err("rrm_open failed, status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800746 return status;
747 }
Jeff Johnson01f2c232018-11-21 19:17:44 -0800748 sme_trace_init(mac);
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +0530749 sme_register_debug_callback();
Krunal Soni33787902017-08-29 11:39:28 -0700750
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800751 return status;
752}
753
754/*
755 * sme_init_chan_list, triggers channel setup based on country code.
756 */
Jeff Johnsonc7309062018-11-09 20:59:42 -0800757QDF_STATUS sme_init_chan_list(mac_handle_t mac_handle, uint8_t *alpha2,
Amar Singhala297bfa2015-10-15 15:07:29 -0700758 enum country_src cc_src)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800759{
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800760 struct mac_context *pmac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800761
Amar Singhala297bfa2015-10-15 15:07:29 -0700762 if ((cc_src == SOURCE_USERSPACE) &&
Bala Venkatesh46e29032018-11-14 18:24:55 +0530763 (pmac->mlme_cfg->sap_cfg.country_code_priority)) {
Abhinav Kumard4d6eb72018-12-04 20:30:37 +0530764 pmac->mlme_cfg->gen.enabled_11d = false;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800765 }
766
767 return csr_init_chan_list(pmac, alpha2);
768}
769
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530770/*
771 * sme_set11dinfo() - Set the 11d information about valid channels
772 * and there power using information from nvRAM
773 * This function is called only for AP.
774 *
775 * This is a synchronous call
776 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -0800777 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530778 * pSmeConfigParams - a pointer to a caller allocated object of
779 * typedef struct _smeConfigParams.
780 *
781 * Return QDF_STATUS_SUCCESS - SME update the config parameters successfully.
782 *
783 * Other status means SME is failed to update the config parameters.
784 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800785
Jeff Johnsonc7309062018-11-09 20:59:42 -0800786QDF_STATUS sme_set11dinfo(mac_handle_t mac_handle,
787 tpSmeConfigParams pSmeConfigParams)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800788{
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800789 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530790 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800791
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530792 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800793 TRACE_CODE_SME_RX_HDD_MSG_SET_11DINFO, NO_SESSION, 0));
794 if (NULL == pSmeConfigParams) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700795 sme_err("SME config params empty");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800796 return status;
797 }
798
Jeff Johnsonff26c612018-06-10 20:57:13 -0700799 status = csr_set_channels(mac_ctx, &pSmeConfigParams->csrConfig);
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700800 if (!QDF_IS_STATUS_SUCCESS(status))
801 sme_err("csr_set_channels failed with status: %d", status);
802
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800803 return status;
804}
805
Krunal Sonie3531942016-04-12 17:43:53 -0700806/**
807 * sme_update_fine_time_measurement_capab() - Update the FTM capabitlies from
808 * incoming val
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -0800809 * @mac_handle: Opaque handle to the global MAC context
Krunal Sonie3531942016-04-12 17:43:53 -0700810 * @val: New FTM capability value
811 *
812 * Return: None
813 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -0800814void sme_update_fine_time_measurement_capab(mac_handle_t mac_handle,
Jeff Johnson1f2dabc2018-11-07 15:33:01 -0800815 uint8_t session_id,
816 uint32_t val)
Krunal Sonie3531942016-04-12 17:43:53 -0700817{
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800818 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +0530819 QDF_STATUS status;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530820
Naveen Rawatd2657be2017-10-10 14:31:23 -0700821 ucfg_wifi_pos_set_ftm_cap(mac_ctx->psoc, val);
Krunal Sonie3531942016-04-12 17:43:53 -0700822
Selvaraj, Sridhar57bb4d02016-08-31 16:14:15 +0530823 if (!val) {
Krunal Sonie3531942016-04-12 17:43:53 -0700824 mac_ctx->rrm.rrmPEContext.rrmEnabledCaps.fine_time_meas_rpt = 0;
825 ((tpRRMCaps)mac_ctx->rrm.rrmSmeContext.
826 rrmConfig.rm_capability)->fine_time_meas_rpt = 0;
827 } else {
828 mac_ctx->rrm.rrmPEContext.rrmEnabledCaps.fine_time_meas_rpt = 1;
829 ((tpRRMCaps)mac_ctx->rrm.rrmSmeContext.
830 rrmConfig.rm_capability)->fine_time_meas_rpt = 1;
831 }
Selvaraj, Sridhar57bb4d02016-08-31 16:14:15 +0530832
833 /* Inform this RRM IE change to FW */
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +0530834 status = sme_acquire_global_lock(&mac_ctx->sme);
835 if (QDF_IS_STATUS_SUCCESS(status)) {
836 csr_roam_offload_scan(mac_ctx, session_id,
Selvaraj, Sridhar57bb4d02016-08-31 16:14:15 +0530837 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
838 REASON_CONNECT_IES_CHANGED);
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +0530839 sme_release_global_lock(&mac_ctx->sme);
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +0530840 }
Krunal Sonie3531942016-04-12 17:43:53 -0700841}
842
Manikandan Mohan06d38d82018-11-26 18:36:58 -0800843/**
844 * sme_update_neighbor_report_config() - Update CSR config for 11k params
845 * @mac_handle: Pointer to MAC context
846 * @csr_config: Pointer to CSR config data structure
847 *
848 * Return: None
849 */
850static void sme_update_neighbor_report_config(struct mac_context *mac,
851 tCsrConfigParam *csr_config)
852{
853 struct wlan_fwol_neighbor_report_cfg fwol_neighbor_report_cfg = {0};
854 QDF_STATUS status;
855
856 status = ucfg_fwol_get_neighbor_report_cfg(mac->psoc,
857 &fwol_neighbor_report_cfg);
858 if (!QDF_IS_STATUS_SUCCESS(status))
859 sme_err("Using defaults for 11K offload params: Error: %d",
860 status);
861
862 csr_config->offload_11k_enable_bitmask =
863 fwol_neighbor_report_cfg.enable_bitmask;
864 csr_config->neighbor_report_offload.params_bitmask =
865 fwol_neighbor_report_cfg.params_bitmask;
866 csr_config->neighbor_report_offload.time_offset =
867 fwol_neighbor_report_cfg.time_offset;
868 csr_config->neighbor_report_offload.low_rssi_offset =
869 fwol_neighbor_report_cfg.low_rssi_offset;
870 csr_config->neighbor_report_offload.bmiss_count_trigger =
871 fwol_neighbor_report_cfg.bmiss_count_trigger;
872 csr_config->neighbor_report_offload.per_threshold_offset =
873 fwol_neighbor_report_cfg.per_threshold_offset;
874 csr_config->neighbor_report_offload.neighbor_report_cache_timeout =
875 fwol_neighbor_report_cfg.cache_timeout;
876 csr_config->neighbor_report_offload.max_neighbor_report_req_cap =
877 fwol_neighbor_report_cfg.max_req_cap;
878}
879
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530880/*
881 * sme_update_config() - Change configurations for all SME moduels
882 * The function updates some configuration for modules in SME, CSR, etc
883 * during SMEs close open sequence.
884 * Modules inside SME apply the new configuration at the next transaction.
885 * This is a synchronous call
886 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -0800887 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530888 * pSmeConfigParams - a pointer to a caller allocated object of
889 * typedef struct _smeConfigParams.
890 * Return QDF_STATUS_SUCCESS - SME update the config parameters successfully.
891 * Other status means SME is failed to update the config parameters.
892 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -0800893QDF_STATUS sme_update_config(mac_handle_t mac_handle, tpSmeConfigParams
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530894 pSmeConfigParams)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800895{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530896 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800897 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800898
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530899 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800900 TRACE_CODE_SME_RX_HDD_MSG_UPDATE_CONFIG, NO_SESSION,
901 0));
902 if (NULL == pSmeConfigParams) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700903 sme_err("SME config params empty");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800904 return status;
905 }
Manikandan Mohan06d38d82018-11-26 18:36:58 -0800906 sme_update_neighbor_report_config(mac, &pSmeConfigParams->csrConfig);
Jeff Johnson01f2c232018-11-21 19:17:44 -0800907 status = csr_change_default_config_param(mac, &pSmeConfigParams->
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530908 csrConfig);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800909
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530910 if (!QDF_IS_STATUS_SUCCESS(status))
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700911 sme_err("csr_change_default_config_param failed status: %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800912 status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800913
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530914 /* For SOC, CFG is set before start We don't want to apply global CFG
915 * in connect state because that may cause some side affect
916 */
Jeff Johnson01f2c232018-11-21 19:17:44 -0800917 if (csr_is_all_session_disconnected(mac))
918 csr_set_global_cfgs(mac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800919
Jeff Johnson01f2c232018-11-21 19:17:44 -0800920 mac->snr_monitor_enabled = pSmeConfigParams->snr_monitor_enabled;
Kapil Gupta4f0c0c12017-02-07 15:21:15 +0530921
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800922 return status;
923}
924
925/**
Abhishek Singh158fe252017-03-23 11:09:34 +0530926 * sme_update_scan_roam_params() - Update the scan roaming params
927 * @mac_ctx: mac ctx
928 *
929 * Return: void.
930 */
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800931static void sme_update_scan_roam_params(struct mac_context *mac_ctx)
Abhishek Singh158fe252017-03-23 11:09:34 +0530932{
933 struct roam_filter_params scan_params = {0};
934 struct roam_ext_params *roam_params_src;
935 uint8_t i;
936 QDF_STATUS status;
937
938 roam_params_src = &mac_ctx->roam.configParam.roam_params;
939
940 scan_params.num_bssid_avoid_list =
941 roam_params_src->num_bssid_avoid_list;
Abhishek Singh158fe252017-03-23 11:09:34 +0530942
943 if (scan_params.num_bssid_avoid_list >
944 MAX_AVOID_LIST_BSSID)
945 scan_params.num_bssid_avoid_list =
946 MAX_AVOID_LIST_BSSID;
947
948 for (i = 0; i < scan_params.num_bssid_avoid_list; i++) {
949 qdf_copy_macaddr(&scan_params.bssid_avoid_list[i],
950 &roam_params_src->bssid_avoid_list[i]);
951 }
952
953 status = ucfg_scan_update_roam_params(mac_ctx->psoc, &scan_params);
954 if (QDF_IS_STATUS_ERROR(status))
Srinivas Girigowda2c263352017-03-17 17:49:53 -0700955 sme_err("ailed to update scan roam params with status=%d",
Abhishek Singh158fe252017-03-23 11:09:34 +0530956 status);
957}
958
959/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800960 * sme_update_roam_params() - Store/Update the roaming params
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -0800961 * @mac_handle: Opaque handle to the global MAC context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800962 * @session_id: SME Session ID
963 * @roam_params_src: The source buffer to copy
964 * @update_param: Type of parameter to be updated
965 *
966 * Return: Return the status of the updation.
967 */
Jeff Johnsonc7309062018-11-09 20:59:42 -0800968QDF_STATUS sme_update_roam_params(mac_handle_t mac_handle,
969 uint8_t session_id,
970 struct roam_ext_params *roam_params_src,
971 int update_param)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800972{
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800973 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800974 struct roam_ext_params *roam_params_dst;
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +0530975 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800976 uint8_t i;
977
978 roam_params_dst = &mac_ctx->roam.configParam.roam_params;
979 switch (update_param) {
980 case REASON_ROAM_EXT_SCAN_PARAMS_CHANGED:
Wu Gaoca416ff2018-09-17 11:05:07 +0800981 mac_ctx->mlme_cfg->lfr.rssi_boost_threshold_5g =
Srinivas Girigowda72f30392017-07-13 18:55:09 -0700982 roam_params_src->raise_rssi_thresh_5g;
Wu Gaoca416ff2018-09-17 11:05:07 +0800983 mac_ctx->mlme_cfg->lfr.rssi_penalize_threshold_5g =
Srinivas Girigowda72f30392017-07-13 18:55:09 -0700984 roam_params_src->drop_rssi_thresh_5g;
Wu Gaoca416ff2018-09-17 11:05:07 +0800985 mac_ctx->mlme_cfg->lfr.rssi_boost_factor_5g =
Srinivas Girigowda72f30392017-07-13 18:55:09 -0700986 roam_params_src->raise_factor_5g;
Wu Gaoca416ff2018-09-17 11:05:07 +0800987 mac_ctx->mlme_cfg->lfr.rssi_penalize_factor_5g =
Srinivas Girigowda72f30392017-07-13 18:55:09 -0700988 roam_params_src->drop_factor_5g;
Wu Gaoca416ff2018-09-17 11:05:07 +0800989 mac_ctx->mlme_cfg->lfr.max_rssi_boost_5g =
Srinivas Girigowda72f30392017-07-13 18:55:09 -0700990 roam_params_src->max_raise_rssi_5g;
Wu Gaoca416ff2018-09-17 11:05:07 +0800991 mac_ctx->mlme_cfg->lfr.max_rssi_penalize_5g =
Srinivas Girigowda72f30392017-07-13 18:55:09 -0700992 roam_params_src->max_drop_rssi_5g;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800993 roam_params_dst->alert_rssi_threshold =
Srinivas Girigowda72f30392017-07-13 18:55:09 -0700994 roam_params_src->alert_rssi_threshold;
Wu Gaoca416ff2018-09-17 11:05:07 +0800995 mac_ctx->mlme_cfg->lfr.enable_5g_band_pref = true;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800996 break;
997 case REASON_ROAM_SET_SSID_ALLOWED:
hangtian127c9532019-01-12 13:29:07 +0800998 qdf_mem_zero(&roam_params_dst->ssid_allowed_list,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800999 sizeof(tSirMacSSid) * MAX_SSID_ALLOWED_LIST);
1000 roam_params_dst->num_ssid_allowed_list =
Srinivas Girigowda72f30392017-07-13 18:55:09 -07001001 roam_params_src->num_ssid_allowed_list;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001002 for (i = 0; i < roam_params_dst->num_ssid_allowed_list; i++) {
1003 roam_params_dst->ssid_allowed_list[i].length =
Srinivas Girigowda72f30392017-07-13 18:55:09 -07001004 roam_params_src->ssid_allowed_list[i].length;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301005 qdf_mem_copy(roam_params_dst->ssid_allowed_list[i].ssId,
Srinivas Girigowda72f30392017-07-13 18:55:09 -07001006 roam_params_src->ssid_allowed_list[i].ssId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001007 roam_params_dst->ssid_allowed_list[i].length);
1008 }
1009 break;
1010 case REASON_ROAM_SET_FAVORED_BSSID:
hangtian127c9532019-01-12 13:29:07 +08001011 qdf_mem_zero(&roam_params_dst->bssid_favored,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001012 sizeof(tSirMacAddr) * MAX_BSSID_FAVORED);
1013 roam_params_dst->num_bssid_favored =
Srinivas Girigowda72f30392017-07-13 18:55:09 -07001014 roam_params_src->num_bssid_favored;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001015 for (i = 0; i < roam_params_dst->num_bssid_favored; i++) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301016 qdf_mem_copy(&roam_params_dst->bssid_favored[i],
Srinivas Girigowda72f30392017-07-13 18:55:09 -07001017 &roam_params_src->bssid_favored[i],
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001018 sizeof(tSirMacAddr));
1019 roam_params_dst->bssid_favored_factor[i] =
Srinivas Girigowda72f30392017-07-13 18:55:09 -07001020 roam_params_src->bssid_favored_factor[i];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001021 }
1022 break;
1023 case REASON_ROAM_SET_BLACKLIST_BSSID:
hangtian127c9532019-01-12 13:29:07 +08001024 qdf_mem_zero(&roam_params_dst->bssid_avoid_list,
Anurag Chouhan6d760662016-02-20 16:05:43 +05301025 QDF_MAC_ADDR_SIZE * MAX_BSSID_AVOID_LIST);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001026 roam_params_dst->num_bssid_avoid_list =
Srinivas Girigowda72f30392017-07-13 18:55:09 -07001027 roam_params_src->num_bssid_avoid_list;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001028 for (i = 0; i < roam_params_dst->num_bssid_avoid_list; i++) {
Anurag Chouhanc5548422016-02-24 18:33:27 +05301029 qdf_copy_macaddr(&roam_params_dst->bssid_avoid_list[i],
Srinivas Girigowda72f30392017-07-13 18:55:09 -07001030 &roam_params_src->bssid_avoid_list[i]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001031 }
1032 break;
1033 case REASON_ROAM_GOOD_RSSI_CHANGED:
1034 roam_params_dst->good_rssi_roam =
Srinivas Girigowda72f30392017-07-13 18:55:09 -07001035 roam_params_src->good_rssi_roam;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001036 break;
1037 default:
1038 break;
1039 }
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05301040
1041 status = sme_acquire_global_lock(&mac_ctx->sme);
1042 if (QDF_IS_STATUS_SUCCESS(status)) {
1043 csr_roam_offload_scan(mac_ctx, session_id,
1044 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
1045 update_param);
1046 sme_release_global_lock(&mac_ctx->sme);
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05301047 }
Abhishek Singh158fe252017-03-23 11:09:34 +05301048
1049 sme_update_scan_roam_params(mac_ctx);
1050
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001051 return 0;
1052}
1053
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001054#ifdef WLAN_FEATURE_EXTWOW_SUPPORT
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001055
Krishna Kumaar Natarajand9131902015-10-19 11:52:47 -07001056/**
1057 * sme_process_ready_to_ext_wow() - inform ready to ExtWoW indication.
Jeff Johnson9d7c99e2018-06-28 15:36:00 -07001058 * @mac: Global MAC context
1059 * @indication: ready to Ext WoW indication from lower layer
Krishna Kumaar Natarajand9131902015-10-19 11:52:47 -07001060 *
1061 * On getting ready to Ext WoW indication, this function calls callback
Jeff Johnson9d7c99e2018-06-28 15:36:00 -07001062 * registered (HDD callback) with SME to inform ready to ExtWoW indication.
Krishna Kumaar Natarajand9131902015-10-19 11:52:47 -07001063 *
1064 * Return: None
1065 */
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001066static void sme_process_ready_to_ext_wow(struct mac_context *mac,
Jeff Johnson9d7c99e2018-06-28 15:36:00 -07001067 tpSirReadyToExtWoWInd indication)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001068{
Jeff Johnson9d7c99e2018-06-28 15:36:00 -07001069 if (!mac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301070 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_FATAL,
Jeff Johnson9d7c99e2018-06-28 15:36:00 -07001071 "%s: mac is null", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001072 return;
1073 }
1074
Jeff Johnson9d7c99e2018-06-28 15:36:00 -07001075 if (NULL != mac->readyToExtWoWCallback) {
1076 mac->readyToExtWoWCallback(mac->readyToExtWoWContext,
1077 indication->status);
1078 mac->readyToExtWoWCallback = NULL;
1079 mac->readyToExtWoWContext = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001080 }
1081
1082}
1083#endif
1084
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301085/*
1086 * sme_hdd_ready_ind() - SME sends eWNI_SME_SYS_READY_IND to PE to inform
1087 * that the NIC is ready tio run.
1088 * The function is called by HDD at the end of initialization stage so PE/HAL
1089 * can enable the NIC to running state.
1090 * This is a synchronous call
1091 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08001092 * @mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301093 * Return QDF_STATUS_SUCCESS - eWNI_SME_SYS_READY_IND is sent to PE
1094 * successfully.
1095 * Other status means SME failed to send the message to PE.
1096 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08001097QDF_STATUS sme_hdd_ready_ind(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001098{
Jeff Johnson47e4b552019-02-01 23:12:25 -08001099 struct sme_ready_req *msg;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301100 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001101 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001102
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301103 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001104 TRACE_CODE_SME_RX_HDD_MSG_HDDREADYIND, NO_SESSION, 0));
1105 do {
1106
Abhishek Singhde410b72017-05-22 15:25:39 +05301107 msg = qdf_mem_malloc(sizeof(*msg));
Arif Hussain0ef77082018-10-10 16:42:53 -07001108 if (!msg)
Abhishek Singhde410b72017-05-22 15:25:39 +05301109 return QDF_STATUS_E_NOMEM;
Arif Hussain0ef77082018-10-10 16:42:53 -07001110
Abhishek Singhde410b72017-05-22 15:25:39 +05301111 msg->messageType = eWNI_SME_SYS_READY_IND;
1112 msg->length = sizeof(*msg);
Abhishek Singhde410b72017-05-22 15:25:39 +05301113 msg->csr_roam_synch_cb = csr_roam_synch_callback;
Sandeep Puligilla1426d612017-04-12 18:22:06 -07001114 msg->sme_msg_cb = sme_process_msg_callback;
Vignesh Viswanathan3d478032018-08-02 20:18:53 +05301115 msg->stop_roaming_cb = sme_stop_roaming;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001116
Jeff Johnsonb460dd72018-11-08 10:26:51 -08001117 status = u_mac_post_ctrl_msg(mac_handle, (tSirMbMsg *)msg);
Jeff Johnsonc09caa42018-06-07 22:58:55 -07001118 if (QDF_IS_STATUS_ERROR(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001119 sme_err("u_mac_post_ctrl_msg failed to send eWNI_SME_SYS_READY_IND");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001120 break;
1121 }
1122
Jeff Johnson01f2c232018-11-21 19:17:44 -08001123 status = csr_ready(mac);
Jeff Johnsonc09caa42018-06-07 22:58:55 -07001124 if (QDF_IS_STATUS_ERROR(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001125 sme_err("csr_ready failed with status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001126 break;
1127 }
1128
Jeff Johnson01f2c232018-11-21 19:17:44 -08001129 mac->sme.state = SME_STATE_READY;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001130 } while (0);
1131
1132 return status;
1133}
1134
Tushnim Bhattacharyyac3c375e2017-08-04 23:39:55 -07001135QDF_STATUS sme_get_valid_channels(uint8_t *chan_list, uint32_t *list_len)
1136{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001137 struct mac_context *mac_ctx = sme_get_mac_context();
Tushnim Bhattacharyyac3c375e2017-08-04 23:39:55 -07001138
1139 if (NULL == mac_ctx) {
1140 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
1141 FL("Invalid MAC context"));
1142 return QDF_STATUS_E_FAILURE;
1143 }
1144
Wu Gaof3cbeaf2019-01-15 18:26:25 +08001145 *list_len = (uint32_t)mac_ctx->mlme_cfg->reg.valid_channel_list_num;
1146 qdf_mem_copy(chan_list, mac_ctx->mlme_cfg->reg.valid_channel_list,
1147 *list_len);
1148
1149 return QDF_STATUS_SUCCESS;
Tushnim Bhattacharyyac3c375e2017-08-04 23:39:55 -07001150}
1151
Sandeep Puligilla8e89d572018-04-02 18:07:45 -07001152#ifdef WLAN_CONV_SPECTRAL_ENABLE
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001153static QDF_STATUS sme_register_spectral_cb(struct mac_context *mac_ctx)
Sandeep Puligilla8e89d572018-04-02 18:07:45 -07001154{
1155 struct spectral_legacy_cbacks spectral_cb;
1156 QDF_STATUS status;
1157
1158 spectral_cb.vdev_get_chan_freq = sme_get_oper_chan_freq;
1159 spectral_cb.vdev_get_ch_width = sme_get_oper_ch_width;
1160 spectral_cb.vdev_get_sec20chan_freq_mhz = sme_get_sec20chan_freq_mhz;
1161 status = spectral_register_legacy_cb(mac_ctx->psoc, &spectral_cb);
1162
1163 return status;
1164}
1165#else
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001166static QDF_STATUS sme_register_spectral_cb(struct mac_context *mac_ctx)
Sandeep Puligilla8e89d572018-04-02 18:07:45 -07001167{
1168 return QDF_STATUS_SUCCESS;
1169}
1170#endif
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301171/*
1172 * sme_start() - Put all SME modules at ready state.
1173 * The function starts each module in SME, PMC, CSR, etc. . Upon
1174 * successfully return, all modules are ready to run.
1175 * This is a synchronous call
1176 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08001177 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301178 * Return QDF_STATUS_SUCCESS - SME is ready.
1179 * Other status means SME is failed to start
1180 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08001181QDF_STATUS sme_start(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001182{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301183 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001184 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Tushnim Bhattacharyya91049632017-03-17 17:31:27 -07001185 struct policy_mgr_sme_cbacks sme_cbacks;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001186
1187 do {
Jeff Johnson01f2c232018-11-21 19:17:44 -08001188 status = csr_start(mac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301189 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001190 sme_err("csr_start failed status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001191 break;
1192 }
Tushnim Bhattacharyya91049632017-03-17 17:31:27 -07001193 sme_cbacks.sme_get_nss_for_vdev = sme_get_vdev_type_nss;
Tushnim Bhattacharyyac3c375e2017-08-04 23:39:55 -07001194 sme_cbacks.sme_get_valid_channels = sme_get_valid_channels;
Tushnim Bhattacharyya91049632017-03-17 17:31:27 -07001195 sme_cbacks.sme_nss_update_request = sme_nss_update_request;
1196 sme_cbacks.sme_pdev_set_hw_mode = sme_pdev_set_hw_mode;
1197 sme_cbacks.sme_pdev_set_pcl = sme_pdev_set_pcl;
1198 sme_cbacks.sme_soc_set_dual_mac_config =
1199 sme_soc_set_dual_mac_config;
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07001200 sme_cbacks.sme_change_mcc_beacon_interval =
1201 sme_change_mcc_beacon_interval;
1202 sme_cbacks.sme_get_ap_channel_from_scan =
1203 sme_get_ap_channel_from_scan;
1204 sme_cbacks.sme_scan_result_purge = sme_scan_result_purge;
Jeff Johnson01f2c232018-11-21 19:17:44 -08001205 status = policy_mgr_register_sme_cb(mac->psoc, &sme_cbacks);
Tushnim Bhattacharyya91049632017-03-17 17:31:27 -07001206 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2c263352017-03-17 17:49:53 -07001207 sme_err("Failed to register sme cb with Policy Manager: %d",
Tushnim Bhattacharyya91049632017-03-17 17:31:27 -07001208 status);
1209 break;
1210 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08001211 sme_register_spectral_cb(mac);
1212 mac->sme.state = SME_STATE_START;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001213
Sandeep Puligilla66d09c42017-09-06 17:10:27 -07001214 /* START RRM */
Jeff Johnson01f2c232018-11-21 19:17:44 -08001215 status = rrm_start(mac);
Sandeep Puligilla66d09c42017-09-06 17:10:27 -07001216 if (!QDF_IS_STATUS_SUCCESS(status)) {
1217 sme_err("Failed to start RRM");
1218 break;
1219 }
1220 } while (0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001221 return status;
1222}
1223
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001224static QDF_STATUS dfs_msg_processor(struct mac_context *mac,
Arif Hussaincd151632017-02-11 16:57:19 -08001225 struct scheduler_msg *msg)
1226{
1227 QDF_STATUS status = QDF_STATUS_SUCCESS;
Min Liu3621ede2018-11-07 18:36:00 +08001228 struct csr_roam_info *roam_info;
Arif Hussaincd151632017-02-11 16:57:19 -08001229 tSirSmeCSAIeTxCompleteRsp *csa_ie_tx_complete_rsp;
1230 uint32_t session_id = 0;
1231 eRoamCmdStatus roam_status;
1232 eCsrRoamResult roam_result;
1233
Min Liu3621ede2018-11-07 18:36:00 +08001234 roam_info = qdf_mem_malloc(sizeof(*roam_info));
1235 if (!roam_info)
1236 return QDF_STATUS_E_NOMEM;
1237
Arif Hussaincd151632017-02-11 16:57:19 -08001238 switch (msg->type) {
1239 case eWNI_SME_DFS_RADAR_FOUND:
1240 {
1241 session_id = msg->bodyval;
1242 roam_status = eCSR_ROAM_DFS_RADAR_IND;
1243 roam_result = eCSR_ROAM_RESULT_DFS_RADAR_FOUND_IND;
Abhishek Singhe4a1f882017-08-10 17:59:44 +05301244 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Arif Hussaincd151632017-02-11 16:57:19 -08001245 "sapdfs: Radar indication event occurred");
1246 break;
1247 }
1248 case eWNI_SME_DFS_CSAIE_TX_COMPLETE_IND:
1249 {
1250 csa_ie_tx_complete_rsp =
1251 (tSirSmeCSAIeTxCompleteRsp *) msg->bodyptr;
1252 if (!csa_ie_tx_complete_rsp) {
1253 sme_err("eWNI_SME_DFS_CSAIE_TX_COMPLETE_IND null msg");
Min Liu3621ede2018-11-07 18:36:00 +08001254 qdf_mem_free(roam_info);
Arif Hussaincd151632017-02-11 16:57:19 -08001255 return QDF_STATUS_E_FAILURE;
1256 }
1257 session_id = csa_ie_tx_complete_rsp->sessionId;
1258 roam_status = eCSR_ROAM_DFS_CHAN_SW_NOTIFY;
1259 roam_result = eCSR_ROAM_RESULT_DFS_CHANSW_UPDATE_SUCCESS;
Abhishek Singhe4a1f882017-08-10 17:59:44 +05301260 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Arif Hussaincd151632017-02-11 16:57:19 -08001261 "eWNI_SME_DFS_CSAIE_TX_COMPLETE_IND session=%d",
1262 session_id);
1263 break;
1264 }
1265 case eWNI_SME_DFS_CAC_COMPLETE:
1266 {
1267 session_id = msg->bodyval;
1268 roam_status = eCSR_ROAM_CAC_COMPLETE_IND;
1269 roam_result = eCSR_ROAM_RESULT_CAC_END_IND;
Abhishek Singhe4a1f882017-08-10 17:59:44 +05301270 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Arif Hussaincd151632017-02-11 16:57:19 -08001271 "sapdfs: Received eWNI_SME_DFS_CAC_COMPLETE vdevid%d",
1272 session_id);
1273 break;
1274 }
Abhishek Singh20a8e442018-09-12 15:50:44 +05301275 case eWNI_SME_CSA_RESTART_RSP:
1276 {
1277 session_id = msg->bodyval;
1278 roam_status = 0;
1279 roam_result = eCSR_ROAM_RESULT_CSA_RESTART_RSP;
1280 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
1281 "sapdfs: Received eCSR_ROAM_RESULT_DFS_CHANSW_UPDATE_REQ vdevid%d",
1282 session_id);
1283 break;
1284 }
Arif Hussaincd151632017-02-11 16:57:19 -08001285 default:
1286 {
1287 sme_err("Invalid DFS message: 0x%x", msg->type);
Min Liu3621ede2018-11-07 18:36:00 +08001288 qdf_mem_free(roam_info);
Arif Hussaincd151632017-02-11 16:57:19 -08001289 status = QDF_STATUS_E_FAILURE;
1290 return status;
1291 }
1292 }
1293
1294 /* Indicate Radar Event to SAP */
Min Liu3621ede2018-11-07 18:36:00 +08001295 csr_roam_call_callback(mac, session_id, roam_info, 0,
Arif Hussaincd151632017-02-11 16:57:19 -08001296 roam_status, roam_result);
Min Liu3621ede2018-11-07 18:36:00 +08001297 qdf_mem_free(roam_info);
Arif Hussaincd151632017-02-11 16:57:19 -08001298 return status;
1299}
1300
1301
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001302#ifdef WLAN_FEATURE_11W
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301303/*
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001304 * Handle the unprotected management frame indication from LIM and
1305 * forward it to HDD.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301306 */
Jeff Johnson2ef47442018-06-09 23:43:40 -07001307static QDF_STATUS
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001308sme_unprotected_mgmt_frm_ind(struct mac_context *mac,
Jeff Johnson2ef47442018-06-09 23:43:40 -07001309 tpSirSmeUnprotMgmtFrameInd pSmeMgmtFrm)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001310{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301311 QDF_STATUS status = QDF_STATUS_SUCCESS;
Min Liu3621ede2018-11-07 18:36:00 +08001312 struct csr_roam_info *roam_info;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001313 uint32_t SessionId = pSmeMgmtFrm->sessionId;
1314
Min Liu3621ede2018-11-07 18:36:00 +08001315 roam_info = qdf_mem_malloc(sizeof(*roam_info));
1316 if (!roam_info)
1317 return QDF_STATUS_E_NOMEM;
1318
1319 roam_info->nFrameLength = pSmeMgmtFrm->frameLen;
1320 roam_info->pbFrames = pSmeMgmtFrm->frameBuf;
1321 roam_info->frameType = pSmeMgmtFrm->frameType;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001322
1323 /* forward the mgmt frame to HDD */
Min Liu3621ede2018-11-07 18:36:00 +08001324 csr_roam_call_callback(mac, SessionId, roam_info, 0,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001325 eCSR_ROAM_UNPROT_MGMT_FRAME_IND, 0);
1326
Min Liu3621ede2018-11-07 18:36:00 +08001327 qdf_mem_free(roam_info);
1328
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001329 return status;
1330}
1331#endif
1332
Jeff Johnsonc7309062018-11-09 20:59:42 -08001333QDF_STATUS sme_update_new_channel_event(mac_handle_t mac_handle,
1334 uint8_t session_id)
Kapil Gupta8878ad92017-02-13 11:56:04 +05301335{
1336 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001337 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Jeff Johnson172237b2017-11-07 15:32:59 -08001338 struct csr_roam_info *roamInfo;
Kapil Gupta8878ad92017-02-13 11:56:04 +05301339 eRoamCmdStatus roamStatus;
1340 eCsrRoamResult roamResult;
1341
1342 roamInfo = qdf_mem_malloc(sizeof(*roamInfo));
Arif Hussain0ef77082018-10-10 16:42:53 -07001343 if (!roamInfo)
Krunal Soni3fa80e22018-01-09 14:16:02 -08001344 return QDF_STATUS_E_FAILURE;
Kapil Gupta8878ad92017-02-13 11:56:04 +05301345
Arif Hussain0ef77082018-10-10 16:42:53 -07001346 roamInfo->dfs_event.sessionId = session_id;
Kapil Gupta8878ad92017-02-13 11:56:04 +05301347 roamStatus = eCSR_ROAM_CHANNEL_COMPLETE_IND;
1348 roamResult = eCSR_ROAM_RESULT_DFS_RADAR_FOUND_IND;
Abhishek Singhe4a1f882017-08-10 17:59:44 +05301349 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Kapil Gupta8878ad92017-02-13 11:56:04 +05301350 "sapdfs: Updated new channel event");
1351
1352 /* Indicate channel Event to SAP */
1353 csr_roam_call_callback(mac, session_id, roamInfo, 0,
1354 roamStatus, roamResult);
1355
1356 qdf_mem_free(roamInfo);
1357 return status;
1358}
1359
1360
Abhishek Singh518323d2015-10-19 17:42:01 +05301361/**
1362 * sme_extended_change_channel_ind()- function to indicate ECSA
1363 * action frame is received in lim to SAP
1364 * @mac_ctx: pointer to global mac structure
1365 * @msg_buf: contain new channel and session id.
1366 *
1367 * This function is called to post ECSA action frame
1368 * receive event to SAP.
1369 *
1370 * Return: success if msg indicated to SAP else return failure
1371 */
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001372static QDF_STATUS sme_extended_change_channel_ind(struct mac_context *mac_ctx,
Abhishek Singh518323d2015-10-19 17:42:01 +05301373 void *msg_buf)
1374{
1375 struct sir_sme_ext_cng_chan_ind *ext_chan_ind;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301376 QDF_STATUS status = QDF_STATUS_SUCCESS;
Abhishek Singh518323d2015-10-19 17:42:01 +05301377 uint32_t session_id = 0;
Min Liu3621ede2018-11-07 18:36:00 +08001378 struct csr_roam_info *roam_info;
Abhishek Singh518323d2015-10-19 17:42:01 +05301379 eRoamCmdStatus roam_status;
1380 eCsrRoamResult roam_result;
1381
Abhishek Singh518323d2015-10-19 17:42:01 +05301382 ext_chan_ind = msg_buf;
1383 if (NULL == ext_chan_ind) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001384 sme_err("ext_chan_ind is NULL");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301385 return QDF_STATUS_E_FAILURE;
Abhishek Singh518323d2015-10-19 17:42:01 +05301386 }
Min Liu3621ede2018-11-07 18:36:00 +08001387 roam_info = qdf_mem_malloc(sizeof(*roam_info));
1388 if (!roam_info)
1389 return QDF_STATUS_E_NOMEM;
Abhishek Singh518323d2015-10-19 17:42:01 +05301390 session_id = ext_chan_ind->session_id;
Min Liu3621ede2018-11-07 18:36:00 +08001391 roam_info->target_channel = ext_chan_ind->new_channel;
Abhishek Singh518323d2015-10-19 17:42:01 +05301392 roam_status = eCSR_ROAM_EXT_CHG_CHNL_IND;
1393 roam_result = eCSR_ROAM_EXT_CHG_CHNL_UPDATE_IND;
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001394 sme_debug("sapdfs: Received eWNI_SME_EXT_CHANGE_CHANNEL_IND for session id [%d]",
1395 session_id);
Abhishek Singh518323d2015-10-19 17:42:01 +05301396
1397 /* Indicate Ext Channel Change event to SAP */
Min Liu3621ede2018-11-07 18:36:00 +08001398 csr_roam_call_callback(mac_ctx, session_id, roam_info, 0,
1399 roam_status, roam_result);
1400 qdf_mem_free(roam_info);
Abhishek Singh518323d2015-10-19 17:42:01 +05301401 return status;
1402}
1403
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001404#ifdef FEATURE_WLAN_ESE
1405/**
1406 * sme_update_is_ese_feature_enabled() - enable/disable ESE support at runtime
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08001407 * @mac_handle: Opaque handle to the global MAC context
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001408 * @sessionId: session id
1409 * @isEseIniFeatureEnabled: ese ini enabled
1410 *
1411 * It is used at in the REG_DYNAMIC_VARIABLE macro definition of
1412 * isEseIniFeatureEnabled. This is a synchronous call
1413 *
1414 * Return: QDF_STATUS enumeration
1415 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08001416QDF_STATUS sme_update_is_ese_feature_enabled(mac_handle_t mac_handle,
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001417 uint8_t sessionId, const bool isEseIniFeatureEnabled)
1418{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001419 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05301420 QDF_STATUS status;
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001421
Wu Gao51a63562018-11-08 16:29:10 +08001422 if (mac->mlme_cfg->lfr.ese_enabled ==
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001423 isEseIniFeatureEnabled) {
Abhishek Singhe4a1f882017-08-10 17:59:44 +05301424 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001425 "%s: ESE Mode is already enabled or disabled, nothing to do (returning) old(%d) new(%d)",
1426 __func__,
Wu Gao51a63562018-11-08 16:29:10 +08001427 mac->mlme_cfg->lfr.ese_enabled,
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001428 isEseIniFeatureEnabled);
1429 return QDF_STATUS_SUCCESS;
1430 }
1431
Abhishek Singhe4a1f882017-08-10 17:59:44 +05301432 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001433 "%s: EseEnabled is changed from %d to %d", __func__,
Wu Gao51a63562018-11-08 16:29:10 +08001434 mac->mlme_cfg->lfr.ese_enabled,
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001435 isEseIniFeatureEnabled);
Wu Gao51a63562018-11-08 16:29:10 +08001436 mac->mlme_cfg->lfr.ese_enabled = isEseIniFeatureEnabled;
Varun Reddy Yeturuff4feb02016-04-20 12:26:11 -07001437 csr_neighbor_roam_update_fast_roaming_enabled(
Jeff Johnson01f2c232018-11-21 19:17:44 -08001438 mac, sessionId, isEseIniFeatureEnabled);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001439
1440 if (true == isEseIniFeatureEnabled)
Wu Gao51a63562018-11-08 16:29:10 +08001441 mac->mlme_cfg->lfr.fast_transition_enabled = true;
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001442
Wu Gao51a63562018-11-08 16:29:10 +08001443 if (mac->mlme_cfg->lfr.roam_scan_offload_enabled) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08001444 status = sme_acquire_global_lock(&mac->sme);
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05301445 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08001446 csr_roam_offload_scan(mac, sessionId,
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05301447 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
1448 REASON_ESE_INI_CFG_CHANGED);
Jeff Johnson01f2c232018-11-21 19:17:44 -08001449 sme_release_global_lock(&mac->sme);
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05301450 } else {
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05301451 return status;
1452 }
1453 }
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001454 return QDF_STATUS_SUCCESS;
1455}
1456
1457/**
1458 * sme_set_plm_request() - set plm request
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08001459 * @mac_handle: Opaque handle to the global MAC context
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001460 * @pPlmReq: Pointer to input plm request
1461 *
1462 * Return: QDF_STATUS enumeration
1463 */
Jeff Johnsonb120a822019-02-02 22:15:55 -08001464QDF_STATUS sme_set_plm_request(mac_handle_t mac_handle, struct plm_req *pPlmReq)
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001465{
1466 QDF_STATUS status;
1467 bool ret = false;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001468 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Wu Gao0821b0d2019-01-11 17:31:11 +08001469 uint8_t ch_list[CFG_VALID_CHANNEL_LIST_LEN] = { 0 };
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001470 uint8_t count, valid_count = 0;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07001471 struct scheduler_msg msg = {0};
Jeff Johnson01f2c232018-11-21 19:17:44 -08001472 struct csr_roam_session *pSession = CSR_GET_SESSION(mac,
gaurank kathpalia14e2f912017-08-31 14:51:45 +05301473 pPlmReq->sessionId);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001474
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
1479 if (!pSession) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001480 sme_err("session %d not found", pPlmReq->sessionId);
Jeff Johnson01f2c232018-11-21 19:17:44 -08001481 sme_release_global_lock(&mac->sme);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001482 return QDF_STATUS_E_FAILURE;
1483 }
1484
1485 if (!pSession->sessionActive) {
1486 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
1487 FL("Invalid Sessionid"));
Jeff Johnson01f2c232018-11-21 19:17:44 -08001488 sme_release_global_lock(&mac->sme);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001489 return QDF_STATUS_E_FAILURE;
1490 }
1491
1492 if (!pPlmReq->enable)
1493 goto send_plm_start;
1494 /* validating channel numbers */
1495 for (count = 0; count < pPlmReq->plmNumCh; count++) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08001496 ret = csr_is_supported_channel(mac, pPlmReq->plmChList[count]);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001497 if (ret && pPlmReq->plmChList[count] > 14) {
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07001498 if (CHANNEL_STATE_DFS == wlan_reg_get_channel_state(
Jeff Johnson01f2c232018-11-21 19:17:44 -08001499 mac->pdev,
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001500 pPlmReq->plmChList[count])) {
1501 /* DFS channel is provided, no PLM bursts can be
1502 * transmitted. Ignoring these channels.
1503 */
1504 QDF_TRACE(QDF_MODULE_ID_SME,
Abhishek Singhe4a1f882017-08-10 17:59:44 +05301505 QDF_TRACE_LEVEL_DEBUG,
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001506 FL("DFS channel %d ignored for PLM"),
1507 pPlmReq->plmChList[count]);
1508 continue;
1509 }
1510 } else if (!ret) {
1511 /* Not supported, ignore the channel */
Abhishek Singhe4a1f882017-08-10 17:59:44 +05301512 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001513 FL("Unsupported channel %d ignored for PLM"),
1514 pPlmReq->plmChList[count]);
1515 continue;
1516 }
1517 ch_list[valid_count] = pPlmReq->plmChList[count];
1518 valid_count++;
1519 } /* End of for () */
1520
1521 /* Copying back the valid channel list to plm struct */
hangtian127c9532019-01-12 13:29:07 +08001522 qdf_mem_zero((void *)pPlmReq->plmChList,
1523 pPlmReq->plmNumCh);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001524 if (valid_count)
1525 qdf_mem_copy(pPlmReq->plmChList, ch_list,
1526 valid_count);
1527 /* All are invalid channels, FW need to send the PLM
1528 * report with "incapable" bit set.
1529 */
1530 pPlmReq->plmNumCh = valid_count;
1531
1532send_plm_start:
1533 /* PLM START */
1534 msg.type = WMA_SET_PLM_REQ;
1535 msg.reserved = 0;
1536 msg.bodyptr = pPlmReq;
1537
gaurank kathpalia36b0c582018-08-28 17:45:43 +05301538 if (!QDF_IS_STATUS_SUCCESS(scheduler_post_message(QDF_MODULE_ID_SME,
1539 QDF_MODULE_ID_WMA,
1540 QDF_MODULE_ID_WMA,
1541 &msg))) {
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001542 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
1543 FL("Not able to post WMA_SET_PLM_REQ to WMA"));
Jeff Johnson01f2c232018-11-21 19:17:44 -08001544 sme_release_global_lock(&mac->sme);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001545 return QDF_STATUS_E_FAILURE;
1546 }
1547
Jeff Johnson01f2c232018-11-21 19:17:44 -08001548 sme_release_global_lock(&mac->sme);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001549 return status;
1550}
1551
1552/**
1553 * sme_tsm_ie_ind() - sme tsm ie indication
Jeff Johnson24e65b52018-06-10 08:45:26 -07001554 * @mac: Global mac context
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001555 * @pSmeTsmIeInd: Pointer to tsm ie indication
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001556 *
1557 * Handle the tsm ie indication from LIM and forward it to HDD.
1558 *
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001559 * Return: QDF_STATUS enumeration
1560 */
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001561static QDF_STATUS sme_tsm_ie_ind(struct mac_context *mac,
Jeff Johnsone21b0eb2019-02-02 19:31:54 -08001562 struct tsm_ie_ind *pSmeTsmIeInd)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001563{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301564 QDF_STATUS status = QDF_STATUS_SUCCESS;
Min Liu3621ede2018-11-07 18:36:00 +08001565 struct csr_roam_info *roam_info;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001566 uint32_t SessionId = pSmeTsmIeInd->sessionId;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301567
Min Liu3621ede2018-11-07 18:36:00 +08001568 roam_info = qdf_mem_malloc(sizeof(*roam_info));
1569 if (!roam_info)
1570 return QDF_STATUS_E_NOMEM;
1571
1572 roam_info->tsm_ie.tsid = pSmeTsmIeInd->tsm_ie.tsid;
1573 roam_info->tsm_ie.state = pSmeTsmIeInd->tsm_ie.state;
1574 roam_info->tsm_ie.msmt_interval = pSmeTsmIeInd->tsm_ie.msmt_interval;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001575 /* forward the tsm ie information to HDD */
Min Liu3621ede2018-11-07 18:36:00 +08001576 csr_roam_call_callback(mac, SessionId, roam_info, 0,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301577 eCSR_ROAM_TSM_IE_IND, 0);
Min Liu3621ede2018-11-07 18:36:00 +08001578 qdf_mem_free(roam_info);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001579 return status;
1580}
1581
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001582/**
1583 * sme_set_cckm_ie() - set cckm ie
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08001584 * @mac_handle: Opaque handle to the global MAC context
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001585 * @sessionId: session id
1586 * @pCckmIe: Pointer to CCKM Ie
1587 * @cckmIeLen: Length of @pCckmIe
1588 *
1589 * Function to store the CCKM IE passed from supplicant and use
1590 * it while packing reassociation request.
1591 *
1592 * Return: QDF_STATUS enumeration
1593 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08001594QDF_STATUS sme_set_cckm_ie(mac_handle_t mac_handle, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001595 uint8_t *pCckmIe, uint8_t cckmIeLen)
1596{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001597 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301598 QDF_STATUS status = QDF_STATUS_SUCCESS;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301599
Jeff Johnson01f2c232018-11-21 19:17:44 -08001600 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301601 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08001602 csr_set_cckm_ie(mac, sessionId, pCckmIe, cckmIeLen);
1603 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001604 }
1605 return status;
1606}
1607
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001608/**
1609 * sme_set_ese_beacon_request() - set ese beacon request
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08001610 * @mac_handle: Opaque handle to the global MAC context
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001611 * @sessionId: session id
Jeff Johnsonb2c3d042019-02-26 12:23:26 -08001612 * @in_req: Ese beacon report request
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001613 *
1614 * function to set ESE beacon request parameters
1615 *
1616 * Return: QDF_STATUS enumeration
1617 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08001618QDF_STATUS sme_set_ese_beacon_request(mac_handle_t mac_handle,
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08001619 const uint8_t sessionId,
Jeff Johnsonb2c3d042019-02-26 12:23:26 -08001620 const tCsrEseBeaconReq *in_req)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001621{
Varun Reddy Yeturu7b2a6572017-06-15 11:07:28 -07001622 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001623 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001624 tpSirBeaconReportReqInd pSmeBcnReportReq = NULL;
Jeff Johnsonb2c3d042019-02-26 12:23:26 -08001625 const tCsrEseBeaconReqParams *pBeaconReq = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001626 uint8_t counter = 0;
Jeff Johnson01f2c232018-11-21 19:17:44 -08001627 struct csr_roam_session *pSession = CSR_GET_SESSION(mac, sessionId);
1628 tpRrmSMEContext pSmeRrmContext = &mac->rrm.rrmSmeContext;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001629
1630 if (pSmeRrmContext->eseBcnReqInProgress == true) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001631 sme_err("A Beacon Report Req is already in progress");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301632 return QDF_STATUS_E_RESOURCES;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001633 }
1634
1635 /* Store the info in RRM context */
Jeff Johnsonb2c3d042019-02-26 12:23:26 -08001636 qdf_mem_copy(&pSmeRrmContext->eseBcnReqInfo, in_req,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001637 sizeof(tCsrEseBeaconReq));
1638
1639 /* Prepare the request to send to SME. */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301640 pSmeBcnReportReq = qdf_mem_malloc(sizeof(tSirBeaconReportReqInd));
Arif Hussain0ef77082018-10-10 16:42:53 -07001641 if (!pSmeBcnReportReq)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301642 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001643
1644 pSmeRrmContext->eseBcnReqInProgress = true;
1645
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001646 sme_debug("Sending Beacon Report Req to SME");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001647
1648 pSmeBcnReportReq->messageType = eWNI_SME_BEACON_REPORT_REQ_IND;
1649 pSmeBcnReportReq->length = sizeof(tSirBeaconReportReqInd);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301650 qdf_mem_copy(pSmeBcnReportReq->bssId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001651 pSession->connectedProfile.bssid.bytes,
1652 sizeof(tSirMacAddr));
1653 pSmeBcnReportReq->channelInfo.channelNum = 255;
Jeff Johnsonb2c3d042019-02-26 12:23:26 -08001654 pSmeBcnReportReq->channelList.numChannels = in_req->numBcnReqIe;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001655 pSmeBcnReportReq->msgSource = eRRM_MSG_SOURCE_ESE_UPLOAD;
1656
Jeff Johnsonb2c3d042019-02-26 12:23:26 -08001657 for (counter = 0; counter < in_req->numBcnReqIe; counter++) {
1658 pBeaconReq = &in_req->bcnReq[counter];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001659 pSmeBcnReportReq->fMeasurementtype[counter] =
1660 pBeaconReq->scanMode;
1661 pSmeBcnReportReq->measurementDuration[counter] =
1662 SYS_TU_TO_MS(pBeaconReq->measurementDuration);
1663 pSmeBcnReportReq->channelList.channelNumber[counter] =
1664 pBeaconReq->channel;
1665 }
1666
Jeff Johnson01f2c232018-11-21 19:17:44 -08001667 status = sme_rrm_process_beacon_report_req_ind(mac, pSmeBcnReportReq);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001668
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301669 if (status != QDF_STATUS_SUCCESS)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001670 pSmeRrmContext->eseBcnReqInProgress = false;
1671
Hanumanth Reddy Pothula7f7a2712016-09-07 18:44:47 +05301672 qdf_mem_free(pSmeBcnReportReq);
1673
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001674 return status;
1675}
1676
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001677/**
1678 * sme_get_tsm_stats() - SME get tsm stats
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08001679 * @mac_handle: Opaque handle to the global MAC context
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001680 * @callback: SME sends back the requested stats using the callback
1681 * @staId: The station ID for which the stats is requested for
1682 * @bssId: bssid
1683 * @pContext: user context to be passed back along with the callback
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001684 * @tid: Traffic id
1685 *
1686 * API register a callback to get TSM Stats.
1687 *
1688 * Return: QDF_STATUS enumeration
1689 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08001690QDF_STATUS sme_get_tsm_stats(mac_handle_t mac_handle,
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001691 tCsrTsmStatsCallback callback,
1692 uint8_t staId, struct qdf_mac_addr bssId,
Jeff Johnson30f84552017-09-13 14:55:25 -07001693 void *pContext, uint8_t tid)
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001694{
1695 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001696 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001697
Jeff Johnson01f2c232018-11-21 19:17:44 -08001698 status = sme_acquire_global_lock(&mac->sme);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001699 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08001700 status = csr_get_tsm_stats(mac, callback,
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001701 staId, bssId, pContext,
Jeff Johnson30f84552017-09-13 14:55:25 -07001702 tid);
Jeff Johnson01f2c232018-11-21 19:17:44 -08001703 sme_release_global_lock(&mac->sme);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001704 }
1705 return status;
1706}
1707
1708/**
1709 * sme_set_ese_roam_scan_channel_list() - To set ese roam scan channel list
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08001710 * @mac_handle: Opaque handle to the global MAC context
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001711 * @sessionId: sme session id
1712 * @pChannelList: Output channel list
1713 * @numChannels: Output number of channels
1714 *
1715 * This routine is called to set ese roam scan channel list.
1716 * This is a synchronous call
1717 *
1718 * Return: QDF_STATUS
1719 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08001720QDF_STATUS sme_set_ese_roam_scan_channel_list(mac_handle_t mac_handle,
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001721 uint8_t sessionId,
1722 uint8_t *pChannelList,
1723 uint8_t numChannels)
1724{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001725 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001726 QDF_STATUS status = QDF_STATUS_SUCCESS;
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08001727 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
1728 tpCsrChannelInfo curchnl_list_info = NULL;
Wu Gao0821b0d2019-01-11 17:31:11 +08001729 uint8_t oldChannelList[CFG_VALID_CHANNEL_LIST_LEN * 2] = { 0 };
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001730 uint8_t newChannelList[128] = { 0 };
1731 uint8_t i = 0, j = 0;
1732
Dustin Brownad06be62019-02-04 14:52:56 -08001733 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08001734 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
1735 FL("Invalid sme session id: %d"), sessionId);
1736 return QDF_STATUS_E_INVAL;
1737 }
1738
Jeff Johnson01f2c232018-11-21 19:17:44 -08001739 pNeighborRoamInfo = &mac->roam.neighborRoamInfo[sessionId];
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08001740 curchnl_list_info =
1741 &pNeighborRoamInfo->roamChannelInfo.currentChannelListInfo;
1742
Jeff Johnson01f2c232018-11-21 19:17:44 -08001743 status = sme_acquire_global_lock(&mac->sme);
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +05301744 if (!QDF_IS_STATUS_SUCCESS(status))
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001745 return status;
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +05301746
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001747 if (NULL != curchnl_list_info->ChannelList) {
1748 for (i = 0; i < curchnl_list_info->numOfChannels; i++) {
1749 j += snprintf(oldChannelList + j,
1750 sizeof(oldChannelList) - j, "%d",
1751 curchnl_list_info->ChannelList[i]);
1752 }
1753 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08001754 status = csr_create_roam_scan_channel_list(mac, sessionId,
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001755 pChannelList, numChannels,
Jeff Johnson01f2c232018-11-21 19:17:44 -08001756 csr_get_current_band(mac));
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001757 if (QDF_IS_STATUS_SUCCESS(status)) {
1758 if (NULL != curchnl_list_info->ChannelList) {
1759 j = 0;
1760 for (i = 0; i < curchnl_list_info->numOfChannels; i++) {
1761 j += snprintf(newChannelList + j,
1762 sizeof(newChannelList) - j, "%d",
1763 curchnl_list_info->ChannelList[i]);
1764 }
1765 }
1766 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
1767 "ESE roam scan chnl list successfully set to %s-old value is %s-roam state is %d",
1768 newChannelList, oldChannelList,
1769 pNeighborRoamInfo->neighborRoamState);
1770 }
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05301771
Wu Gao51a63562018-11-08 16:29:10 +08001772 if (mac->mlme_cfg->lfr.roam_scan_offload_enabled)
Jeff Johnson01f2c232018-11-21 19:17:44 -08001773 csr_roam_offload_scan(mac, sessionId,
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001774 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
1775 REASON_CHANNEL_LIST_CHANGED);
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05301776
Jeff Johnson01f2c232018-11-21 19:17:44 -08001777 sme_release_global_lock(&mac->sme);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001778 return status;
1779}
1780
1781#endif /* FEATURE_WLAN_ESE */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001782
Jeff Johnson49c02f92016-10-07 10:29:09 -07001783static
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001784QDF_STATUS sme_ibss_peer_info_response_handler(struct mac_context *mac,
Jeff Johnson49c02f92016-10-07 10:29:09 -07001785 tpSirIbssGetPeerInfoRspParams
1786 pIbssPeerInfoParams)
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08001787{
Jeff Johnson56ba88a2019-02-17 17:18:43 -08001788 struct ibss_peer_info_cb_info *cb_info;
1789
1790 if (!mac) {
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08001791 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_FATAL,
Jeff Johnson01f2c232018-11-21 19:17:44 -08001792 "%s: mac is null", __func__);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08001793 return QDF_STATUS_E_FAILURE;
1794 }
Jeff Johnsone7aa5cd2019-02-17 19:36:01 -08001795 cb_info = &mac->sme.peer_info_cb_info;
Jeff Johnson56ba88a2019-02-17 17:18:43 -08001796 if (!cb_info->peer_info_cb) {
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08001797 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
1798 "%s: HDD callback is null", __func__);
1799 return QDF_STATUS_E_FAILURE;
1800 }
Jeff Johnson56ba88a2019-02-17 17:18:43 -08001801 cb_info->peer_info_cb(cb_info->peer_info_cb_context,
1802 &pIbssPeerInfoParams->ibssPeerInfoRspParams);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08001803 return QDF_STATUS_SUCCESS;
1804}
1805
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001806/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001807 * sme_process_dual_mac_config_resp() - Process set Dual mac config response
1808 * @mac: Global MAC pointer
1809 * @msg: Dual mac config response
1810 *
1811 * Processes the dual mac configuration response and invokes the HDD callback
1812 * to process further
1813 */
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001814static QDF_STATUS sme_process_dual_mac_config_resp(struct mac_context *mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001815 uint8_t *msg)
1816{
1817 tListElem *entry = NULL;
1818 tSmeCmd *command = NULL;
1819 bool found;
1820 dual_mac_cb callback = NULL;
1821 struct sir_dual_mac_config_resp *param;
1822
1823 param = (struct sir_dual_mac_config_resp *)msg;
1824 if (!param) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001825 sme_err("Dual mac config resp param is NULL");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001826 /* Not returning. Need to check if active command list
1827 * needs to be freed
1828 */
1829 }
1830
Krunal Sonia8270f52017-02-23 19:51:25 -08001831 entry = csr_nonscan_active_ll_peek_head(mac, LL_ACCESS_LOCK);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001832 if (!entry) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001833 sme_err("No cmd found in active list");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301834 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001835 }
1836
1837 command = GET_BASE_ADDR(entry, tSmeCmd, Link);
1838 if (!command) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001839 sme_err("Base address is NULL");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301840 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001841 }
1842
1843 if (e_sme_command_set_dual_mac_config != command->command) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001844 sme_err("Command mismatch!");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301845 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001846 }
1847
1848 callback = command->u.set_dual_mac_cmd.set_dual_mac_cb;
1849 if (callback) {
1850 if (!param) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001851 sme_err("Callback failed-Dual mac config is NULL");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001852 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001853 sme_debug("Calling HDD callback for Dual mac config");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001854 callback(param->status,
1855 command->u.set_dual_mac_cmd.scan_config,
1856 command->u.set_dual_mac_cmd.fw_mode_config);
1857 }
1858 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001859 sme_err("Callback does not exist");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001860 }
1861
Krunal Soni72dba662017-02-15 20:13:17 -08001862 found = csr_nonscan_active_ll_remove_entry(mac, entry, LL_ACCESS_LOCK);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001863 if (found)
1864 /* Now put this command back on the available command list */
Krunal Soni78618d92017-02-14 21:46:31 -08001865 csr_release_command(mac, command);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001866
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301867 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001868}
1869
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001870/**
1871 * sme_process_antenna_mode_resp() - Process set antenna mode
1872 * response
1873 * @mac: Global MAC pointer
1874 * @msg: antenna mode response
1875 *
1876 * Processes the antenna mode response and invokes the HDD
1877 * callback to process further
1878 */
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001879static QDF_STATUS sme_process_antenna_mode_resp(struct mac_context *mac,
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001880 uint8_t *msg)
1881{
1882 tListElem *entry;
1883 tSmeCmd *command;
1884 bool found;
Dundi Raviteja6bb9e322018-05-16 17:04:41 +05301885 void *context = NULL;
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001886 antenna_mode_cb callback;
1887 struct sir_antenna_mode_resp *param;
1888
1889 param = (struct sir_antenna_mode_resp *)msg;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301890 if (!param)
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001891 sme_err("set antenna mode resp is NULL");
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001892 /* Not returning. Need to check if active command list
1893 * needs to be freed
1894 */
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001895
Krunal Sonia8270f52017-02-23 19:51:25 -08001896 entry = csr_nonscan_active_ll_peek_head(mac, LL_ACCESS_LOCK);
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001897 if (!entry) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001898 sme_err("No cmd found in active list");
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001899 return QDF_STATUS_E_FAILURE;
1900 }
1901
1902 command = GET_BASE_ADDR(entry, tSmeCmd, Link);
1903 if (!command) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001904 sme_err("Base address is NULL");
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001905 return QDF_STATUS_E_FAILURE;
1906 }
1907
1908 if (e_sme_command_set_antenna_mode != command->command) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001909 sme_err("Command mismatch!");
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001910 return QDF_STATUS_E_FAILURE;
1911 }
1912
Dundi Raviteja6bb9e322018-05-16 17:04:41 +05301913 context = command->u.set_antenna_mode_cmd.set_antenna_mode_ctx;
1914 callback = command->u.set_antenna_mode_cmd.set_antenna_mode_resp;
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001915 if (callback) {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301916 if (!param)
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001917 sme_err("Set antenna mode call back is NULL");
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301918 else
Dundi Raviteja6bb9e322018-05-16 17:04:41 +05301919 callback(param->status, context);
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001920 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001921 sme_err("Callback does not exist");
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001922 }
1923
Krunal Soni72dba662017-02-15 20:13:17 -08001924 found = csr_nonscan_active_ll_remove_entry(mac, entry, LL_ACCESS_LOCK);
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001925 if (found)
1926 /* Now put this command back on the available command list */
Krunal Soni78618d92017-02-14 21:46:31 -08001927 csr_release_command(mac, command);
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001928
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001929 return QDF_STATUS_SUCCESS;
1930}
1931
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001932QDF_STATUS sme_process_msg(struct mac_context *mac, struct scheduler_msg *pMsg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001933{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301934 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Ashish Kumar Dhanotiya443d31f2017-10-13 12:41:19 +05301935 struct sir_peer_info *peer_stats;
1936 struct sir_peer_info_resp *peer_info_rsp;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001937
1938 if (pMsg == NULL) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001939 sme_err("Empty message for SME");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001940 return status;
1941 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08001942 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301943 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001944 if (pMsg->bodyptr)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301945 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001946 return status;
1947 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08001948 if (!SME_IS_START(mac)) {
Rajeev Kumar3887f9b2018-01-10 11:24:01 -08001949 sme_debug("message type %d in stop state ignored", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001950 if (pMsg->bodyptr)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301951 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001952 goto release_lock;
1953 }
1954 switch (pMsg->type) {
1955#ifdef WLAN_FEATURE_ROAM_OFFLOAD
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001956 case eWNI_SME_HO_FAIL_IND:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301957 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001958 FL("LFR3: Rcvd eWNI_SME_HO_FAIL_IND"));
Jeff Johnson01f2c232018-11-21 19:17:44 -08001959 csr_process_ho_fail_ind(mac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301960 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001961 break;
1962#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001963 case eWNI_SME_ADDTS_RSP:
1964 case eWNI_SME_DELTS_RSP:
1965 case eWNI_SME_DELTS_IND:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001966 case eWNI_SME_FT_AGGR_QOS_RSP:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001967 /* QoS */
1968 if (pMsg->bodyptr) {
1969#ifndef WLAN_MDM_CODE_REDUCTION_OPT
Jeff Johnson01f2c232018-11-21 19:17:44 -08001970 status = sme_qos_msg_processor(mac, pMsg->type,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001971 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301972 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001973#endif
1974 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001975 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001976 }
1977 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001978 case eWNI_SME_NEIGHBOR_REPORT_IND:
1979 case eWNI_SME_BEACON_REPORT_REQ_IND:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001980 if (pMsg->bodyptr) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08001981 status = sme_rrm_msg_processor(mac, pMsg->type,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001982 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301983 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001984 } else {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301985 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001986 }
1987 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001988 case eWNI_SME_ADD_STA_SELF_RSP:
1989 if (pMsg->bodyptr) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08001990 status = csr_process_add_sta_session_rsp(mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001991 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301992 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001993 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001994 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001995 }
1996 break;
1997 case eWNI_SME_DEL_STA_SELF_RSP:
1998 if (pMsg->bodyptr) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08001999 status = csr_process_del_sta_session_rsp(mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002000 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302001 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002002 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002003 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002004 }
2005 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002006 case eWNI_SME_GENERIC_CHANGE_COUNTRY_CODE:
2007 if (pMsg->bodyptr) {
2008 status = sme_handle_generic_change_country_code(
Jeff Johnson01f2c232018-11-21 19:17:44 -08002009 (void *)mac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302010 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002011 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002012 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002013 }
2014 break;
Sandeep Puligilla8d6011b2017-11-08 00:06:18 -08002015
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002016#ifdef WLAN_FEATURE_11W
2017 case eWNI_SME_UNPROT_MGMT_FRM_IND:
2018 if (pMsg->bodyptr) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002019 sme_unprotected_mgmt_frm_ind(mac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302020 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002021 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002022 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002023 }
2024 break;
2025#endif
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08002026#ifdef FEATURE_WLAN_ESE
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002027 case eWNI_SME_TSM_IE_IND:
2028 if (pMsg->bodyptr) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002029 sme_tsm_ie_ind(mac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302030 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002031 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002032 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002033 }
2034 break;
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08002035#endif /* FEATURE_WLAN_ESE */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002036 case eWNI_SME_ROAM_SCAN_OFFLOAD_RSP:
Jeff Johnson01f2c232018-11-21 19:17:44 -08002037 status = csr_roam_offload_scan_rsp_hdlr((void *)mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002038 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302039 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002040 break;
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08002041 case eWNI_SME_IBSS_PEER_INFO_RSP:
2042 if (pMsg->bodyptr) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002043 sme_ibss_peer_info_response_handler(mac,
Jeff Johnson49c02f92016-10-07 10:29:09 -07002044 pMsg->bodyptr);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08002045 qdf_mem_free(pMsg->bodyptr);
2046 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002047 sme_err("Empty message for: %d", pMsg->type);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08002048 }
2049 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002050#ifdef WLAN_FEATURE_EXTWOW_SUPPORT
2051 case eWNI_SME_READY_TO_EXTWOW_IND:
2052 if (pMsg->bodyptr) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002053 sme_process_ready_to_ext_wow(mac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302054 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002055 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002056 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002057 }
2058 break;
2059#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002060#ifdef FEATURE_WLAN_AUTO_SHUTDOWN
2061 case eWNI_SME_AUTO_SHUTDOWN_IND:
Jeff Johnsoneb7bbed2019-02-17 10:34:24 -08002062 if (mac->sme.auto_shutdown_cb) {
Abhishek Singhe4a1f882017-08-10 17:59:44 +05302063 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002064 FL("Auto shutdown notification"));
Jeff Johnsoneb7bbed2019-02-17 10:34:24 -08002065 mac->sme.auto_shutdown_cb();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002066 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002067 break;
2068#endif
2069 case eWNI_SME_DFS_RADAR_FOUND:
Arif Hussaincd151632017-02-11 16:57:19 -08002070 case eWNI_SME_DFS_CAC_COMPLETE:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002071 case eWNI_SME_DFS_CSAIE_TX_COMPLETE_IND:
Abhishek Singh20a8e442018-09-12 15:50:44 +05302072 case eWNI_SME_CSA_RESTART_RSP:
Jeff Johnson01f2c232018-11-21 19:17:44 -08002073 status = dfs_msg_processor(mac, pMsg);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302074 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002075 break;
2076 case eWNI_SME_CHANNEL_CHANGE_RSP:
2077 if (pMsg->bodyptr) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002078 status = sme_process_channel_change_resp(mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002079 pMsg->type,
2080 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302081 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002082 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002083 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002084 }
2085 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002086 case eWNI_SME_STATS_EXT_EVENT:
Jeff Johnson01f2c232018-11-21 19:17:44 -08002087 status = sme_stats_ext_event(mac, pMsg->bodyptr);
Jeff Johnsonfdecd512018-06-10 09:18:32 -07002088 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002089 break;
Will Huang558f8082017-05-31 16:22:24 +08002090 case eWNI_SME_GET_PEER_INFO_IND:
Jeff Johnson01f2c232018-11-21 19:17:44 -08002091 if (mac->sme.pget_peer_info_ind_cb)
2092 mac->sme.pget_peer_info_ind_cb(pMsg->bodyptr,
2093 mac->sme.pget_peer_info_cb_context);
Ashish Kumar Dhanotiya443d31f2017-10-13 12:41:19 +05302094 if (pMsg->bodyptr) {
2095 peer_info_rsp = (struct sir_peer_info_resp *)
2096 (pMsg->bodyptr);
2097 peer_stats = (struct sir_peer_info *)
2098 (peer_info_rsp->info);
2099 if (peer_stats) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002100 mac->peer_rssi = peer_stats[0].rssi;
2101 mac->peer_txrate = peer_stats[0].tx_rate;
2102 mac->peer_rxrate = peer_stats[0].rx_rate;
Ashish Kumar Dhanotiya443d31f2017-10-13 12:41:19 +05302103 }
2104 }
Will Huang558f8082017-05-31 16:22:24 +08002105 qdf_mem_free(pMsg->bodyptr);
2106 break;
2107 case eWNI_SME_GET_PEER_INFO_EXT_IND:
Jeff Johnson01f2c232018-11-21 19:17:44 -08002108 if (mac->sme.pget_peer_info_ext_ind_cb)
2109 mac->sme.pget_peer_info_ext_ind_cb(pMsg->bodyptr,
2110 mac->sme.pget_peer_info_ext_cb_context);
Will Huang558f8082017-05-31 16:22:24 +08002111 qdf_mem_free(pMsg->bodyptr);
2112 break;
Qun Zhangef655622019-02-25 10:48:10 +08002113 case eWNI_SME_FW_STATUS_IND:
2114 status = sme_fw_state_resp(mac);
2115 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002116 case eWNI_SME_CSA_OFFLOAD_EVENT:
2117 if (pMsg->bodyptr) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002118 csr_scan_flush_bss_entry(mac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302119 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002120 }
2121 break;
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07002122 case eWNI_SME_TSF_EVENT:
Jeff Johnson01f2c232018-11-21 19:17:44 -08002123 if (mac->sme.get_tsf_cb) {
2124 mac->sme.get_tsf_cb(mac->sme.get_tsf_cxt,
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07002125 (struct stsf *)pMsg->bodyptr);
2126 }
2127 if (pMsg->bodyptr)
2128 qdf_mem_free(pMsg->bodyptr);
2129 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002130 case eWNI_SME_LINK_STATUS_IND:
2131 {
2132 tAniGetLinkStatus *pLinkStatus =
2133 (tAniGetLinkStatus *) pMsg->bodyptr;
2134 if (pLinkStatus) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002135 if (mac->sme.link_status_callback)
2136 mac->sme.link_status_callback(
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002137 pLinkStatus->linkStatus,
Jeff Johnson01f2c232018-11-21 19:17:44 -08002138 mac->sme.link_status_context);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302139
Jeff Johnson01f2c232018-11-21 19:17:44 -08002140 mac->sme.link_status_callback = NULL;
2141 mac->sme.link_status_context = NULL;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302142 qdf_mem_free(pLinkStatus);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002143 }
2144 break;
2145 }
2146 case eWNI_SME_MSG_GET_TEMPERATURE_IND:
Jeff Johnson3f3ad252019-02-17 20:44:11 -08002147 if (mac->sme.temperature_cb)
2148 mac->sme.temperature_cb(pMsg->bodyval,
2149 mac->sme.temperature_cb_context);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002150 break;
2151 case eWNI_SME_SNR_IND:
2152 {
2153 tAniGetSnrReq *pSnrReq = (tAniGetSnrReq *) pMsg->bodyptr;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302154
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002155 if (pSnrReq) {
2156 if (pSnrReq->snrCallback) {
2157 ((tCsrSnrCallback)
2158 (pSnrReq->snrCallback))
2159 (pSnrReq->snr, pSnrReq->staId,
2160 pSnrReq->pDevContext);
2161 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302162 qdf_mem_free(pSnrReq);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002163 }
2164 break;
2165 }
2166#ifdef FEATURE_WLAN_EXTSCAN
2167 case eWNI_SME_EXTSCAN_FULL_SCAN_RESULT_IND:
Jeff Johnson01f2c232018-11-21 19:17:44 -08002168 if (mac->sme.ext_scan_ind_cb)
2169 mac->sme.ext_scan_ind_cb(mac->hdd_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002170 eSIR_EXTSCAN_FULL_SCAN_RESULT_IND,
2171 pMsg->bodyptr);
2172 else
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002173 sme_err("callback not registered to process: %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002174 pMsg->type);
2175
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302176 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002177 break;
2178 case eWNI_SME_EPNO_NETWORK_FOUND_IND:
Jeff Johnson01f2c232018-11-21 19:17:44 -08002179 if (mac->sme.ext_scan_ind_cb)
2180 mac->sme.ext_scan_ind_cb(mac->hdd_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002181 eSIR_EPNO_NETWORK_FOUND_IND,
2182 pMsg->bodyptr);
2183 else
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002184 sme_err("callback not registered to process: %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002185 pMsg->type);
2186
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302187 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002188 break;
2189#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002190 case eWNI_SME_SET_HW_MODE_RESP:
2191 if (pMsg->bodyptr) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002192 status = sme_process_set_hw_mode_resp(mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002193 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302194 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002195 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002196 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002197 }
2198 break;
2199 case eWNI_SME_HW_MODE_TRANS_IND:
2200 if (pMsg->bodyptr) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002201 status = sme_process_hw_mode_trans_ind(mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002202 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302203 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002204 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002205 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002206 }
2207 break;
2208 case eWNI_SME_NSS_UPDATE_RSP:
2209 if (pMsg->bodyptr) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002210 status = sme_process_nss_update_resp(mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002211 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302212 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002213 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002214 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002215 }
2216 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002217 case eWNI_SME_SET_DUAL_MAC_CFG_RESP:
2218 if (pMsg->bodyptr) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002219 status = sme_process_dual_mac_config_resp(mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002220 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302221 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002222 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002223 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002224 }
gaurank kathpaliaebe3fc82018-05-07 09:39:46 +05302225 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002226 case eWNI_SME_SET_THERMAL_LEVEL_IND:
Jeff Johnson01f2c232018-11-21 19:17:44 -08002227 if (mac->sme.set_thermal_level_cb)
2228 mac->sme.set_thermal_level_cb(mac->hdd_handle,
Jeff Johnson6aaaa992018-06-30 10:43:04 -07002229 pMsg->bodyval);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002230 break;
Abhishek Singh518323d2015-10-19 17:42:01 +05302231 case eWNI_SME_EXT_CHANGE_CHANNEL_IND:
Jeff Johnson01f2c232018-11-21 19:17:44 -08002232 status = sme_extended_change_channel_ind(mac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302233 qdf_mem_free(pMsg->bodyptr);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302234 break;
Archana Ramachandrana20ef812015-11-13 16:12:13 -08002235 case eWNI_SME_SET_ANTENNA_MODE_RESP:
2236 if (pMsg->bodyptr) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002237 status = sme_process_antenna_mode_resp(mac,
Archana Ramachandrana20ef812015-11-13 16:12:13 -08002238 pMsg->bodyptr);
2239 qdf_mem_free(pMsg->bodyptr);
2240 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002241 sme_err("Empty message for: %d", pMsg->type);
Archana Ramachandrana20ef812015-11-13 16:12:13 -08002242 }
2243 break;
Sreelakshmi Konamki58c72432016-11-09 17:06:44 +05302244 case eWNI_SME_LOST_LINK_INFO_IND:
Jeff Johnson01f2c232018-11-21 19:17:44 -08002245 if (mac->sme.lost_link_info_cb)
2246 mac->sme.lost_link_info_cb(mac->hdd_handle,
Sreelakshmi Konamki58c72432016-11-09 17:06:44 +05302247 (struct sir_lost_link_info *)pMsg->bodyptr);
2248 qdf_mem_free(pMsg->bodyptr);
2249 break;
Sreelakshmi Konamki88a2a412017-04-14 15:11:55 +05302250 case eWNI_SME_RSO_CMD_STATUS_IND:
Jeff Johnson01f2c232018-11-21 19:17:44 -08002251 if (mac->sme.rso_cmd_status_cb)
2252 mac->sme.rso_cmd_status_cb(mac->hdd_handle,
Jeff Johnson6aaaa992018-06-30 10:43:04 -07002253 pMsg->bodyptr);
lifeng66831662017-05-19 16:01:35 +08002254 qdf_mem_free(pMsg->bodyptr);
2255 break;
Zhang Qiana6e9c102016-12-22 16:47:24 +08002256 case eWMI_SME_LL_STATS_IND:
Jeff Johnson01f2c232018-11-21 19:17:44 -08002257 if (mac->sme.link_layer_stats_ext_cb)
2258 mac->sme.link_layer_stats_ext_cb(mac->hdd_handle,
Zhang Qiana6e9c102016-12-22 16:47:24 +08002259 pMsg->bodyptr);
Sreelakshmi Konamki88a2a412017-04-14 15:11:55 +05302260 qdf_mem_free(pMsg->bodyptr);
2261 break;
Vidyullatha Kanchanapallybe0ebb32017-03-23 14:36:21 +05302262 case eWNI_SME_BT_ACTIVITY_INFO_IND:
Jeff Johnson01f2c232018-11-21 19:17:44 -08002263 if (mac->sme.bt_activity_info_cb)
2264 mac->sme.bt_activity_info_cb(mac->hdd_handle,
Vidyullatha Kanchanapallybe0ebb32017-03-23 14:36:21 +05302265 pMsg->bodyval);
2266 break;
Abhinav Kumar338e57d2019-02-04 17:30:10 +05302267 case eWNI_SME_HIDDEN_SSID_RESTART_RSP:
2268 if (mac->sme.hidden_ssid_cb)
2269 mac->sme.hidden_ssid_cb(mac->hdd_handle, pMsg->bodyval);
2270 else
2271 sme_err("callback is NULL");
2272 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002273 default:
2274
2275 if ((pMsg->type >= eWNI_SME_MSG_TYPES_BEGIN)
2276 && (pMsg->type <= eWNI_SME_MSG_TYPES_END)) {
2277 /* CSR */
2278 if (pMsg->bodyptr) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002279 status = csr_msg_processor(mac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302280 qdf_mem_free(pMsg->bodyptr);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302281 } else
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002282 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002283 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002284 sme_warn("Unknown message type: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002285 if (pMsg->bodyptr)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302286 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002287 }
2288 } /* switch */
2289release_lock:
Jeff Johnson01f2c232018-11-21 19:17:44 -08002290 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002291 return status;
2292}
2293
Krunal Sonid32c6bc2016-10-18 18:00:21 -07002294QDF_STATUS sme_mc_process_handler(struct scheduler_msg *msg)
2295{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002296 struct mac_context *mac_ctx = cds_get_context(QDF_MODULE_ID_SME);
Krunal Sonid32c6bc2016-10-18 18:00:21 -07002297
2298 if (mac_ctx == NULL) {
2299 QDF_ASSERT(0);
2300 return QDF_STATUS_E_FAILURE;
2301 }
2302
Jeff Johnson5f9ce2d2018-06-09 21:20:45 -07002303 return sme_process_msg(mac_ctx, msg);
Krunal Sonid32c6bc2016-10-18 18:00:21 -07002304}
Krunal Sonid32c6bc2016-10-18 18:00:21 -07002305
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002306/**
2307 * sme_process_nss_update_resp() - Process nss update response
2308 * @mac: Global MAC pointer
2309 * @msg: nss update response
2310 *
2311 * Processes the nss update response and invokes the HDD
2312 * callback to process further
2313 */
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002314static QDF_STATUS sme_process_nss_update_resp(struct mac_context *mac, uint8_t *msg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002315{
2316 tListElem *entry = NULL;
2317 tSmeCmd *command = NULL;
2318 bool found;
Tushnim Bhattacharyyaeab33dd2017-11-15 15:20:02 -08002319 policy_mgr_nss_update_cback callback = NULL;
Abhishek Singhfc740be2018-10-12 11:34:26 +05302320 struct sir_bcn_update_rsp *param;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002321
Abhishek Singhfc740be2018-10-12 11:34:26 +05302322 param = (struct sir_bcn_update_rsp *)msg;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302323 if (!param)
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002324 sme_err("nss update resp param is NULL");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002325 /* Not returning. Need to check if active command list
2326 * needs to be freed
2327 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002328
Abhishek Singhfc740be2018-10-12 11:34:26 +05302329 if (param && param->reason != REASON_NSS_UPDATE) {
2330 sme_err("reason not NSS update");
2331 return QDF_STATUS_E_INVAL;
2332 }
Krunal Sonia8270f52017-02-23 19:51:25 -08002333 entry = csr_nonscan_active_ll_peek_head(mac, LL_ACCESS_LOCK);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002334 if (!entry) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002335 sme_err("No cmd found in active list");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302336 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002337 }
2338
2339 command = GET_BASE_ADDR(entry, tSmeCmd, Link);
2340 if (!command) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002341 sme_err("Base address is NULL");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302342 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002343 }
2344
2345 if (e_sme_command_nss_update != command->command) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002346 sme_err("Command mismatch!");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302347 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002348 }
2349
2350 callback = command->u.nss_update_cmd.nss_update_cb;
2351 if (callback) {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302352 if (!param)
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002353 sme_err("Callback failed since nss update params is NULL");
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302354 else
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002355 callback(command->u.nss_update_cmd.context,
Abhishek Singhfc740be2018-10-12 11:34:26 +05302356 param->status,
2357 param->vdev_id,
Chandrasekaran, Manishekarce2172e2016-02-18 16:12:43 +05302358 command->u.nss_update_cmd.next_action,
Liangwei Dong1ba99482018-10-19 02:57:29 -04002359 command->u.nss_update_cmd.reason,
2360 command->u.nss_update_cmd.original_vdev_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002361 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002362 sme_err("Callback does not exisit");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002363 }
2364
Krunal Soni72dba662017-02-15 20:13:17 -08002365 found = csr_nonscan_active_ll_remove_entry(mac, entry, LL_ACCESS_LOCK);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002366 if (found) {
2367 /* Now put this command back on the avilable command list */
Krunal Soni78618d92017-02-14 21:46:31 -08002368 csr_release_command(mac, command);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002369 }
Krunal Sonia8270f52017-02-23 19:51:25 -08002370
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302371 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002372}
2373
Jeff Johnson62cd6802018-07-20 12:38:25 -07002374QDF_STATUS sme_stop(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002375{
Jeff Johnson62cd6802018-07-20 12:38:25 -07002376 QDF_STATUS status;
2377 QDF_STATUS ret_status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002378 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002379
Jeff Johnson62cd6802018-07-20 12:38:25 -07002380 status = rrm_stop(mac);
2381 if (QDF_IS_STATUS_ERROR(status)) {
2382 ret_status = status;
Sandeep Puligilla66d09c42017-09-06 17:10:27 -07002383 sme_err("rrm_stop failed with status: %d", status);
2384 }
2385
Jeff Johnson62cd6802018-07-20 12:38:25 -07002386 status = csr_stop(mac);
2387 if (QDF_IS_STATUS_ERROR(status)) {
2388 ret_status = status;
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002389 sme_err("csr_stop failed with status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002390 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002391
Jeff Johnson62cd6802018-07-20 12:38:25 -07002392 mac->sme.state = SME_STATE_STOP;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002393
Jeff Johnson62cd6802018-07-20 12:38:25 -07002394 return ret_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002395}
2396
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302397/*
2398 * sme_close() - Release all SME modules and their resources.
2399 * The function release each module in SME, PMC, CSR, etc. . Upon
2400 * return, all modules are at closed state.
2401 *
2402 * No SME APIs can be involved after smeClose except smeOpen.
2403 * smeClose must be called before mac_close.
2404 * This is a synchronous call
2405 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002406 * mac_handle - The handle returned by mac_open
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302407 * Return QDF_STATUS_SUCCESS - SME is successfully close.
2408 *
2409 * Other status means SME is failed to be closed but caller still cannot
2410 * call any other SME functions except smeOpen.
2411 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002412QDF_STATUS sme_close(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002413{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302414 QDF_STATUS status = QDF_STATUS_E_FAILURE;
2415 QDF_STATUS fail_status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002416 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002417
Jeff Johnson01f2c232018-11-21 19:17:44 -08002418 if (!mac)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302419 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002420
Jeff Johnson01f2c232018-11-21 19:17:44 -08002421 status = csr_close(mac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302422 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002423 sme_err("csr_close failed with status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002424 fail_status = status;
2425 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002426#ifndef WLAN_MDM_CODE_REDUCTION_OPT
Jeff Johnson01f2c232018-11-21 19:17:44 -08002427 status = sme_qos_close(mac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302428 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002429 sme_err("Qos close failed with status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002430 fail_status = status;
2431 }
2432#endif
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002433 status = sme_ps_close(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302434 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002435 sme_err("sme_ps_close failed status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002436 fail_status = status;
2437 }
2438
Jeff Johnson01f2c232018-11-21 19:17:44 -08002439 status = rrm_close(mac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302440 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002441 sme_err("RRM close failed with status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002442 fail_status = status;
2443 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002444
Jeff Johnson01f2c232018-11-21 19:17:44 -08002445 free_sme_cmd_list(mac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002446
Jeff Johnson3e7a4932019-02-17 12:11:36 -08002447 status = qdf_mutex_destroy(&mac->sme.sme_global_lock);
2448 if (!QDF_IS_STATUS_SUCCESS(status))
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302449 fail_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002450
Jeff Johnson01f2c232018-11-21 19:17:44 -08002451 mac->sme.state = SME_STATE_STOP;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002452
Jeff Johnson3e7a4932019-02-17 12:11:36 -08002453 return fail_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002454}
2455
2456/**
Abhishek Singhc9941602016-08-09 16:06:22 +05302457 * sme_remove_bssid_from_scan_list() - wrapper to remove the bssid from
2458 * scan list
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08002459 * @mac_handle: Opaque handle to the global MAC context.
Abhishek Singhc9941602016-08-09 16:06:22 +05302460 * @bssid: bssid to be removed
2461 *
2462 * This function remove the given bssid from scan list.
2463 *
2464 * Return: QDF status.
2465 */
Jeff Johnsonc7309062018-11-09 20:59:42 -08002466QDF_STATUS sme_remove_bssid_from_scan_list(mac_handle_t mac_handle,
2467 tSirMacAddr bssid)
Abhishek Singhc9941602016-08-09 16:06:22 +05302468{
2469 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002470 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Abhishek Singhc9941602016-08-09 16:06:22 +05302471
2472 status = sme_acquire_global_lock(&mac_ctx->sme);
2473 if (QDF_IS_STATUS_SUCCESS(status)) {
2474 csr_remove_bssid_from_scan_list(mac_ctx, bssid);
2475 sme_release_global_lock(&mac_ctx->sme);
2476 }
2477
2478 return status;
2479}
2480
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002481
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302482/*
2483 * sme_scan_get_result
2484 * A wrapper function to request scan results from CSR.
2485 * This is a synchronous call
2486 *
2487 * pFilter - If pFilter is NULL, all cached results are returned
2488 * phResult - an object for the result.
2489 * Return QDF_STATUS
2490 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002491QDF_STATUS sme_scan_get_result(mac_handle_t mac_handle, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002492 tCsrScanResultFilter *pFilter,
2493 tScanResultHandle *phResult)
2494{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302495 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002496 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002497
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302498 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002499 TRACE_CODE_SME_RX_HDD_MSG_SCAN_GET_RESULTS, sessionId,
2500 0));
Jeff Johnson01f2c232018-11-21 19:17:44 -08002501 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302502 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002503 status = csr_scan_get_result(mac, pFilter, phResult);
2504 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002505 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002506
2507 return status;
2508}
2509
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002510QDF_STATUS sme_scan_get_result_for_bssid(mac_handle_t mac_handle,
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +05302511 struct qdf_mac_addr *bssid,
2512 tCsrScanResultInfo *res)
2513{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002514 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +05302515 QDF_STATUS status;
2516
2517 status = sme_acquire_global_lock(&mac_ctx->sme);
2518 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson1b56f6b2018-06-10 18:17:10 -07002519 status = csr_scan_get_result_for_bssid(mac_ctx, bssid, res);
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +05302520 sme_release_global_lock(&mac_ctx->sme);
2521 }
2522
2523 return status;
2524}
2525
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002526/**
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07002527 * sme_get_ap_channel_from_scan() - a wrapper function to get
Srinivas Girigowda828ef232017-10-13 22:31:27 -07002528 * AP's channel id from
2529 * CSR by filtering the
2530 * result which matches
2531 * our roam profile.
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07002532 * @profile: SAP profile
2533 * @ap_chnl_id: pointer to channel id of SAP. Fill the value after finding the
2534 * best ap from scan cache.
2535 *
2536 * This function is written to get AP's channel id from CSR by filtering
2537 * the result which matches our roam profile. This is a synchronous call.
2538 *
2539 * Return: QDF_STATUS.
2540 */
2541QDF_STATUS sme_get_ap_channel_from_scan(void *profile,
2542 tScanResultHandle *scan_cache,
2543 uint8_t *ap_chnl_id)
2544{
Jeff Johnson66ee8a92018-03-17 15:24:26 -07002545 return sme_get_ap_channel_from_scan_cache((struct csr_roam_profile *)
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07002546 profile,
2547 scan_cache,
2548 ap_chnl_id);
2549}
2550
2551/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002552 * sme_get_ap_channel_from_scan_cache() - a wrapper function to get AP's
2553 * channel id from CSR by filtering the
2554 * result which matches our roam profile.
2555 * @profile: SAP adapter
2556 * @ap_chnl_id: pointer to channel id of SAP. Fill the value after finding the
2557 * best ap from scan cache.
2558 *
2559 * This function is written to get AP's channel id from CSR by filtering
2560 * the result which matches our roam profile. This is a synchronous call.
2561 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302562 * Return: QDF_STATUS.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002563 */
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07002564QDF_STATUS sme_get_ap_channel_from_scan_cache(
Jeff Johnson66ee8a92018-03-17 15:24:26 -07002565 struct csr_roam_profile *profile, tScanResultHandle *scan_cache,
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07002566 uint8_t *ap_chnl_id)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002567{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302568 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002569 struct mac_context *mac_ctx = sme_get_mac_context();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002570 tCsrScanResultFilter *scan_filter = NULL;
2571 tScanResultHandle filtered_scan_result = NULL;
2572 tSirBssDescription first_ap_profile;
2573
2574 if (NULL == mac_ctx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302575 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002576 FL("mac_ctx is NULL"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302577 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002578 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302579 scan_filter = qdf_mem_malloc(sizeof(tCsrScanResultFilter));
Arif Hussain0ef77082018-10-10 16:42:53 -07002580 if (!scan_filter)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302581 return QDF_STATUS_E_FAILURE;
Arif Hussain0ef77082018-10-10 16:42:53 -07002582
hangtian127c9532019-01-12 13:29:07 +08002583 qdf_mem_zero(&first_ap_profile, sizeof(tSirBssDescription));
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302584 if (NULL == profile) {
2585 scan_filter->EncryptionType.numEntries = 1;
2586 scan_filter->EncryptionType.encryptionType[0]
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002587 = eCSR_ENCRYPT_TYPE_NONE;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302588 } else {
2589 /* Here is the profile we need to connect to */
2590 status = csr_roam_prepare_filter_from_profile(mac_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002591 profile,
2592 scan_filter);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302593 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002594
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302595 if (QDF_STATUS_SUCCESS == status) {
2596 /* Save the WPS info */
2597 if (NULL != profile) {
2598 scan_filter->bWPSAssociation =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002599 profile->bWPSAssociation;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302600 scan_filter->bOSENAssociation =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002601 profile->bOSENAssociation;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002602 } else {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302603 scan_filter->bWPSAssociation = 0;
2604 scan_filter->bOSENAssociation = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002605 }
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302606 } else {
2607 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
2608 FL("Preparing the profile filter failed"));
2609 qdf_mem_free(scan_filter);
2610 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002611 }
2612 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302613 if (QDF_STATUS_SUCCESS == status) {
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07002614 status = csr_scan_get_result(mac_ctx, scan_filter,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002615 &filtered_scan_result);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302616 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002617 csr_get_bssdescr_from_scan_handle(filtered_scan_result,
2618 &first_ap_profile);
2619 *scan_cache = filtered_scan_result;
2620 if (0 != first_ap_profile.channelId) {
2621 *ap_chnl_id = first_ap_profile.channelId;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302622 QDF_TRACE(QDF_MODULE_ID_SME,
Abhishek Singh5d8d7332017-08-10 15:15:24 +05302623 QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002624 FL("Found best AP & its on chnl[%d]"),
2625 first_ap_profile.channelId);
2626 } else {
2627 /*
2628 * This means scan result is empty
2629 * so set the channel to zero, caller should
2630 * take of zero channel id case.
2631 */
2632 *ap_chnl_id = 0;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302633 QDF_TRACE(QDF_MODULE_ID_SME,
2634 QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002635 FL("Scan is empty, set chnl to 0"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302636 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002637 }
2638 } else {
Sandeep Puligilla1f1e4002018-08-18 12:15:01 -07002639 sme_err("Failed to get scan get result");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302640 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002641 }
2642 csr_free_scan_filter(mac_ctx, scan_filter);
2643 sme_release_global_lock(&mac_ctx->sme);
2644 } else {
Krunal Sonif9882222016-01-22 17:16:50 -08002645 csr_free_scan_filter(mac_ctx, scan_filter);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302646 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002647 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302648 qdf_mem_free(scan_filter);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002649 return status;
2650}
2651
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302652/*
2653 * sme_scan_flush_result() -
2654 * A wrapper function to request CSR to clear scan results.
2655 * This is a synchronous call
2656 *
2657 * Return QDF_STATUS
2658 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002659QDF_STATUS sme_scan_flush_result(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002660{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302661 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002662 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002663
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302664 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002665 TRACE_CODE_SME_RX_HDD_MSG_SCAN_FLUSH_RESULTS,
2666 0, 0));
Jeff Johnson01f2c232018-11-21 19:17:44 -08002667 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302668 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002669 status = csr_scan_flush_result(mac);
2670 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002671 }
2672
2673 return status;
2674}
2675
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302676/*
2677 * sme_scan_result_get_first() -
2678 * A wrapper function to request CSR to returns the first element of
2679 * scan result.
2680 * This is a synchronous call
2681 *
2682 * hScanResult - returned from csr_scan_get_result
2683 * Return tCsrScanResultInfo * - NULL if no result
2684 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002685tCsrScanResultInfo *sme_scan_result_get_first(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002686 tScanResultHandle hScanResult)
2687{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302688 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002689 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002690 tCsrScanResultInfo *pRet = NULL;
2691
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302692 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002693 TRACE_CODE_SME_RX_HDD_MSG_SCAN_RESULT_GETFIRST,
2694 NO_SESSION, 0));
Jeff Johnson01f2c232018-11-21 19:17:44 -08002695 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302696 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002697 pRet = csr_scan_result_get_first(mac, hScanResult);
2698 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002699 }
2700
2701 return pRet;
2702}
2703
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302704/*
2705 * sme_scan_result_get_next() -
2706 * A wrapper function to request CSR to returns the next element of
2707 * scan result. It can be called without calling csr_scan_result_get_first first
2708 * This is a synchronous call
2709 *
2710 * hScanResult - returned from csr_scan_get_result
2711 * Return Null if no result or reach the end
2712 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002713tCsrScanResultInfo *sme_scan_result_get_next(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002714 tScanResultHandle hScanResult)
2715{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302716 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002717 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002718 tCsrScanResultInfo *pRet = NULL;
2719
Jeff Johnson01f2c232018-11-21 19:17:44 -08002720 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302721 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002722 pRet = csr_scan_result_get_next(mac, hScanResult);
2723 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002724 }
2725
2726 return pRet;
2727}
2728
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302729/*
2730 * sme_scan_result_purge() -
2731 * A wrapper function to request CSR to remove all items(tCsrScanResult)
2732 * in the list and free memory for each item
2733 * This is a synchronous call
2734 *
2735 * hScanResult - returned from csr_scan_get_result. hScanResult is
2736 * considered gone by
2737 * calling this function and even before this function reutrns.
2738 * Return QDF_STATUS
2739 */
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07002740QDF_STATUS sme_scan_result_purge(tScanResultHandle hScanResult)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002741{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302742 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002743 struct mac_context *mac_ctx = sme_get_mac_context();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002744
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302745 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002746 TRACE_CODE_SME_RX_HDD_MSG_SCAN_RESULT_PURGE,
2747 NO_SESSION, 0));
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07002748 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302749 if (QDF_IS_STATUS_SUCCESS(status)) {
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07002750 status = csr_scan_result_purge(mac_ctx, hScanResult);
2751 sme_release_global_lock(&mac_ctx->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002752 }
2753
2754 return status;
2755}
2756
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002757eCsrPhyMode sme_get_phy_mode(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002758{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002759 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302760
Jeff Johnson01f2c232018-11-21 19:17:44 -08002761 return mac->roam.configParam.phyMode;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002762}
2763
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302764/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302765 * sme_roam_connect() -
2766 * A wrapper function to request CSR to inititiate an association
2767 * This is an asynchronous call.
2768 *
2769 * sessionId - the sessionId returned by sme_open_session.
2770 * pProfile - description of the network to which to connect
2771 * hBssListIn - a list of BSS descriptor to roam to. It is returned
2772 * from csr_scan_get_result
2773 * pRoamId - to get back the request ID
2774 * Return QDF_STATUS
2775 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002776QDF_STATUS sme_roam_connect(mac_handle_t mac_handle, uint8_t sessionId,
Jeff Johnson66ee8a92018-03-17 15:24:26 -07002777 struct csr_roam_profile *pProfile,
2778 uint32_t *pRoamId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002779{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302780 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002781 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002782
Jeff Johnson01f2c232018-11-21 19:17:44 -08002783 if (!mac)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302784 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002785
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302786 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002787 TRACE_CODE_SME_RX_HDD_MSG_CONNECT, sessionId, 0));
Jeff Johnson01f2c232018-11-21 19:17:44 -08002788 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302789 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002790 if (CSR_IS_SESSION_VALID(mac, sessionId)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002791 status =
Jeff Johnson01f2c232018-11-21 19:17:44 -08002792 csr_roam_connect(mac, sessionId, pProfile,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002793 pRoamId);
2794 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002795 sme_err("Invalid sessionID: %d", sessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302796 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002797 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08002798 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002799 }
2800
2801 return status;
2802}
2803
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302804/*
2805 * sme_set_phy_mode() -
2806 * Changes the PhyMode.
2807 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002808 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302809 * phyMode new phyMode which is to set
2810 * Return QDF_STATUS SUCCESS.
2811 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002812QDF_STATUS sme_set_phy_mode(mac_handle_t mac_handle, eCsrPhyMode phyMode)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002813{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002814 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002815
Jeff Johnson01f2c232018-11-21 19:17:44 -08002816 mac->roam.configParam.phyMode = phyMode;
2817 mac->roam.configParam.uCfgDot11Mode =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002818 csr_get_cfg_dot11_mode_from_csr_phy_mode(NULL,
Jeff Johnson01f2c232018-11-21 19:17:44 -08002819 mac->roam.configParam.phyMode,
2820 mac->roam.configParam.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302821 ProprietaryRatesEnabled);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002822
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302823 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002824}
2825
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302826/*
2827 * sme_roam_reassoc() -
2828 * A wrapper function to request CSR to inititiate a re-association
2829 *
2830 * pProfile - can be NULL to join the currently connected AP. In that
2831 * case modProfileFields should carry the modified field(s) which could trigger
2832 * reassoc
2833 * modProfileFields - fields which are part of tCsrRoamConnectedProfile
2834 * that might need modification dynamically once STA is up & running and this
2835 * could trigger a reassoc
2836 * pRoamId - to get back the request ID
2837 * Return QDF_STATUS
2838 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002839QDF_STATUS sme_roam_reassoc(mac_handle_t mac_handle, uint8_t sessionId,
Jeff Johnson66ee8a92018-03-17 15:24:26 -07002840 struct csr_roam_profile *pProfile,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002841 tCsrRoamModifyProfileFields modProfileFields,
2842 uint32_t *pRoamId, bool fForce)
2843{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302844 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002845 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002846
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302847 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002848 TRACE_CODE_SME_RX_HDD_ROAM_REASSOC, sessionId, 0));
Jeff Johnson01f2c232018-11-21 19:17:44 -08002849 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302850 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002851 if (CSR_IS_SESSION_VALID(mac, sessionId)) {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302852 if ((NULL == pProfile) && (fForce == 1))
Jeff Johnson01f2c232018-11-21 19:17:44 -08002853 status = csr_reassoc(mac, sessionId,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302854 &modProfileFields, pRoamId,
2855 fForce);
2856 else
Jeff Johnson01f2c232018-11-21 19:17:44 -08002857 status = csr_roam_reassoc(mac, sessionId,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302858 pProfile,
2859 modProfileFields, pRoamId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002860 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302861 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002862 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08002863 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002864 }
2865
2866 return status;
2867}
2868
Jeff Johnsonc7309062018-11-09 20:59:42 -08002869QDF_STATUS sme_roam_disconnect(mac_handle_t mac_handle, uint8_t session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002870 eCsrRoamDisconnectReason reason)
2871{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302872 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002873 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002874
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302875 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Varun Reddy Yeturu363809c2018-06-27 14:12:52 -07002876 TRACE_CODE_SME_RX_HDD_ROAM_DISCONNECT, session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002877 reason));
Varun Reddy Yeturu363809c2018-06-27 14:12:52 -07002878 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302879 if (QDF_IS_STATUS_SUCCESS(status)) {
Varun Reddy Yeturu363809c2018-06-27 14:12:52 -07002880 if (CSR_IS_SESSION_VALID(mac_ctx, session_id))
2881 status = csr_roam_disconnect(mac_ctx, session_id,
2882 reason);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302883 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302884 status = QDF_STATUS_E_INVAL;
Varun Reddy Yeturu363809c2018-06-27 14:12:52 -07002885 sme_release_global_lock(&mac_ctx->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002886 }
2887
2888 return status;
2889}
2890
Abhishek Singhca408032016-09-13 15:26:12 +05302891/* sme_dhcp_done_ind() - send dhcp done ind
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08002892 * @mac_handle: Opaque handle to the global MAC context
Abhishek Singhca408032016-09-13 15:26:12 +05302893 * @session_id: session id
2894 *
2895 * Return: void.
2896 */
Jeff Johnsonc7309062018-11-09 20:59:42 -08002897void sme_dhcp_done_ind(mac_handle_t mac_handle, uint8_t session_id)
Abhishek Singhca408032016-09-13 15:26:12 +05302898{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002899 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
gaurank kathpalia14e2f912017-08-31 14:51:45 +05302900 struct csr_roam_session *session;
Abhishek Singhca408032016-09-13 15:26:12 +05302901
2902 if (!mac_ctx)
2903 return;
2904
2905 session = CSR_GET_SESSION(mac_ctx, session_id);
2906 if (!session) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002907 sme_err("Session: %d not found", session_id);
Abhishek Singhca408032016-09-13 15:26:12 +05302908 return;
2909 }
2910 session->dhcp_done = true;
2911}
2912
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302913/*
2914 * sme_roam_stop_bss() -
2915 * To stop BSS for Soft AP. This is an asynchronous API.
2916 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002917 * mac_handle - Global structure
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302918 * sessionId - sessionId of SoftAP
2919 * Return QDF_STATUS SUCCESS Roam callback will be called to indicate
2920 * actual results
2921 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002922QDF_STATUS sme_roam_stop_bss(mac_handle_t mac_handle, uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002923{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302924 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002925 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002926
Jeff Johnson01f2c232018-11-21 19:17:44 -08002927 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302928 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002929 if (CSR_IS_SESSION_VALID(mac, sessionId))
2930 status = csr_roam_issue_stop_bss_cmd(mac, sessionId,
Himanshu Agarwal75c8d792017-12-19 18:31:04 +05302931 false);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302932 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302933 status = QDF_STATUS_E_INVAL;
Jeff Johnson01f2c232018-11-21 19:17:44 -08002934 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002935 }
2936
2937 return status;
2938}
2939
Deepthi Gowrib3bfefd2016-09-13 15:14:34 +05302940/**
2941 * sme_roam_disconnect_sta() - disassociate a station
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002942 * @mac_handle: Global structure
Deepthi Gowrib3bfefd2016-09-13 15:14:34 +05302943 * @sessionId: SessionId of SoftAP
2944 * @p_del_sta_params: Pointer to parameters of the station to disassoc
2945 *
2946 * To disassociate a station. This is an asynchronous API.
2947 *
2948 * Return: QDF_STATUS_SUCCESS on success.Roam callback will
2949 * be called to indicate actual result.
2950 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002951QDF_STATUS sme_roam_disconnect_sta(mac_handle_t mac_handle, uint8_t sessionId,
Jeff Johnsone6bf7192017-11-07 15:16:09 -08002952 struct csr_del_sta_params *p_del_sta_params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002953{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302954 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002955 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002956
Jeff Johnson01f2c232018-11-21 19:17:44 -08002957 if (NULL == mac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302958 QDF_ASSERT(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002959 return status;
2960 }
2961
Jeff Johnson01f2c232018-11-21 19:17:44 -08002962 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302963 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002964 if (CSR_IS_SESSION_VALID(mac, sessionId))
2965 status = csr_roam_issue_disassociate_sta_cmd(mac,
Deepthi Gowrib3bfefd2016-09-13 15:14:34 +05302966 sessionId, p_del_sta_params);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302967 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302968 status = QDF_STATUS_E_INVAL;
Jeff Johnson01f2c232018-11-21 19:17:44 -08002969 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002970 }
2971
2972 return status;
2973}
2974
2975/**
2976 * sme_roam_deauth_sta() - deauthenticate a station
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002977 * @mac_handle: Global structure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002978 * @sessionId: SessionId of SoftAP
2979 * @pDelStaParams: Pointer to parameters of the station to deauthenticate
2980 *
2981 * To disassociate a station. This is an asynchronous API.
2982 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302983 * Return: QDF_STATUS_SUCCESS on success or another QDF_STATUS error
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002984 * code on error. Roam callback will be called to indicate actual
2985 * result
2986 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002987QDF_STATUS sme_roam_deauth_sta(mac_handle_t mac_handle, uint8_t sessionId,
Jeff Johnsone6bf7192017-11-07 15:16:09 -08002988 struct csr_del_sta_params *pDelStaParams)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002989{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302990 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002991 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002992
Jeff Johnson01f2c232018-11-21 19:17:44 -08002993 if (NULL == mac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302994 QDF_ASSERT(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002995 return status;
2996 }
2997
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302998 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Sreelakshmi Konamki6744cff2015-09-07 12:10:39 +05302999 TRACE_CODE_SME_RX_HDD_MSG_DEAUTH_STA,
3000 sessionId, pDelStaParams->reason_code));
Jeff Johnson01f2c232018-11-21 19:17:44 -08003001 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303002 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08003003 if (CSR_IS_SESSION_VALID(mac, sessionId))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003004 status =
Jeff Johnson01f2c232018-11-21 19:17:44 -08003005 csr_roam_issue_deauth_sta_cmd(mac, sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003006 pDelStaParams);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303007 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303008 status = QDF_STATUS_E_INVAL;
Jeff Johnson01f2c232018-11-21 19:17:44 -08003009 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003010 }
3011
3012 return status;
3013}
3014
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303015/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303016 * sme_roam_get_connect_profile() -
3017 * A wrapper function to request CSR to return the current connect
3018 * profile. Caller must call csr_roam_free_connect_profile after it is done
3019 * and before reuse for another csr_roam_get_connect_profile call.
3020 * This is a synchronous call.
3021 *
3022 * pProfile - pointer to a caller allocated structure
3023 * tCsrRoamConnectedProfile
3024 * eturn QDF_STATUS. Failure if not connected
3025 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003026QDF_STATUS sme_roam_get_connect_profile(mac_handle_t mac_handle,
3027 uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003028 tCsrRoamConnectedProfile *pProfile)
3029{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303030 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003031 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003032
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303033 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003034 TRACE_CODE_SME_RX_HDD_ROAM_GET_CONNECTPROFILE,
3035 sessionId, 0));
Jeff Johnson01f2c232018-11-21 19:17:44 -08003036 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303037 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08003038 if (CSR_IS_SESSION_VALID(mac, sessionId))
3039 status = csr_roam_get_connect_profile(mac, sessionId,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303040 pProfile);
3041 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303042 status = QDF_STATUS_E_INVAL;
Jeff Johnson01f2c232018-11-21 19:17:44 -08003043 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003044 }
3045
3046 return status;
3047}
3048
Naveen Rawatdf0a7e72016-01-06 18:35:53 -08003049/**
3050 * sme_roam_free_connect_profile - a wrapper function to request CSR to free and
3051 * reinitialize the profile returned previously by csr_roam_get_connect_profile.
3052 *
3053 * @profile - pointer to a caller allocated structure tCsrRoamConnectedProfile
3054 *
3055 * Return: none
3056 */
3057void sme_roam_free_connect_profile(tCsrRoamConnectedProfile *profile)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003058{
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303059 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003060 TRACE_CODE_SME_RX_HDD_ROAM_FREE_CONNECTPROFILE,
3061 NO_SESSION, 0));
Naveen Rawatdf0a7e72016-01-06 18:35:53 -08003062 csr_roam_free_connect_profile(profile);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003063}
3064
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303065/*
3066 * sme_roam_set_pmkid_cache() -
3067 * A wrapper function to request CSR to return the PMKID candidate list
3068 * This is a synchronous call.
3069
3070 * pPMKIDCache - caller allocated buffer point to an array of
3071 * tPmkidCacheInfo
3072 * numItems - a variable that has the number of tPmkidCacheInfo
3073 * allocated when retruning, this is either the number needed
3074 * or number of items put into pPMKIDCache
3075 * update_entire_cache - this bool value specifies if the entire pmkid
3076 * cache should be overwritten or should it be
3077 * updated entry by entry.
3078 * Return QDF_STATUS - when fail, it usually means the buffer allocated is not
3079 * big enough and pNumItems has the number of
3080 * tPmkidCacheInfo.
3081 * \Note: pNumItems is a number of tPmkidCacheInfo,
3082 * not sizeof(tPmkidCacheInfo) * something
3083 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003084QDF_STATUS sme_roam_set_pmkid_cache(mac_handle_t mac_handle, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003085 tPmkidCacheInfo *pPMKIDCache,
3086 uint32_t numItems, bool update_entire_cache)
3087{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303088 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003089 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003090
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303091 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003092 TRACE_CODE_SME_RX_HDD_ROAM_SET_PMKIDCACHE, sessionId,
3093 numItems));
Jeff Johnson01f2c232018-11-21 19:17:44 -08003094 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303095 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08003096 if (CSR_IS_SESSION_VALID(mac, sessionId))
3097 status = csr_roam_set_pmkid_cache(mac, sessionId,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303098 pPMKIDCache,
3099 numItems, update_entire_cache);
3100 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303101 status = QDF_STATUS_E_INVAL;
Jeff Johnson01f2c232018-11-21 19:17:44 -08003102 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003103 }
3104
3105 return status;
3106}
3107
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003108QDF_STATUS sme_roam_del_pmkid_from_cache(mac_handle_t mac_handle,
3109 uint8_t sessionId,
Sridhar Selvarajc3684c72017-08-21 14:32:47 +05303110 tPmkidCacheInfo *pmksa,
3111 bool flush_cache)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003112{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303113 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003114 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Sreelakshmi Konamki6744cff2015-09-07 12:10:39 +05303115
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303116 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Sreelakshmi Konamki6744cff2015-09-07 12:10:39 +05303117 TRACE_CODE_SME_RX_HDD_ROAM_DEL_PMKIDCACHE,
3118 sessionId, flush_cache));
Jeff Johnson01f2c232018-11-21 19:17:44 -08003119 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303120 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08003121 if (CSR_IS_SESSION_VALID(mac, sessionId))
3122 status = csr_roam_del_pmkid_from_cache(mac, sessionId,
Sridhar Selvarajc3684c72017-08-21 14:32:47 +05303123 pmksa, flush_cache);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303124 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303125 status = QDF_STATUS_E_INVAL;
Jeff Johnson01f2c232018-11-21 19:17:44 -08003126 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003127 }
3128 return status;
3129}
3130
Abhinav Kumar7830d9c2018-06-27 17:57:48 +05303131#ifdef WLAN_FEATURE_ROAM_OFFLOAD
Jeff Johnsonc7309062018-11-09 20:59:42 -08003132void sme_get_pmk_info(mac_handle_t mac_handle, uint8_t session_id,
3133 tPmkidCacheInfo *pmk_cache)
gaurank kathpalia99d06c12018-05-16 16:28:35 +05303134{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003135 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
gaurank kathpalia99d06c12018-05-16 16:28:35 +05303136 QDF_STATUS status = sme_acquire_global_lock(&mac_ctx->sme);
3137
3138 if (QDF_IS_STATUS_SUCCESS(status)) {
3139 if (CSR_IS_SESSION_VALID(mac_ctx, session_id))
3140 csr_get_pmk_info(mac_ctx, session_id, pmk_cache);
3141 sme_release_global_lock(&mac_ctx->sme);
3142 }
3143}
Abhinav Kumar7830d9c2018-06-27 17:57:48 +05303144#endif
3145
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003146#ifdef WLAN_FEATURE_ROAM_OFFLOAD
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303147/*
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003148 * \fn sme_roam_set_psk_pmk
3149 * \brief a wrapper function to request CSR to save PSK/PMK
3150 * This is a synchronous call.
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003151 * \param mac_handle - Global structure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003152 * \param sessionId - SME sessionId
3153 * \param pPSK_PMK - pointer to an array of Psk[]/Pmk
3154 * \param pmk_len - Length could be only 16 bytes in case if LEAP
3155 * connections. Need to pass this information to
3156 * firmware.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303157 * \return QDF_STATUS -status whether PSK/PMK is set or not
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003158 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003159QDF_STATUS sme_roam_set_psk_pmk(mac_handle_t mac_handle, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003160 uint8_t *pPSK_PMK, size_t pmk_len)
3161{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303162 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003163 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303164
Jeff Johnson01f2c232018-11-21 19:17:44 -08003165 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303166 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08003167 if (CSR_IS_SESSION_VALID(mac, sessionId))
3168 status = csr_roam_set_psk_pmk(mac, sessionId, pPSK_PMK,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003169 pmk_len);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303170 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303171 status = QDF_STATUS_E_INVAL;
Jeff Johnson01f2c232018-11-21 19:17:44 -08003172 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003173 }
3174 return status;
3175}
3176#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003177
Jeff Johnsonc7309062018-11-09 20:59:42 -08003178QDF_STATUS sme_roam_get_wpa_rsn_req_ie(mac_handle_t mac_handle,
3179 uint8_t session_id,
Jeff Johnson0a078b52018-06-01 16:15:54 -07003180 uint32_t *len, uint8_t *buf)
3181{
3182 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003183 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Jeff Johnson0a078b52018-06-01 16:15:54 -07003184
3185 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303186 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson0a078b52018-06-01 16:15:54 -07003187 if (CSR_IS_SESSION_VALID(mac, session_id))
3188 status = csr_roam_get_wpa_rsn_req_ie(mac, session_id,
3189 len, buf);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303190 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303191 status = QDF_STATUS_E_INVAL;
Jeff Johnson0a078b52018-06-01 16:15:54 -07003192 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003193 }
3194
3195 return status;
3196}
3197
Jeff Johnsonc7309062018-11-09 20:59:42 -08003198QDF_STATUS sme_roam_get_wpa_rsn_rsp_ie(mac_handle_t mac_handle,
3199 uint8_t session_id,
Jeff Johnson0a078b52018-06-01 16:15:54 -07003200 uint32_t *len, uint8_t *buf)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003201{
Jeff Johnson0a078b52018-06-01 16:15:54 -07003202 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003203 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003204
Jeff Johnson0a078b52018-06-01 16:15:54 -07003205 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303206 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson0a078b52018-06-01 16:15:54 -07003207 if (CSR_IS_SESSION_VALID(mac, session_id))
3208 status = csr_roam_get_wpa_rsn_rsp_ie(mac, session_id,
3209 len, buf);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303210 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303211 status = QDF_STATUS_E_INVAL;
Jeff Johnson0a078b52018-06-01 16:15:54 -07003212 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003213 }
3214
3215 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003216}
3217
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303218/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303219 * sme_get_config_param() -
3220 * A wrapper function that HDD calls to get the global settings
3221 * currently maintained by CSR.
3222 * This is a synchronous call.
3223 *
3224 * pParam - caller allocated memory
3225 * Return QDF_STATUS
3226 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003227QDF_STATUS sme_get_config_param(mac_handle_t mac_handle,
3228 tSmeConfigParams *pParam)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003229{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303230 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003231 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003232
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303233 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003234 TRACE_CODE_SME_RX_HDD_GET_CONFIGPARAM, NO_SESSION, 0));
Jeff Johnson01f2c232018-11-21 19:17:44 -08003235 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303236 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08003237 status = csr_get_config_param(mac, &pParam->csrConfig);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303238 if (status != QDF_STATUS_SUCCESS) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07003239 sme_err("csr_get_config_param failed");
Jeff Johnson01f2c232018-11-21 19:17:44 -08003240 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003241 return status;
3242 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303243 qdf_mem_copy(&pParam->rrmConfig,
Jeff Johnson01f2c232018-11-21 19:17:44 -08003244 &mac->rrm.rrmSmeContext.rrmConfig,
3245 sizeof(mac->rrm.rrmSmeContext.rrmConfig));
3246 pParam->snr_monitor_enabled = mac->snr_monitor_enabled;
3247 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003248 }
3249
3250 return status;
3251}
3252
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303253/*
3254 * sme_get_modify_profile_fields() -
3255 * HDD or SME - QOS calls this function to get the current values of
3256 * connected profile fields, changing which can cause reassoc.
3257 * This function must be called after CFG is downloaded and STA is in connected
3258 * state. Also, make sure to call this function to get the current profile
3259 * fields before calling the reassoc. So that pModifyProfileFields will have
3260 * all the latest values plus the one(s) has been updated as part of reassoc
3261 * request.
3262 *
3263 * pModifyProfileFields - pointer to the connected profile fields
3264 * changing which can cause reassoc
3265 * Return QDF_STATUS
3266 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003267QDF_STATUS sme_get_modify_profile_fields(mac_handle_t mac_handle,
3268 uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003269 tCsrRoamModifyProfileFields *
3270 pModifyProfileFields)
3271{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303272 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003273 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003274
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303275 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003276 TRACE_CODE_SME_RX_HDD_GET_MODPROFFIELDS, sessionId,
3277 0));
Jeff Johnson01f2c232018-11-21 19:17:44 -08003278 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303279 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08003280 if (CSR_IS_SESSION_VALID(mac, sessionId))
3281 status = csr_get_modify_profile_fields(mac, sessionId,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303282 pModifyProfileFields);
3283 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303284 status = QDF_STATUS_E_INVAL;
Jeff Johnson01f2c232018-11-21 19:17:44 -08003285 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003286 }
3287
3288 return status;
3289}
3290
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003291#ifdef FEATURE_OEM_DATA_SUPPORT
3292/**
3293 * sme_register_oem_data_rsp_callback() - Register a routine of
3294 * type send_oem_data_rsp_msg
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003295 * @mac_handle: Handle returned by mac_open.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003296 * @callback: Callback to send response
3297 * to oem application.
3298 *
3299 * sme_oem_data_rsp_callback is used to register sme_send_oem_data_rsp_msg
3300 * callback function.
3301 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303302 * Return: QDF_STATUS.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003303 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003304QDF_STATUS sme_register_oem_data_rsp_callback(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003305 sme_send_oem_data_rsp_msg callback)
3306{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303307 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003308 struct mac_context *pmac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003309
Krishna Kumaar Natarajanbbbf2ef2016-08-03 14:06:26 -07003310 pmac->sme.oem_data_rsp_callback = callback;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003311
3312 return status;
3313
3314}
Arun Khandavalli4b55da72016-07-19 19:55:01 +05303315
3316/**
3317 * sme_deregister_oem_data_rsp_callback() - De-register OEM datarsp callback
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003318 * @mac_handle: Handler return by mac_open
Arun Khandavalli4b55da72016-07-19 19:55:01 +05303319 * This function De-registers the OEM data response callback to SME
3320 *
3321 * Return: None
3322 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003323void sme_deregister_oem_data_rsp_callback(mac_handle_t mac_handle)
Arun Khandavalli4b55da72016-07-19 19:55:01 +05303324{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003325 struct mac_context *pmac;
Arun Khandavalli4b55da72016-07-19 19:55:01 +05303326
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003327 if (!mac_handle) {
Arun Khandavalli4b55da72016-07-19 19:55:01 +05303328 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003329 FL("mac_handle is not valid"));
Arun Khandavalli4b55da72016-07-19 19:55:01 +05303330 return;
3331 }
Jeff Johnsona0619e42018-11-28 17:43:00 -08003332 pmac = MAC_CONTEXT(mac_handle);
Arun Khandavalli4b55da72016-07-19 19:55:01 +05303333
Krishna Kumaar Natarajanbbbf2ef2016-08-03 14:06:26 -07003334 pmac->sme.oem_data_rsp_callback = NULL;
Arun Khandavalli4b55da72016-07-19 19:55:01 +05303335}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003336
3337/**
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08003338 * sme_oem_update_capability() - update UMAC's oem related capability.
Jeff Johnsonc7309062018-11-09 20:59:42 -08003339 * @mac_handle: Handle returned by mac_open
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08003340 * @oem_cap: pointer to oem_capability
3341 *
3342 * This function updates OEM capability to UMAC. Currently RTT
3343 * related capabilities are updated. More capabilities can be
3344 * added in future.
3345 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303346 * Return: QDF_STATUS
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08003347 */
Jeff Johnsonc7309062018-11-09 20:59:42 -08003348QDF_STATUS sme_oem_update_capability(mac_handle_t mac_handle,
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08003349 struct sme_oem_capability *cap)
3350{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303351 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003352 struct mac_context *pmac = MAC_CONTEXT(mac_handle);
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08003353 uint8_t *bytes;
3354
3355 bytes = pmac->rrm.rrmSmeContext.rrmConfig.rm_capability;
3356
3357 if (cap->ftm_rr)
3358 bytes[4] |= RM_CAP_FTM_RANGE_REPORT;
3359 if (cap->lci_capability)
3360 bytes[4] |= RM_CAP_CIVIC_LOC_MEASUREMENT;
3361
3362 return status;
3363}
3364
3365/**
3366 * sme_oem_get_capability() - get oem capability
Jeff Johnsonc7309062018-11-09 20:59:42 -08003367 * @mac_handle: Handle returned by mac_open
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08003368 * @oem_cap: pointer to oem_capability
3369 *
3370 * This function is used to get the OEM capability from UMAC.
3371 * Currently RTT related capabilities are received. More
3372 * capabilities can be added in future.
3373 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303374 * Return: QDF_STATUS
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08003375 */
Jeff Johnsonc7309062018-11-09 20:59:42 -08003376QDF_STATUS sme_oem_get_capability(mac_handle_t mac_handle,
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08003377 struct sme_oem_capability *cap)
3378{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303379 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003380 struct mac_context *pmac = MAC_CONTEXT(mac_handle);
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08003381 uint8_t *bytes;
3382
3383 bytes = pmac->rrm.rrmSmeContext.rrmConfig.rm_capability;
3384
3385 cap->ftm_rr = bytes[4] & RM_CAP_FTM_RANGE_REPORT;
3386 cap->lci_capability = bytes[4] & RM_CAP_CIVIC_LOC_MEASUREMENT;
3387
3388 return status;
3389}
Naveen Rawat910726a2017-03-06 11:42:51 -08003390#endif
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08003391
3392/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003393 * sme_roam_set_key() - To set encryption key.
Jeff Johnsonc7309062018-11-09 20:59:42 -08003394 * @mac_handle: mac_handle global context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003395 * @session_id: session id
3396 * @set_key: pointer to a caller allocated object of tCsrSetContextInfo
3397 * @ptr_roam_id: Upon success return, this is the id caller can use to
3398 * identify the request in roamcallback
3399 *
3400 * This function should be called only when connected. This is an asynchronous
3401 * API.
3402 *
3403 * Return: Status of operation
3404 */
Jeff Johnsonc7309062018-11-09 20:59:42 -08003405QDF_STATUS sme_roam_set_key(mac_handle_t mac_handle, uint8_t session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003406 tCsrRoamSetKey *set_key, uint32_t *ptr_roam_id)
3407{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303408 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003409 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003410 uint32_t roam_id;
gaurank kathpalia14e2f912017-08-31 14:51:45 +05303411 struct csr_roam_session *session = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003412 struct ps_global_info *ps_global_info = &mac_ctx->sme.ps_global_info;
3413
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303414 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_RX_HDD_SET_KEY,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003415 session_id, 0));
3416 if (set_key->keyLength > CSR_MAX_KEY_LEN) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07003417 sme_err("Invalid key length: %d", set_key->keyLength);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303418 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003419 }
3420 /*Once Setkey is done, we can go in BMPS */
3421 if (set_key->keyLength)
3422 ps_global_info->remain_in_power_active_till_dhcp = false;
3423
3424 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303425 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003426 return status;
3427
3428 roam_id = GET_NEXT_ROAM_ID(&mac_ctx->roam);
3429 if (ptr_roam_id)
3430 *ptr_roam_id = roam_id;
3431
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07003432 sme_debug("keyLength: %d", set_key->keyLength);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003433
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07003434 sme_debug("Session_id: %d roam_id: %d", session_id, roam_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003435 session = CSR_GET_SESSION(mac_ctx, session_id);
3436 if (!session) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07003437 sme_err("session %d not found", session_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003438 sme_release_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303439 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003440 }
3441 if (CSR_IS_INFRA_AP(&session->connectedProfile)
3442 && set_key->keyDirection == eSIR_TX_DEFAULT) {
3443 if ((eCSR_ENCRYPT_TYPE_WEP40 == set_key->encType)
3444 || (eCSR_ENCRYPT_TYPE_WEP40_STATICKEY ==
3445 set_key->encType)) {
3446 session->pCurRoamProfile->negotiatedUCEncryptionType =
3447 eCSR_ENCRYPT_TYPE_WEP40_STATICKEY;
3448 }
3449 if ((eCSR_ENCRYPT_TYPE_WEP104 == set_key->encType)
3450 || (eCSR_ENCRYPT_TYPE_WEP104_STATICKEY ==
3451 set_key->encType)) {
3452 session->pCurRoamProfile->negotiatedUCEncryptionType =
3453 eCSR_ENCRYPT_TYPE_WEP104_STATICKEY;
3454 }
3455 }
3456 status = csr_roam_set_key(mac_ctx, session_id, set_key, roam_id);
3457 sme_release_global_lock(&mac_ctx->sme);
3458 return status;
3459}
3460
Masti, Narayanraddiab712a72016-08-04 11:59:11 +05303461/**
3462 * sme_roam_set_default_key_index - To set default wep key idx
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08003463 * @mac_handle: Opaque handle to the global MAC context
Masti, Narayanraddiab712a72016-08-04 11:59:11 +05303464 * @session_id: session id
3465 * @default_idx: default wep key index
3466 *
3467 * This function prepares a message and post to WMA to set wep default
3468 * key index
3469 *
3470 * Return: Success:QDF_STATUS_SUCCESS Failure: Error value
3471 */
Jeff Johnsonc7309062018-11-09 20:59:42 -08003472QDF_STATUS sme_roam_set_default_key_index(mac_handle_t mac_handle,
3473 uint8_t session_id,
Masti, Narayanraddiab712a72016-08-04 11:59:11 +05303474 uint8_t default_idx)
3475{
Rajeev Kumar37d478b2017-04-17 16:59:28 -07003476 struct scheduler_msg msg = {0};
Masti, Narayanraddiab712a72016-08-04 11:59:11 +05303477 struct wep_update_default_key_idx *update_key;
3478
3479 update_key = qdf_mem_malloc(sizeof(*update_key));
Arif Hussain0ef77082018-10-10 16:42:53 -07003480 if (!update_key)
Masti, Narayanraddiab712a72016-08-04 11:59:11 +05303481 return QDF_STATUS_E_NOMEM;
Masti, Narayanraddiab712a72016-08-04 11:59:11 +05303482
3483 update_key->session_id = session_id;
3484 update_key->default_idx = default_idx;
3485
3486 msg.type = WMA_UPDATE_WEP_DEFAULT_KEY;
3487 msg.reserved = 0;
3488 msg.bodyptr = (void *)update_key;
3489
3490 if (QDF_STATUS_SUCCESS !=
gaurank kathpalia36b0c582018-08-28 17:45:43 +05303491 scheduler_post_message(QDF_MODULE_ID_SME,
3492 QDF_MODULE_ID_WMA,
3493 QDF_MODULE_ID_WMA, &msg)) {
Masti, Narayanraddiab712a72016-08-04 11:59:11 +05303494 qdf_mem_free(update_key);
3495 return QDF_STATUS_E_FAILURE;
3496 }
3497
3498 return QDF_STATUS_SUCCESS;
3499}
3500
3501
Jeff Johnson8bd23352017-09-26 11:39:24 -07003502/**
3503 * sme_get_rssi() - API to retrieve current RSSI
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08003504 * @mac_handle: Opaque handle to the global MAC context
Jeff Johnson8bd23352017-09-26 11:39:24 -07003505 * @callback: SME sends back the requested stats using the callback
3506 * @staId: The station ID for which the RSSI is requested for
3507 * @bssid: The bssid of the connected session
3508 * @lastRSSI: RSSI value at time of request. In case fw cannot provide
3509 * RSSI, do not hold up but return this value.
3510 * @pContext: user context to be passed back along with the callback
3511 *
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303512 * A wrapper function that client calls to register a callback to get RSSI
3513 *
Jeff Johnson8bd23352017-09-26 11:39:24 -07003514 * Return: QDF_STATUS
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303515 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003516QDF_STATUS sme_get_rssi(mac_handle_t mac_handle,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303517 tCsrRssiCallback callback, uint8_t staId,
3518 struct qdf_mac_addr bssId, int8_t lastRSSI,
Jeff Johnson8bd23352017-09-26 11:39:24 -07003519 void *pContext)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003520{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303521 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003522 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003523
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303524 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003525 TRACE_CODE_SME_RX_HDD_GET_RSSI, NO_SESSION, 0));
Jeff Johnson01f2c232018-11-21 19:17:44 -08003526 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303527 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08003528 status = csr_get_rssi(mac, callback,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003529 staId, bssId, lastRSSI,
Jeff Johnson8bd23352017-09-26 11:39:24 -07003530 pContext);
Jeff Johnson01f2c232018-11-21 19:17:44 -08003531 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003532 }
3533 return status;
3534}
3535
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303536/*
3537 * sme_get_snr() -
3538 * A wrapper function that client calls to register a callback to get SNR
3539 *
3540 * callback - SME sends back the requested stats using the callback
3541 * staId - The station ID for which the stats is requested for
3542 * pContext - user context to be passed back along with the callback
3543 * p_cds_context - cds context
3544 * \return QDF_STATUS
3545 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003546QDF_STATUS sme_get_snr(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003547 tCsrSnrCallback callback,
Anurag Chouhan6d760662016-02-20 16:05:43 +05303548 uint8_t staId, struct qdf_mac_addr bssId, void *pContext)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003549{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303550 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003551 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003552
Jeff Johnson01f2c232018-11-21 19:17:44 -08003553 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303554 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08003555 status = csr_get_snr(mac, callback, staId, bssId, pContext);
3556 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003557 }
3558 return status;
3559}
3560
Naveen Rawatfa2a1002018-05-17 16:06:37 -07003561#ifndef QCA_SUPPORT_CP_STATS
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303562/*
3563 * sme_get_statistics() -
3564 * A wrapper function that client calls to register a callback to get
3565 * different PHY level statistics from CSR.
3566 *
3567 * requesterId - different client requesting for statistics,
3568 * HDD, UMA/GAN etc
3569 * statsMask - The different category/categories of stats requester
3570 * is looking for
3571 * callback - SME sends back the requested stats using the callback
3572 * periodicity - If requester needs periodic update in millisec, 0 means
3573 * it's an one time request
3574 * cache - If requester is happy with cached stats
3575 * staId - The station ID for which the stats is requested for
3576 * pContext - user context to be passed back along with the callback
3577 * sessionId - sme session interface
3578 * Return QDF_STATUS
3579 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003580QDF_STATUS sme_get_statistics(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003581 eCsrStatsRequesterType requesterId,
3582 uint32_t statsMask, tCsrStatsCallback callback,
Naveen Rawatd0ca4412017-06-16 14:19:19 -07003583 uint8_t staId, void *pContext, uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003584{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303585 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003586 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003587
Jeff Johnson01f2c232018-11-21 19:17:44 -08003588 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303589 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08003590 status = csr_get_statistics(mac, requesterId, statsMask,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303591 callback, staId, pContext,
3592 sessionId);
Jeff Johnson01f2c232018-11-21 19:17:44 -08003593 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003594 }
3595
3596 return status;
3597
3598}
Naveen Rawatfa2a1002018-05-17 16:06:37 -07003599#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003600
Jeff Johnsonca7a7162018-07-07 12:56:54 -07003601QDF_STATUS sme_get_link_status(mac_handle_t mac_handle,
3602 csr_link_status_callback callback,
3603 void *context, uint8_t session_id)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003604{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303605 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003606 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Jeff Johnsonca7a7162018-07-07 12:56:54 -07003607 tAniGetLinkStatus *msg;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07003608 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003609
Jeff Johnsonca7a7162018-07-07 12:56:54 -07003610 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303611 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnsonca7a7162018-07-07 12:56:54 -07003612 msg = qdf_mem_malloc(sizeof(*msg));
3613 if (!msg) {
Jeff Johnsonca7a7162018-07-07 12:56:54 -07003614 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303615 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003616 }
3617
Jeff Johnsonca7a7162018-07-07 12:56:54 -07003618 msg->msgType = WMA_LINK_STATUS_GET_REQ;
3619 msg->msgLen = sizeof(*msg);
3620 msg->sessionId = session_id;
3621 mac->sme.link_status_context = context;
3622 mac->sme.link_status_callback = callback;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003623
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08003624 message.type = WMA_LINK_STATUS_GET_REQ;
Jeff Johnsonca7a7162018-07-07 12:56:54 -07003625 message.bodyptr = msg;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08003626 message.reserved = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003627
gaurank kathpalia36b0c582018-08-28 17:45:43 +05303628 status = scheduler_post_message(QDF_MODULE_ID_SME,
3629 QDF_MODULE_ID_WMA,
3630 QDF_MODULE_ID_WMA, &message);
Jeff Johnsonca7a7162018-07-07 12:56:54 -07003631 if (QDF_IS_STATUS_ERROR(status)) {
3632 sme_err("post msg failed, %d", status);
3633 qdf_mem_free(msg);
3634 mac->sme.link_status_context = NULL;
3635 mac->sme.link_status_callback = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003636 }
3637
Jeff Johnsonca7a7162018-07-07 12:56:54 -07003638 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003639 }
3640
3641 return status;
3642}
3643
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303644/*
3645 * sme_get_country_code() -
3646 * To return the current country code. If no country code is applied,
3647 * default country code is used to fill the buffer.
3648 * If 11d supported is turned off, an error is return and the last
3649 * applied/default country code is used.
3650 * This is a synchronous API.
3651 *
3652 * pBuf - pointer to a caller allocated buffer for returned country code.
3653 * pbLen For input, this parameter indicates how big is the buffer.
3654 * Upon return, this parameter has the number of bytes for
3655 * country. If pBuf doesn't have enough space, this function
3656 * returns fail status and this parameter contains the number
3657 * that is needed.
3658 *
3659 * Return QDF_STATUS SUCCESS.
3660 *
3661 * FAILURE or RESOURCES The API finished and failed.
3662 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003663QDF_STATUS sme_get_country_code(mac_handle_t mac_handle, uint8_t *pBuf,
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08003664 uint8_t *pbLen)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003665{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003666 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003667
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303668 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003669 TRACE_CODE_SME_RX_HDD_GET_CNTRYCODE, NO_SESSION, 0));
3670
Jeff Johnson01f2c232018-11-21 19:17:44 -08003671 return csr_get_country_code(mac, pBuf, pbLen);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003672}
3673
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303674/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303675 * sme_generic_change_country_code() -
3676 * Change Country code from upperlayer during WLAN driver operation.
3677 * This is a synchronous API.
3678 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003679 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303680 * pCountry New Country Code String
3681 * reg_domain regulatory domain
3682 * Return QDF_STATUS SUCCESS.
3683 * FAILURE or RESOURCES The API finished and failed.
3684 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003685QDF_STATUS sme_generic_change_country_code(mac_handle_t mac_handle,
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07003686 uint8_t *pCountry)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003687{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303688 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003689 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07003690 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003691 tAniGenericChangeCountryCodeReq *pMsg;
3692
Jeff Johnson01f2c232018-11-21 19:17:44 -08003693 if (NULL == mac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303694 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_FATAL,
Jeff Johnson01f2c232018-11-21 19:17:44 -08003695 "%s: mac is null", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003696 return status;
3697 }
3698
Jeff Johnson01f2c232018-11-21 19:17:44 -08003699 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303700 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303701 pMsg = qdf_mem_malloc(sizeof(tAniGenericChangeCountryCodeReq));
Arif Hussain0ef77082018-10-10 16:42:53 -07003702 if (!pMsg) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08003703 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303704 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003705 }
3706
3707 pMsg->msgType = eWNI_SME_GENERIC_CHANGE_COUNTRY_CODE;
3708 pMsg->msgLen =
3709 (uint16_t) sizeof(tAniGenericChangeCountryCodeReq);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303710 qdf_mem_copy(pMsg->countryCode, pCountry, 2);
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07003711 pMsg->countryCode[2] = ' ';
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003712
3713 msg.type = eWNI_SME_GENERIC_CHANGE_COUNTRY_CODE;
3714 msg.bodyptr = pMsg;
3715 msg.reserved = 0;
3716
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303717 if (QDF_STATUS_SUCCESS !=
gaurank kathpalia36b0c582018-08-28 17:45:43 +05303718 scheduler_post_message(QDF_MODULE_ID_SME,
3719 QDF_MODULE_ID_SME,
3720 QDF_MODULE_ID_SME, &msg)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303721 qdf_mem_free(pMsg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303722 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003723 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08003724 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003725 }
3726
3727 return status;
3728}
3729
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303730/*
3731 * sme_dhcp_start_ind() -
3732 * API to signal the FW about the DHCP Start event.
3733 *
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08003734 * mac_handle: Opaque handle to the global MAC context.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303735 * device_mode - mode(AP,SAP etc) of the device.
3736 * macAddr - MAC address of the adapter.
3737 * sessionId - session ID.
3738 * Return QDF_STATUS SUCCESS.
3739 * FAILURE or RESOURCES The API finished and failed.
3740 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003741QDF_STATUS sme_dhcp_start_ind(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003742 uint8_t device_mode,
3743 uint8_t *macAddr, uint8_t sessionId)
3744{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303745 QDF_STATUS status;
3746 QDF_STATUS qdf_status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003747 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07003748 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003749 tAniDHCPInd *pMsg;
gaurank kathpalia14e2f912017-08-31 14:51:45 +05303750 struct csr_roam_session *pSession;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003751
Jeff Johnson01f2c232018-11-21 19:17:44 -08003752 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303753 if (QDF_STATUS_SUCCESS == status) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08003754 pSession = CSR_GET_SESSION(mac, sessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003755
3756 if (!pSession) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07003757 sme_err("Session: %d not found", sessionId);
Jeff Johnson01f2c232018-11-21 19:17:44 -08003758 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303759 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003760 }
Arif Hussain3316f402016-11-10 13:08:03 -08003761 pSession->dhcp_done = false;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003762
Arif Hussain0ef77082018-10-10 16:42:53 -07003763 pMsg = qdf_mem_malloc(sizeof(tAniDHCPInd));
3764 if (!pMsg) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08003765 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303766 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003767 }
3768 pMsg->msgType = WMA_DHCP_START_IND;
3769 pMsg->msgLen = (uint16_t) sizeof(tAniDHCPInd);
3770 pMsg->device_mode = device_mode;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303771 qdf_mem_copy(pMsg->adapterMacAddr.bytes, macAddr,
Anurag Chouhan6d760662016-02-20 16:05:43 +05303772 QDF_MAC_ADDR_SIZE);
Anurag Chouhanc5548422016-02-24 18:33:27 +05303773 qdf_copy_macaddr(&pMsg->peerMacAddr,
Srinivas Girigowda296105a2015-09-24 16:31:16 -07003774 &pSession->connectedProfile.bssid);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003775
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08003776 message.type = WMA_DHCP_START_IND;
3777 message.bodyptr = pMsg;
3778 message.reserved = 0;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05303779 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08003780 sessionId, message.type));
gaurank kathpalia36b0c582018-08-28 17:45:43 +05303781 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
3782 QDF_MODULE_ID_WMA,
3783 QDF_MODULE_ID_WMA,
3784 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303785 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303786 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003787 "%s: Post DHCP Start MSG fail", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303788 qdf_mem_free(pMsg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303789 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003790 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08003791 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003792 }
3793 return status;
3794}
3795
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303796/*
3797 * sme_dhcp_stop_ind() -
3798 * API to signal the FW about the DHCP complete event.
3799 *
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08003800 * mac_handle: Opaque handle to the global MAC context.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303801 * device_mode - mode(AP, SAP etc) of the device.
3802 * macAddr - MAC address of the adapter.
3803 * sessionId - session ID.
3804 * Return QDF_STATUS SUCCESS.
3805 * FAILURE or RESOURCES The API finished and failed.
3806 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003807QDF_STATUS sme_dhcp_stop_ind(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003808 uint8_t device_mode,
3809 uint8_t *macAddr, uint8_t sessionId)
3810{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303811 QDF_STATUS status;
3812 QDF_STATUS qdf_status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003813 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07003814 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003815 tAniDHCPInd *pMsg;
gaurank kathpalia14e2f912017-08-31 14:51:45 +05303816 struct csr_roam_session *pSession;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003817
Jeff Johnson01f2c232018-11-21 19:17:44 -08003818 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303819 if (QDF_STATUS_SUCCESS == status) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08003820 pSession = CSR_GET_SESSION(mac, sessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003821
3822 if (!pSession) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07003823 sme_err("Session: %d not found", sessionId);
Jeff Johnson01f2c232018-11-21 19:17:44 -08003824 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303825 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003826 }
Arif Hussain3316f402016-11-10 13:08:03 -08003827 pSession->dhcp_done = true;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003828
Arif Hussain0ef77082018-10-10 16:42:53 -07003829 pMsg = qdf_mem_malloc(sizeof(tAniDHCPInd));
3830 if (!pMsg) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08003831 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303832 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003833 }
3834
3835 pMsg->msgType = WMA_DHCP_STOP_IND;
3836 pMsg->msgLen = (uint16_t) sizeof(tAniDHCPInd);
3837 pMsg->device_mode = device_mode;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303838 qdf_mem_copy(pMsg->adapterMacAddr.bytes, macAddr,
Anurag Chouhan6d760662016-02-20 16:05:43 +05303839 QDF_MAC_ADDR_SIZE);
Anurag Chouhanc5548422016-02-24 18:33:27 +05303840 qdf_copy_macaddr(&pMsg->peerMacAddr,
Srinivas Girigowda296105a2015-09-24 16:31:16 -07003841 &pSession->connectedProfile.bssid);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003842
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08003843 message.type = WMA_DHCP_STOP_IND;
3844 message.bodyptr = pMsg;
3845 message.reserved = 0;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05303846 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08003847 sessionId, message.type));
gaurank kathpalia36b0c582018-08-28 17:45:43 +05303848 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
3849 QDF_MODULE_ID_WMA,
3850 QDF_MODULE_ID_WMA,
3851 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303852 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303853 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003854 "%s: Post DHCP Stop MSG fail", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303855 qdf_mem_free(pMsg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303856 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003857 }
3858
Jeff Johnson01f2c232018-11-21 19:17:44 -08003859 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003860 }
3861 return status;
3862}
3863
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303864/*
3865 * sme_TXFailMonitorStopInd() -
3866 * API to signal the FW to start monitoring TX failures
3867 *
3868 * Return QDF_STATUS SUCCESS.
3869 * FAILURE or RESOURCES The API finished and failed.
3870 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003871QDF_STATUS sme_tx_fail_monitor_start_stop_ind(mac_handle_t mac_handle,
3872 uint8_t tx_fail_count,
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003873 void *txFailIndCallback)
3874{
3875 QDF_STATUS status;
3876 QDF_STATUS qdf_status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003877 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07003878 struct scheduler_msg message = {0};
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003879 tAniTXFailMonitorInd *pMsg;
3880
Jeff Johnson01f2c232018-11-21 19:17:44 -08003881 status = sme_acquire_global_lock(&mac->sme);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003882 if (QDF_STATUS_SUCCESS == status) {
Arif Hussain0ef77082018-10-10 16:42:53 -07003883 pMsg = qdf_mem_malloc(sizeof(tAniTXFailMonitorInd));
3884 if (!pMsg) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08003885 sme_release_global_lock(&mac->sme);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003886 return QDF_STATUS_E_NOMEM;
3887 }
3888
3889 pMsg->msgType = WMA_TX_FAIL_MONITOR_IND;
3890 pMsg->msgLen = (uint16_t) sizeof(tAniTXFailMonitorInd);
3891
3892 /* tx_fail_count = 0 should disable the Monitoring in FW */
3893 pMsg->tx_fail_count = tx_fail_count;
3894 pMsg->txFailIndCallback = txFailIndCallback;
3895
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08003896 message.type = WMA_TX_FAIL_MONITOR_IND;
3897 message.bodyptr = pMsg;
3898 message.reserved = 0;
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003899
gaurank kathpalia36b0c582018-08-28 17:45:43 +05303900 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
3901 QDF_MODULE_ID_WMA,
3902 QDF_MODULE_ID_WMA,
3903 &message);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003904 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
3905 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
3906 "%s: Post TX Fail monitor Start MSG fail",
3907 __func__);
3908 qdf_mem_free(pMsg);
3909 status = QDF_STATUS_E_FAILURE;
3910 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08003911 sme_release_global_lock(&mac->sme);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003912 }
3913 return status;
3914}
3915
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303916/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303917 * sme_neighbor_report_request() -
3918 * API to request neighbor report.
3919 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003920 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303921 * pRrmNeighborReq - Pointer to a caller allocated object of type
3922 * tRrmNeighborReq. Caller owns the memory and is
3923 * responsible for freeing it.
3924 * Return QDF_STATUS
3925 * QDF_STATUS_E_FAILURE - failure
3926 * QDF_STATUS_SUCCESS success
3927 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003928QDF_STATUS sme_neighbor_report_request(
3929 mac_handle_t mac_handle,
3930 uint8_t sessionId,
3931 tpRrmNeighborReq pRrmNeighborReq,
3932 tpRrmNeighborRspCallbackInfo callbackInfo)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003933{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303934 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003935 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303936
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303937 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003938 TRACE_CODE_SME_RX_HDD_NEIGHBOR_REPORTREQ, NO_SESSION,
3939 0));
3940
Vignesh Viswanathan694e28e2018-01-18 20:53:57 +05303941 if (pRrmNeighborReq->neighbor_report_offload) {
3942 status = csr_invoke_neighbor_report_request(sessionId,
3943 pRrmNeighborReq,
3944 false);
3945 return status;
3946 }
3947
Jeff Johnson01f2c232018-11-21 19:17:44 -08003948 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&mac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003949 status =
Jeff Johnson01f2c232018-11-21 19:17:44 -08003950 sme_rrm_neighbor_report_request(mac, sessionId,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303951 pRrmNeighborReq, callbackInfo);
Jeff Johnson01f2c232018-11-21 19:17:44 -08003952 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003953 }
3954
3955 return status;
3956}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003957
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003958#ifdef FEATURE_OEM_DATA_SUPPORT
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07003959/**
3960 * sme_oem_data_req() - send oem data request to WMA
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08003961 * @mac_handle: Opaque handle to the global MAC context
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07003962 * @hdd_oem_req: OEM data request from HDD
3963 *
3964 * Return: QDF_STATUS
3965 */
Jeff Johnsonc7309062018-11-09 20:59:42 -08003966QDF_STATUS sme_oem_data_req(mac_handle_t mac_handle,
3967 struct oem_data_req *hdd_oem_req)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003968{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303969 QDF_STATUS status = QDF_STATUS_SUCCESS;
Krishna Kumaar Natarajanc1fa17d2016-08-03 14:19:20 -07003970 struct oem_data_req *oem_data_req;
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07003971 void *wma_handle;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003972
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07003973 SME_ENTER();
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07003974 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
3975 if (!wma_handle) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07003976 sme_err("wma_handle is NULL");
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07003977 return QDF_STATUS_E_FAILURE;
3978 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003979
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07003980 oem_data_req = qdf_mem_malloc(sizeof(*oem_data_req));
Arif Hussain0ef77082018-10-10 16:42:53 -07003981 if (!oem_data_req)
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07003982 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003983
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07003984 oem_data_req->data_len = hdd_oem_req->data_len;
3985 oem_data_req->data = qdf_mem_malloc(oem_data_req->data_len);
Arif Hussain0ef77082018-10-10 16:42:53 -07003986 if (!oem_data_req->data)
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07003987 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003988
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07003989 qdf_mem_copy(oem_data_req->data, hdd_oem_req->data,
3990 oem_data_req->data_len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003991
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07003992 status = wma_start_oem_data_req(wma_handle, oem_data_req);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003993
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303994 if (!QDF_IS_STATUS_SUCCESS(status))
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07003995 sme_err("Post oem data request msg fail");
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303996 else
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07003997 sme_debug("OEM request(length: %d) sent to WMA",
3998 oem_data_req->data_len);
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07003999
4000 if (oem_data_req->data_len)
4001 qdf_mem_free(oem_data_req->data);
4002 qdf_mem_free(oem_data_req);
4003
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07004004 SME_EXIT();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004005 return status;
4006}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004007#endif /*FEATURE_OEM_DATA_SUPPORT */
4008
gaurank kathpalia78af1932018-10-27 20:33:10 +05304009#define STA_NSS_CHAINS_SHIFT 0
4010#define SAP_NSS_CHAINS_SHIFT 3
4011#define P2P_GO_NSS_CHAINS_SHIFT 6
4012#define P2P_CLI_CHAINS_SHIFT 9
gaurank kathpalia651abcd2018-11-12 22:41:23 +05304013#define TDLS_NSS_CHAINS_SHIFT 12
gaurank kathpalia78af1932018-10-27 20:33:10 +05304014#define IBSS_NSS_CHAINS_SHIFT 15
4015#define P2P_DEV_NSS_CHAINS_SHIFT 18
4016#define OCB_NSS_CHAINS_SHIFT 21
4017#define NAN_NSS_CHAIN_SHIFT 24
4018#define NSS_CHAIN_MASK 0x7
4019#define GET_VDEV_NSS_CHAIN(x, y) (((x) >> (y)) & NSS_CHAIN_MASK)
4020
4021static uint8_t sme_get_nss_chain_shift(enum QDF_OPMODE device_mode)
4022{
4023 switch (device_mode) {
4024 case QDF_STA_MODE:
4025 return STA_NSS_CHAINS_SHIFT;
4026 case QDF_SAP_MODE:
4027 return SAP_NSS_CHAINS_SHIFT;
4028 case QDF_P2P_GO_MODE:
4029 return P2P_GO_NSS_CHAINS_SHIFT;
4030 case QDF_P2P_CLIENT_MODE:
4031 return P2P_CLI_CHAINS_SHIFT;
4032 case QDF_IBSS_MODE:
4033 return IBSS_NSS_CHAINS_SHIFT;
4034 case QDF_P2P_DEVICE_MODE:
4035 return P2P_DEV_NSS_CHAINS_SHIFT;
4036 case QDF_OCB_MODE:
4037 return OCB_NSS_CHAINS_SHIFT;
gaurank kathpalia651abcd2018-11-12 22:41:23 +05304038 case QDF_TDLS_MODE:
4039 return TDLS_NSS_CHAINS_SHIFT;
gaurank kathpalia78af1932018-10-27 20:33:10 +05304040
4041 default:
4042 sme_err("Device mode %d invalid", device_mode);
4043 return STA_NSS_CHAINS_SHIFT;
4044 }
4045}
4046
4047static void
gaurank kathpaliacbf12122018-11-18 14:52:11 +05304048sme_check_nss_chain_ini_param(struct wlan_mlme_nss_chains *vdev_ini_cfg,
4049 uint8_t rf_chains_supported,
4050 enum nss_chains_band_info band)
4051{
4052 vdev_ini_cfg->rx_nss[band] = QDF_MIN(vdev_ini_cfg->rx_nss[band],
4053 rf_chains_supported);
4054 vdev_ini_cfg->tx_nss[band] = QDF_MIN(vdev_ini_cfg->tx_nss[band],
4055 rf_chains_supported);
4056}
4057
4058static void
gaurank kathpalia24ed0f42018-11-13 15:37:49 +05304059sme_fill_nss_chain_params(struct mac_context *mac_ctx,
gaurank kathpalia78af1932018-10-27 20:33:10 +05304060 struct wlan_mlme_nss_chains *vdev_ini_cfg,
4061 enum QDF_OPMODE device_mode,
4062 enum nss_chains_band_info band,
4063 uint8_t rf_chains_supported)
4064{
4065 uint8_t nss_chain_shift;
4066 uint8_t max_supported_nss;
4067 struct wlan_mlme_nss_chains *nss_chains_ini_cfg =
4068 &mac_ctx->mlme_cfg->nss_chains_ini_cfg;
4069
4070 nss_chain_shift = sme_get_nss_chain_shift(device_mode);
4071 max_supported_nss = mac_ctx->mlme_cfg->vht_caps.vht_cap_info.enable2x2 ?
4072 MAX_VDEV_NSS : 1;
4073
Nachiket Kukaded4d40bc2019-01-21 17:54:12 +05304074 /*
4075 * If target supports Antenna sharing, set NSS to 1 for 2.4GHz band for
4076 * NDI vdev.
4077 */
4078 if (device_mode == QDF_NDI_MODE && mac_ctx->lteCoexAntShare &&
4079 band == NSS_CHAINS_BAND_2GHZ)
4080 max_supported_nss = NSS_1x1_MODE;
4081
gaurank kathpalia78af1932018-10-27 20:33:10 +05304082 /* If the fw doesn't support two chains, num rf chains can max be 1 */
4083 vdev_ini_cfg->num_rx_chains[band] =
4084 QDF_MIN(GET_VDEV_NSS_CHAIN(
4085 nss_chains_ini_cfg->num_rx_chains[band],
4086 nss_chain_shift), rf_chains_supported);
4087
4088 vdev_ini_cfg->num_tx_chains[band] =
4089 QDF_MIN(GET_VDEV_NSS_CHAIN(
4090 nss_chains_ini_cfg->num_tx_chains[band],
4091 nss_chain_shift), rf_chains_supported);
4092
4093 /* If 2x2 mode is disabled, then max rx, tx nss can be 1 */
4094 vdev_ini_cfg->rx_nss[band] =
4095 QDF_MIN(GET_VDEV_NSS_CHAIN(
4096 nss_chains_ini_cfg->rx_nss[band],
4097 nss_chain_shift), max_supported_nss);
4098
4099 vdev_ini_cfg->tx_nss[band] =
4100 QDF_MIN(GET_VDEV_NSS_CHAIN(
4101 nss_chains_ini_cfg->tx_nss[band],
4102 nss_chain_shift), max_supported_nss);
4103
4104 vdev_ini_cfg->num_tx_chains_11a =
4105 QDF_MIN(GET_VDEV_NSS_CHAIN(
4106 nss_chains_ini_cfg->num_tx_chains_11a,
4107 nss_chain_shift), rf_chains_supported);
4108
4109 /* If the fw doesn't support two chains, num rf chains can max be 1 */
4110 vdev_ini_cfg->num_tx_chains_11b =
4111 QDF_MIN(GET_VDEV_NSS_CHAIN(
4112 nss_chains_ini_cfg->num_tx_chains_11b,
4113 nss_chain_shift), rf_chains_supported);
4114
4115 vdev_ini_cfg->num_tx_chains_11g =
4116 QDF_MIN(GET_VDEV_NSS_CHAIN(
4117 nss_chains_ini_cfg->num_tx_chains_11g,
4118 nss_chain_shift), rf_chains_supported);
4119
4120 vdev_ini_cfg->disable_rx_mrc[band] =
4121 nss_chains_ini_cfg->disable_rx_mrc[band];
4122
4123 vdev_ini_cfg->disable_tx_mrc[band] =
4124 nss_chains_ini_cfg->disable_tx_mrc[band];
gaurank kathpaliacbf12122018-11-18 14:52:11 +05304125 /*
4126 * Check whether the rx/tx nss is greater than the number of rf chains
4127 * supported by FW, if so downgrade the nss to the number of chains
4128 * supported, as higher nss cannot be supported with less chains.
4129 */
4130 sme_check_nss_chain_ini_param(vdev_ini_cfg, rf_chains_supported,
4131 band);
4132
gaurank kathpalia78af1932018-10-27 20:33:10 +05304133}
4134
4135void sme_populate_nss_chain_params(mac_handle_t mac_handle,
4136 struct wlan_mlme_nss_chains *vdev_ini_cfg,
4137 enum QDF_OPMODE device_mode,
4138 uint8_t rf_chains_supported)
4139{
gaurank kathpalia24ed0f42018-11-13 15:37:49 +05304140 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
gaurank kathpalia78af1932018-10-27 20:33:10 +05304141 enum nss_chains_band_info band;
4142
gaurank kathpaliab414bce2018-11-09 18:44:46 +05304143 for (band = NSS_CHAINS_BAND_2GHZ; band < NSS_CHAINS_BAND_MAX; band++)
gaurank kathpalia78af1932018-10-27 20:33:10 +05304144 sme_fill_nss_chain_params(mac_ctx, vdev_ini_cfg,
4145 device_mode, band,
4146 rf_chains_supported);
4147}
4148
gaurank kathpaliab414bce2018-11-09 18:44:46 +05304149void
4150sme_store_nss_chains_cfg_in_vdev(struct wlan_objmgr_vdev *vdev,
4151 struct wlan_mlme_nss_chains *vdev_ini_cfg)
4152{
4153 struct wlan_mlme_nss_chains *ini_cfg;
4154 struct wlan_mlme_nss_chains *dynamic_cfg;
4155
4156 ini_cfg = mlme_get_ini_vdev_config(vdev);
4157 dynamic_cfg = mlme_get_dynamic_vdev_config(vdev);
4158
4159 if (!ini_cfg || !dynamic_cfg) {
4160 sme_err("Nss chains ini/dynamic config NULL vdev_id %d",
4161 vdev->vdev_objmgr.vdev_id);
4162 return;
4163 }
4164
4165 *ini_cfg = *vdev_ini_cfg;
4166 *dynamic_cfg = *vdev_ini_cfg;
4167}
4168
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304169static void
4170sme_populate_user_config(struct wlan_mlme_nss_chains *dynamic_cfg,
4171 struct wlan_mlme_nss_chains *user_cfg,
4172 enum nss_chains_band_info band)
4173{
4174 if (!user_cfg->num_rx_chains[band])
4175 user_cfg->num_rx_chains[band] =
4176 dynamic_cfg->num_rx_chains[band];
4177
4178 if (!user_cfg->num_tx_chains[band])
4179 user_cfg->num_tx_chains[band] =
4180 dynamic_cfg->num_tx_chains[band];
4181
4182 if (!user_cfg->rx_nss[band])
4183 user_cfg->rx_nss[band] =
4184 dynamic_cfg->rx_nss[band];
4185
4186 if (!user_cfg->tx_nss[band])
4187 user_cfg->tx_nss[band] =
4188 dynamic_cfg->tx_nss[band];
4189
4190 if (!user_cfg->num_tx_chains_11a)
4191 user_cfg->num_tx_chains_11a =
4192 dynamic_cfg->num_tx_chains_11a;
4193
4194 if (!user_cfg->num_tx_chains_11b)
4195 user_cfg->num_tx_chains_11b =
4196 dynamic_cfg->num_tx_chains_11b;
4197
4198 if (!user_cfg->num_tx_chains_11g)
4199 user_cfg->num_tx_chains_11g =
4200 dynamic_cfg->num_tx_chains_11g;
4201
4202 if (!user_cfg->disable_rx_mrc[band])
4203 user_cfg->disable_rx_mrc[band] =
4204 dynamic_cfg->disable_rx_mrc[band];
4205
4206 if (!user_cfg->disable_tx_mrc[band])
4207 user_cfg->disable_tx_mrc[band] =
4208 dynamic_cfg->disable_tx_mrc[band];
4209}
4210
4211static QDF_STATUS
4212sme_validate_from_ini_config(struct wlan_mlme_nss_chains *user_cfg,
4213 struct wlan_mlme_nss_chains *ini_cfg,
4214 enum nss_chains_band_info band)
4215{
4216 if (user_cfg->num_rx_chains[band] >
4217 ini_cfg->num_rx_chains[band])
4218 return QDF_STATUS_E_FAILURE;
4219
4220 if (user_cfg->num_tx_chains[band] >
4221 ini_cfg->num_tx_chains[band])
4222 return QDF_STATUS_E_FAILURE;
4223
4224 if (user_cfg->rx_nss[band] >
4225 ini_cfg->rx_nss[band])
4226 return QDF_STATUS_E_FAILURE;
4227
4228 if (user_cfg->tx_nss[band] >
4229 ini_cfg->tx_nss[band])
4230 return QDF_STATUS_E_FAILURE;
4231
4232 if (user_cfg->num_tx_chains_11a >
4233 ini_cfg->num_tx_chains_11a)
4234 return QDF_STATUS_E_FAILURE;
4235
4236 if (user_cfg->num_tx_chains_11b >
4237 ini_cfg->num_tx_chains_11b)
4238 return QDF_STATUS_E_FAILURE;
4239
4240 if (user_cfg->num_tx_chains_11g >
4241 ini_cfg->num_tx_chains_11g)
4242 return QDF_STATUS_E_FAILURE;
4243
4244 return QDF_STATUS_SUCCESS;
4245}
4246
4247static QDF_STATUS
4248sme_validate_user_nss_chain_params(
4249 struct wlan_mlme_nss_chains *user_cfg,
4250 enum nss_chains_band_info band)
4251{
4252 /* Reject as 2x1 modes are not supported in chains yet */
4253
4254 if (user_cfg->num_tx_chains[band] >
4255 user_cfg->num_rx_chains[band])
4256 return QDF_STATUS_E_FAILURE;
4257
4258 /* Also if mode is 2x2, we cant have chains as 1x1, or 1x2, or 2x1 */
4259
4260 if (user_cfg->tx_nss[band] >
4261 user_cfg->num_tx_chains[band])
4262 user_cfg->num_tx_chains[band] =
4263 user_cfg->tx_nss[band];
4264
4265 if (user_cfg->rx_nss[band] >
4266 user_cfg->num_rx_chains[band])
4267 user_cfg->num_rx_chains[band] =
4268 user_cfg->rx_nss[band];
4269
4270 /*
4271 * It may happen that already chains are in 1x1 mode and nss too
4272 * is in 1x1 mode, but the tx 11a/b/g chains in user config comes
4273 * as 2x1, or 1x2 which cannot support respective mode, as tx chains
4274 * for respective band have max of 1x1 only, so these cannot exceed
4275 * respective band num tx chains.
4276 */
4277
4278 if (user_cfg->num_tx_chains_11a >
gaurank kathpaliab414bce2018-11-09 18:44:46 +05304279 user_cfg->num_tx_chains[NSS_CHAINS_BAND_5GHZ])
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304280 user_cfg->num_tx_chains_11a =
gaurank kathpaliab414bce2018-11-09 18:44:46 +05304281 user_cfg->num_tx_chains[NSS_CHAINS_BAND_5GHZ];
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304282
4283 if (user_cfg->num_tx_chains_11b >
gaurank kathpaliab414bce2018-11-09 18:44:46 +05304284 user_cfg->num_tx_chains[NSS_CHAINS_BAND_2GHZ])
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304285 user_cfg->num_tx_chains_11b =
gaurank kathpaliab414bce2018-11-09 18:44:46 +05304286 user_cfg->num_tx_chains[NSS_CHAINS_BAND_2GHZ];
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304287
4288 if (user_cfg->num_tx_chains_11g >
gaurank kathpaliab414bce2018-11-09 18:44:46 +05304289 user_cfg->num_tx_chains[NSS_CHAINS_BAND_2GHZ])
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304290 user_cfg->num_tx_chains_11g =
gaurank kathpaliab414bce2018-11-09 18:44:46 +05304291 user_cfg->num_tx_chains[NSS_CHAINS_BAND_2GHZ];
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304292
4293 return QDF_STATUS_SUCCESS;
4294}
4295
4296static QDF_STATUS
4297sme_validate_nss_chains_config(struct wlan_objmgr_vdev *vdev,
gaurank kathpaliadb87c0d2018-10-31 16:44:00 +05304298 struct wlan_mlme_nss_chains *user_cfg,
4299 struct wlan_mlme_nss_chains *dynamic_cfg)
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304300{
4301 enum nss_chains_band_info band;
4302 struct wlan_mlme_nss_chains *ini_cfg;
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304303 QDF_STATUS status;
4304
4305 ini_cfg = mlme_get_ini_vdev_config(vdev);
4306 if (!ini_cfg) {
4307 sme_err("nss chain ini config NULL");
4308 return QDF_STATUS_E_FAILURE;
4309 }
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304310
gaurank kathpaliab414bce2018-11-09 18:44:46 +05304311 for (band = NSS_CHAINS_BAND_2GHZ; band < NSS_CHAINS_BAND_MAX; band++) {
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304312 sme_populate_user_config(dynamic_cfg,
4313 user_cfg, band);
4314 status = sme_validate_from_ini_config(user_cfg,
4315 ini_cfg,
4316 band);
4317 if (QDF_IS_STATUS_ERROR(status)) {
4318 sme_err("Validation from ini config failed");
4319 return QDF_STATUS_E_FAILURE;
4320 }
4321 status = sme_validate_user_nss_chain_params(user_cfg,
4322 band);
4323 if (QDF_IS_STATUS_ERROR(status)) {
4324 sme_err("User cfg validation failed");
4325 return QDF_STATUS_E_FAILURE;
4326 }
4327 }
4328
4329 return QDF_STATUS_SUCCESS;
4330}
4331
4332QDF_STATUS
4333sme_nss_chains_update(mac_handle_t mac_handle,
4334 struct wlan_mlme_nss_chains *user_cfg,
4335 uint8_t vdev_id)
4336{
gaurank kathpalia24ed0f42018-11-13 15:37:49 +05304337 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304338 QDF_STATUS status;
gaurank kathpaliadb87c0d2018-10-31 16:44:00 +05304339 struct wlan_mlme_nss_chains *dynamic_cfg;
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304340 struct wlan_objmgr_vdev *vdev =
4341 wlan_objmgr_get_vdev_by_id_from_psoc(mac_ctx->psoc,
4342 vdev_id,
4343 WLAN_LEGACY_SME_ID);
4344 if (!vdev) {
4345 sme_err("Got NULL vdev obj, returning");
4346 return QDF_STATUS_E_FAILURE;
4347 }
gaurank kathpaliadb87c0d2018-10-31 16:44:00 +05304348
gaurank kathpalia748c7272018-10-24 22:05:15 +05304349 status = sme_acquire_global_lock(&mac_ctx->sme);
4350 if (QDF_IS_STATUS_ERROR(status))
4351 goto release_ref;
4352
gaurank kathpaliadb87c0d2018-10-31 16:44:00 +05304353 dynamic_cfg = mlme_get_dynamic_vdev_config(vdev);
4354 if (!dynamic_cfg) {
4355 sme_err("nss chain dynamic config NULL");
4356 status = QDF_STATUS_E_FAILURE;
4357 goto release_lock;
4358 }
4359
4360 status = sme_validate_nss_chains_config(vdev, user_cfg,
4361 dynamic_cfg);
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304362 if (QDF_IS_STATUS_ERROR(status))
gaurank kathpalia748c7272018-10-24 22:05:15 +05304363 goto release_lock;
gaurank kathpaliadb87c0d2018-10-31 16:44:00 +05304364
4365 if (!qdf_mem_cmp(dynamic_cfg, user_cfg,
4366 sizeof(struct wlan_mlme_nss_chains))) {
4367 sme_debug("current config same as user config");
4368 status = QDF_STATUS_SUCCESS;
4369 goto release_lock;
4370 }
gaurank kathpalia748c7272018-10-24 22:05:15 +05304371 sme_debug("User params verified, sending to fw vdev id %d", vdev_id);
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304372
gaurank kathpalia748c7272018-10-24 22:05:15 +05304373 status = wma_vdev_nss_chain_params_send(vdev->vdev_objmgr.vdev_id,
4374 user_cfg);
4375 if (QDF_IS_STATUS_ERROR(status)) {
4376 sme_err("params sent failed to fw vdev id %d", vdev_id);
4377 goto release_lock;
4378 }
4379
gaurank kathpaliab414bce2018-11-09 18:44:46 +05304380 *dynamic_cfg = *user_cfg;
gaurank kathpaliadb87c0d2018-10-31 16:44:00 +05304381
gaurank kathpalia748c7272018-10-24 22:05:15 +05304382release_lock:
4383 sme_release_global_lock(&mac_ctx->sme);
4384
4385release_ref:
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304386 wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_SME_ID);
4387 return status;
4388}
4389
Jeff Johnsonc7309062018-11-09 20:59:42 -08004390QDF_STATUS sme_open_session(mac_handle_t mac_handle,
4391 struct sme_session_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004392{
Arif Hussainee677012017-01-26 17:50:13 -08004393 QDF_STATUS status = QDF_STATUS_E_INVAL;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08004394 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Arif Hussainee677012017-01-26 17:50:13 -08004395 struct cdp_pdev *pdev;
4396 ol_txrx_peer_handle peer;
4397 uint8_t peer_id;
Krishna Kumaar Natarajanb9e1d712017-06-20 17:14:37 -07004398 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004399
Abhishek Singhe4a1f882017-08-10 17:59:44 +05304400 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_DEBUG,
Rajeev Kumar7414c8c2017-04-06 15:42:52 -07004401 "%s: type=%d, session_id %d subType=%d addr:%pM",
Krunal Soni8d184fa2017-11-20 21:52:05 -08004402 __func__, params->type_of_persona,
4403 params->sme_session_id, params->subtype_of_persona,
4404 params->self_mac_addr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004405
Arif Hussainee677012017-01-26 17:50:13 -08004406 pdev = cds_get_context(QDF_MODULE_ID_TXRX);
4407
4408 if (NULL == pdev) {
4409 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
4410 "%s: Failed to get pdev handler", __func__);
4411 return status;
4412 }
4413
Krunal Soni8d184fa2017-11-20 21:52:05 -08004414 status = sme_acquire_global_lock(&mac_ctx->sme);
Dustin Brownd28772b2017-03-17 14:16:07 -07004415 if (QDF_IS_STATUS_ERROR(status))
4416 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004417
Krunal Soni8d184fa2017-11-20 21:52:05 -08004418 peer = cdp_peer_find_by_addr(soc, pdev, params->self_mac_addr,
4419 &peer_id);
Arif Hussainee677012017-01-26 17:50:13 -08004420 if (peer) {
4421 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
4422 "%s: Peer=%d exist with same MAC",
4423 __func__, peer_id);
4424 status = QDF_STATUS_E_INVAL;
4425 } else {
Krunal Soni8d184fa2017-11-20 21:52:05 -08004426 status = csr_roam_open_session(mac_ctx, params);
Arif Hussainee677012017-01-26 17:50:13 -08004427 }
Krunal Soni8d184fa2017-11-20 21:52:05 -08004428 sme_release_global_lock(&mac_ctx->sme);
Dustin Brownd28772b2017-03-17 14:16:07 -07004429
4430 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_RX_HDD_OPEN_SESSION,
Krunal Soni8d184fa2017-11-20 21:52:05 -08004431 params->sme_session_id, 0));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004432
4433 return status;
4434}
4435
Jeff Johnsonc7309062018-11-09 20:59:42 -08004436QDF_STATUS sme_close_session(mac_handle_t mac_handle, uint8_t session_id)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004437{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304438 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08004439 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004440
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304441 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Krunal Soni8d184fa2017-11-20 21:52:05 -08004442 TRACE_CODE_SME_RX_HDD_CLOSE_SESSION, session_id, 0));
Jeff Johnson01f2c232018-11-21 19:17:44 -08004443 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304444 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08004445 status = csr_roam_close_session(mac, session_id, false);
4446 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004447 }
4448
4449 return status;
4450}
4451
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304452/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304453 * sme_change_mcc_beacon_interval() -
4454 * To update P2P-GO beaconInterval. This function should be called after
4455 * disassociating all the station is done
4456 * This is an asynchronous API.
4457 *
4458 * @sessionId: Session Identifier
4459 * Return QDF_STATUS SUCCESS
4460 * FAILURE or RESOURCES
4461 * The API finished and failed.
4462 */
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07004463QDF_STATUS sme_change_mcc_beacon_interval(uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004464{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304465 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08004466 struct mac_context *mac_ctx = sme_get_mac_context();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004467
Krunal Soni3fa80e22018-01-09 14:16:02 -08004468 if (!mac_ctx) {
4469 sme_err("mac_ctx is NULL");
4470 return status;
4471 }
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07004472 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304473 if (QDF_IS_STATUS_SUCCESS(status)) {
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07004474 status = csr_send_chng_mcc_beacon_interval(mac_ctx,
4475 sessionId);
4476 sme_release_global_lock(&mac_ctx->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004477 }
4478 return status;
4479}
4480
4481/**
4482 * sme_set_host_offload(): API to set the host offload feature.
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004483 * @mac_handle: The handle returned by mac_open.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004484 * @sessionId: Session Identifier
4485 * @request: Pointer to the offload request.
4486 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304487 * Return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004488 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004489QDF_STATUS sme_set_host_offload(mac_handle_t mac_handle, uint8_t sessionId,
Jeff Johnsond6fda812019-02-06 21:54:23 -08004490 struct sir_host_offload_req *request)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004491{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08004492 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304493 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004494
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304495 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004496 TRACE_CODE_SME_RX_HDD_SET_HOSTOFFLOAD, sessionId, 0));
Jeff Johnson01f2c232018-11-21 19:17:44 -08004497 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304498 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004499#ifdef WLAN_NS_OFFLOAD
4500 if (SIR_IPV6_NS_OFFLOAD == request->offloadType) {
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004501 status = sme_set_ps_ns_offload(mac_handle, request,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004502 sessionId);
4503 } else
4504#endif /* WLAN_NS_OFFLOAD */
4505 {
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004506 status = sme_set_ps_host_offload(mac_handle, request,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004507 sessionId);
4508 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08004509 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004510 }
4511
4512 return status;
4513}
4514
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304515/*
4516 * sme_set_keep_alive() -
4517 * API to set the Keep Alive feature.
4518 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004519 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304520 * request - Pointer to the Keep Alive request.
4521 * Return QDF_STATUS
4522 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004523QDF_STATUS sme_set_keep_alive(mac_handle_t mac_handle, uint8_t session_id,
Jeff Johnson562ccad2019-02-06 22:10:24 -08004524 struct keep_alive_req *request)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004525{
Jeff Johnson562ccad2019-02-06 22:10:24 -08004526 struct keep_alive_req *request_buf;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07004527 struct scheduler_msg msg = {0};
Jeff Johnson0a8786a2018-12-02 10:49:01 -08004528 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Jeff Johnson01f2c232018-11-21 19:17:44 -08004529 struct csr_roam_session *pSession = CSR_GET_SESSION(mac, session_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004530
Abhishek Singhe4a1f882017-08-10 17:59:44 +05304531 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004532 FL("WMA_SET_KEEP_ALIVE message"));
4533
4534 if (pSession == NULL) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304535 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004536 FL("Session not Found"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304537 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004538 }
Jeff Johnson562ccad2019-02-06 22:10:24 -08004539 request_buf = qdf_mem_malloc(sizeof(*request_buf));
Arif Hussain0ef77082018-10-10 16:42:53 -07004540 if (!request_buf)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304541 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004542
Anurag Chouhanc5548422016-02-24 18:33:27 +05304543 qdf_copy_macaddr(&request->bssid, &pSession->connectedProfile.bssid);
Jeff Johnson562ccad2019-02-06 22:10:24 -08004544 qdf_mem_copy(request_buf, request, sizeof(*request_buf));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004545
Abhishek Singhe4a1f882017-08-10 17:59:44 +05304546 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004547 "buff TP %d input TP %d ", request_buf->timePeriod,
4548 request->timePeriod);
4549 request_buf->sessionId = session_id;
4550
4551 msg.type = WMA_SET_KEEP_ALIVE;
4552 msg.reserved = 0;
4553 msg.bodyptr = request_buf;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05304554 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
4555 session_id, msg.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304556 if (QDF_STATUS_SUCCESS !=
gaurank kathpalia36b0c582018-08-28 17:45:43 +05304557 scheduler_post_message(QDF_MODULE_ID_SME,
4558 QDF_MODULE_ID_WMA,
4559 QDF_MODULE_ID_WMA, &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304560 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304561 "Not able to post WMA_SET_KEEP_ALIVE message to WMA");
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304562 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304563 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004564 }
4565
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304566 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004567}
4568
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304569/*
4570 * sme_get_operation_channel() -
4571 * API to get current channel on which STA is parked his function gives
4572 * channel information only of infra station or IBSS station
4573 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004574 * mac_handle, pointer to memory location and sessionId
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304575 * Returns QDF_STATUS_SUCCESS
4576 * QDF_STATUS_E_FAILURE
4577 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004578QDF_STATUS sme_get_operation_channel(mac_handle_t mac_handle,
4579 uint32_t *pChannel,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004580 uint8_t sessionId)
4581{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08004582 struct mac_context *mac = MAC_CONTEXT(mac_handle);
gaurank kathpalia14e2f912017-08-31 14:51:45 +05304583 struct csr_roam_session *pSession;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004584
Jeff Johnson01f2c232018-11-21 19:17:44 -08004585 if (CSR_IS_SESSION_VALID(mac, sessionId)) {
4586 pSession = CSR_GET_SESSION(mac, sessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004587
4588 if ((pSession->connectedProfile.BSSType ==
4589 eCSR_BSS_TYPE_INFRASTRUCTURE)
4590 || (pSession->connectedProfile.BSSType ==
4591 eCSR_BSS_TYPE_IBSS)
4592 || (pSession->connectedProfile.BSSType ==
4593 eCSR_BSS_TYPE_INFRA_AP)
4594 || (pSession->connectedProfile.BSSType ==
4595 eCSR_BSS_TYPE_START_IBSS)) {
4596 *pChannel = pSession->connectedProfile.operationChannel;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304597 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004598 }
4599 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304600 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004601} /* sme_get_operation_channel ends here */
4602
Abhishek Singh7996eb72015-12-30 17:24:02 +05304603/**
4604 * sme_register_mgmt_frame_ind_callback() - Register a callback for
4605 * management frame indication to PE.
4606 *
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08004607 * @mac_handle: Opaque handle to the global MAC context
Abhishek Singh7996eb72015-12-30 17:24:02 +05304608 * @callback: callback pointer to be registered
4609 *
4610 * This function is used to register a callback for management
4611 * frame indication to PE.
4612 *
4613 * Return: Success if msg is posted to PE else Failure.
4614 */
Jeff Johnsonc7309062018-11-09 20:59:42 -08004615QDF_STATUS sme_register_mgmt_frame_ind_callback(mac_handle_t mac_handle,
Abhishek Singh7996eb72015-12-30 17:24:02 +05304616 sir_mgmt_frame_ind_callback callback)
4617{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08004618 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Abhishek Singh7996eb72015-12-30 17:24:02 +05304619 struct sir_sme_mgmt_frame_cb_req *msg;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304620 QDF_STATUS status = QDF_STATUS_SUCCESS;
Abhishek Singh7996eb72015-12-30 17:24:02 +05304621
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304622 if (QDF_STATUS_SUCCESS ==
Abhishek Singh7996eb72015-12-30 17:24:02 +05304623 sme_acquire_global_lock(&mac_ctx->sme)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304624 msg = qdf_mem_malloc(sizeof(*msg));
Arif Hussain0ef77082018-10-10 16:42:53 -07004625 if (!msg) {
Abhishek Singh7996eb72015-12-30 17:24:02 +05304626 sme_release_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304627 return QDF_STATUS_E_NOMEM;
Abhishek Singh7996eb72015-12-30 17:24:02 +05304628 }
Abhishek Singh7996eb72015-12-30 17:24:02 +05304629 msg->message_type = eWNI_SME_REGISTER_MGMT_FRAME_CB;
4630 msg->length = sizeof(*msg);
4631
4632 msg->callback = callback;
Rajeev Kumard138ac52017-01-30 18:38:37 -08004633 status = umac_send_mb_message_to_mac(msg);
Abhishek Singh7996eb72015-12-30 17:24:02 +05304634 sme_release_global_lock(&mac_ctx->sme);
4635 return status;
4636 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304637 return QDF_STATUS_E_FAILURE;
Abhishek Singh7996eb72015-12-30 17:24:02 +05304638}
4639
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304640/*
4641 * sme_RegisterMgtFrame() -
Jeff Johnson698eacd2018-05-12 17:00:03 -07004642 * To register management frame of specified type and subtype.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304643 *
4644 * frameType - type of the frame that needs to be passed to HDD.
4645 * matchData - data which needs to be matched before passing frame
4646 * to HDD.
4647 * matchDataLen - Length of matched data.
4648 * Return QDF_STATUS
4649 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004650QDF_STATUS sme_register_mgmt_frame(mac_handle_t mac_handle, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004651 uint16_t frameType, uint8_t *matchData,
4652 uint16_t matchLen)
4653{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304654 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08004655 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004656
Jeff Johnson01f2c232018-11-21 19:17:44 -08004657 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304658 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson78f7a182019-02-01 22:45:41 -08004659 struct register_mgmt_frame *pMsg;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004660 uint16_t len;
Jeff Johnson01f2c232018-11-21 19:17:44 -08004661 struct csr_roam_session *pSession = CSR_GET_SESSION(mac,
gaurank kathpalia14e2f912017-08-31 14:51:45 +05304662 sessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004663
4664 if (!CSR_IS_SESSION_ANY(sessionId) && !pSession) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07004665 sme_err("Session %d not found", sessionId);
Jeff Johnson01f2c232018-11-21 19:17:44 -08004666 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304667 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004668 }
4669
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304670 if (!CSR_IS_SESSION_ANY(sessionId) &&
4671 !pSession->sessionActive) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304672 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004673 "%s Invalid Sessionid", __func__);
Jeff Johnson01f2c232018-11-21 19:17:44 -08004674 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304675 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004676 }
4677
Jeff Johnson78f7a182019-02-01 22:45:41 -08004678 len = sizeof(*pMsg) + matchLen;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004679
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304680 pMsg = qdf_mem_malloc(len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004681 if (NULL == pMsg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304682 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004683 else {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004684 pMsg->messageType = eWNI_SME_REGISTER_MGMT_FRAME_REQ;
4685 pMsg->length = len;
4686 pMsg->sessionId = sessionId;
4687 pMsg->registerFrame = true;
4688 pMsg->frameType = frameType;
4689 pMsg->matchLen = matchLen;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304690 qdf_mem_copy(pMsg->matchData, matchData, matchLen);
Rajeev Kumard138ac52017-01-30 18:38:37 -08004691 status = umac_send_mb_message_to_mac(pMsg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004692 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08004693 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004694 }
4695 return status;
4696}
4697
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304698/*
4699 * sme_DeregisterMgtFrame() -
Jeff Johnson698eacd2018-05-12 17:00:03 -07004700 * To De-register management frame of specified type and subtype.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304701 *
4702 * frameType - type of the frame that needs to be passed to HDD.
4703 * matchData - data which needs to be matched before passing frame
4704 * to HDD.
4705 * matchDataLen - Length of matched data.
4706 * Return QDF_STATUS
4707 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004708QDF_STATUS sme_deregister_mgmt_frame(mac_handle_t mac_handle, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004709 uint16_t frameType, uint8_t *matchData,
4710 uint16_t matchLen)
4711{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304712 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08004713 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004714
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304715 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004716 TRACE_CODE_SME_RX_HDD_DEREGISTER_MGMTFR, sessionId,
4717 0));
Jeff Johnson01f2c232018-11-21 19:17:44 -08004718 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304719 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson78f7a182019-02-01 22:45:41 -08004720 struct register_mgmt_frame *pMsg;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004721 uint16_t len;
Jeff Johnson01f2c232018-11-21 19:17:44 -08004722 struct csr_roam_session *pSession = CSR_GET_SESSION(mac,
gaurank kathpalia14e2f912017-08-31 14:51:45 +05304723 sessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004724
4725 if (!CSR_IS_SESSION_ANY(sessionId) && !pSession) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07004726 sme_err("Session %d not found", sessionId);
Jeff Johnson01f2c232018-11-21 19:17:44 -08004727 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304728 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004729 }
4730
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304731 if (!CSR_IS_SESSION_ANY(sessionId) &&
4732 !pSession->sessionActive) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304733 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004734 "%s Invalid Sessionid", __func__);
Jeff Johnson01f2c232018-11-21 19:17:44 -08004735 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304736 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004737 }
4738
Jeff Johnson78f7a182019-02-01 22:45:41 -08004739 len = sizeof(*pMsg) + matchLen;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004740
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304741 pMsg = qdf_mem_malloc(len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004742 if (NULL == pMsg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304743 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004744 else {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004745 pMsg->messageType = eWNI_SME_REGISTER_MGMT_FRAME_REQ;
4746 pMsg->length = len;
4747 pMsg->registerFrame = false;
4748 pMsg->frameType = frameType;
4749 pMsg->matchLen = matchLen;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304750 qdf_mem_copy(pMsg->matchData, matchData, matchLen);
Rajeev Kumard138ac52017-01-30 18:38:37 -08004751 status = umac_send_mb_message_to_mac(pMsg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004752 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08004753 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004754 }
4755 return status;
4756}
4757
Padma, Santhosh Kumar22c462c2018-01-16 17:56:44 +05304758/**
4759 * sme_prepare_mgmt_tx() - Prepares mgmt frame
Jeff Johnsonc7309062018-11-09 20:59:42 -08004760 * @mac_handle: The handle returned by mac_open
Padma, Santhosh Kumar22c462c2018-01-16 17:56:44 +05304761 * @session_id: session id
4762 * @buf: pointer to frame
4763 * @len: frame length
4764 *
4765 * Return: QDF_STATUS
4766 */
Jeff Johnsonc7309062018-11-09 20:59:42 -08004767static QDF_STATUS sme_prepare_mgmt_tx(mac_handle_t mac_handle,
4768 uint8_t session_id,
4769 const uint8_t *buf, uint32_t len)
Padma, Santhosh Kumar22c462c2018-01-16 17:56:44 +05304770{
4771 QDF_STATUS status = QDF_STATUS_SUCCESS;
4772 struct sir_mgmt_msg *msg;
4773 uint16_t msg_len;
4774 struct scheduler_msg sch_msg = {0};
4775
4776 sme_debug("prepares auth frame");
4777
4778 msg_len = sizeof(*msg) + len;
4779 msg = qdf_mem_malloc(msg_len);
4780 if (msg == NULL) {
4781 status = QDF_STATUS_E_NOMEM;
4782 } else {
4783 msg->type = eWNI_SME_SEND_MGMT_FRAME_TX;
4784 msg->msg_len = msg_len;
4785 msg->session_id = session_id;
4786 msg->data = (uint8_t *)msg + sizeof(*msg);
4787 qdf_mem_copy(msg->data, buf, len);
4788
4789 sch_msg.type = eWNI_SME_SEND_MGMT_FRAME_TX;
4790 sch_msg.bodyptr = msg;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05304791 status = scheduler_post_message(QDF_MODULE_ID_SME,
4792 QDF_MODULE_ID_PE,
4793 QDF_MODULE_ID_PE, &sch_msg);
Padma, Santhosh Kumar22c462c2018-01-16 17:56:44 +05304794 }
4795 return status;
4796}
4797
Jeff Johnsonc7309062018-11-09 20:59:42 -08004798QDF_STATUS sme_send_mgmt_tx(mac_handle_t mac_handle, uint8_t session_id,
4799 const uint8_t *buf, uint32_t len)
Padma, Santhosh Kumar22c462c2018-01-16 17:56:44 +05304800{
4801 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08004802 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Padma, Santhosh Kumar22c462c2018-01-16 17:56:44 +05304803
Padma, Santhosh Kumar22c462c2018-01-16 17:56:44 +05304804 status = sme_acquire_global_lock(&mac->sme);
4805 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnsonc7309062018-11-09 20:59:42 -08004806 status = sme_prepare_mgmt_tx(mac_handle, session_id, buf, len);
Padma, Santhosh Kumar22c462c2018-01-16 17:56:44 +05304807 sme_release_global_lock(&mac->sme);
4808 }
4809
4810 return status;
4811}
4812
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004813#ifdef WLAN_FEATURE_EXTWOW_SUPPORT
Krishna Kumaar Natarajand9131902015-10-19 11:52:47 -07004814/**
4815 * sme_configure_ext_wow() - configure Extr WoW
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004816 * @mac_handle - The handle returned by mac_open.
Krishna Kumaar Natarajand9131902015-10-19 11:52:47 -07004817 * @wlanExtParams - Depicts the wlan Ext params.
4818 * @callback - ext_wow callback to be registered.
4819 * @callback_context - ext_wow callback context
4820 *
4821 * SME will pass this request to lower mac to configure Extr WoW
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304822 * Return: QDF_STATUS
Krishna Kumaar Natarajand9131902015-10-19 11:52:47 -07004823 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004824QDF_STATUS sme_configure_ext_wow(mac_handle_t mac_handle,
4825 tpSirExtWoWParams wlanExtParams,
4826 csr_readyToExtWoWCallback callback,
4827 void *callback_context)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004828{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304829 QDF_STATUS status = QDF_STATUS_SUCCESS;
4830 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08004831 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07004832 struct scheduler_msg message = {0};
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304833 tpSirExtWoWParams MsgPtr = qdf_mem_malloc(sizeof(*MsgPtr));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004834
4835 if (!MsgPtr)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304836 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004837
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304838 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004839 TRACE_CODE_SME_RX_HDD_CONFIG_EXTWOW, NO_SESSION, 0));
4840
Jeff Johnson01f2c232018-11-21 19:17:44 -08004841 mac->readyToExtWoWCallback = callback;
4842 mac->readyToExtWoWContext = callback_context;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004843
Jeff Johnson01f2c232018-11-21 19:17:44 -08004844 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304845 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004846
4847 /* serialize the req through MC thread */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304848 qdf_mem_copy(MsgPtr, wlanExtParams, sizeof(*MsgPtr));
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08004849 message.bodyptr = MsgPtr;
4850 message.type = WMA_WLAN_EXT_WOW;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05304851 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
4852 QDF_MODULE_ID_WMA,
4853 QDF_MODULE_ID_WMA,
4854 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304855 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08004856 mac->readyToExtWoWCallback = NULL;
4857 mac->readyToExtWoWContext = NULL;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304858 qdf_mem_free(MsgPtr);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304859 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004860 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08004861 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004862 } else {
Jeff Johnson01f2c232018-11-21 19:17:44 -08004863 mac->readyToExtWoWCallback = NULL;
4864 mac->readyToExtWoWContext = NULL;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304865 qdf_mem_free(MsgPtr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004866 }
4867
4868 return status;
4869}
4870
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304871/*
4872 * sme_configure_app_type1_params() -
4873 * SME will pass this request to lower mac to configure Indoor WoW parameters.
4874 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004875 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304876 * wlanAppType1Params- Depicts the wlan App Type 1(Indoor) params
4877 * Return QDF_STATUS
4878 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004879QDF_STATUS sme_configure_app_type1_params(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004880 tpSirAppType1Params wlanAppType1Params)
4881{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304882 QDF_STATUS status = QDF_STATUS_SUCCESS;
4883 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08004884 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07004885 struct scheduler_msg message = {0};
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304886 tpSirAppType1Params MsgPtr = qdf_mem_malloc(sizeof(*MsgPtr));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004887
4888 if (!MsgPtr)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304889 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004890
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304891 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004892 TRACE_CODE_SME_RX_HDD_CONFIG_APP_TYPE1, NO_SESSION,
4893 0));
4894
Jeff Johnson01f2c232018-11-21 19:17:44 -08004895 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304896 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004897 /* serialize the req through MC thread */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304898 qdf_mem_copy(MsgPtr, wlanAppType1Params, sizeof(*MsgPtr));
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08004899 message.bodyptr = MsgPtr;
4900 message.type = WMA_WLAN_SET_APP_TYPE1_PARAMS;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05304901 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
4902 QDF_MODULE_ID_WMA,
4903 QDF_MODULE_ID_WMA,
4904 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304905 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304906 qdf_mem_free(MsgPtr);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304907 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004908 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08004909 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004910 } else {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304911 qdf_mem_free(MsgPtr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004912 }
4913
4914 return status;
4915}
4916
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304917/*
4918 * sme_configure_app_type2_params() -
4919 * SME will pass this request to lower mac to configure Indoor WoW parameters.
4920 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004921 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304922 * wlanAppType2Params- Depicts the wlan App Type 2 (Outdoor) params
4923 * Return QDF_STATUS
4924 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004925QDF_STATUS sme_configure_app_type2_params(mac_handle_t mac_handle,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304926 tpSirAppType2Params wlanAppType2Params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004927{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304928 QDF_STATUS status = QDF_STATUS_SUCCESS;
4929 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08004930 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07004931 struct scheduler_msg message = {0};
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304932 tpSirAppType2Params MsgPtr = qdf_mem_malloc(sizeof(*MsgPtr));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004933
4934 if (!MsgPtr)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304935 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004936
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304937 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004938 TRACE_CODE_SME_RX_HDD_CONFIG_APP_TYPE2, NO_SESSION,
4939 0));
4940
Jeff Johnson01f2c232018-11-21 19:17:44 -08004941 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304942 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004943 /* serialize the req through MC thread */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304944 qdf_mem_copy(MsgPtr, wlanAppType2Params, sizeof(*MsgPtr));
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08004945 message.bodyptr = MsgPtr;
4946 message.type = WMA_WLAN_SET_APP_TYPE2_PARAMS;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05304947 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
4948 QDF_MODULE_ID_WMA,
4949 QDF_MODULE_ID_WMA,
4950 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304951 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304952 qdf_mem_free(MsgPtr);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304953 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004954 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08004955 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004956 } else {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304957 qdf_mem_free(MsgPtr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004958 }
4959
4960 return status;
4961}
4962#endif
4963
Abhishek Singhb1954c62019-02-14 10:18:28 +05304964uint8_t sme_get_beaconing_concurrent_operation_channel(mac_handle_t mac_handle,
4965 uint8_t vdev_id_to_skip)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004966{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304967 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08004968 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004969 uint8_t channel = 0;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304970
Jeff Johnson01f2c232018-11-21 19:17:44 -08004971 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304972 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004973
Abhishek Singhb1954c62019-02-14 10:18:28 +05304974 channel = csr_get_beaconing_concurrent_channel(mac,
4975 vdev_id_to_skip);
4976 sme_info("Other Concurrent Channel: %d skipped vdev_id %d",
4977 channel, vdev_id_to_skip);
Jeff Johnson01f2c232018-11-21 19:17:44 -08004978 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004979 }
4980
4981 return channel;
4982}
4983
4984#ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004985uint16_t sme_check_concurrent_channel_overlap(mac_handle_t mac_handle,
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08004986 uint16_t sap_ch,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004987 eCsrPhyMode sapPhyMode,
4988 uint8_t cc_switch_mode)
4989{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304990 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08004991 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004992 uint16_t channel = 0;
4993
Jeff Johnson01f2c232018-11-21 19:17:44 -08004994 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304995 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004996 channel =
Jeff Johnson01f2c232018-11-21 19:17:44 -08004997 csr_check_concurrent_channel_overlap(mac, sap_ch,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304998 sapPhyMode,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004999 cc_switch_mode);
Jeff Johnson01f2c232018-11-21 19:17:44 -08005000 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005001 }
5002
5003 return channel;
5004}
5005#endif
5006
Arun Khandavalli4b55da72016-07-19 19:55:01 +05305007/**
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07005008 * sme_set_tsfcb() - Set callback for TSF capture
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005009 * @mac_handle: Handler return by mac_open
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07005010 * @cb_fn: Callback function pointer
5011 * @db_ctx: Callback data
5012 *
5013 * Return: QDF_STATUS
5014 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005015QDF_STATUS sme_set_tsfcb(mac_handle_t mac_handle,
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07005016 int (*cb_fn)(void *cb_ctx, struct stsf *ptsf), void *cb_ctx)
5017{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005018 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07005019 QDF_STATUS status;
5020
Manikandan Mohan976e7562016-03-15 16:33:31 -07005021 status = sme_acquire_global_lock(&mac->sme);
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07005022 if (QDF_IS_STATUS_SUCCESS(status)) {
Manikandan Mohan976e7562016-03-15 16:33:31 -07005023 mac->sme.get_tsf_cb = cb_fn;
5024 mac->sme.get_tsf_cxt = cb_ctx;
5025 sme_release_global_lock(&mac->sme);
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07005026 }
5027 return status;
5028}
5029
Arun Khandavalli4b55da72016-07-19 19:55:01 +05305030/**
5031 * sme_reset_tsfcb() - Reset callback for TSF capture
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005032 * @mac_handle: Handler return by mac_open
Arun Khandavalli4b55da72016-07-19 19:55:01 +05305033 *
5034 * This function reset the tsf capture callback to SME
5035 *
5036 * Return: QDF_STATUS
5037 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005038QDF_STATUS sme_reset_tsfcb(mac_handle_t mac_handle)
Arun Khandavalli4b55da72016-07-19 19:55:01 +05305039{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005040 struct mac_context *mac;
Arun Khandavalli4b55da72016-07-19 19:55:01 +05305041 QDF_STATUS status;
5042
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005043 if (!mac_handle) {
Arun Khandavalli4b55da72016-07-19 19:55:01 +05305044 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005045 FL("mac_handle is not valid"));
Arun Khandavalli4b55da72016-07-19 19:55:01 +05305046 return QDF_STATUS_E_INVAL;
5047 }
Jeff Johnsona0619e42018-11-28 17:43:00 -08005048 mac = MAC_CONTEXT(mac_handle);
Arun Khandavalli4b55da72016-07-19 19:55:01 +05305049
5050 status = sme_acquire_global_lock(&mac->sme);
5051 if (QDF_IS_STATUS_SUCCESS(status)) {
5052 mac->sme.get_tsf_cb = NULL;
5053 mac->sme.get_tsf_cxt = NULL;
5054 sme_release_global_lock(&mac->sme);
5055 }
5056 return status;
5057}
5058
yuanl2746f072018-09-21 19:19:16 +08005059#if defined(WLAN_FEATURE_TSF) && !defined(WLAN_FEATURE_TSF_PLUS_NOIRQ)
Manikandan Mohan976e7562016-03-15 16:33:31 -07005060/*
yuanl2746f072018-09-21 19:19:16 +08005061 * sme_set_tsf_gpio() - set gpio pin that be toggled when capture tsf
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005062 * @mac_handle: Handler return by mac_open
Manikandan Mohan976e7562016-03-15 16:33:31 -07005063 * @pinvalue: gpio pin id
5064 *
5065 * Return: QDF_STATUS
5066 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005067QDF_STATUS sme_set_tsf_gpio(mac_handle_t mac_handle, uint32_t pinvalue)
Manikandan Mohan976e7562016-03-15 16:33:31 -07005068{
5069 QDF_STATUS status;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08005070 struct scheduler_msg tsf_msg = {0};
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005071 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Manikandan Mohan976e7562016-03-15 16:33:31 -07005072
5073 status = sme_acquire_global_lock(&mac->sme);
5074 if (QDF_IS_STATUS_SUCCESS(status)) {
5075 tsf_msg.type = WMA_TSF_GPIO_PIN;
5076 tsf_msg.reserved = 0;
5077 tsf_msg.bodyval = pinvalue;
5078
gaurank kathpalia36b0c582018-08-28 17:45:43 +05305079 status = scheduler_post_message(QDF_MODULE_ID_SME,
5080 QDF_MODULE_ID_WMA,
5081 QDF_MODULE_ID_WMA, &tsf_msg);
Manikandan Mohan976e7562016-03-15 16:33:31 -07005082 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07005083 sme_err("Unable to post WMA_TSF_GPIO_PIN");
Manikandan Mohan976e7562016-03-15 16:33:31 -07005084 status = QDF_STATUS_E_FAILURE;
5085 }
5086 sme_release_global_lock(&mac->sme);
5087 }
5088 return status;
5089}
5090#endif
5091
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -08005092QDF_STATUS sme_get_cfg_valid_channels(uint8_t *aValidChannels,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005093 uint32_t *len)
5094{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305095 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005096 struct mac_context *mac_ctx = sme_get_mac_context();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005097
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -08005098 if (NULL == mac_ctx) {
5099 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
5100 FL("Invalid MAC context"));
5101 return QDF_STATUS_E_FAILURE;
5102 }
5103
5104 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305105 if (QDF_IS_STATUS_SUCCESS(status)) {
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -08005106 status = csr_get_cfg_valid_channels(mac_ctx,
5107 aValidChannels, len);
5108 sme_release_global_lock(&mac_ctx->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005109 }
5110
5111 return status;
5112}
5113
Amar Singhalf0a94ad2017-11-27 15:20:00 -08005114static uint8_t *sme_reg_hint_to_str(const enum country_src src)
5115{
5116 switch (src) {
5117 case SOURCE_CORE:
5118 return "WORLD MODE";
5119
5120 case SOURCE_DRIVER:
5121 return "BDF file";
5122
5123 case SOURCE_USERSPACE:
5124 return "user-space";
5125
5126 case SOURCE_11D:
5127 return "802.11D IEs in beacons";
5128
5129 default:
5130 return "unknown";
5131 }
5132}
5133
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005134void sme_set_cc_src(mac_handle_t mac_handle, enum country_src cc_src)
Amar Singhal6edf9732016-11-20 21:43:40 -08005135{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005136 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Amar Singhal6edf9732016-11-20 21:43:40 -08005137
5138 mac_ctx->reg_hint_src = cc_src;
Amar Singhalf0a94ad2017-11-27 15:20:00 -08005139
5140 sme_debug("Country source is %s",
5141 sme_reg_hint_to_str(cc_src));
Amar Singhal6edf9732016-11-20 21:43:40 -08005142}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005143
5144/**
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07005145 * sme_handle_generic_change_country_code() - handles country ch req
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005146 * @mac_ctx: mac global context
5147 * @msg: request msg packet
5148 *
5149 * If Supplicant country code is priority than 11d is disabled.
5150 * If 11D is enabled, we update the country code after every scan.
5151 * Hence when Supplicant country code is priority, we don't need 11D info.
5152 * Country code from Supplicant is set as current country code.
5153 *
5154 * Return: status of operation
5155 */
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305156static QDF_STATUS
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005157sme_handle_generic_change_country_code(struct mac_context *mac_ctx,
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07005158 void *pMsgBuf)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005159{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305160 QDF_STATUS status = QDF_STATUS_SUCCESS;
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07005161 v_REGDOMAIN_t reg_domain_id = 0;
Amar Singhalb6d0dc42016-10-19 09:45:05 -07005162 bool user_ctry_priority =
Bala Venkatesh46e29032018-11-14 18:24:55 +05305163 mac_ctx->mlme_cfg->sap_cfg.country_code_priority;
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07005164 tAniGenericChangeCountryCodeReq *msg = pMsgBuf;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005165
Amar Singhal6edf9732016-11-20 21:43:40 -08005166 if (SOURCE_11D != mac_ctx->reg_hint_src) {
5167 if (SOURCE_DRIVER != mac_ctx->reg_hint_src) {
5168 if (user_ctry_priority)
Abhinav Kumard4d6eb72018-12-04 20:30:37 +05305169 mac_ctx->mlme_cfg->gen.enabled_11d = false;
Amar Singhal6edf9732016-11-20 21:43:40 -08005170 else {
Abhinav Kumard4d6eb72018-12-04 20:30:37 +05305171 if (mac_ctx->mlme_cfg->gen.enabled_11d &&
5172 mac_ctx->scan.countryCode11d[0] != 0) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005173
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07005174 sme_debug("restore 11d");
Amar Singhalb6d0dc42016-10-19 09:45:05 -07005175
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305176 status =
5177 csr_get_regulatory_domain_for_country(
Amar Singhal6edf9732016-11-20 21:43:40 -08005178 mac_ctx,
5179 mac_ctx->scan.countryCode11d,
5180 &reg_domain_id,
5181 SOURCE_11D);
5182 return QDF_STATUS_E_FAILURE;
5183 }
Amar Singhalb6d0dc42016-10-19 09:45:05 -07005184 }
5185 }
5186 } else {
5187 /* if kernel gets invalid country code; it
5188 * resets the country code to world
5189 */
5190 if (('0' != msg->countryCode[0]) ||
5191 ('0' != msg->countryCode[1]))
5192 qdf_mem_copy(mac_ctx->scan.countryCode11d,
5193 msg->countryCode,
Wu Gaoaa155142019-01-14 15:09:26 +08005194 CFG_COUNTRY_CODE_LEN);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005195 }
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07005196
Amar Singhalb6d0dc42016-10-19 09:45:05 -07005197 qdf_mem_copy(mac_ctx->scan.countryCodeCurrent,
5198 msg->countryCode,
Wu Gaoaa155142019-01-14 15:09:26 +08005199 CFG_COUNTRY_CODE_LEN);
Amar Singhal9d5b1fe2016-10-16 20:16:05 -07005200
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005201 /* get the channels based on new cc */
5202 status = csr_get_channel_and_power_list(mac_ctx);
5203
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305204 if (status != QDF_STATUS_SUCCESS) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07005205 sme_err("fail to get Channels");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005206 return status;
5207 }
Amar Singhalb6d0dc42016-10-19 09:45:05 -07005208
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005209 /* reset info based on new cc, and we are done */
5210 csr_apply_channel_power_info_wrapper(mac_ctx);
5211
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005212 csr_scan_filter_results(mac_ctx);
Amar Singhalb6d0dc42016-10-19 09:45:05 -07005213
5214 /* scans after the country is set by User hints or
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005215 * Country IE
5216 */
5217 mac_ctx->scan.curScanType = eSIR_ACTIVE_SCAN;
Amar Singhal9d5b1fe2016-10-16 20:16:05 -07005218
Amar Singhal6edf9732016-11-20 21:43:40 -08005219 mac_ctx->reg_hint_src = SOURCE_UNKNOWN;
5220
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005221 sme_disconnect_connected_sessions(mac_ctx);
Amar Singhalb6d0dc42016-10-19 09:45:05 -07005222
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305223 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005224}
5225
Jeff Johnsonc7309062018-11-09 20:59:42 -08005226QDF_STATUS sme_update_channel_list(mac_handle_t mac_handle)
Mukul Sharmaecf8e092017-12-19 22:36:31 +05305227{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005228 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Jeff Johnson330c0bf2018-06-01 15:13:12 -07005229 QDF_STATUS status;
Mukul Sharmaecf8e092017-12-19 22:36:31 +05305230
5231 status = sme_acquire_global_lock(&mac_ctx->sme);
5232 if (QDF_IS_STATUS_SUCCESS(status)) {
5233 /* Update umac channel (enable/disable) from cds channels */
5234 status = csr_get_channel_and_power_list(mac_ctx);
5235 if (status != QDF_STATUS_SUCCESS) {
5236 sme_err("fail to get Channels");
5237 sme_release_global_lock(&mac_ctx->sme);
5238 return status;
5239 }
5240
5241 csr_apply_channel_power_info_wrapper(mac_ctx);
5242 csr_scan_filter_results(mac_ctx);
5243 sme_disconnect_connected_sessions(mac_ctx);
5244 sme_release_global_lock(&mac_ctx->sme);
5245 }
5246
5247 return status;
5248}
5249
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005250static bool
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005251sme_search_in_base_ch_lst(struct mac_context *mac_ctx, uint8_t curr_ch)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005252{
5253 uint8_t i;
gaurank kathpalia14e2f912017-08-31 14:51:45 +05305254 struct csr_channel *ch_lst_info;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305255
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005256 ch_lst_info = &mac_ctx->scan.base_channels;
5257 for (i = 0; i < ch_lst_info->numChannels; i++) {
5258 if (ch_lst_info->channelList[i] == curr_ch)
5259 return true;
5260 }
5261
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005262 return false;
5263}
5264/**
5265 * sme_disconnect_connected_sessions() - Disconnect STA and P2P client session
5266 * if channel is not supported
5267 * @mac_ctx: mac global context
5268 *
5269 * If new country code does not support the channel on which STA/P2P client
5270 * is connetced, it sends the disconnect to the AP/P2P GO
5271 *
5272 * Return: void
5273 */
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005274static void sme_disconnect_connected_sessions(struct mac_context *mac_ctx)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005275{
5276 uint8_t session_id, found = false;
5277 uint8_t curr_ch;
5278
Dustin Brownad06be62019-02-04 14:52:56 -08005279 for (session_id = 0; session_id < WLAN_MAX_VDEVS; session_id++) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005280 if (!csr_is_session_client_and_connected(mac_ctx, session_id))
5281 continue;
5282 found = false;
5283 /* Session is connected.Check the channel */
5284 curr_ch = csr_get_infra_operation_channel(mac_ctx,
5285 session_id);
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07005286 sme_debug("Current Operating channel : %d, session :%d",
5287 curr_ch, session_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005288 found = sme_search_in_base_ch_lst(mac_ctx, curr_ch);
5289 if (!found) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07005290 sme_debug("Disconnect Session: %d", session_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005291 csr_roam_disconnect(mac_ctx, session_id,
5292 eCSR_DISCONNECT_REASON_UNSPECIFIED);
5293 }
5294 }
5295}
5296
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005297#ifdef WLAN_FEATURE_PACKET_FILTERING
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005298QDF_STATUS sme_8023_multicast_list(mac_handle_t mac_handle, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005299 tpSirRcvFltMcAddrList pMulticastAddrs)
5300{
5301 tpSirRcvFltMcAddrList request_buf;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07005302 struct scheduler_msg msg = {0};
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005303 struct mac_context *mac = MAC_CONTEXT(mac_handle);
gaurank kathpalia14e2f912017-08-31 14:51:45 +05305304 struct csr_roam_session *pSession = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005305
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305306 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
5307 "%s: ulMulticastAddrCnt: %d, multicastAddr[0]: %pK", __func__,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005308 pMulticastAddrs->ulMulticastAddrCnt,
Srinivas Girigowda98530492015-11-20 17:39:24 -08005309 pMulticastAddrs->multicastAddr[0].bytes);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005310
Ravi Joshi4f447cb2016-07-19 13:42:01 -07005311 /* Find the connected Infra / P2P_client connected session */
Jeff Johnson01f2c232018-11-21 19:17:44 -08005312 pSession = CSR_GET_SESSION(mac, sessionId);
5313 if (!CSR_IS_SESSION_VALID(mac, sessionId) ||
5314 (!csr_is_conn_state_infra(mac, sessionId) &&
5315 !csr_is_ndi_started(mac, sessionId))) {
Abhishek Singh5d8d7332017-08-10 15:15:24 +05305316 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Srinivas Girigowdaf2599dd2015-11-16 18:20:46 -08005317 "%s: Unable to find the session Id: %d", __func__,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005318 sessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305319 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005320 }
5321
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305322 request_buf = qdf_mem_malloc(sizeof(tSirRcvFltMcAddrList));
Arif Hussain0ef77082018-10-10 16:42:53 -07005323 if (!request_buf)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305324 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005325
Jeff Johnson01f2c232018-11-21 19:17:44 -08005326 if (!csr_is_conn_state_connected_infra(mac, sessionId) &&
5327 !csr_is_ndi_started(mac, sessionId)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305328 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Ravi Joshi4f447cb2016-07-19 13:42:01 -07005329 "%s: Request ignored, session %d is not connected or started",
5330 __func__, sessionId);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305331 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305332 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005333 }
5334
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305335 qdf_mem_copy(request_buf, pMulticastAddrs,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005336 sizeof(tSirRcvFltMcAddrList));
5337
Anurag Chouhanc5548422016-02-24 18:33:27 +05305338 qdf_copy_macaddr(&request_buf->self_macaddr, &pSession->selfMacAddr);
5339 qdf_copy_macaddr(&request_buf->bssid,
Srinivas Girigowda98530492015-11-20 17:39:24 -08005340 &pSession->connectedProfile.bssid);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005341
5342 msg.type = WMA_8023_MULTICAST_LIST_REQ;
5343 msg.reserved = 0;
5344 msg.bodyptr = request_buf;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05305345 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
5346 sessionId, msg.type));
gaurank kathpalia36b0c582018-08-28 17:45:43 +05305347 if (QDF_STATUS_SUCCESS != scheduler_post_message(QDF_MODULE_ID_SME,
5348 QDF_MODULE_ID_WMA,
5349 QDF_MODULE_ID_WMA,
5350 &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305351 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305352 "%s: Not able to post WMA_8023_MULTICAST_LIST message to WMA",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005353 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305354 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305355 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005356 }
5357
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305358 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005359}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005360#endif /* WLAN_FEATURE_PACKET_FILTERING */
5361
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305362/*
5363 * sme_is_channel_valid() -
5364 * To check if the channel is valid for currently established domain
5365 * This is a synchronous API.
5366 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005367 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305368 * channel - channel to verify
5369 * Return true/false, true if channel is valid
5370 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005371bool sme_is_channel_valid(mac_handle_t mac_handle, uint8_t channel)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005372{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305373 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005374 bool valid = false;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005375 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005376
Jeff Johnson01f2c232018-11-21 19:17:44 -08005377 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305378 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005379
Jeff Johnson01f2c232018-11-21 19:17:44 -08005380 valid = csr_roam_is_channel_valid(mac, channel);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005381
Jeff Johnson01f2c232018-11-21 19:17:44 -08005382 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005383 }
5384
5385 return valid;
5386}
5387
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305388/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305389 * sme_get_freq_band() -
5390 * Used to get the current band settings.
5391 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005392 * mac_handle
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305393 * pBand pointer to hold band value
5394 * Return QDF_STATUS
5395 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005396QDF_STATUS sme_get_freq_band(mac_handle_t mac_handle, enum band_info *pBand)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005397{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305398 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005399 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005400
Jeff Johnson01f2c232018-11-21 19:17:44 -08005401 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305402 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08005403 *pBand = csr_get_current_band(mac);
5404 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005405 }
5406 return status;
5407}
5408
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305409/*
5410 * sme_set_max_tx_power_per_band() -
5411 * Set the Maximum Transmit Power specific to band dynamically.
5412 * Note: this setting will not persist over reboots.
5413 *
5414 * band
5415 * power to set in dB
5416 * Return QDF_STATUS
5417 */
Varun Reddy Yeturua48bc412017-11-17 15:33:35 -08005418QDF_STATUS sme_set_max_tx_power_per_band(enum band_info band, int8_t dB)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005419{
Rajeev Kumar37d478b2017-04-17 16:59:28 -07005420 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005421 tpMaxTxPowerPerBandParams pMaxTxPowerPerBandParams = NULL;
5422
5423 pMaxTxPowerPerBandParams =
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305424 qdf_mem_malloc(sizeof(tMaxTxPowerPerBandParams));
Arif Hussain0ef77082018-10-10 16:42:53 -07005425 if (!pMaxTxPowerPerBandParams)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305426 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005427
5428 pMaxTxPowerPerBandParams->power = dB;
5429 pMaxTxPowerPerBandParams->bandInfo = band;
5430
5431 msg.type = WMA_SET_MAX_TX_POWER_PER_BAND_REQ;
5432 msg.reserved = 0;
5433 msg.bodyptr = pMaxTxPowerPerBandParams;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05305434 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
5435 NO_SESSION, msg.type));
gaurank kathpalia36b0c582018-08-28 17:45:43 +05305436 if (QDF_STATUS_SUCCESS != scheduler_post_message(QDF_MODULE_ID_SME,
5437 QDF_MODULE_ID_WMA,
5438 QDF_MODULE_ID_WMA,
5439 &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305440 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005441 "%s:Not able to post WMA_SET_MAX_TX_POWER_PER_BAND_REQ",
5442 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305443 qdf_mem_free(pMaxTxPowerPerBandParams);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305444 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005445 }
5446
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305447 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005448}
5449
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305450/*
5451 * sme_set_max_tx_power() -
5452 * Set the Maximum Transmit Power dynamically. Note: this setting will
5453 * not persist over reboots.
5454 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005455 * mac_handle
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305456 * pBssid BSSID to set the power cap for
5457 * pBssid pSelfMacAddress self MAC Address
5458 * pBssid power to set in dB
5459 * Return QDF_STATUS
5460 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005461QDF_STATUS sme_set_max_tx_power(mac_handle_t mac_handle,
5462 struct qdf_mac_addr pBssid,
Anurag Chouhan6d760662016-02-20 16:05:43 +05305463 struct qdf_mac_addr pSelfMacAddress, int8_t dB)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005464{
Rajeev Kumar37d478b2017-04-17 16:59:28 -07005465 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005466 tpMaxTxPowerParams pMaxTxParams = NULL;
5467
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305468 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005469 TRACE_CODE_SME_RX_HDD_SET_MAXTXPOW, NO_SESSION, 0));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305470 pMaxTxParams = qdf_mem_malloc(sizeof(tMaxTxPowerParams));
Arif Hussain0ef77082018-10-10 16:42:53 -07005471 if (!pMaxTxParams)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305472 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005473
Anurag Chouhanc5548422016-02-24 18:33:27 +05305474 qdf_copy_macaddr(&pMaxTxParams->bssId, &pBssid);
5475 qdf_copy_macaddr(&pMaxTxParams->selfStaMacAddr, &pSelfMacAddress);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005476 pMaxTxParams->power = dB;
5477
5478 msg.type = WMA_SET_MAX_TX_POWER_REQ;
5479 msg.reserved = 0;
5480 msg.bodyptr = pMaxTxParams;
5481
gaurank kathpalia36b0c582018-08-28 17:45:43 +05305482 if (QDF_STATUS_SUCCESS != scheduler_post_message(QDF_MODULE_ID_SME,
5483 QDF_MODULE_ID_WMA,
5484 QDF_MODULE_ID_WMA,
5485 &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305486 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005487 "%s: Not able to post WMA_SET_MAX_TX_POWER_REQ message to WMA",
5488 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305489 qdf_mem_free(pMaxTxParams);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305490 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005491 }
5492
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305493 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005494}
5495
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305496/*
5497 * sme_set_custom_mac_addr() -
5498 * Set the customer Mac Address.
5499 *
5500 * customMacAddr customer MAC Address
5501 * Return QDF_STATUS
5502 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305503QDF_STATUS sme_set_custom_mac_addr(tSirMacAddr customMacAddr)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005504{
Rajeev Kumar37d478b2017-04-17 16:59:28 -07005505 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005506 tSirMacAddr *pBaseMacAddr;
5507
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305508 pBaseMacAddr = qdf_mem_malloc(sizeof(tSirMacAddr));
Arif Hussain0ef77082018-10-10 16:42:53 -07005509 if (!pBaseMacAddr)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305510 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005511
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305512 qdf_mem_copy(*pBaseMacAddr, customMacAddr, sizeof(tSirMacAddr));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005513
5514 msg.type = SIR_HAL_SET_BASE_MACADDR_IND;
5515 msg.reserved = 0;
5516 msg.bodyptr = pBaseMacAddr;
5517
gaurank kathpalia36b0c582018-08-28 17:45:43 +05305518 if (QDF_STATUS_SUCCESS != scheduler_post_message(QDF_MODULE_ID_SME,
5519 QDF_MODULE_ID_WMA,
5520 QDF_MODULE_ID_WMA,
5521 &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305522 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305523 "Not able to post SIR_HAL_SET_BASE_MACADDR_IND message to WMA");
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305524 qdf_mem_free(pBaseMacAddr);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305525 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005526 }
5527
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305528 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005529}
5530
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305531/*
5532 * sme_set_tx_power() -
5533 * Set Transmit Power dynamically.
5534 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005535 * mac_handle
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305536 * sessionId Target Session ID
5537 * BSSID
5538 * dev_mode dev_mode such as station, P2PGO, SAP
5539 * dBm power to set
5540 * Return QDF_STATUS
5541 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005542QDF_STATUS sme_set_tx_power(mac_handle_t mac_handle, uint8_t sessionId,
Anurag Chouhan6d760662016-02-20 16:05:43 +05305543 struct qdf_mac_addr pBSSId,
Jeff Johnsonc1e62782017-11-09 09:50:17 -08005544 enum QDF_OPMODE dev_mode, int dBm)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005545{
Rajeev Kumar37d478b2017-04-17 16:59:28 -07005546 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005547 tpMaxTxPowerParams pTxParams = NULL;
5548 int8_t power = (int8_t) dBm;
5549
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305550 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005551 TRACE_CODE_SME_RX_HDD_SET_TXPOW, sessionId, 0));
5552
5553 /* make sure there is no overflow */
5554 if ((int)power != dBm) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305555 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005556 "%s: error, invalid power = %d", __func__, dBm);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305557 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005558 }
5559
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305560 pTxParams = qdf_mem_malloc(sizeof(tMaxTxPowerParams));
Arif Hussain0ef77082018-10-10 16:42:53 -07005561 if (!pTxParams)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305562 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005563
Anurag Chouhanc5548422016-02-24 18:33:27 +05305564 qdf_copy_macaddr(&pTxParams->bssId, &pBSSId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005565 pTxParams->power = power; /* unit is dBm */
5566 pTxParams->dev_mode = dev_mode;
5567 msg.type = WMA_SET_TX_POWER_REQ;
5568 msg.reserved = 0;
5569 msg.bodyptr = pTxParams;
5570
gaurank kathpalia36b0c582018-08-28 17:45:43 +05305571 if (QDF_STATUS_SUCCESS != scheduler_post_message(QDF_MODULE_ID_SME,
5572 QDF_MODULE_ID_WMA,
5573 QDF_MODULE_ID_WMA,
5574 &msg)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305575 qdf_mem_free(pTxParams);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305576 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005577 }
5578
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305579 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005580}
5581
Jeff Johnsonc7309062018-11-09 20:59:42 -08005582QDF_STATUS sme_update_session_param(mac_handle_t mac_handle, uint8_t session_id,
5583 uint32_t param_type, uint32_t param_val)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005584{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305585 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005586 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005587 uint16_t len;
5588
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05305589 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305590 if (QDF_IS_STATUS_SUCCESS(status)) {
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05305591 struct sir_update_session_param *msg;
gaurank kathpalia14e2f912017-08-31 14:51:45 +05305592 struct csr_roam_session *session = CSR_GET_SESSION(mac_ctx,
5593 session_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005594
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05305595 if (!session) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07005596 sme_err("Session: %d not found", session_id);
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05305597 sme_release_global_lock(&mac_ctx->sme);
5598 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005599 }
5600
Selvaraj, Sridhar5b5a0652017-05-04 11:23:07 +05305601 if (param_type == SIR_PARAM_IGNORE_ASSOC_DISALLOWED)
5602 mac_ctx->ignore_assoc_disallowed = param_val;
5603
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05305604 if (!session->sessionActive)
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305605 QDF_ASSERT(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005606
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05305607 len = sizeof(*msg);
5608 msg = qdf_mem_malloc(len);
5609 if (!msg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305610 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005611 else {
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05305612 msg->message_type = eWNI_SME_SESSION_UPDATE_PARAM;
5613 msg->length = len;
5614 msg->session_id = session_id;
5615 msg->param_type = param_type;
5616 msg->param_val = param_val;
Rajeev Kumard138ac52017-01-30 18:38:37 -08005617 status = umac_send_mb_message_to_mac(msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005618 }
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05305619 sme_release_global_lock(&mac_ctx->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005620 }
5621 return status;
5622}
5623
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305624/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305625 * sme_update_roam_scan_n_probes() -
5626 * Function to update roam scan N probes
5627 * This function is called through dynamic setConfig callback function
5628 * to update roam scan N probes
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08005629 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305630 * sessionId - Session Identifier
5631 * nProbes number of probe requests to be sent out
5632 * Return Success or failure
5633 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005634QDF_STATUS sme_update_roam_scan_n_probes(mac_handle_t mac_handle,
5635 uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005636 const uint8_t nProbes)
5637{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005638 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305639 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005640
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305641 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005642 TRACE_CODE_SME_RX_HDD_UPDATE_ROAM_SCAN_N_PROBES,
5643 NO_SESSION, 0));
Jeff Johnson01f2c232018-11-21 19:17:44 -08005644 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305645 if (QDF_IS_STATUS_SUCCESS(status)) {
Abhishek Singhe4a1f882017-08-10 17:59:44 +05305646 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005647 "%s: gRoamScanNProbes is changed from %d to %d",
Wu Gao51a63562018-11-08 16:29:10 +08005648 __func__, mac->mlme_cfg->lfr.roam_scan_n_probes,
5649 nProbes);
5650 mac->mlme_cfg->lfr.roam_scan_n_probes = nProbes;
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05305651
Wu Gao51a63562018-11-08 16:29:10 +08005652 if (mac->mlme_cfg->lfr.roam_scan_offload_enabled) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08005653 csr_roam_offload_scan(mac, sessionId,
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05305654 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
5655 REASON_NPROBES_CHANGED);
5656 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08005657 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005658 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005659 return status;
5660}
5661
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305662/*
5663 * sme_update_roam_scan_home_away_time() -
5664 * Function to update roam scan Home away time
5665 * This function is called through dynamic setConfig callback function
5666 * to update roam scan home away time
5667 *
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08005668 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305669 * sessionId - Session Identifier
5670 * nRoamScanAwayTime Scan home away time
5671 * bSendOffloadCmd If true then send offload command to firmware
5672 * If false then command is not sent to firmware
5673 * Return Success or failure
5674 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005675QDF_STATUS sme_update_roam_scan_home_away_time(
5676 mac_handle_t mac_handle,
5677 uint8_t sessionId,
5678 const uint16_t nRoamScanHomeAwayTime,
5679 const bool bSendOffloadCmd)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005680{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005681 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305682 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005683
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305684 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005685 TRACE_CODE_SME_RX_HDD_UPDATE_ROAM_SCAN_HOME_AWAY_TIME,
5686 NO_SESSION, 0));
Jeff Johnson01f2c232018-11-21 19:17:44 -08005687 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305688 if (QDF_IS_STATUS_SUCCESS(status)) {
Abhishek Singhe4a1f882017-08-10 17:59:44 +05305689 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005690 "%s: gRoamScanHomeAwayTime is changed from %d to %d",
5691 __func__,
Wu Gao51a63562018-11-08 16:29:10 +08005692 mac->mlme_cfg->lfr.roam_scan_home_away_time,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005693 nRoamScanHomeAwayTime);
Wu Gao51a63562018-11-08 16:29:10 +08005694 mac->mlme_cfg->lfr.roam_scan_home_away_time =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005695 nRoamScanHomeAwayTime;
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05305696
Wu Gao51a63562018-11-08 16:29:10 +08005697 if (mac->mlme_cfg->lfr.roam_scan_offload_enabled &&
5698 bSendOffloadCmd) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08005699 csr_roam_offload_scan(mac, sessionId,
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05305700 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
5701 REASON_HOME_AWAY_TIME_CHANGED);
5702 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08005703 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005704 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005705 return status;
5706}
5707
Abhishek Singh518323d2015-10-19 17:42:01 +05305708/**
5709 * sme_ext_change_channel()- function to post send ECSA
5710 * action frame to csr.
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08005711 * @mac_handle: Opaque handle to the global MAC context
Abhishek Singh518323d2015-10-19 17:42:01 +05305712 * @channel: new channel to switch
5713 * @session_id: senssion it should be sent on.
5714 *
5715 * This function is called to post ECSA frame to csr.
5716 *
5717 * Return: success if msg is sent else return failure
5718 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005719QDF_STATUS sme_ext_change_channel(mac_handle_t mac_handle, uint32_t channel,
Abhishek Singh518323d2015-10-19 17:42:01 +05305720 uint8_t session_id)
5721{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305722 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005723 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Abhishek Singh518323d2015-10-19 17:42:01 +05305724 uint8_t channel_state;
5725
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07005726 sme_err("Set Channel: %d", channel);
Abhishek Singh518323d2015-10-19 17:42:01 +05305727 channel_state =
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07005728 wlan_reg_get_channel_state(mac_ctx->pdev, channel);
Abhishek Singh518323d2015-10-19 17:42:01 +05305729
5730 if (CHANNEL_STATE_DISABLE == channel_state) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07005731 sme_err("Invalid channel: %d", channel);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305732 return QDF_STATUS_E_INVAL;
Abhishek Singh518323d2015-10-19 17:42:01 +05305733 }
5734
5735 status = sme_acquire_global_lock(&mac_ctx->sme);
5736
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305737 if (QDF_STATUS_SUCCESS == status) {
Abhishek Singh518323d2015-10-19 17:42:01 +05305738 /* update the channel list to the firmware */
5739 status = csr_send_ext_change_channel(mac_ctx,
5740 channel, session_id);
5741 sme_release_global_lock(&mac_ctx->sme);
5742 }
5743
5744 return status;
5745}
5746
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305747/*
5748 * sme_get_roam_intra_band() -
5749 * get Intra band roaming
5750 *
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08005751 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305752 * Return Success or failure
5753 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005754bool sme_get_roam_intra_band(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005755{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005756 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305757
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305758 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005759 TRACE_CODE_SME_RX_HDD_GET_ROAMIBAND, NO_SESSION, 0));
Wu Gao51a63562018-11-08 16:29:10 +08005760
5761 return mac->mlme_cfg->lfr.roam_intra_band;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005762}
5763
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305764/*
5765 * sme_get_roam_scan_n_probes() -
5766 * get N Probes
5767 *
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08005768 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305769 * Return Success or failure
5770 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005771uint8_t sme_get_roam_scan_n_probes(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005772{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005773 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305774
Wu Gao51a63562018-11-08 16:29:10 +08005775 return mac->mlme_cfg->lfr.roam_scan_n_probes;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005776}
5777
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305778/*
5779 * sme_get_roam_scan_home_away_time() -
5780 * get Roam scan home away time
5781 *
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08005782 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305783 * Return Success or failure
5784 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005785uint16_t sme_get_roam_scan_home_away_time(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005786{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005787 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305788
Wu Gao51a63562018-11-08 16:29:10 +08005789 return mac->mlme_cfg->lfr.roam_scan_home_away_time;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005790}
5791
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305792/*
5793 * sme_update_roam_rssi_diff() -
5794 * Update RoamRssiDiff
5795 * This function is called through dynamic setConfig callback function
5796 * to configure RoamRssiDiff
5797 * Usage: adb shell iwpriv wlan0 setConfig RoamRssiDiff=[0 .. 125]
5798 *
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08005799 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305800 * sessionId - Session Identifier
5801 * RoamRssiDiff - minimum rssi difference between potential
5802 * candidate and current AP.
5803 * Return Success or failure
5804 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005805
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005806QDF_STATUS sme_update_roam_rssi_diff(mac_handle_t mac_handle, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005807 uint8_t RoamRssiDiff)
5808{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005809 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305810 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005811
Dustin Brownad06be62019-02-04 14:52:56 -08005812 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08005813 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
5814 FL("Invalid sme session id: %d"), sessionId);
5815 return QDF_STATUS_E_INVAL;
5816 }
5817
Jeff Johnson01f2c232018-11-21 19:17:44 -08005818 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305819 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305820 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005821 "LFR runtime successfully set roam rssi diff to %d - old value is %d - roam state is %s",
5822 RoamRssiDiff,
Wu Gao51a63562018-11-08 16:29:10 +08005823 mac->mlme_cfg->lfr.roam_rssi_diff,
Jeff Johnson01f2c232018-11-21 19:17:44 -08005824 mac_trace_get_neighbour_roam_state(mac->roam.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005825 neighborRoamInfo
5826 [sessionId].
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305827 neighborRoamState));
Wu Gao51a63562018-11-08 16:29:10 +08005828 mac->mlme_cfg->lfr.roam_rssi_diff = RoamRssiDiff;
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05305829
Wu Gao51a63562018-11-08 16:29:10 +08005830 if (mac->mlme_cfg->lfr.roam_scan_offload_enabled)
Jeff Johnson01f2c232018-11-21 19:17:44 -08005831 csr_roam_offload_scan(mac, sessionId,
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05305832 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
5833 REASON_RSSI_DIFF_CHANGED);
5834
Jeff Johnson01f2c232018-11-21 19:17:44 -08005835 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005836 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005837 return status;
5838}
5839
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05305840#ifdef WLAN_FEATURE_FILS_SK
Jeff Johnsonc7309062018-11-09 20:59:42 -08005841QDF_STATUS sme_update_fils_config(mac_handle_t mac_handle, uint8_t session_id,
Jeff Johnson66ee8a92018-03-17 15:24:26 -07005842 struct csr_roam_profile *src_profile)
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05305843{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005844 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05305845 QDF_STATUS status = QDF_STATUS_SUCCESS;
5846 tpCsrNeighborRoamControlInfo neighbor_roam_info =
5847 &mac->roam.neighborRoamInfo[session_id];
5848
Dustin Brownad06be62019-02-04 14:52:56 -08005849 if (session_id >= WLAN_MAX_VDEVS) {
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05305850 sme_err("Invalid sme session id: %d", session_id);
5851 return QDF_STATUS_E_INVAL;
5852 }
5853
5854 if (!src_profile) {
5855 sme_err("src roam profile NULL");
5856 return QDF_STATUS_E_INVAL;
5857 }
5858
Wu Gao51a63562018-11-08 16:29:10 +08005859 if (!mac->mlme_cfg->lfr.lfr_enabled ||
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05305860 (neighbor_roam_info->neighborRoamState !=
5861 eCSR_NEIGHBOR_ROAM_STATE_CONNECTED)) {
5862 sme_info("Fast roam is disabled or not connected(%d)",
5863 neighbor_roam_info->neighborRoamState);
5864 return QDF_STATUS_E_PERM;
5865 }
5866
5867 csr_update_fils_config(mac, session_id, src_profile);
Jianmin Zhubf845932018-12-17 11:52:50 +08005868 if (csr_is_roam_offload_enabled(mac)) {
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05305869 status = sme_acquire_global_lock(&mac->sme);
5870 if (QDF_IS_STATUS_SUCCESS(status)) {
5871 sme_debug("Updating fils config to fw");
5872 csr_roam_offload_scan(mac, session_id,
5873 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
5874 REASON_FILS_PARAMS_CHANGED);
5875 sme_release_global_lock(&mac->sme);
5876 } else {
5877 sme_err("Failed to acquire SME lock");
5878 }
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05305879 } else {
5880 sme_info("LFR3 not enabled");
5881 return QDF_STATUS_E_INVAL;
5882 }
5883
5884 return status;
5885}
5886
Jeff Johnsonc7309062018-11-09 20:59:42 -08005887void sme_send_hlp_ie_info(mac_handle_t mac_handle, uint8_t session_id,
Jeff Johnson66ee8a92018-03-17 15:24:26 -07005888 struct csr_roam_profile *profile, uint32_t if_addr)
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05305889{
5890 int i;
5891 struct scheduler_msg msg;
5892 QDF_STATUS status;
5893 struct hlp_params *params;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005894 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05305895 struct csr_roam_session *session = CSR_GET_SESSION(mac, session_id);
5896 tpCsrNeighborRoamControlInfo neighbor_roam_info =
5897 &mac->roam.neighborRoamInfo[session_id];
5898
5899 if (!session) {
5900 sme_err("session NULL");
5901 return;
5902 }
5903
Wu Gao51a63562018-11-08 16:29:10 +08005904 if (!mac->mlme_cfg->lfr.lfr_enabled ||
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05305905 (neighbor_roam_info->neighborRoamState !=
5906 eCSR_NEIGHBOR_ROAM_STATE_CONNECTED)) {
5907 sme_debug("Fast roam is disabled or not connected(%d)",
5908 neighbor_roam_info->neighborRoamState);
5909 return;
5910 }
5911
5912 params = qdf_mem_malloc(sizeof(*params));
Arif Hussain0ef77082018-10-10 16:42:53 -07005913 if (!params)
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05305914 return;
Arif Hussain0ef77082018-10-10 16:42:53 -07005915
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05305916 if ((profile->hlp_ie_len +
5917 SIR_IPV4_ADDR_LEN) > FILS_MAX_HLP_DATA_LEN) {
5918 sme_err("HLP IE len exceeds %d",
5919 profile->hlp_ie_len);
5920 qdf_mem_free(params);
5921 return;
5922 }
5923
5924 params->vdev_id = session_id;
5925 params->hlp_ie_len = profile->hlp_ie_len + SIR_IPV4_ADDR_LEN;
5926
5927 for (i = 0; i < SIR_IPV4_ADDR_LEN; i++)
5928 params->hlp_ie[i] = (if_addr >> (i * 8)) & 0xFF;
5929
5930 qdf_mem_copy(params->hlp_ie + SIR_IPV4_ADDR_LEN,
5931 profile->hlp_ie, profile->hlp_ie_len);
5932
5933 msg.type = SIR_HAL_HLP_IE_INFO;
5934 msg.reserved = 0;
5935 msg.bodyptr = params;
5936 status = sme_acquire_global_lock(&mac->sme);
5937 if (status != QDF_STATUS_SUCCESS) {
5938 sme_err("sme lock acquire fails");
5939 qdf_mem_free(params);
5940 return;
5941 }
5942
5943 if (!QDF_IS_STATUS_SUCCESS
gaurank kathpalia36b0c582018-08-28 17:45:43 +05305944 (scheduler_post_message(QDF_MODULE_ID_SME,
5945 QDF_MODULE_ID_WMA,
5946 QDF_MODULE_ID_WMA, &msg))) {
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05305947 sme_err("Not able to post WMA_HLP_IE_INFO message to HAL");
5948 sme_release_global_lock(&mac->sme);
5949 qdf_mem_free(params);
5950 return;
5951 }
5952
5953 sme_release_global_lock(&mac->sme);
5954}
5955
Jeff Johnson172237b2017-11-07 15:32:59 -08005956void sme_free_join_rsp_fils_params(struct csr_roam_info *roam_info)
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05305957{
5958 struct fils_join_rsp_params *roam_fils_params;
5959
5960 if (!roam_info) {
5961 sme_err("FILS Roam Info NULL");
5962 return;
5963 }
5964
5965 roam_fils_params = roam_info->fils_join_rsp;
5966 if (!roam_fils_params) {
5967 sme_err("FILS Roam Param NULL");
5968 return;
5969 }
5970
5971 if (roam_fils_params->fils_pmk)
5972 qdf_mem_free(roam_fils_params->fils_pmk);
5973
5974 qdf_mem_free(roam_fils_params);
5975
5976 roam_info->fils_join_rsp = NULL;
5977}
5978
5979#else
Jeff Johnsonc7309062018-11-09 20:59:42 -08005980inline void sme_send_hlp_ie_info(mac_handle_t mac_handle, uint8_t session_id,
Jeff Johnson66ee8a92018-03-17 15:24:26 -07005981 struct csr_roam_profile *profile, uint32_t if_addr)
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05305982{}
5983#endif
5984
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305985/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305986 * sme_update_wes_mode() -
5987 * Update WES Mode
5988 * This function is called through dynamic setConfig callback function
5989 * to configure isWESModeEnabled
5990 *
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08005991 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305992 * isWESModeEnabled - WES mode
5993 * sessionId - Session Identifier
5994 * Return QDF_STATUS_SUCCESS - SME update isWESModeEnabled config successfully.
5995 * Other status means SME is failed to update isWESModeEnabled.
5996 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005997
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005998QDF_STATUS sme_update_wes_mode(mac_handle_t mac_handle, bool isWESModeEnabled,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005999 uint8_t sessionId)
6000{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006001 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306002 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006003
Dustin Brownad06be62019-02-04 14:52:56 -08006004 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08006005 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
6006 FL("Invalid sme session id: %d"), sessionId);
6007 return QDF_STATUS_E_INVAL;
6008 }
6009
Jeff Johnson01f2c232018-11-21 19:17:44 -08006010 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306011 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306012 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006013 "LFR runtime successfully set WES Mode to %d - old value is %d - roam state is %s",
6014 isWESModeEnabled,
Wu Gao51a63562018-11-08 16:29:10 +08006015 mac->mlme_cfg->lfr.wes_mode_enabled,
Jeff Johnson01f2c232018-11-21 19:17:44 -08006016 mac_trace_get_neighbour_roam_state(mac->roam.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006017 neighborRoamInfo
6018 [sessionId].
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306019 neighborRoamState));
Wu Gao51a63562018-11-08 16:29:10 +08006020 mac->mlme_cfg->lfr.wes_mode_enabled = isWESModeEnabled;
Jeff Johnson01f2c232018-11-21 19:17:44 -08006021 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006022 }
6023
6024 return status;
6025}
6026
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306027/*
6028 * sme_set_roam_scan_control() -
6029 * Set roam scan control
6030 * This function is called to set roam scan control
6031 * if roam scan control is set to 0, roaming scan cache is cleared
6032 * any value other than 0 is treated as invalid value
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08006033 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306034 * sessionId - Session Identifier
6035 * Return QDF_STATUS_SUCCESS - SME update config successfully.
6036 * Other status means SME failure to update
6037 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006038QDF_STATUS sme_set_roam_scan_control(mac_handle_t mac_handle, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006039 bool roamScanControl)
6040{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006041 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306042 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006043
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306044 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006045 TRACE_CODE_SME_RX_HDD_SET_SCANCTRL, NO_SESSION, 0));
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08006046
Dustin Brownad06be62019-02-04 14:52:56 -08006047 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08006048 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
6049 FL("Invalid sme session id: %d"), sessionId);
6050 return QDF_STATUS_E_INVAL;
6051 }
6052
Jeff Johnson01f2c232018-11-21 19:17:44 -08006053 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306054 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306055 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006056 "LFR runtime successfully set roam scan control to %d - old value is %d - roam state is %s",
6057 roamScanControl,
Jeff Johnson01f2c232018-11-21 19:17:44 -08006058 mac->roam.configParam.nRoamScanControl,
6059 mac_trace_get_neighbour_roam_state(mac->roam.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006060 neighborRoamInfo
6061 [sessionId].
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306062 neighborRoamState));
Jeff Johnson01f2c232018-11-21 19:17:44 -08006063 mac->roam.configParam.nRoamScanControl = roamScanControl;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006064 if (0 == roamScanControl) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306065 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006066 "LFR runtime successfully cleared roam scan cache");
Jeff Johnson01f2c232018-11-21 19:17:44 -08006067 csr_flush_cfg_bg_scan_roam_channel_list(mac,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306068 sessionId);
Wu Gao51a63562018-11-08 16:29:10 +08006069 if (mac->mlme_cfg->lfr.roam_scan_offload_enabled) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08006070 csr_roam_offload_scan(mac, sessionId,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306071 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
6072 REASON_FLUSH_CHANNEL_LIST);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006073 }
6074 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08006075 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006076 }
6077 return status;
6078}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006079
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306080/*
6081 * sme_update_is_fast_roam_ini_feature_enabled() - enable/disable LFR
6082 * support at runtime
6083 * It is used at in the REG_DYNAMIC_VARIABLE macro definition of
6084 * isFastRoamIniFeatureEnabled.
6085 * This is a synchronous call
6086 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006087 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306088 * sessionId - Session Identifier
6089 * Return QDF_STATUS_SUCCESS - SME update isFastRoamIniFeatureEnabled config
6090 * successfully.
6091 * Other status means SME is failed to update isFastRoamIniFeatureEnabled.
6092 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006093QDF_STATUS sme_update_is_fast_roam_ini_feature_enabled(mac_handle_t mac_handle,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306094 uint8_t sessionId, const bool isFastRoamIniFeatureEnabled)
6095{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006096 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006097
Wu Gao51a63562018-11-08 16:29:10 +08006098 if (mac->mlme_cfg->lfr.lfr_enabled ==
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006099 isFastRoamIniFeatureEnabled) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306100 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006101 "%s: FastRoam is already enabled or disabled, nothing to do (returning) old(%d) new(%d)",
6102 __func__,
Wu Gao51a63562018-11-08 16:29:10 +08006103 mac->mlme_cfg->lfr.lfr_enabled,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006104 isFastRoamIniFeatureEnabled);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306105 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006106 }
6107
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306108 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006109 "%s: FastRoamEnabled is changed from %d to %d", __func__,
Wu Gao51a63562018-11-08 16:29:10 +08006110 mac->mlme_cfg->lfr.lfr_enabled,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006111 isFastRoamIniFeatureEnabled);
Wu Gao51a63562018-11-08 16:29:10 +08006112 mac->mlme_cfg->lfr.lfr_enabled = isFastRoamIniFeatureEnabled;
Jeff Johnson01f2c232018-11-21 19:17:44 -08006113 csr_neighbor_roam_update_fast_roaming_enabled(mac, sessionId,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306114 isFastRoamIniFeatureEnabled);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006115
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306116 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006117}
6118
Mukul Sharma69c44cd2016-09-12 18:33:57 +05306119/**
6120 * sme_config_fast_roaming() - enable/disable LFR support at runtime
Jeff Johnsonc7309062018-11-09 20:59:42 -08006121 * @mac_handle - The handle returned by macOpen.
Mukul Sharma69c44cd2016-09-12 18:33:57 +05306122 * @session_id - Session Identifier
6123 * @is_fast_roam_enabled - flag to enable/disable roaming
6124 *
6125 * When Supplicant issues enabled/disable fast roaming on the basis
6126 * of the Bssid modification in network block (e.g. AutoJoin mode N/W block)
6127 *
6128 * Return: QDF_STATUS
6129 */
6130
Jeff Johnsonc7309062018-11-09 20:59:42 -08006131QDF_STATUS sme_config_fast_roaming(mac_handle_t mac_handle, uint8_t session_id,
Mukul Sharma69c44cd2016-09-12 18:33:57 +05306132 const bool is_fast_roam_enabled)
6133{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006134 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
gaurank kathpalia14e2f912017-08-31 14:51:45 +05306135 struct csr_roam_session *session = CSR_GET_SESSION(mac_ctx, session_id);
Mukul Sharma69c44cd2016-09-12 18:33:57 +05306136 QDF_STATUS status;
6137
Varun Reddy Yeturue5a35d12017-10-20 11:26:57 -07006138 /*
6139 * supplicant_disabled_roaming flag is set to true in
6140 * wlan_hdd_cfg80211_connect_start when supplicant initiate connect
6141 * request with BSSID. This flag is reset when supplicant sends
6142 * vendor command to enable roaming after association.
Arif Hussaina48a9c02017-01-31 14:37:45 -08006143 *
6144 * This request from wpa_supplicant will be skipped in this function
Varun Reddy Yeturue5a35d12017-10-20 11:26:57 -07006145 * if roaming is disabled using driver command or INI and
6146 * supplicant_disabled_roaming flag remains set. So make sure to set
6147 * supplicant_disabled_roaming flag as per wpa_supplicant even if roam
6148 * request from wpa_supplicant ignored.
Arif Hussaina48a9c02017-01-31 14:37:45 -08006149 */
6150 if (session && session->pCurRoamProfile)
Varun Reddy Yeturue5a35d12017-10-20 11:26:57 -07006151 session->pCurRoamProfile->supplicant_disabled_roaming =
6152 !is_fast_roam_enabled;
Arif Hussaina48a9c02017-01-31 14:37:45 -08006153
Wu Gao51a63562018-11-08 16:29:10 +08006154 if (!mac_ctx->mlme_cfg->lfr.lfr_enabled) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07006155 sme_debug("Fast roam is disabled through ini");
Mukul Sharma69c44cd2016-09-12 18:33:57 +05306156 if (!is_fast_roam_enabled)
6157 return QDF_STATUS_SUCCESS;
6158 return QDF_STATUS_E_FAILURE;
6159 }
Sreelakshmi Konamkibda5bbf2016-09-12 18:38:10 +05306160
Mukul Sharma69c44cd2016-09-12 18:33:57 +05306161 status = csr_neighbor_roam_update_fast_roaming_enabled(mac_ctx,
6162 session_id, is_fast_roam_enabled);
6163 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07006164 sme_err("update fast roaming failed. status: %d", status);
Mukul Sharma69c44cd2016-09-12 18:33:57 +05306165 return QDF_STATUS_E_FAILURE;
6166 }
6167
6168 return QDF_STATUS_SUCCESS;
6169}
6170
Kiran Kumar Lokere7d6e4c92018-09-19 13:45:47 -07006171#ifdef FEATURE_WLAN_ESE
6172int sme_add_key_krk(mac_handle_t mac_handle, uint8_t session_id,
6173 const uint8_t *key, const int key_len)
6174{
6175 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
6176 struct csr_roam_session *session;
6177
6178 if (key_len < SIR_KRK_KEY_LEN) {
6179 sme_warn("Invalid KRK keylength [= %d]", key_len);
6180 return -EINVAL;
6181 }
6182
6183 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
6184 sme_err("incorrect session/vdev ID");
6185 return -EINVAL;
6186 }
6187
6188 session = CSR_GET_SESSION(mac_ctx, session_id);
6189
6190 qdf_mem_copy(session->eseCckmInfo.krk, key, SIR_KRK_KEY_LEN);
6191 session->eseCckmInfo.reassoc_req_num = 1;
6192 session->eseCckmInfo.krk_plumbed = true;
6193
6194 return 0;
6195}
6196
6197int sme_add_key_btk(mac_handle_t mac_handle, uint8_t session_id,
6198 const uint8_t *key, const int key_len)
6199{
6200 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
6201 struct csr_roam_session *session;
6202
6203 if (key_len < SIR_BTK_KEY_LEN) {
6204 sme_warn("Invalid BTK keylength [= %d]", key_len);
6205 return -EINVAL;
6206 }
6207
6208 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
6209 sme_err("incorrect session/vdev ID");
6210 return -EINVAL;
6211 }
6212
6213 session = CSR_GET_SESSION(mac_ctx, session_id);
6214
6215 qdf_mem_copy(session->eseCckmInfo.btk, key, SIR_BTK_KEY_LEN);
6216 /*
6217 * KRK and BTK are updated by upper layer back to back. Send
6218 * updated KRK and BTK together to FW here.
6219 */
6220 csr_roam_offload_scan(mac_ctx, session_id,
6221 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
6222 REASON_ROAM_PSK_PMK_CHANGED);
6223
6224 return 0;
6225}
6226#endif
6227
Varun Reddy Yeturu66899fe2017-07-11 14:00:12 -07006228/**
6229 * sme_stop_roaming() - Stop roaming for a given sessionId
6230 * This is a synchronous call
6231 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006232 * @mac_handle - The handle returned by mac_open
Varun Reddy Yeturu66899fe2017-07-11 14:00:12 -07006233 * @sessionId - Session Identifier
6234 *
6235 * Return QDF_STATUS_SUCCESS on success
6236 * Other status on failure
6237 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006238QDF_STATUS sme_stop_roaming(mac_handle_t mac_handle, uint8_t session_id,
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08006239 uint8_t reason)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006240{
Naveen Rawat5c35ae42017-04-18 15:35:07 -07006241 struct scheduler_msg wma_msg = {0};
Jeff Johnsonc09caa42018-06-07 22:58:55 -07006242 QDF_STATUS status;
Jeff Johnsone6da4b02019-02-06 22:22:04 -08006243 struct roam_offload_scan_req *req;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006244 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Varun Reddy Yeturu66899fe2017-07-11 14:00:12 -07006245 tpCsrNeighborRoamControlInfo roam_info;
Varun Reddy Yeturue5a35d12017-10-20 11:26:57 -07006246 struct csr_roam_session *session;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006247
Varun Reddy Yeturu66899fe2017-07-11 14:00:12 -07006248 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
Naveen Rawat5c35ae42017-04-18 15:35:07 -07006249 sme_err("incorrect session/vdev ID");
6250 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006251 }
Varun Reddy Yeturue5a35d12017-10-20 11:26:57 -07006252
6253 session = CSR_GET_SESSION(mac_ctx, session_id);
Abhishek Singh1f217ec2017-12-22 11:48:27 +05306254
Padma, Santhosh Kumar86747ec2018-05-29 18:28:29 +05306255 /*
6256 * set the driver_disabled_roaming flag to true even if roaming
6257 * is not enabled on this session so that roam start requests for
6258 * this session can be blocked until driver enables roaming
6259 */
Vignesh Viswanathan3d478032018-08-02 20:18:53 +05306260 if (reason == ecsr_driver_disabled && session->pCurRoamProfile &&
6261 session->pCurRoamProfile->csrPersona == QDF_STA_MODE) {
Padma, Santhosh Kumar86747ec2018-05-29 18:28:29 +05306262 session->pCurRoamProfile->driver_disabled_roaming = true;
6263 sme_debug("driver_disabled_roaming set for session %d",
6264 session_id);
6265 }
6266
Abhishek Singh1f217ec2017-12-22 11:48:27 +05306267 roam_info = &mac_ctx->roam.neighborRoamInfo[session_id];
6268 if (!roam_info->b_roam_scan_offload_started) {
6269 sme_debug("Roaming already disabled for session %d", session_id);
Varun Reddy Yeturue5a35d12017-10-20 11:26:57 -07006270 return QDF_STATUS_SUCCESS;
6271 }
Naveen Rawat5c35ae42017-04-18 15:35:07 -07006272 req = qdf_mem_malloc(sizeof(*req));
Arif Hussain0ef77082018-10-10 16:42:53 -07006273 if (!req)
Naveen Rawat5c35ae42017-04-18 15:35:07 -07006274 return QDF_STATUS_E_NOMEM;
Naveen Rawat5c35ae42017-04-18 15:35:07 -07006275
6276 req->Command = ROAM_SCAN_OFFLOAD_STOP;
Padma, Santhosh Kumar86747ec2018-05-29 18:28:29 +05306277 if ((reason == eCsrForcedDisassoc) || reason == ecsr_driver_disabled)
Abhishek Singh533c9da2017-05-04 10:23:34 +05306278 req->reason = REASON_ROAM_STOP_ALL;
6279 else
Varun Reddy Yeturubc1bea02018-02-01 18:12:34 -08006280 req->reason = REASON_SME_ISSUED;
Varun Reddy Yeturu66899fe2017-07-11 14:00:12 -07006281 req->sessionId = session_id;
6282 if (csr_neighbor_middle_of_roaming(mac_ctx, session_id))
Naveen Rawat5c35ae42017-04-18 15:35:07 -07006283 req->middle_of_roaming = 1;
6284 else
6285 csr_roam_reset_roam_params(mac_ctx);
6286
6287 wma_msg.type = WMA_ROAM_SCAN_OFFLOAD_REQ;
6288 wma_msg.bodyptr = req;
6289
6290 status = wma_post_ctrl_msg(mac_ctx, &wma_msg);
Jeff Johnsonc09caa42018-06-07 22:58:55 -07006291 if (QDF_STATUS_SUCCESS != status) {
Naveen Rawat5c35ae42017-04-18 15:35:07 -07006292 sme_err("WMA_ROAM_SCAN_OFFLOAD_REQ failed, session_id: %d",
Varun Reddy Yeturu66899fe2017-07-11 14:00:12 -07006293 session_id);
Naveen Rawat5c35ae42017-04-18 15:35:07 -07006294 qdf_mem_free(req);
6295 return QDF_STATUS_E_FAULT;
6296 }
Varun Reddy Yeturu66899fe2017-07-11 14:00:12 -07006297 roam_info->b_roam_scan_offload_started = false;
6298 roam_info->last_sent_cmd = ROAM_SCAN_OFFLOAD_STOP;
Naveen Rawat5c35ae42017-04-18 15:35:07 -07006299
6300 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006301}
6302
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306303/*
6304 * sme_start_roaming() - Start roaming for a given sessionId
6305 * This is a synchronous call
6306 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006307 * mac_handle - The handle returned by mac_open
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306308 * sessionId - Session Identifier
6309 * Return QDF_STATUS_SUCCESS on success
6310 * Other status on failure
6311 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006312QDF_STATUS sme_start_roaming(mac_handle_t mac_handle, uint8_t sessionId,
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08006313 uint8_t reason)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006314{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006315 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306316 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006317
Jeff Johnson01f2c232018-11-21 19:17:44 -08006318 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306319 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08006320 csr_roam_offload_scan(mac, sessionId, ROAM_SCAN_OFFLOAD_START,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006321 reason);
Jeff Johnson01f2c232018-11-21 19:17:44 -08006322 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006323 }
6324
6325 return status;
6326}
6327
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306328/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306329 * sme_set_roam_opportunistic_scan_threshold_diff() -
6330 * Update Opportunistic Scan threshold diff
6331 * This function is called through dynamic setConfig callback function
6332 * to configure nOpportunisticThresholdDiff
6333 *
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08006334 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306335 * sessionId - Session Identifier
6336 * nOpportunisticThresholdDiff - Opportunistic Scan threshold diff
6337 * Return QDF_STATUS_SUCCESS - SME update nOpportunisticThresholdDiff config
6338 * successfully.
6339 * else SME is failed to update nOpportunisticThresholdDiff.
6340 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006341QDF_STATUS sme_set_roam_opportunistic_scan_threshold_diff(
6342 mac_handle_t mac_handle,
6343 uint8_t sessionId,
6344 const uint8_t nOpportunisticThresholdDiff)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006345{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006346 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306347 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006348
Jeff Johnson01f2c232018-11-21 19:17:44 -08006349 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306350 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08006351 status = csr_neighbor_roam_update_config(mac, sessionId,
Varun Reddy Yeturuff4feb02016-04-20 12:26:11 -07006352 nOpportunisticThresholdDiff,
6353 REASON_OPPORTUNISTIC_THRESH_DIFF_CHANGED);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306354 if (QDF_IS_STATUS_SUCCESS(status)) {
Wu Gao51a63562018-11-08 16:29:10 +08006355 mac->mlme_cfg->lfr.opportunistic_scan_threshold_diff =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006356 nOpportunisticThresholdDiff;
6357 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08006358 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006359 }
6360 return status;
6361}
6362
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306363/*
6364 * sme_get_roam_opportunistic_scan_threshold_diff()
6365 * gets Opportunistic Scan threshold diff
6366 * This is a synchronous call
6367 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006368 * mac_handle - The handle returned by mac_open
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306369 * Return uint8_t - nOpportunisticThresholdDiff
6370 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006371uint8_t sme_get_roam_opportunistic_scan_threshold_diff(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006372{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006373 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306374
Wu Gao51a63562018-11-08 16:29:10 +08006375 return mac->mlme_cfg->lfr.opportunistic_scan_threshold_diff;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006376}
6377
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306378/*
6379 * sme_set_roam_rescan_rssi_diff() - Update roam rescan rssi diff
6380 * This function is called through dynamic setConfig callback function
6381 * to configure nRoamRescanRssiDiff
6382 *
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08006383 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306384 * sessionId - Session Identifier
6385 * nRoamRescanRssiDiff - roam rescan rssi diff
6386 * Return QDF_STATUS_SUCCESS - SME update nRoamRescanRssiDiff config
6387 * successfully.
6388 * else SME is failed to update nRoamRescanRssiDiff.
6389 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006390QDF_STATUS sme_set_roam_rescan_rssi_diff(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006391 uint8_t sessionId,
6392 const uint8_t nRoamRescanRssiDiff)
6393{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006394 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306395 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006396
Jeff Johnson01f2c232018-11-21 19:17:44 -08006397 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306398 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08006399 status = csr_neighbor_roam_update_config(mac, sessionId,
Varun Reddy Yeturuff4feb02016-04-20 12:26:11 -07006400 nRoamRescanRssiDiff,
6401 REASON_ROAM_RESCAN_RSSI_DIFF_CHANGED);
Wu Gao51a63562018-11-08 16:29:10 +08006402 if (QDF_IS_STATUS_SUCCESS(status))
6403 mac->mlme_cfg->lfr.roam_rescan_rssi_diff =
6404 nRoamRescanRssiDiff;
6405
Jeff Johnson01f2c232018-11-21 19:17:44 -08006406 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006407 }
6408 return status;
6409}
6410
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306411/*
6412 * sme_get_roam_rescan_rssi_diff()
6413 * gets roam rescan rssi diff
6414 * This is a synchronous call
6415 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006416 * mac_handle - The handle returned by mac_open
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306417 * Return int8_t - nRoamRescanRssiDiff
6418 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006419uint8_t sme_get_roam_rescan_rssi_diff(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006420{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006421 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306422
Wu Gao51a63562018-11-08 16:29:10 +08006423 return mac->mlme_cfg->lfr.roam_rescan_rssi_diff;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006424}
6425
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306426/*
6427 * sme_set_roam_bmiss_first_bcnt() -
6428 * Update Roam count for first beacon miss
6429 * This function is called through dynamic setConfig callback function
6430 * to configure nRoamBmissFirstBcnt
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08006431 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306432 * sessionId - Session Identifier
6433 * nRoamBmissFirstBcnt - Roam first bmiss count
6434 * Return QDF_STATUS_SUCCESS - SME update nRoamBmissFirstBcnt
6435 * successfully.
6436 * else SME is failed to update nRoamBmissFirstBcnt
6437 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006438QDF_STATUS sme_set_roam_bmiss_first_bcnt(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006439 uint8_t sessionId,
6440 const uint8_t nRoamBmissFirstBcnt)
6441{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006442 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306443 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006444
Jeff Johnson01f2c232018-11-21 19:17:44 -08006445 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306446 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08006447 status = csr_neighbor_roam_update_config(mac, sessionId,
Varun Reddy Yeturuff4feb02016-04-20 12:26:11 -07006448 nRoamBmissFirstBcnt,
6449 REASON_ROAM_BMISS_FIRST_BCNT_CHANGED);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306450 if (QDF_IS_STATUS_SUCCESS(status)) {
Wu Gao51a63562018-11-08 16:29:10 +08006451 mac->mlme_cfg->lfr.roam_bmiss_first_bcnt =
6452 nRoamBmissFirstBcnt;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006453 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08006454 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006455 }
6456 return status;
6457}
6458
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306459/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306460 * sme_set_roam_bmiss_final_bcnt() -
6461 * Update Roam count for final beacon miss
6462 * This function is called through dynamic setConfig callback function
6463 * to configure nRoamBmissFinalBcnt
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08006464 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306465 * sessionId - Session Identifier
6466 * nRoamBmissFinalBcnt - Roam final bmiss count
6467 * Return QDF_STATUS_SUCCESS - SME update nRoamBmissFinalBcnt
6468 * successfully.
6469 * else SME is failed to update nRoamBmissFinalBcnt
6470 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006471QDF_STATUS sme_set_roam_bmiss_final_bcnt(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006472 uint8_t sessionId,
6473 const uint8_t nRoamBmissFinalBcnt)
6474{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006475 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306476 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006477
Jeff Johnson01f2c232018-11-21 19:17:44 -08006478 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306479 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08006480 status = csr_neighbor_roam_update_config(mac, sessionId,
Varun Reddy Yeturuff4feb02016-04-20 12:26:11 -07006481 nRoamBmissFinalBcnt,
6482 REASON_ROAM_BMISS_FINAL_BCNT_CHANGED);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306483 if (QDF_IS_STATUS_SUCCESS(status)) {
Wu Gao51a63562018-11-08 16:29:10 +08006484 mac->mlme_cfg->lfr.roam_bmiss_final_bcnt =
6485 nRoamBmissFinalBcnt;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006486 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08006487 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006488 }
6489 return status;
6490}
6491
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306492/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306493 * sme_set_neighbor_lookup_rssi_threshold() - update neighbor lookup
6494 * rssi threshold
6495 * This is a synchronous call
6496 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006497 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306498 * sessionId - Session Identifier
6499 * Return QDF_STATUS_SUCCESS - SME update config successful.
6500 * Other status means SME is failed to update
6501 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006502QDF_STATUS sme_set_neighbor_lookup_rssi_threshold(mac_handle_t mac_handle,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306503 uint8_t sessionId, uint8_t neighborLookupRssiThreshold)
6504{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006505 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306506 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006507
Jeff Johnson01f2c232018-11-21 19:17:44 -08006508 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306509 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08006510 status = csr_neighbor_roam_update_config(mac,
Varun Reddy Yeturuff4feb02016-04-20 12:26:11 -07006511 sessionId, neighborLookupRssiThreshold,
6512 REASON_LOOKUP_THRESH_CHANGED);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306513 if (QDF_IS_STATUS_SUCCESS(status)) {
Wu Gao51a63562018-11-08 16:29:10 +08006514 mac->mlme_cfg->lfr.neighbor_lookup_rssi_threshold =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006515 neighborLookupRssiThreshold;
6516 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08006517 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006518 }
6519 return status;
6520}
6521
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306522/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306523 * sme_get_neighbor_lookup_rssi_threshold() - get neighbor lookup
6524 * rssi threshold
6525 * This is a synchronous call
6526 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006527 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306528 * Return QDF_STATUS_SUCCESS - SME update config successful.
6529 * Other status means SME is failed to update
6530 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006531uint8_t sme_get_neighbor_lookup_rssi_threshold(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006532{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006533 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306534
Wu Gao51a63562018-11-08 16:29:10 +08006535 return mac->mlme_cfg->lfr.neighbor_lookup_rssi_threshold;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006536}
6537
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306538/*
6539 * sme_set_neighbor_scan_refresh_period() - set neighbor scan results
6540 * refresh period
6541 * This is a synchronous call
6542 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006543 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306544 * sessionId - Session Identifier
6545 * Return QDF_STATUS_SUCCESS - SME update config successful.
6546 * Other status means SME is failed to update
6547 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006548QDF_STATUS sme_set_neighbor_scan_refresh_period(mac_handle_t mac_handle,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306549 uint8_t sessionId, uint16_t neighborScanResultsRefreshPeriod)
6550{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006551 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306552 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006553 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
6554
Dustin Brownad06be62019-02-04 14:52:56 -08006555 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08006556 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
6557 FL("Invalid sme session id: %d"), sessionId);
6558 return QDF_STATUS_E_INVAL;
6559 }
6560
Jeff Johnson01f2c232018-11-21 19:17:44 -08006561 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306562 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08006563 pNeighborRoamInfo = &mac->roam.neighborRoamInfo[sessionId];
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306564 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006565 "LFR runtime successfully set roam scan refresh period to %d- old value is %d - roam state is %s",
6566 neighborScanResultsRefreshPeriod,
Wu Gao51a63562018-11-08 16:29:10 +08006567 mac->mlme_cfg->lfr.
6568 neighbor_scan_results_refresh_period,
Jeff Johnson01f2c232018-11-21 19:17:44 -08006569 mac_trace_get_neighbour_roam_state(mac->roam.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006570 neighborRoamInfo
6571 [sessionId].
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306572 neighborRoamState));
Wu Gao51a63562018-11-08 16:29:10 +08006573 mac->mlme_cfg->lfr.neighbor_scan_results_refresh_period =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006574 neighborScanResultsRefreshPeriod;
6575 pNeighborRoamInfo->cfgParams.neighborResultsRefreshPeriod =
6576 neighborScanResultsRefreshPeriod;
6577
Wu Gao51a63562018-11-08 16:29:10 +08006578 if (mac->mlme_cfg->lfr.roam_scan_offload_enabled) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08006579 csr_roam_offload_scan(mac, sessionId,
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05306580 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
6581 REASON_NEIGHBOR_SCAN_REFRESH_PERIOD_CHANGED);
6582 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08006583 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006584 }
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05306585
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006586 return status;
6587}
6588
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306589/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306590 * sme_get_neighbor_scan_refresh_period() - get neighbor scan results
6591 * refresh period
6592 * This is a synchronous call
6593 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006594 * \param mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306595 * \return uint16_t - Neighbor scan results refresh period value
6596 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006597uint16_t sme_get_neighbor_scan_refresh_period(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006598{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006599 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306600
Wu Gao51a63562018-11-08 16:29:10 +08006601 return mac->mlme_cfg->lfr.neighbor_scan_results_refresh_period;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006602}
6603
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306604/*
6605 * sme_get_empty_scan_refresh_period() - get empty scan refresh period
6606 * This is a synchronuous call
6607 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006608 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306609 * Return QDF_STATUS_SUCCESS - SME update config successful.
6610 * Other status means SME is failed to update
6611 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006612uint16_t sme_get_empty_scan_refresh_period(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006613{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006614 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306615
Wu Gao51a63562018-11-08 16:29:10 +08006616 return mac->mlme_cfg->lfr.empty_scan_refresh_period;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006617}
6618
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306619/*
6620 * sme_update_empty_scan_refresh_period
6621 * Update nEmptyScanRefreshPeriod
6622 * This function is called through dynamic setConfig callback function
6623 * to configure nEmptyScanRefreshPeriod
6624 * Usage: adb shell iwpriv wlan0 setConfig
6625 * nEmptyScanRefreshPeriod=[0 .. 60]
6626 *
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08006627 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306628 * sessionId - Session Identifier
6629 * nEmptyScanRefreshPeriod - scan period following empty scan results.
6630 * Return Success or failure
6631 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006632
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006633QDF_STATUS sme_update_empty_scan_refresh_period(mac_handle_t mac_handle,
6634 uint8_t sessionId, uint16_t
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306635 nEmptyScanRefreshPeriod)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006636{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006637 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306638 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006639 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
6640
Dustin Brownad06be62019-02-04 14:52:56 -08006641 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08006642 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
6643 FL("Invalid sme session id: %d"), sessionId);
6644 return QDF_STATUS_E_INVAL;
6645 }
6646
Jeff Johnson01f2c232018-11-21 19:17:44 -08006647 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306648 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08006649 pNeighborRoamInfo = &mac->roam.neighborRoamInfo[sessionId];
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306650 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006651 "LFR runtime successfully set roam scan period to %d -old value is %d - roam state is %s",
6652 nEmptyScanRefreshPeriod,
Wu Gao51a63562018-11-08 16:29:10 +08006653 mac->mlme_cfg->lfr.empty_scan_refresh_period,
Jeff Johnson01f2c232018-11-21 19:17:44 -08006654 mac_trace_get_neighbour_roam_state(mac->roam.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006655 neighborRoamInfo
6656 [sessionId].
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306657 neighborRoamState));
Wu Gao51a63562018-11-08 16:29:10 +08006658 mac->mlme_cfg->lfr.empty_scan_refresh_period =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006659 nEmptyScanRefreshPeriod;
6660 pNeighborRoamInfo->cfgParams.emptyScanRefreshPeriod =
6661 nEmptyScanRefreshPeriod;
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05306662
Wu Gao51a63562018-11-08 16:29:10 +08006663 if (mac->mlme_cfg->lfr.roam_scan_offload_enabled) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08006664 csr_roam_offload_scan(mac, sessionId,
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05306665 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
6666 REASON_EMPTY_SCAN_REF_PERIOD_CHANGED);
6667 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08006668 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006669 }
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05306670
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006671 return status;
6672}
6673
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306674/*
6675 * sme_set_neighbor_scan_min_chan_time() -
6676 * Update nNeighborScanMinChanTime
6677 * This function is called through dynamic setConfig callback function
6678 * to configure gNeighborScanChannelMinTime
6679 * Usage: adb shell iwpriv wlan0 setConfig
6680 * gNeighborScanChannelMinTime=[0 .. 60]
6681 *
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08006682 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306683 * nNeighborScanMinChanTime - Channel minimum dwell time
6684 * sessionId - Session Identifier
6685 * Return Success or failure
6686 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006687QDF_STATUS sme_set_neighbor_scan_min_chan_time(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006688 const uint16_t
6689 nNeighborScanMinChanTime,
6690 uint8_t sessionId)
6691{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006692 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306693 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006694
Dustin Brownad06be62019-02-04 14:52:56 -08006695 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08006696 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
6697 FL("Invalid sme session id: %d"), sessionId);
6698 return QDF_STATUS_E_INVAL;
6699 }
6700
Jeff Johnson01f2c232018-11-21 19:17:44 -08006701 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306702 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306703 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006704 "LFR runtime successfully set channel min dwell time to %d - old value is %d - roam state is %s",
6705 nNeighborScanMinChanTime,
Wu Gao51a63562018-11-08 16:29:10 +08006706 mac->mlme_cfg->lfr.neighbor_scan_min_chan_time,
Jeff Johnson01f2c232018-11-21 19:17:44 -08006707 mac_trace_get_neighbour_roam_state(mac->roam.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006708 neighborRoamInfo
6709 [sessionId].
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306710 neighborRoamState));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006711
Wu Gao51a63562018-11-08 16:29:10 +08006712 mac->mlme_cfg->lfr.neighbor_scan_min_chan_time =
6713 nNeighborScanMinChanTime;
Jeff Johnson01f2c232018-11-21 19:17:44 -08006714 mac->roam.neighborRoamInfo[sessionId].cfgParams.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006715 minChannelScanTime = nNeighborScanMinChanTime;
Jeff Johnson01f2c232018-11-21 19:17:44 -08006716 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006717 }
6718
6719 return status;
6720}
6721
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306722/*
6723 * sme_set_neighbor_scan_max_chan_time() -
6724 * Update nNeighborScanMaxChanTime
6725 * This function is called through dynamic setConfig callback function
6726 * to configure gNeighborScanChannelMaxTime
6727 * Usage: adb shell iwpriv wlan0 setConfig
6728 * gNeighborScanChannelMaxTime=[0 .. 60]
6729 *
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08006730 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306731 * sessionId - Session Identifier
6732 * nNeighborScanMinChanTime - Channel maximum dwell time
6733 * Return Success or failure
6734 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006735QDF_STATUS sme_set_neighbor_scan_max_chan_time(mac_handle_t mac_handle,
6736 uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006737 const uint16_t
6738 nNeighborScanMaxChanTime)
6739{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006740 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306741 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006742 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
6743
Dustin Brownad06be62019-02-04 14:52:56 -08006744 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08006745 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
6746 FL("Invalid sme session id: %d"), sessionId);
6747 return QDF_STATUS_E_INVAL;
6748 }
6749
Jeff Johnson01f2c232018-11-21 19:17:44 -08006750 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306751 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08006752 pNeighborRoamInfo = &mac->roam.neighborRoamInfo[sessionId];
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306753 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006754 "LFR runtime successfully set channel max dwell time to %d - old value is %d - roam state is %s",
6755 nNeighborScanMaxChanTime,
Wu Gao51a63562018-11-08 16:29:10 +08006756 mac->mlme_cfg->lfr.neighbor_scan_max_chan_time,
Jeff Johnson01f2c232018-11-21 19:17:44 -08006757 mac_trace_get_neighbour_roam_state(mac->roam.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006758 neighborRoamInfo
6759 [sessionId].
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306760 neighborRoamState));
Wu Gao51a63562018-11-08 16:29:10 +08006761 mac->mlme_cfg->lfr.neighbor_scan_max_chan_time =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006762 nNeighborScanMaxChanTime;
6763 pNeighborRoamInfo->cfgParams.maxChannelScanTime =
6764 nNeighborScanMaxChanTime;
Wu Gao51a63562018-11-08 16:29:10 +08006765 if (mac->mlme_cfg->lfr.roam_scan_offload_enabled) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08006766 csr_roam_offload_scan(mac, sessionId,
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05306767 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
6768 REASON_SCAN_CH_TIME_CHANGED);
6769 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08006770 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006771 }
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05306772
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006773 return status;
6774}
6775
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306776/*
6777 * sme_get_neighbor_scan_min_chan_time() -
6778 * get neighbor scan min channel time
6779 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006780 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306781 * sessionId - Session Identifier
6782 * Return uint16_t - channel min time value
6783 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006784uint16_t sme_get_neighbor_scan_min_chan_time(mac_handle_t mac_handle,
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08006785 uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006786{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006787 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08006788
Dustin Brownad06be62019-02-04 14:52:56 -08006789 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08006790 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
6791 FL("Invalid sme session id: %d"), sessionId);
6792 return 0;
6793 }
6794
Jeff Johnson01f2c232018-11-21 19:17:44 -08006795 return mac->roam.neighborRoamInfo[sessionId].cfgParams.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006796 minChannelScanTime;
6797}
6798
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306799/*
6800 * sme_get_neighbor_roam_state() -
6801 * get neighbor roam state
6802 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006803 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306804 * sessionId - Session Identifier
6805 * Return uint32_t - neighbor roam state
6806 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006807uint32_t sme_get_neighbor_roam_state(mac_handle_t mac_handle, uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006808{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006809 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08006810
Dustin Brownad06be62019-02-04 14:52:56 -08006811 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08006812 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
6813 FL("Invalid sme session id: %d"), sessionId);
6814 return 0;
6815 }
6816
Jeff Johnson01f2c232018-11-21 19:17:44 -08006817 return mac->roam.neighborRoamInfo[sessionId].neighborRoamState;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006818}
6819
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306820/*
6821 * sme_get_current_roam_state() -
6822 * get current roam state
6823 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006824 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306825 * sessionId - Session Identifier
6826 * Return uint32_t - current roam state
6827 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006828uint32_t sme_get_current_roam_state(mac_handle_t mac_handle, uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006829{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006830 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306831
Jeff Johnson01f2c232018-11-21 19:17:44 -08006832 return mac->roam.curState[sessionId];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006833}
6834
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306835/*
6836 * sme_get_current_roam_sub_state() -
6837 * \brief get neighbor roam sub state
6838 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006839 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306840 * sessionId - Session Identifier
6841 * Return uint32_t - current roam sub state
6842 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006843uint32_t sme_get_current_roam_sub_state(mac_handle_t mac_handle,
6844 uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006845{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006846 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306847
Jeff Johnson01f2c232018-11-21 19:17:44 -08006848 return mac->roam.curSubState[sessionId];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006849}
6850
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306851/*
6852 * sme_get_lim_sme_state() -
6853 * get Lim Sme state
6854 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006855 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306856 * Return uint32_t - Lim Sme state
6857 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006858uint32_t sme_get_lim_sme_state(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006859{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006860 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306861
Jeff Johnson01f2c232018-11-21 19:17:44 -08006862 return mac->lim.gLimSmeState;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006863}
6864
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306865/*
6866 * sme_get_lim_mlm_state() -
6867 * get Lim Mlm state
6868 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006869 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306870 * Return uint32_t - Lim Mlm state
6871 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006872uint32_t sme_get_lim_mlm_state(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006873{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006874 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306875
Jeff Johnson01f2c232018-11-21 19:17:44 -08006876 return mac->lim.gLimMlmState;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006877}
6878
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306879/*
6880 * sme_is_lim_session_valid() -
6881 * is Lim session valid
6882 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006883 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306884 * sessionId - Session Identifier
6885 * Return bool - true or false
6886 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006887bool sme_is_lim_session_valid(mac_handle_t mac_handle, uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006888{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006889 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Hanumantha Reddy Pothula589fd702015-11-17 15:25:16 +05306890
Jeff Johnson01f2c232018-11-21 19:17:44 -08006891 if (sessionId > mac->lim.maxBssId)
Hanumantha Reddy Pothula589fd702015-11-17 15:25:16 +05306892 return false;
6893
Jeff Johnson01f2c232018-11-21 19:17:44 -08006894 return mac->lim.gpSession[sessionId].valid;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006895}
6896
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306897/*
6898 * sme_get_lim_sme_session_state() -
6899 * get Lim Sme session state
6900 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006901 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306902 * sessionId - Session Identifier
6903 * Return uint32_t - Lim Sme session state
6904 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006905uint32_t sme_get_lim_sme_session_state(mac_handle_t mac_handle,
6906 uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006907{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006908 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306909
Jeff Johnson01f2c232018-11-21 19:17:44 -08006910 return mac->lim.gpSession[sessionId].limSmeState;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006911}
6912
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306913/*
6914 * sme_get_lim_mlm_session_state() -
6915 * \brief get Lim Mlm session state
6916 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006917 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306918 * sessionId - Session Identifier
6919 * Return uint32_t - Lim Mlm session state
6920 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006921uint32_t sme_get_lim_mlm_session_state(mac_handle_t mac_handle,
6922 uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006923{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006924 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306925
Jeff Johnson01f2c232018-11-21 19:17:44 -08006926 return mac->lim.gpSession[sessionId].limMlmState;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006927}
6928
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306929/*
6930 * sme_get_neighbor_scan_max_chan_time() -
6931 * get neighbor scan max channel time
6932 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006933 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306934 * sessionId - Session Identifier
6935 * Return uint16_t - channel max time value
6936 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006937uint16_t sme_get_neighbor_scan_max_chan_time(mac_handle_t mac_handle,
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08006938 uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006939{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006940 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08006941
Dustin Brownad06be62019-02-04 14:52:56 -08006942 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08006943 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
6944 FL("Invalid sme session id: %d"), sessionId);
6945 return 0;
6946 }
6947
Jeff Johnson01f2c232018-11-21 19:17:44 -08006948 return mac->roam.neighborRoamInfo[sessionId].cfgParams.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006949 maxChannelScanTime;
6950}
6951
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306952/*
6953 * sme_set_neighbor_scan_period() -
6954 * Update nNeighborScanPeriod
6955 * This function is called through dynamic setConfig callback function
6956 * to configure nNeighborScanPeriod
6957 * Usage: adb shell iwpriv wlan0 setConfig
6958 * nNeighborScanPeriod=[0 .. 1000]
6959 *
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08006960 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306961 * sessionId - Session Identifier
6962 * nNeighborScanPeriod - neighbor scan period
6963 * Return Success or failure
6964 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006965QDF_STATUS sme_set_neighbor_scan_period(mac_handle_t mac_handle,
6966 uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006967 const uint16_t nNeighborScanPeriod)
6968{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006969 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306970 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006971 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
6972
Dustin Brownad06be62019-02-04 14:52:56 -08006973 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08006974 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
6975 FL("Invalid sme session id: %d"), sessionId);
6976 return QDF_STATUS_E_INVAL;
6977 }
6978
Jeff Johnson01f2c232018-11-21 19:17:44 -08006979 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306980 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08006981 pNeighborRoamInfo = &mac->roam.neighborRoamInfo[sessionId];
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306982 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306983 "LFR runtime successfully set neighbor scan period to %d - old value is %d - roam state is %s",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006984 nNeighborScanPeriod,
Wu Gao51a63562018-11-08 16:29:10 +08006985 mac->mlme_cfg->lfr.neighbor_scan_timer_period,
Jeff Johnson01f2c232018-11-21 19:17:44 -08006986 mac_trace_get_neighbour_roam_state(mac->roam.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006987 neighborRoamInfo
6988 [sessionId].
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306989 neighborRoamState));
Wu Gao51a63562018-11-08 16:29:10 +08006990 mac->mlme_cfg->lfr.neighbor_scan_timer_period =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006991 nNeighborScanPeriod;
6992 pNeighborRoamInfo->cfgParams.neighborScanPeriod =
6993 nNeighborScanPeriod;
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05306994
Wu Gao51a63562018-11-08 16:29:10 +08006995 if (mac->mlme_cfg->lfr.roam_scan_offload_enabled) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08006996 csr_roam_offload_scan(mac, sessionId,
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05306997 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
6998 REASON_SCAN_HOME_TIME_CHANGED);
6999 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08007000 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007001 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007002
7003 return status;
7004}
7005
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307006/*
7007 * sme_get_neighbor_scan_period() -
7008 * get neighbor scan period
7009 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007010 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307011 * sessionId - Session Identifier
7012 * Return uint16_t - neighbor scan period
7013 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007014uint16_t sme_get_neighbor_scan_period(mac_handle_t mac_handle,
7015 uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007016{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007017 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08007018
Dustin Brownad06be62019-02-04 14:52:56 -08007019 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08007020 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7021 FL("Invalid sme session id: %d"), sessionId);
7022 return 0;
7023 }
7024
Jeff Johnson01f2c232018-11-21 19:17:44 -08007025 return mac->roam.neighborRoamInfo[sessionId].cfgParams.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007026 neighborScanPeriod;
7027}
7028
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307029/*
7030 * sme_get_roam_rssi_diff() - get Roam rssi diff
7031 * This is a synchronous call
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 * Return uint16_t - Rssi diff value
7035 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007036uint8_t sme_get_roam_rssi_diff(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007037{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007038 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307039
Wu Gao51a63562018-11-08 16:29:10 +08007040 return mac->mlme_cfg->lfr.roam_rssi_diff;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007041}
7042
7043/**
7044 * sme_change_roam_scan_channel_list() - to change scan channel list
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08007045 * @mac_handle: Opaque handle to the global MAC context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007046 * @sessionId: sme session id
7047 * @pChannelList: Output channel list
7048 * @numChannels: Output number of channels
7049 *
7050 * This routine is called to Change roam scan channel list.
7051 * This is a synchronous call
7052 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307053 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007054 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007055QDF_STATUS sme_change_roam_scan_channel_list(mac_handle_t mac_handle,
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08007056 uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007057 uint8_t *pChannelList,
7058 uint8_t numChannels)
7059{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007060 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307061 QDF_STATUS status = QDF_STATUS_SUCCESS;
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08007062 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
Wu Gao0821b0d2019-01-11 17:31:11 +08007063 uint8_t oldChannelList[CFG_VALID_CHANNEL_LIST_LEN * 2] = { 0 };
7064 uint8_t newChannelList[CFG_VALID_CHANNEL_LIST_LEN * 2] = { 0 };
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007065 uint8_t i = 0, j = 0;
7066 tCsrChannelInfo *chan_info;
7067
Dustin Brownad06be62019-02-04 14:52:56 -08007068 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08007069 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7070 FL("Invalid sme session id: %d"), sessionId);
7071 return QDF_STATUS_E_INVAL;
7072 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007073
Jeff Johnson01f2c232018-11-21 19:17:44 -08007074 pNeighborRoamInfo = &mac->roam.neighborRoamInfo[sessionId];
7075 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307076 if (!QDF_IS_STATUS_SUCCESS(status)) {
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05307077 sme_err("Failed to acquire SME lock");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007078 return status;
7079 }
7080 chan_info = &pNeighborRoamInfo->cfgParams.channelInfo;
7081
7082 if (NULL != chan_info->ChannelList) {
7083 for (i = 0; i < chan_info->numOfChannels; i++) {
7084 if (j < sizeof(oldChannelList))
7085 j += snprintf(oldChannelList + j,
7086 sizeof(oldChannelList) -
7087 j, "%d",
7088 chan_info->ChannelList[i]);
7089 else
7090 break;
7091 }
7092 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08007093 csr_flush_cfg_bg_scan_roam_channel_list(mac, sessionId);
7094 csr_create_bg_scan_roam_channel_list(mac, sessionId, pChannelList,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007095 numChannels);
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007096 sme_set_roam_scan_control(mac_handle, sessionId, 1);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007097 if (NULL != chan_info->ChannelList) {
7098 j = 0;
7099 for (i = 0; i < chan_info->numOfChannels; i++) {
7100 if (j < sizeof(newChannelList))
7101 j += snprintf(newChannelList + j,
7102 sizeof(newChannelList) -
7103 j, " %d",
7104 chan_info->ChannelList[i]);
7105 else
7106 break;
7107 }
7108 }
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307109 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307110 "LFR runtime successfully set roam scan channels to %s - old value is %s - roam state is %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007111 newChannelList, oldChannelList,
Jeff Johnson01f2c232018-11-21 19:17:44 -08007112 mac->roam.neighborRoamInfo[sessionId].neighborRoamState);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007113
Wu Gao51a63562018-11-08 16:29:10 +08007114 if (mac->mlme_cfg->lfr.roam_scan_offload_enabled)
Jeff Johnson01f2c232018-11-21 19:17:44 -08007115 csr_roam_offload_scan(mac, sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007116 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
7117 REASON_CHANNEL_LIST_CHANGED);
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05307118
Jeff Johnson01f2c232018-11-21 19:17:44 -08007119 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007120 return status;
7121}
7122
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007123/**
7124 * sme_get_roam_scan_channel_list() - To get roam scan channel list
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08007125 * @mac_handle: Opaque handle to the global MAC context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007126 * @pChannelList: Output channel list
7127 * @pNumChannels: Output number of channels
7128 * @sessionId: Session Identifier
7129 *
7130 * To get roam scan channel list This is a synchronous call
7131 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307132 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007133 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007134QDF_STATUS sme_get_roam_scan_channel_list(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007135 uint8_t *pChannelList, uint8_t *pNumChannels,
7136 uint8_t sessionId)
7137{
7138 int i = 0;
7139 uint8_t *pOutPtr = pChannelList;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007140 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08007141 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307142 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007143
Dustin Brownad06be62019-02-04 14:52:56 -08007144 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08007145 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7146 FL("Invalid sme session id: %d"), sessionId);
7147 return QDF_STATUS_E_INVAL;
7148 }
7149
Jeff Johnson01f2c232018-11-21 19:17:44 -08007150 pNeighborRoamInfo = &mac->roam.neighborRoamInfo[sessionId];
7151 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307152 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007153 return status;
7154 if (NULL == pNeighborRoamInfo->cfgParams.channelInfo.ChannelList) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307155 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_WARN,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007156 FL("Roam Scan channel list is NOT yet initialized"));
7157 *pNumChannels = 0;
Jeff Johnson01f2c232018-11-21 19:17:44 -08007158 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007159 return status;
7160 }
7161
7162 *pNumChannels = pNeighborRoamInfo->cfgParams.channelInfo.numOfChannels;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307163 for (i = 0; i < (*pNumChannels); i++)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007164 pOutPtr[i] =
7165 pNeighborRoamInfo->cfgParams.channelInfo.ChannelList[i];
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307166
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007167 pOutPtr[i] = '\0';
Jeff Johnson01f2c232018-11-21 19:17:44 -08007168 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007169 return status;
7170}
7171
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307172/*
7173 * sme_get_is_ese_feature_enabled() - get ESE feature enabled or not
7174 * This is a synchronuous call
7175 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007176 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307177 * Return true (1) - if the ESE feature is enabled
7178 * false (0) - if feature is disabled (compile or runtime)
7179 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007180bool sme_get_is_ese_feature_enabled(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007181{
7182#ifdef FEATURE_WLAN_ESE
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007183 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307184
Jeff Johnson01f2c232018-11-21 19:17:44 -08007185 return csr_roam_is_ese_ini_feature_enabled(mac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007186#else
7187 return false;
7188#endif
7189}
7190
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307191/*
7192 * sme_get_wes_mode() - get WES Mode
7193 * This is a synchronous call
7194 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007195 * mac_handle - The handle returned by mac_open
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307196 * Return uint8_t - WES Mode Enabled(1)/Disabled(0)
7197 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007198bool sme_get_wes_mode(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007199{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007200 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307201
Wu Gao51a63562018-11-08 16:29:10 +08007202 return mac->mlme_cfg->lfr.wes_mode_enabled;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007203}
7204
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307205/*
7206 * sme_get_roam_scan_control() - get scan control
7207 * This is a synchronous call
7208 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007209 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307210 * Return bool - Enabled(1)/Disabled(0)
7211 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007212bool sme_get_roam_scan_control(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007213{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007214 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307215
Jeff Johnson01f2c232018-11-21 19:17:44 -08007216 return mac->roam.configParam.nRoamScanControl;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007217}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007218
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307219/*
7220 * sme_get_is_lfr_feature_enabled() - get LFR feature enabled or not
7221 * This is a synchronuous call
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007222 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307223 * Return true (1) - if the feature is enabled
7224 * false (0) - if feature is disabled (compile or runtime)
7225 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007226bool sme_get_is_lfr_feature_enabled(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007227{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007228 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307229
Wu Gao51a63562018-11-08 16:29:10 +08007230 return mac->mlme_cfg->lfr.lfr_enabled;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007231}
7232
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307233/*
7234 * sme_get_is_ft_feature_enabled() - get FT feature enabled or not
7235 * This is a synchronuous call
7236 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007237 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307238 * Return true (1) - if the feature is enabled
7239 * false (0) - if feature is disabled (compile or runtime)
7240 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007241bool sme_get_is_ft_feature_enabled(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007242{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007243 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307244
Wu Gao51a63562018-11-08 16:29:10 +08007245 return mac->mlme_cfg->lfr.fast_transition_enabled;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007246}
7247
Krishna Kumaar Natarajand0bbb3c2017-03-13 17:04:58 -07007248/**
7249 * sme_is_feature_supported_by_fw() - check if feature is supported by FW
7250 * @feature: enum value of requested feature.
7251 *
7252 * Retrun: 1 if supported; 0 otherwise
7253 */
7254bool sme_is_feature_supported_by_fw(enum cap_bitmap feature)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007255{
Krishna Kumaar Natarajand0bbb3c2017-03-13 17:04:58 -07007256 return IS_FEATURE_SUPPORTED_BY_FW(feature);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007257}
7258
Jeff Johnsone943bca2019-02-08 22:45:17 -08007259QDF_STATUS sme_get_link_speed(mac_handle_t mac_handle,
7260 struct link_speed_info *req,
7261 void *context,
7262 sme_link_speed_cb cb)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007263{
Jeff Johnsone943bca2019-02-08 22:45:17 -08007264 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007265 struct mac_context *mac;
Mukul Sharmac3886aa2017-05-04 17:53:22 +05307266 void *wma_handle;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007267
Jeff Johnsone943bca2019-02-08 22:45:17 -08007268 if (!mac_handle || !cb || !req) {
Jeff Johnsona5317a62017-01-26 08:51:25 -08007269 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7270 FL("Invalid parameter"));
7271 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007272 }
Jeff Johnsona5317a62017-01-26 08:51:25 -08007273
Mukul Sharmac3886aa2017-05-04 17:53:22 +05307274 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
7275 if (!wma_handle) {
7276 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7277 "wma handle is NULL");
7278 return QDF_STATUS_E_FAILURE;
7279 }
7280
Jeff Johnsona0619e42018-11-28 17:43:00 -08007281 mac = MAC_CONTEXT(mac_handle);
Jeff Johnson01f2c232018-11-21 19:17:44 -08007282 status = sme_acquire_global_lock(&mac->sme);
Jeff Johnsona5317a62017-01-26 08:51:25 -08007283 if (QDF_STATUS_SUCCESS != status) {
Srinivas Girigowda2c263352017-03-17 17:49:53 -07007284 sme_err("Failed to acquire global lock");
Jeff Johnsona5317a62017-01-26 08:51:25 -08007285 return QDF_STATUS_E_FAILURE;
7286 }
7287
Jeff Johnsone943bca2019-02-08 22:45:17 -08007288 mac->sme.link_speed_context = context;
7289 mac->sme.link_speed_cb = cb;
7290 status = wma_get_link_speed(wma_handle, req);
Jeff Johnson01f2c232018-11-21 19:17:44 -08007291 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007292 return status;
7293}
7294
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007295QDF_STATUS sme_get_peer_stats(struct mac_context *mac,
Ashish Kumar Dhanotiya443d31f2017-10-13 12:41:19 +05307296 struct sir_peer_info_req req)
7297{
7298 QDF_STATUS qdf_status;
7299 struct scheduler_msg message = {0};
7300
7301 qdf_status = sme_acquire_global_lock(&mac->sme);
7302 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
7303 sme_debug("Failed to get Lock");
7304 return qdf_status;
7305 }
7306 /* serialize the req through MC thread */
7307 message.bodyptr = qdf_mem_malloc(sizeof(req));
Arif Hussain0ef77082018-10-10 16:42:53 -07007308 if (!message.bodyptr) {
Ashish Kumar Dhanotiya443d31f2017-10-13 12:41:19 +05307309 sme_release_global_lock(&mac->sme);
7310 return QDF_STATUS_E_NOMEM;
7311 }
7312 qdf_mem_copy(message.bodyptr, &req, sizeof(req));
7313 message.type = WMA_GET_PEER_INFO;
7314 message.reserved = 0;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05307315 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
7316 QDF_MODULE_ID_WMA,
7317 QDF_MODULE_ID_WMA, &message);
Ashish Kumar Dhanotiya443d31f2017-10-13 12:41:19 +05307318 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
7319 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7320 "%s: Post get peer info msg fail", __func__);
7321 qdf_mem_free(message.bodyptr);
7322 qdf_status = QDF_STATUS_E_FAILURE;
7323 }
7324 sme_release_global_lock(&mac->sme);
7325 return qdf_status;
7326}
7327
Jeff Johnsonc7309062018-11-09 20:59:42 -08007328QDF_STATUS
7329sme_get_peer_info(mac_handle_t mac_handle,
7330 struct sir_peer_info_req req,
7331 void *context,
7332 void (*callbackfn)(struct sir_peer_info_resp *param,
7333 void *pcontext))
Will Huang558f8082017-05-31 16:22:24 +08007334{
7335
7336 QDF_STATUS status;
7337 QDF_STATUS qdf_status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007338 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar658e8492017-12-13 11:35:41 -08007339 struct scheduler_msg message = {0};
Will Huang558f8082017-05-31 16:22:24 +08007340
7341 status = sme_acquire_global_lock(&mac->sme);
7342 if (QDF_STATUS_SUCCESS == status) {
7343 if (NULL == callbackfn) {
7344 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7345 "%s: Indication Call back is NULL",
7346 __func__);
7347 sme_release_global_lock(&mac->sme);
7348 return QDF_STATUS_E_FAILURE;
7349 }
7350
7351 mac->sme.pget_peer_info_ind_cb = callbackfn;
7352 mac->sme.pget_peer_info_cb_context = context;
7353
7354 /* serialize the req through MC thread */
7355 message.bodyptr = qdf_mem_malloc(sizeof(req));
Arif Hussain0ef77082018-10-10 16:42:53 -07007356 if (!message.bodyptr) {
Will Huang558f8082017-05-31 16:22:24 +08007357 sme_release_global_lock(&mac->sme);
7358 return QDF_STATUS_E_NOMEM;
7359 }
7360 qdf_mem_copy(message.bodyptr, &req, sizeof(req));
7361 message.type = WMA_GET_PEER_INFO;
Ashish Kumar Dhanotiya443d31f2017-10-13 12:41:19 +05307362 message.reserved = 0;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05307363 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
7364 QDF_MODULE_ID_WMA,
7365 QDF_MODULE_ID_WMA,
7366 &message);
Will Huang558f8082017-05-31 16:22:24 +08007367 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
7368 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7369 "%s: Post get peer info msg fail", __func__);
7370 qdf_mem_free(message.bodyptr);
7371 status = QDF_STATUS_E_FAILURE;
7372 }
7373 sme_release_global_lock(&mac->sme);
7374 }
7375 return status;
7376}
7377
Jeff Johnsonc7309062018-11-09 20:59:42 -08007378QDF_STATUS sme_get_peer_info_ext(mac_handle_t mac_handle,
Will Huang558f8082017-05-31 16:22:24 +08007379 struct sir_peer_info_ext_req *req,
7380 void *context,
7381 void (*callbackfn)(struct sir_peer_info_ext_resp *param,
7382 void *pcontext))
7383{
7384 QDF_STATUS status;
7385 QDF_STATUS qdf_status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007386 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar658e8492017-12-13 11:35:41 -08007387 struct scheduler_msg message = {0};
Will Huang558f8082017-05-31 16:22:24 +08007388
7389 status = sme_acquire_global_lock(&mac->sme);
7390 if (QDF_STATUS_SUCCESS == status) {
7391 if (NULL == callbackfn) {
7392 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7393 "%s: Indication Call back is NULL",
7394 __func__);
7395 sme_release_global_lock(&mac->sme);
7396 return QDF_STATUS_E_FAILURE;
7397 }
7398
7399 mac->sme.pget_peer_info_ext_ind_cb = callbackfn;
7400 mac->sme.pget_peer_info_ext_cb_context = context;
7401
7402 /* serialize the req through MC thread */
7403 message.bodyptr =
7404 qdf_mem_malloc(sizeof(struct sir_peer_info_ext_req));
Arif Hussain0ef77082018-10-10 16:42:53 -07007405 if (!message.bodyptr) {
Will Huang558f8082017-05-31 16:22:24 +08007406 sme_release_global_lock(&mac->sme);
7407 return QDF_STATUS_E_NOMEM;
7408 }
7409 qdf_mem_copy(message.bodyptr,
7410 req,
7411 sizeof(struct sir_peer_info_ext_req));
7412 message.type = WMA_GET_PEER_INFO_EXT;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05307413 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
7414 QDF_MODULE_ID_WMA,
7415 QDF_MODULE_ID_WMA,
7416 &message);
Will Huang558f8082017-05-31 16:22:24 +08007417 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
7418 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7419 "%s: Post get rssi msg fail", __func__);
7420 qdf_mem_free(message.bodyptr);
7421 status = QDF_STATUS_E_FAILURE;
7422 }
7423 sme_release_global_lock(&mac->sme);
7424 }
7425 return status;
7426}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007427
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007428/*convert the ini value to the ENUM used in csr and MAC for CB state*/
7429ePhyChanBondState sme_get_cb_phy_state_from_cb_ini_value(uint32_t cb_ini_value)
7430{
7431 return csr_convert_cb_ini_value_to_phy_cb_state(cb_ini_value);
7432}
7433
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007434void sme_set_curr_device_mode(mac_handle_t mac_handle,
Jeff Johnson5a6a0c92019-02-17 16:12:02 -08007435 enum QDF_OPMODE curr_device_mode)
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
Jeff Johnson5a6a0c92019-02-17 16:12:02 -08007439 mac->sme.curr_device_mode = curr_device_mode;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007440}
7441
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307442/*
7443 * sme_handoff_request() - a wrapper function to Request a handoff from CSR.
7444 * This is a synchronous 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 * sessionId - Session Identifier
7448 * pHandoffInfo - info provided by HDD with the handoff request (namely:
7449 * BSSID, channel etc.)
7450 * Return QDF_STATUS_SUCCESS - SME passed the request to CSR successfully.
7451 * Other status means SME is failed to send the request.
7452 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007453
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007454QDF_STATUS sme_handoff_request(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007455 uint8_t sessionId,
7456 tCsrHandoffRequest *pHandoffInfo)
7457{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007458 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307459 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007460
Jeff Johnson01f2c232018-11-21 19:17:44 -08007461 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307462 if (QDF_IS_STATUS_SUCCESS(status)) {
Abhishek Singhe4a1f882017-08-10 17:59:44 +05307463 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007464 "%s: invoked", __func__);
Jeff Johnson01f2c232018-11-21 19:17:44 -08007465 status = csr_handoff_request(mac, sessionId, pHandoffInfo);
7466 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007467 }
7468
7469 return status;
7470}
7471
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007472/**
7473 * sme_add_periodic_tx_ptrn() - Add Periodic TX Pattern
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08007474 * @mac_handle: Opaque handle to the global MAC context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007475 * @addPeriodicTxPtrnParams: request message
7476 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307477 * Return: QDF_STATUS enumeration
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007478 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307479QDF_STATUS
Jeff Johnsonc7309062018-11-09 20:59:42 -08007480sme_add_periodic_tx_ptrn(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007481 struct sSirAddPeriodicTxPtrn *addPeriodicTxPtrnParams)
7482{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307483 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007484 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007485 struct sSirAddPeriodicTxPtrn *req_msg;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07007486 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007487
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07007488 SME_ENTER();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007489
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307490 req_msg = qdf_mem_malloc(sizeof(*req_msg));
Arif Hussain0ef77082018-10-10 16:42:53 -07007491 if (!req_msg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307492 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007493
7494 *req_msg = *addPeriodicTxPtrnParams;
7495
7496 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307497 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07007498 sme_err("sme_acquire_global_lock failed!(status=%d)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007499 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307500 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007501 return status;
7502 }
7503
7504 /* Serialize the req through MC thread */
7505 msg.bodyptr = req_msg;
7506 msg.type = WMA_ADD_PERIODIC_TX_PTRN_IND;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05307507 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
7508 NO_SESSION, msg.type));
gaurank kathpalia36b0c582018-08-28 17:45:43 +05307509 status = scheduler_post_message(QDF_MODULE_ID_SME,
7510 QDF_MODULE_ID_WMA,
7511 QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307512 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07007513 sme_err("scheduler_post_msg failed!(err=%d)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007514 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307515 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007516 }
7517 sme_release_global_lock(&mac->sme);
7518 return status;
7519}
7520
7521/**
7522 * sme_del_periodic_tx_ptrn() - Delete Periodic TX Pattern
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08007523 * @mac_handle: Opaque handle to the global MAC context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007524 * @delPeriodicTxPtrnParams: request message
7525 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307526 * Return: QDF_STATUS enumeration
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007527 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307528QDF_STATUS
Jeff Johnsonc7309062018-11-09 20:59:42 -08007529sme_del_periodic_tx_ptrn(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007530 struct sSirDelPeriodicTxPtrn *delPeriodicTxPtrnParams)
7531{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307532 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007533 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007534 struct sSirDelPeriodicTxPtrn *req_msg;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07007535 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007536
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07007537 SME_ENTER();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007538
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307539 req_msg = qdf_mem_malloc(sizeof(*req_msg));
Arif Hussain0ef77082018-10-10 16:42:53 -07007540 if (!req_msg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307541 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007542
7543 *req_msg = *delPeriodicTxPtrnParams;
7544
7545 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307546 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07007547 sme_err("sme_acquire_global_lock failed!(status=%d)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007548 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307549 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007550 return status;
7551 }
7552
7553 /* Serialize the req through MC thread */
7554 msg.bodyptr = req_msg;
7555 msg.type = WMA_DEL_PERIODIC_TX_PTRN_IND;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05307556 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
7557 NO_SESSION, msg.type));
gaurank kathpalia36b0c582018-08-28 17:45:43 +05307558 status = scheduler_post_message(QDF_MODULE_ID_SME,
7559 QDF_MODULE_ID_WMA,
7560 QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307561 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07007562 sme_err("scheduler_post_msg failed!(err=%d)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007563 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307564 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007565 }
7566 sme_release_global_lock(&mac->sme);
7567 return status;
7568}
7569
Rachit Kankaneee1735c2018-08-02 13:19:34 +05307570#ifdef FEATURE_WLAN_RMC
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307571/*
7572 * sme_enable_rmc() - enables RMC
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08007573 * @mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307574 * @sessionId : Session ID
7575 *
7576 * Return: QDF_STATUS
7577 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007578QDF_STATUS sme_enable_rmc(mac_handle_t mac_handle, uint32_t sessionId)
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007579{
7580 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007581 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07007582 struct scheduler_msg message = {0};
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007583 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
7584
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07007585 SME_ENTER();
7586
Jeff Johnson01f2c232018-11-21 19:17:44 -08007587 status = sme_acquire_global_lock(&mac->sme);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007588 if (QDF_IS_STATUS_SUCCESS(status)) {
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08007589 message.bodyptr = NULL;
7590 message.type = WMA_RMC_ENABLE_IND;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05307591 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
7592 QDF_MODULE_ID_WMA,
7593 QDF_MODULE_ID_WMA,
7594 &message);
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +05307595 if (!QDF_IS_STATUS_SUCCESS(qdf_status))
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007596 status = QDF_STATUS_E_FAILURE;
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +05307597
Jeff Johnson01f2c232018-11-21 19:17:44 -08007598 sme_release_global_lock(&mac->sme);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007599 }
7600 return status;
7601}
7602
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307603/*
7604 * sme_disable_rmc() - disables RMC
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08007605 * @mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307606 * @sessionId : Session ID
7607 *
7608 * Return: QDF_STATUS
7609 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007610QDF_STATUS sme_disable_rmc(mac_handle_t mac_handle, uint32_t sessionId)
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007611{
7612 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007613 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07007614 struct scheduler_msg message = {0};
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007615 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
7616
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07007617 SME_ENTER();
7618
Jeff Johnson01f2c232018-11-21 19:17:44 -08007619 status = sme_acquire_global_lock(&mac->sme);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007620 if (QDF_IS_STATUS_SUCCESS(status)) {
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08007621 message.bodyptr = NULL;
7622 message.type = WMA_RMC_DISABLE_IND;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05307623 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
7624 QDF_MODULE_ID_WMA,
7625 QDF_MODULE_ID_WMA,
7626 &message);
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +05307627 if (!QDF_IS_STATUS_SUCCESS(qdf_status))
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007628 status = QDF_STATUS_E_FAILURE;
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +05307629
Jeff Johnson01f2c232018-11-21 19:17:44 -08007630 sme_release_global_lock(&mac->sme);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007631 }
7632 return status;
7633}
7634
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307635/*
7636 * sme_send_rmc_action_period() - sends RMC action period param to target
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08007637 * @mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307638 * @sessionId : Session ID
7639 *
7640 * Return: QDF_STATUS
7641 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007642QDF_STATUS sme_send_rmc_action_period(mac_handle_t mac_handle,
7643 uint32_t sessionId)
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007644{
7645 QDF_STATUS status = QDF_STATUS_SUCCESS;
7646 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007647 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07007648 struct scheduler_msg message = {0};
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007649
Jeff Johnson01f2c232018-11-21 19:17:44 -08007650 status = sme_acquire_global_lock(&mac->sme);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007651 if (QDF_STATUS_SUCCESS == status) {
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08007652 message.bodyptr = NULL;
7653 message.type = WMA_RMC_ACTION_PERIOD_IND;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05307654 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
7655 QDF_MODULE_ID_WMA,
7656 QDF_MODULE_ID_WMA,
7657 &message);
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +05307658 if (!QDF_IS_STATUS_SUCCESS(qdf_status))
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007659 status = QDF_STATUS_E_FAILURE;
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +05307660
Jeff Johnson01f2c232018-11-21 19:17:44 -08007661 sme_release_global_lock(&mac->sme);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007662 }
7663
7664 return status;
7665}
Rachit Kankaneee1735c2018-08-02 13:19:34 +05307666#endif /* FEATURE_WLAN_RMC */
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007667
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307668/*
7669 * sme_request_ibss_peer_info() - request ibss peer info
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08007670 * @mac_handle: Opaque handle to the global MAC context
Jeff Johnson56ba88a2019-02-17 17:18:43 -08007671 * @cb_context: Pointer to user data
Jeff Johnsond6a23162019-02-17 16:46:37 -08007672 * @peer_info_cb: Peer info callback
7673 * @allPeerInfoReqd: All peer info required or not
7674 * @staIdx: sta index
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307675 *
7676 * Return: QDF_STATUS
7677 */
Jeff Johnson56ba88a2019-02-17 17:18:43 -08007678QDF_STATUS sme_request_ibss_peer_info(mac_handle_t mac_handle, void *cb_context,
Jeff Johnsond6a23162019-02-17 16:46:37 -08007679 ibss_peer_info_cb peer_info_cb,
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007680 bool allPeerInfoReqd, uint8_t staIdx)
7681{
7682 QDF_STATUS status = QDF_STATUS_E_FAILURE;
7683 QDF_STATUS qdf_status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007684 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07007685 struct scheduler_msg message = {0};
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007686 tSirIbssGetPeerInfoReqParams *pIbssInfoReqParams;
Jeff Johnsone7aa5cd2019-02-17 19:36:01 -08007687 struct ibss_peer_info_cb_info *cb_info;
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007688
Jeff Johnson01f2c232018-11-21 19:17:44 -08007689 status = sme_acquire_global_lock(&mac->sme);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007690 if (QDF_STATUS_SUCCESS == status) {
Jeff Johnsone7aa5cd2019-02-17 19:36:01 -08007691 cb_info = &mac->sme.peer_info_cb_info;
7692 cb_info->peer_info_cb = peer_info_cb;
7693 cb_info->peer_info_cb_context = cb_context;
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007694
7695 pIbssInfoReqParams = (tSirIbssGetPeerInfoReqParams *)
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307696 qdf_mem_malloc(sizeof(tSirIbssGetPeerInfoReqParams));
Arif Hussain0ef77082018-10-10 16:42:53 -07007697 if (!pIbssInfoReqParams) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08007698 sme_release_global_lock(&mac->sme);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007699 return QDF_STATUS_E_NOMEM;
7700 }
7701 pIbssInfoReqParams->allPeerInfoReqd = allPeerInfoReqd;
7702 pIbssInfoReqParams->staIdx = staIdx;
7703
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08007704 message.type = WMA_GET_IBSS_PEER_INFO_REQ;
7705 message.bodyptr = pIbssInfoReqParams;
7706 message.reserved = 0;
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007707
gaurank kathpalia36b0c582018-08-28 17:45:43 +05307708 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
7709 QDF_MODULE_ID_WMA,
7710 QDF_MODULE_ID_WMA,
7711 &message);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007712 if (QDF_STATUS_SUCCESS != qdf_status) {
7713 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7714 "%s: Post WMA_GET_IBSS_PEER_INFO_REQ MSG failed",
7715 __func__);
7716 qdf_mem_free(pIbssInfoReqParams);
7717 qdf_status = QDF_STATUS_E_FAILURE;
7718 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08007719 sme_release_global_lock(&mac->sme);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007720 }
7721
7722 return qdf_status;
7723}
7724
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307725/*
7726 * sme_send_cesium_enable_ind() -
7727 * Used to send proprietary cesium enable indication to fw
7728 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007729 * mac_handle
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307730 * sessionId
7731 * Return QDF_STATUS
7732 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007733QDF_STATUS sme_send_cesium_enable_ind(mac_handle_t mac_handle,
7734 uint32_t sessionId)
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007735{
7736 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007737 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07007738 struct scheduler_msg message = {0};
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007739
Jeff Johnson01f2c232018-11-21 19:17:44 -08007740 status = sme_acquire_global_lock(&mac->sme);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007741 if (QDF_STATUS_SUCCESS == status) {
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08007742 message.bodyptr = NULL;
7743 message.type = WMA_IBSS_CESIUM_ENABLE_IND;
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +05307744 status = scheduler_post_message(QDF_MODULE_ID_SME,
7745 QDF_MODULE_ID_WMA,
7746 QDF_MODULE_ID_WMA,
7747 &message);
Jeff Johnson01f2c232018-11-21 19:17:44 -08007748 sme_release_global_lock(&mac->sme);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007749 }
7750
7751 return status;
7752}
7753
Jeff Johnsonc7309062018-11-09 20:59:42 -08007754QDF_STATUS sme_set_wlm_latency_level(mac_handle_t mac_handle,
7755 uint16_t session_id,
Paul Zhang99fe8842017-12-08 14:43:46 +08007756 uint16_t latency_level)
7757{
7758 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007759 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Paul Zhang99fe8842017-12-08 14:43:46 +08007760 struct wlm_latency_level_param params;
7761 void *wma = cds_get_context(QDF_MODULE_ID_WMA);
7762
Bala Venkatesh7cf5b662018-05-10 15:18:53 +05307763 if (!wma)
7764 return QDF_STATUS_E_FAILURE;
7765
Yeshwanth Sriram Guntuka334aa8d2018-08-20 16:49:15 +05307766 if (!mac_ctx->mlme_cfg->wlm_config.latency_enable) {
Paul Zhang99fe8842017-12-08 14:43:46 +08007767 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7768 "%s: WLM latency level setting is disabled",
7769 __func__);
7770 return QDF_STATUS_E_FAILURE;
7771 }
Krunal Soni3fa80e22018-01-09 14:16:02 -08007772 if (!wma) {
7773 sme_err("wma is NULL");
7774 return QDF_STATUS_E_FAILURE;
7775 }
Paul Zhang99fe8842017-12-08 14:43:46 +08007776
7777 params.wlm_latency_level = latency_level;
7778 params.wlm_latency_flags =
Yeshwanth Sriram Guntuka334aa8d2018-08-20 16:49:15 +05307779 mac_ctx->mlme_cfg->wlm_config.latency_flags[latency_level];
Paul Zhang99fe8842017-12-08 14:43:46 +08007780 params.vdev_id = session_id;
7781
7782 status = wma_set_wlm_latency_level(wma, &params);
Paul Zhang99fe8842017-12-08 14:43:46 +08007783
7784 return status;
7785}
7786
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007787void sme_get_command_q_status(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007788{
7789 tSmeCmd *pTempCmd = NULL;
7790 tListElem *pEntry;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007791 struct mac_context *mac;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007792
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +05307793 if (!mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007794 return;
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +05307795
7796 mac = MAC_CONTEXT(mac_handle);
7797
Jeff Johnson01f2c232018-11-21 19:17:44 -08007798 pEntry = csr_nonscan_active_ll_peek_head(mac, LL_ACCESS_LOCK);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307799 if (pEntry)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007800 pTempCmd = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307801
Kabilan Kannan33fcd682018-03-08 14:29:46 -08007802 sme_err("WLAN_BUG_RCA: Currently smeCmdActiveList has command (0x%X)",
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +05307803 (pTempCmd) ? pTempCmd->command : eSmeNoCommand);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007804 if (pTempCmd) {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307805 if (eSmeCsrCommandMask & pTempCmd->command)
7806 /* CSR command is stuck. See what the reason code is
7807 * for that command
7808 */
Jeff Johnson01f2c232018-11-21 19:17:44 -08007809 dump_csr_command_info(mac, pTempCmd);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007810 } /* if(pTempCmd) */
7811
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07007812 sme_err("Currently smeCmdPendingList has %d commands",
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +05307813 csr_nonscan_pending_ll_count(mac));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007814
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007815}
Kiran Kumar Lokere1aa9c9a2016-10-05 18:50:59 -07007816
Agrawal Ashishb141b092016-09-02 19:59:26 +05307817#ifdef WLAN_FEATURE_DSRC
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007818/**
Naveen Rawatb4d37622015-11-13 16:15:25 -08007819 * sme_ocb_gen_timing_advert_frame() - generate TA frame and populate the buffer
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08007820 * @mac_handle: Opaque handle to the global MAC context
Naveen Rawatb4d37622015-11-13 16:15:25 -08007821 * @self_addr: the self MAC address
7822 * @buf: the buffer that will contain the frame
7823 * @timestamp_offset: return for the offset of the timestamp field
7824 * @time_value_offset: return for the time_value field in the TA IE
7825 *
7826 * Return: the length of the buffer.
7827 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007828int sme_ocb_gen_timing_advert_frame(mac_handle_t mac_handle,
Naveen Rawatb4d37622015-11-13 16:15:25 -08007829 tSirMacAddr self_addr, uint8_t **buf,
7830 uint32_t *timestamp_offset,
7831 uint32_t *time_value_offset)
7832{
7833 int template_length;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007834 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Naveen Rawatb4d37622015-11-13 16:15:25 -08007835
7836 template_length = sch_gen_timing_advert_frame(mac_ctx, self_addr, buf,
7837 timestamp_offset,
7838 time_value_offset);
7839 return template_length;
7840}
Agrawal Ashishb141b092016-09-02 19:59:26 +05307841#endif
Arun Khandavalli4b55da72016-07-19 19:55:01 +05307842
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007843QDF_STATUS sme_notify_modem_power_state(mac_handle_t mac_handle, uint32_t value)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007844{
Rajeev Kumar37d478b2017-04-17 16:59:28 -07007845 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007846 tpSirModemPowerStateInd request_buf;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007847 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007848
Jeff Johnson01f2c232018-11-21 19:17:44 -08007849 if (NULL == mac)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307850 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007851
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307852 request_buf = qdf_mem_malloc(sizeof(tSirModemPowerStateInd));
Arif Hussain0ef77082018-10-10 16:42:53 -07007853 if (!request_buf)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307854 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007855
7856 request_buf->param = value;
7857
7858 msg.type = WMA_MODEM_POWER_STATE_IND;
7859 msg.reserved = 0;
7860 msg.bodyptr = request_buf;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307861 if (!QDF_IS_STATUS_SUCCESS
gaurank kathpalia36b0c582018-08-28 17:45:43 +05307862 (scheduler_post_message(QDF_MODULE_ID_SME,
7863 QDF_MODULE_ID_WMA,
7864 QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307865 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307866 "%s: Not able to post WMA_MODEM_POWER_STATE_IND message to WMA",
7867 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307868 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307869 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007870 }
7871
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307872 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007873}
7874
7875#ifdef QCA_HT_2040_COEX
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007876QDF_STATUS sme_notify_ht2040_mode(mac_handle_t mac_handle, uint16_t staId,
Anurag Chouhan6d760662016-02-20 16:05:43 +05307877 struct qdf_mac_addr macAddrSTA,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007878 uint8_t sessionId,
7879 uint8_t channel_type)
7880{
Rajeev Kumar37d478b2017-04-17 16:59:28 -07007881 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007882 tUpdateVHTOpMode *pHtOpMode = NULL;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007883 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007884
Jeff Johnson01f2c232018-11-21 19:17:44 -08007885 if (NULL == mac)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307886 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007887
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307888 pHtOpMode = qdf_mem_malloc(sizeof(tUpdateVHTOpMode));
Arif Hussain0ef77082018-10-10 16:42:53 -07007889 if (!pHtOpMode)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307890 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007891
7892 switch (channel_type) {
7893 case eHT_CHAN_HT20:
7894 pHtOpMode->opMode = eHT_CHANNEL_WIDTH_20MHZ;
7895 break;
7896
7897 case eHT_CHAN_HT40MINUS:
7898 case eHT_CHAN_HT40PLUS:
7899 pHtOpMode->opMode = eHT_CHANNEL_WIDTH_40MHZ;
7900 break;
7901
7902 default:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307903 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007904 "%s: Invalid OP mode", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307905 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007906 }
7907
7908 pHtOpMode->staId = staId,
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307909 qdf_mem_copy(pHtOpMode->peer_mac, macAddrSTA.bytes,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007910 sizeof(tSirMacAddr));
7911 pHtOpMode->smesessionId = sessionId;
7912
7913 msg.type = WMA_UPDATE_OP_MODE;
7914 msg.reserved = 0;
7915 msg.bodyptr = pHtOpMode;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307916 if (!QDF_IS_STATUS_SUCCESS
gaurank kathpalia36b0c582018-08-28 17:45:43 +05307917 (scheduler_post_message(QDF_MODULE_ID_SME,
7918 QDF_MODULE_ID_WMA,
7919 QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307920 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307921 "%s: Not able to post WMA_UPDATE_OP_MODE message to WMA",
7922 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307923 qdf_mem_free(pHtOpMode);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307924 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007925 }
7926
Abhishek Singhe4a1f882017-08-10 17:59:44 +05307927 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Jeff Johnson698eacd2018-05-12 17:00:03 -07007928 "%s: Notified FW about OP mode: %d for staId=%d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007929 __func__, pHtOpMode->opMode, staId);
7930
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307931 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007932}
7933
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307934/*
7935 * sme_set_ht2040_mode() -
7936 * To update HT Operation beacon IE.
7937 *
7938 * Return QDF_STATUS SUCCESS
7939 * FAILURE or RESOURCES
7940 * The API finished and failed.
7941 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007942QDF_STATUS sme_set_ht2040_mode(mac_handle_t mac_handle, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007943 uint8_t channel_type, bool obssEnabled)
7944{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307945 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007946 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007947 ePhyChanBondState cbMode;
Jeff Johnson01f2c232018-11-21 19:17:44 -08007948 struct csr_roam_session *session = CSR_GET_SESSION(mac, sessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007949
Jeff Johnson01f2c232018-11-21 19:17:44 -08007950 if (!CSR_IS_SESSION_VALID(mac, sessionId)) {
Abhishek Singh9d5f4582017-10-11 17:59:48 +05307951 sme_err("Session not valid for session id %d", sessionId);
7952 return QDF_STATUS_E_INVAL;
7953 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08007954 session = CSR_GET_SESSION(mac, sessionId);
Abhishek Singh9d5f4582017-10-11 17:59:48 +05307955 sme_debug("Update HT operation beacon IE, channel_type=%d cur cbmode %d",
7956 channel_type, session->bssParams.cbMode);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007957
7958 switch (channel_type) {
7959 case eHT_CHAN_HT20:
Abhishek Singh9d5f4582017-10-11 17:59:48 +05307960 if (!session->bssParams.cbMode)
7961 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007962 cbMode = PHY_SINGLE_CHANNEL_CENTERED;
7963 break;
7964 case eHT_CHAN_HT40MINUS:
Abhishek Singh9d5f4582017-10-11 17:59:48 +05307965 if (session->bssParams.cbMode)
7966 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007967 cbMode = PHY_DOUBLE_CHANNEL_HIGH_PRIMARY;
7968 break;
7969 case eHT_CHAN_HT40PLUS:
Abhishek Singh9d5f4582017-10-11 17:59:48 +05307970 if (session->bssParams.cbMode)
7971 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007972 cbMode = PHY_DOUBLE_CHANNEL_LOW_PRIMARY;
7973 break;
7974 default:
Abhishek Singh9d5f4582017-10-11 17:59:48 +05307975 sme_err("Error!!! Invalid HT20/40 mode !");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307976 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007977 }
Abhishek Singh9d5f4582017-10-11 17:59:48 +05307978 session->bssParams.cbMode = cbMode;
Jeff Johnson01f2c232018-11-21 19:17:44 -08007979 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307980 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08007981 status = csr_set_ht2040_mode(mac, sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007982 cbMode, obssEnabled);
Jeff Johnson01f2c232018-11-21 19:17:44 -08007983 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007984 }
7985 return status;
7986}
7987
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007988#endif
7989
7990/*
7991 * SME API to enable/disable idle mode powersave
7992 * This should be called only if powersave offload
7993 * is enabled
7994 */
Arunk Khandavalli847969d2017-09-25 15:15:36 +05307995QDF_STATUS sme_set_idle_powersave_config(bool value)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007996{
Anurag Chouhan6d760662016-02-20 16:05:43 +05307997 void *wmaContext = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007998
7999 if (NULL == wmaContext) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308000 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008001 "%s: wmaContext is NULL", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308002 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008003 }
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308004 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008005 " Idle Ps Set Value %d", value);
8006
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308007 if (QDF_STATUS_SUCCESS != wma_set_idle_ps_config(wmaContext, value)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308008 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008009 " Failed to Set Idle Ps Value %d", value);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308010 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008011 }
Arunk Khandavalli847969d2017-09-25 15:15:36 +05308012
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308013 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008014}
8015
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008016int16_t sme_get_ht_config(mac_handle_t mac_handle, uint8_t session_id,
8017 uint16_t ht_capab)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008018{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008019 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Jeff Johnson01f2c232018-11-21 19:17:44 -08008020 struct csr_roam_session *pSession = CSR_GET_SESSION(mac, session_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008021
8022 if (NULL == pSession) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308023 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008024 "%s: pSession is NULL", __func__);
8025 return -EIO;
8026 }
8027 switch (ht_capab) {
8028 case WNI_CFG_HT_CAP_INFO_ADVANCE_CODING:
Jeff Johnsonbe119e62019-02-02 12:30:26 -08008029 return pSession->ht_config.ht_rx_ldpc;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008030 case WNI_CFG_HT_CAP_INFO_TX_STBC:
Jeff Johnsonbe119e62019-02-02 12:30:26 -08008031 return pSession->ht_config.ht_tx_stbc;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008032 case WNI_CFG_HT_CAP_INFO_RX_STBC:
Jeff Johnsonbe119e62019-02-02 12:30:26 -08008033 return pSession->ht_config.ht_rx_stbc;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008034 case WNI_CFG_HT_CAP_INFO_SHORT_GI_20MHZ:
Jeff Johnsonbe119e62019-02-02 12:30:26 -08008035 return pSession->ht_config.ht_sgi20;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008036 case WNI_CFG_HT_CAP_INFO_SHORT_GI_40MHZ:
Jeff Johnsonbe119e62019-02-02 12:30:26 -08008037 return pSession->ht_config.ht_sgi40;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008038 default:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308039 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008040 "invalid ht capability");
8041 return -EIO;
8042 }
8043}
8044
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008045int sme_update_ht_config(mac_handle_t mac_handle, uint8_t sessionId,
8046 uint16_t htCapab, int value)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008047{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008048 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Jeff Johnson01f2c232018-11-21 19:17:44 -08008049 struct csr_roam_session *pSession = CSR_GET_SESSION(mac, sessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008050
8051 if (NULL == pSession) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308052 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008053 "%s: pSession is NULL", __func__);
8054 return -EIO;
8055 }
8056
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308057 if (QDF_STATUS_SUCCESS != wma_set_htconfig(sessionId, htCapab, value)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308058 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008059 "Failed to set ht capability in target");
8060 return -EIO;
8061 }
8062
8063 switch (htCapab) {
8064 case WNI_CFG_HT_CAP_INFO_ADVANCE_CODING:
Jeff Johnsonbe119e62019-02-02 12:30:26 -08008065 pSession->ht_config.ht_rx_ldpc = value;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008066 break;
8067 case WNI_CFG_HT_CAP_INFO_TX_STBC:
Jeff Johnsonbe119e62019-02-02 12:30:26 -08008068 pSession->ht_config.ht_tx_stbc = value;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008069 break;
8070 case WNI_CFG_HT_CAP_INFO_RX_STBC:
Jeff Johnsonbe119e62019-02-02 12:30:26 -08008071 pSession->ht_config.ht_rx_stbc = value;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008072 break;
8073 case WNI_CFG_HT_CAP_INFO_SHORT_GI_20MHZ:
Krishna Kumaar Natarajana5c5aad2016-12-05 14:12:13 -08008074 value = value ? 1 : 0; /* HT SGI can be only 1 or 0 */
Jeff Johnsonbe119e62019-02-02 12:30:26 -08008075 pSession->ht_config.ht_sgi20 = value;
Sandeep Puligilla607f34a2016-05-25 14:37:47 -07008076 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008077 case WNI_CFG_HT_CAP_INFO_SHORT_GI_40MHZ:
Krishna Kumaar Natarajana5c5aad2016-12-05 14:12:13 -08008078 value = value ? 1 : 0; /* HT SGI can be only 1 or 0 */
Jeff Johnsonbe119e62019-02-02 12:30:26 -08008079 pSession->ht_config.ht_sgi40 = value;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008080 break;
8081 }
8082
Jeff Johnson01f2c232018-11-21 19:17:44 -08008083 csr_roam_update_config(mac, sessionId, htCapab, value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008084 return 0;
8085}
8086
Jeff Johnsonc7309062018-11-09 20:59:42 -08008087int sme_set_addba_accept(mac_handle_t mac_handle, uint8_t session_id, int value)
Kiran Kumar Lokere08195ef2018-01-17 19:25:15 -08008088{
8089 struct sme_addba_accept *addba_accept;
8090 struct scheduler_msg msg = {0};
8091 QDF_STATUS status;
8092
8093 addba_accept = qdf_mem_malloc(sizeof(*addba_accept));
Arif Hussain0ef77082018-10-10 16:42:53 -07008094 if (!addba_accept)
Kiran Kumar Lokere08195ef2018-01-17 19:25:15 -08008095 return -EIO;
Arif Hussain0ef77082018-10-10 16:42:53 -07008096
Kiran Kumar Lokere08195ef2018-01-17 19:25:15 -08008097 addba_accept->session_id = session_id;
8098 addba_accept->addba_accept = value;
8099 qdf_mem_zero(&msg, sizeof(msg));
8100 msg.type = eWNI_SME_SET_ADDBA_ACCEPT;
8101 msg.reserved = 0;
8102 msg.bodyptr = addba_accept;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05308103 status = scheduler_post_message(QDF_MODULE_ID_SME,
8104 QDF_MODULE_ID_PE,
8105 QDF_MODULE_ID_PE, &msg);
Kiran Kumar Lokere08195ef2018-01-17 19:25:15 -08008106 if (status != QDF_STATUS_SUCCESS) {
8107 sme_err("Not able to post addba reject");
8108 qdf_mem_free(addba_accept);
8109 return -EIO;
8110 }
8111 return 0;
8112}
Kiran Kumar Lokerebc87bec2018-02-27 20:06:42 -08008113
Jeff Johnsonc7309062018-11-09 20:59:42 -08008114int sme_set_ba_buff_size(mac_handle_t mac_handle, uint8_t session_id,
8115 uint16_t buff_size)
Kiran Kumar Lokerebc87bec2018-02-27 20:06:42 -08008116{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008117 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokerebc87bec2018-02-27 20:06:42 -08008118 if (!buff_size) {
8119 sme_err("invalid buff size %d", buff_size);
8120 return -EINVAL;
8121 }
8122 mac_ctx->usr_cfg_ba_buff_size = buff_size;
8123 sme_debug("addba buff size is set to %d",
8124 mac_ctx->usr_cfg_ba_buff_size);
8125
8126 return 0;
8127}
8128
8129#define DEFAULT_BA_BUFF_SIZE 64
Jeff Johnsonc7309062018-11-09 20:59:42 -08008130int sme_send_addba_req(mac_handle_t mac_handle, uint8_t session_id, uint8_t tid,
8131 uint16_t buff_size)
Kiran Kumar Lokerebc87bec2018-02-27 20:06:42 -08008132{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008133 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokerebc87bec2018-02-27 20:06:42 -08008134 uint16_t ba_buff = 0;
8135 QDF_STATUS status;
8136 struct scheduler_msg msg = {0};
8137 struct send_add_ba_req *send_ba_req;
8138 struct csr_roam_session *csr_session = NULL;
8139
8140 if (!csr_is_conn_state_connected_infra(mac_ctx, session_id)) {
8141 sme_err("STA not infra/connected state session_id: %d",
8142 session_id);
8143 return -EINVAL;
8144 }
8145 csr_session = CSR_GET_SESSION(mac_ctx, session_id);
8146 if (!csr_session) {
8147 sme_err("CSR session is NULL");
8148 return -EINVAL;
8149 }
8150 send_ba_req = qdf_mem_malloc(sizeof(*send_ba_req));
Arif Hussain0ef77082018-10-10 16:42:53 -07008151 if (!send_ba_req)
Kiran Kumar Lokerebc87bec2018-02-27 20:06:42 -08008152 return -EIO;
Arif Hussain0ef77082018-10-10 16:42:53 -07008153
Kiran Kumar Lokerebc87bec2018-02-27 20:06:42 -08008154 qdf_mem_copy(send_ba_req->mac_addr,
8155 csr_session->connectedProfile.bssid.bytes,
8156 QDF_MAC_ADDR_SIZE);
8157 ba_buff = buff_size;
8158 if (!buff_size) {
8159 if (mac_ctx->usr_cfg_ba_buff_size)
8160 ba_buff = mac_ctx->usr_cfg_ba_buff_size;
8161 else
8162 ba_buff = DEFAULT_BA_BUFF_SIZE;
8163 }
8164 send_ba_req->param.vdev_id = session_id;
8165 send_ba_req->param.tidno = tid;
8166 send_ba_req->param.buffersize = ba_buff;
8167 msg.type = WMA_SEND_ADDBA_REQ;
8168 msg.bodyptr = send_ba_req;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05308169 status = scheduler_post_message(QDF_MODULE_ID_SME,
8170 QDF_MODULE_ID_WMA,
8171 QDF_MODULE_ID_WMA, &msg);
Kiran Kumar Lokerebc87bec2018-02-27 20:06:42 -08008172 if (QDF_STATUS_SUCCESS != status) {
Kiran Kumar Lokerebc87bec2018-02-27 20:06:42 -08008173 qdf_mem_free(send_ba_req);
8174 return -EIO;
8175 }
8176 sme_debug("ADDBA_REQ sent to FW: tid %d buff_size %d", tid, ba_buff);
8177
8178 return 0;
8179}
8180
Jeff Johnsonc7309062018-11-09 20:59:42 -08008181int sme_set_no_ack_policy(mac_handle_t mac_handle, uint8_t session_id,
8182 uint8_t val, uint8_t ac)
Kiran Kumar Lokere3324f632018-03-01 21:43:21 -08008183{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008184 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokere3324f632018-03-01 21:43:21 -08008185 uint8_t i, set_val;
Arif Hussaineb8ba362018-03-07 19:15:13 -08008186 struct scheduler_msg msg = {0};
8187 QDF_STATUS status;
Kiran Kumar Lokere3324f632018-03-01 21:43:21 -08008188
8189 if (ac > MAX_NUM_AC) {
8190 sme_err("invalid ac val %d", ac);
8191 return -EINVAL;
8192 }
8193 if (val)
8194 set_val = 1;
8195 else
8196 set_val = 0;
8197 if (ac == MAX_NUM_AC) {
8198 for (i = 0; i < ac; i++)
8199 mac_ctx->no_ack_policy_cfg[i] = set_val;
8200 } else {
8201 mac_ctx->no_ack_policy_cfg[ac] = set_val;
8202 }
8203 sme_debug("no ack is set to %d for ac %d", set_val, ac);
Arif Hussaineb8ba362018-03-07 19:15:13 -08008204 qdf_mem_zero(&msg, sizeof(msg));
8205 msg.type = eWNI_SME_UPDATE_EDCA_PROFILE;
8206 msg.reserved = 0;
8207 msg.bodyval = session_id;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05308208 status = scheduler_post_message(QDF_MODULE_ID_SME,
8209 QDF_MODULE_ID_PE,
8210 QDF_MODULE_ID_PE, &msg);
Arif Hussaineb8ba362018-03-07 19:15:13 -08008211 if (status != QDF_STATUS_SUCCESS) {
8212 sme_err("Not able to post update edca profile");
8213 return -EIO;
8214 }
Kiran Kumar Lokere3324f632018-03-01 21:43:21 -08008215
8216 return 0;
8217}
8218
Jeff Johnsonc7309062018-11-09 20:59:42 -08008219int sme_set_auto_rate_he_ltf(mac_handle_t mac_handle, uint8_t session_id,
8220 uint8_t cfg_val)
Kiran Kumar Lokerea006a302018-03-07 20:58:13 -08008221{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008222 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokerea006a302018-03-07 20:58:13 -08008223 uint32_t set_val;
8224 uint32_t bit_mask = 0;
8225 int status;
8226
8227 if (cfg_val > QCA_WLAN_HE_LTF_4X) {
8228 sme_err("invalid HE LTF cfg %d", cfg_val);
8229 return -EINVAL;
8230 }
8231
8232 /*set the corresponding HE LTF cfg BIT*/
8233 if (cfg_val == QCA_WLAN_HE_LTF_AUTO)
8234 bit_mask = HE_LTF_ALL;
8235 else
8236 bit_mask = (1 << (cfg_val - 1));
8237
8238 set_val = mac_ctx->he_sgi_ltf_cfg_bit_mask;
8239
8240 SET_AUTO_RATE_HE_LTF_VAL(set_val, bit_mask);
8241
8242 mac_ctx->he_sgi_ltf_cfg_bit_mask = set_val;
8243 status = wma_cli_set_command(session_id,
8244 WMI_VDEV_PARAM_AUTORATE_MISC_CFG,
8245 set_val, VDEV_CMD);
8246 if (status) {
8247 sme_err("failed to set he_ltf_sgi");
8248 return status;
8249 }
8250
8251 sme_debug("HE SGI_LTF is set to 0x%08X",
8252 mac_ctx->he_sgi_ltf_cfg_bit_mask);
8253
8254 return 0;
8255}
8256
Jeff Johnsonc7309062018-11-09 20:59:42 -08008257int sme_set_auto_rate_he_sgi(mac_handle_t mac_handle, uint8_t session_id,
8258 uint8_t cfg_val)
Kiran Kumar Lokerea006a302018-03-07 20:58:13 -08008259{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008260 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokerea006a302018-03-07 20:58:13 -08008261 uint32_t set_val;
8262 uint32_t sgi_bit_mask = 0;
8263 int status;
8264
8265 if ((cfg_val > AUTO_RATE_GI_3200NS) ||
8266 (cfg_val < AUTO_RATE_GI_400NS)) {
8267 sme_err("invalid auto rate GI cfg %d", cfg_val);
8268 return -EINVAL;
8269 }
8270
8271 sgi_bit_mask = (1 << cfg_val);
8272
8273 set_val = mac_ctx->he_sgi_ltf_cfg_bit_mask;
8274 SET_AUTO_RATE_SGI_VAL(set_val, sgi_bit_mask);
8275
8276 mac_ctx->he_sgi_ltf_cfg_bit_mask = set_val;
8277 status = wma_cli_set_command(session_id,
8278 WMI_VDEV_PARAM_AUTORATE_MISC_CFG,
8279 set_val, VDEV_CMD);
8280 if (status) {
8281 sme_err("failed to set he_ltf_sgi");
8282 return status;
8283 }
8284
8285 sme_debug("auto rate HE SGI_LTF is set to 0x%08X",
8286 mac_ctx->he_sgi_ltf_cfg_bit_mask);
8287
8288 return 0;
8289}
8290
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008291#define HT20_SHORT_GI_MCS7_RATE 722
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308292/*
8293 * sme_send_rate_update_ind() -
8294 * API to Update rate
8295 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008296 * mac_handle - The handle returned by mac_open
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308297 * rateUpdateParams - Pointer to rate update params
8298 * Return QDF_STATUS
8299 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008300QDF_STATUS sme_send_rate_update_ind(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008301 tSirRateUpdateInd *rateUpdateParams)
8302{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008303 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308304 QDF_STATUS status;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07008305 struct scheduler_msg msg = {0};
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308306 tSirRateUpdateInd *rate_upd = qdf_mem_malloc(sizeof(tSirRateUpdateInd));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008307
Arif Hussain0ef77082018-10-10 16:42:53 -07008308 if (!rate_upd)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308309 return QDF_STATUS_E_FAILURE;
Arif Hussain0ef77082018-10-10 16:42:53 -07008310
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008311 *rate_upd = *rateUpdateParams;
8312
8313 if (rate_upd->mcastDataRate24GHz == HT20_SHORT_GI_MCS7_RATE)
8314 rate_upd->mcastDataRate24GHzTxFlag =
Naveen Rawatea1564b2018-05-17 15:56:11 -07008315 TX_RATE_HT20 | TX_RATE_SGI;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008316 else if (rate_upd->reliableMcastDataRate ==
8317 HT20_SHORT_GI_MCS7_RATE)
8318 rate_upd->reliableMcastDataRateTxFlag =
Naveen Rawatea1564b2018-05-17 15:56:11 -07008319 TX_RATE_HT20 | TX_RATE_SGI;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008320
Jeff Johnson01f2c232018-11-21 19:17:44 -08008321 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308322 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008323 msg.type = WMA_RATE_UPDATE_IND;
8324 msg.bodyptr = rate_upd;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05308325 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
8326 NO_SESSION, msg.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308327 if (!QDF_IS_STATUS_SUCCESS
gaurank kathpalia36b0c582018-08-28 17:45:43 +05308328 (scheduler_post_message(QDF_MODULE_ID_SME,
8329 QDF_MODULE_ID_WMA,
8330 QDF_MODULE_ID_WMA,
8331 &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308332 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Rachit Kankaneee1735c2018-08-02 13:19:34 +05308333 "%s: Not able to post WMA_RATE_UPDATE_IND to WMA!",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008334 __func__);
8335
Jeff Johnson01f2c232018-11-21 19:17:44 -08008336 sme_release_global_lock(&mac->sme);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308337 qdf_mem_free(rate_upd);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308338 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008339 }
8340
Jeff Johnson01f2c232018-11-21 19:17:44 -08008341 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308342 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008343 }
8344
8345 return status;
8346}
8347
8348/**
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +05308349 * sme_update_access_policy_vendor_ie() - update vendor ie and access policy.
Jeff Johnsonc7309062018-11-09 20:59:42 -08008350 * @mac_handle: Pointer to the mac context
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +05308351 * @session_id: sme session id
8352 * @vendor_ie: vendor ie
8353 * @access_policy: vendor ie access policy
8354 *
8355 * This function updates the vendor ie and access policy to lim.
8356 *
8357 * Return: success or failure.
8358 */
Jeff Johnsonc7309062018-11-09 20:59:42 -08008359QDF_STATUS sme_update_access_policy_vendor_ie(mac_handle_t mac_handle,
8360 uint8_t session_id,
8361 uint8_t *vendor_ie,
8362 int access_policy)
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +05308363{
8364 struct sme_update_access_policy_vendor_ie *msg;
8365 uint16_t msg_len;
8366 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +05308367
8368 msg_len = sizeof(*msg);
8369
8370 msg = qdf_mem_malloc(msg_len);
8371 if (!msg) {
Srinivas Girigowda09625b02018-09-10 15:28:09 -07008372 return QDF_STATUS_E_NOMEM;
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +05308373 }
8374
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +05308375 msg->msg_type = (uint16_t)eWNI_SME_UPDATE_ACCESS_POLICY_VENDOR_IE;
8376 msg->length = (uint16_t)msg_len;
8377
8378 qdf_mem_copy(&msg->ie[0], vendor_ie, sizeof(msg->ie));
8379
8380 msg->sme_session_id = session_id;
8381 msg->access_policy = access_policy;
8382
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07008383 sme_debug("sme_session_id: %hu, access_policy: %d", session_id,
8384 access_policy);
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +05308385
Rajeev Kumard138ac52017-01-30 18:38:37 -08008386 status = umac_send_mb_message_to_mac(msg);
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +05308387
8388 return status;
8389}
8390
8391/**
Agrawal, Ashish4e5fa1c2016-09-21 19:03:43 +05308392 * sme_update_sta_inactivity_timeout(): Update sta_inactivity_timeout to FW
Jeff Johnsonc7309062018-11-09 20:59:42 -08008393 * @mac_handle: Handle returned by mac_open
Agrawal, Ashish4e5fa1c2016-09-21 19:03:43 +05308394 * @session_id: Session ID on which sta_inactivity_timeout needs
8395 * to be updated to FW
8396 * @sta_inactivity_timeout: sta inactivity timeout.
8397 *
8398 * If a station does not send anything in sta_inactivity_timeout seconds, an
8399 * empty data frame is sent to it in order to verify whether it is
8400 * still in range. If this frame is not ACKed, the station will be
8401 * disassociated and then deauthenticated.
8402 *
8403 * Return: QDF_STATUS_SUCCESS or non-zero on failure.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308404 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008405QDF_STATUS sme_update_sta_inactivity_timeout(mac_handle_t mac_handle,
Agrawal, Ashish4e5fa1c2016-09-21 19:03:43 +05308406 struct sme_sta_inactivity_timeout *sta_inactivity_timer)
8407{
8408 struct sme_sta_inactivity_timeout *inactivity_time;
8409 void *wma_handle;
8410
8411 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
8412 inactivity_time = qdf_mem_malloc(sizeof(*inactivity_time));
Arif Hussain0ef77082018-10-10 16:42:53 -07008413 if (!inactivity_time)
Agrawal, Ashish4e5fa1c2016-09-21 19:03:43 +05308414 return QDF_STATUS_E_FAILURE;
Arif Hussain0ef77082018-10-10 16:42:53 -07008415
Abhishek Singhe4a1f882017-08-10 17:59:44 +05308416 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Agrawal, Ashish4e5fa1c2016-09-21 19:03:43 +05308417 FL("sta_inactivity_timeout: %d"),
8418 sta_inactivity_timer->sta_inactivity_timeout);
8419 inactivity_time->session_id = sta_inactivity_timer->session_id;
8420 inactivity_time->sta_inactivity_timeout =
8421 sta_inactivity_timer->sta_inactivity_timeout;
8422
8423 wma_update_sta_inactivity_timeout(wma_handle,
8424 inactivity_time);
8425 return QDF_STATUS_SUCCESS;
8426}
8427
8428/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008429 * sme_get_reg_info() - To get registration info
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08008430 * @mac_handle: Opaque handle to the global MAC context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008431 * @chanId: channel id
8432 * @regInfo1: first reg info to fill
8433 * @regInfo2: second reg info to fill
8434 *
8435 * This routine will give you reg info
8436 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308437 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008438 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008439QDF_STATUS sme_get_reg_info(mac_handle_t mac_handle, uint8_t chanId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008440 uint32_t *regInfo1, uint32_t *regInfo2)
8441{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008442 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308443 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008444 uint8_t i;
8445 bool found = false;
8446
Jeff Johnson01f2c232018-11-21 19:17:44 -08008447 status = sme_acquire_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008448 *regInfo1 = 0;
8449 *regInfo2 = 0;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308450 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008451 return status;
8452
Wu Gao0821b0d2019-01-11 17:31:11 +08008453 for (i = 0; i < CFG_VALID_CHANNEL_LIST_LEN; i++) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08008454 if (mac->scan.defaultPowerTable[i].chan_num == chanId) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008455 SME_SET_CHANNEL_REG_POWER(*regInfo1,
Jeff Johnson01f2c232018-11-21 19:17:44 -08008456 mac->scan.defaultPowerTable[i].tx_power);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008457
8458 SME_SET_CHANNEL_MAX_TX_POWER(*regInfo2,
Jeff Johnson01f2c232018-11-21 19:17:44 -08008459 mac->scan.defaultPowerTable[i].tx_power);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008460 found = true;
8461 break;
8462 }
8463 }
8464 if (!found)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308465 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008466
Jeff Johnson01f2c232018-11-21 19:17:44 -08008467 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008468 return status;
8469}
8470
8471#ifdef FEATURE_WLAN_AUTO_SHUTDOWN
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008472QDF_STATUS sme_set_auto_shutdown_cb(mac_handle_t mac_handle,
Jeff Johnsoneb7bbed2019-02-17 10:34:24 -08008473 void (*callback_fn)(void))
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008474{
Jeff Johnsoneb7bbed2019-02-17 10:34:24 -08008475 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008476 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008477
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308478 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008479 "%s: Plug in Auto shutdown event callback", __func__);
8480
Jeff Johnson01f2c232018-11-21 19:17:44 -08008481 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308482 if (QDF_STATUS_SUCCESS == status) {
Jeff Johnsoneb7bbed2019-02-17 10:34:24 -08008483 if (NULL != callback_fn)
8484 mac->sme.auto_shutdown_cb = callback_fn;
Jeff Johnson01f2c232018-11-21 19:17:44 -08008485 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008486 }
8487
8488 return status;
8489}
8490
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308491/*
8492 * sme_set_auto_shutdown_timer() -
8493 * API to set auto shutdown timer value in FW.
8494 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008495 * mac_handle - The handle returned by mac_open
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308496 * timer_val - The auto shutdown timer value to be set
8497 * Return Configuration message posting status, SUCCESS or Fail
8498 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008499QDF_STATUS sme_set_auto_shutdown_timer(mac_handle_t mac_handle,
8500 uint32_t timer_val)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008501{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308502 QDF_STATUS status = QDF_STATUS_SUCCESS;
8503 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008504 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Jeff Johnsona9ade7d2019-02-17 10:08:17 -08008505 struct auto_shutdown_cmd *auto_sh_cmd;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07008506 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008507
Jeff Johnson01f2c232018-11-21 19:17:44 -08008508 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308509 if (QDF_STATUS_SUCCESS == status) {
Jeff Johnsona9ade7d2019-02-17 10:08:17 -08008510 auto_sh_cmd = qdf_mem_malloc(sizeof(*auto_sh_cmd));
Arif Hussain0ef77082018-10-10 16:42:53 -07008511 if (!auto_sh_cmd) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08008512 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308513 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008514 }
8515
8516 auto_sh_cmd->timer_val = timer_val;
8517
8518 /* serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08008519 message.bodyptr = auto_sh_cmd;
8520 message.type = WMA_SET_AUTO_SHUTDOWN_TIMER_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05308521 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
8522 QDF_MODULE_ID_WMA,
8523 QDF_MODULE_ID_WMA,
8524 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308525 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308526 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008527 "%s: Post Auto shutdown MSG fail", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308528 qdf_mem_free(auto_sh_cmd);
Jeff Johnson01f2c232018-11-21 19:17:44 -08008529 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308530 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008531 }
Abhishek Singhe4a1f882017-08-10 17:59:44 +05308532 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008533 "%s: Posted Auto shutdown MSG", __func__);
Jeff Johnson01f2c232018-11-21 19:17:44 -08008534 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008535 }
8536
8537 return status;
8538}
8539#endif
8540
Nirav Shaheb017be2018-02-15 11:20:58 +05308541#ifdef FEATURE_WLAN_CH_AVOID
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308542/*
8543 * sme_ch_avoid_update_req() -
8544 * API to request channel avoidance update from FW.
8545 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008546 * mac_handle - The handle returned by mac_open
Jeff Johnsonc5927de2018-05-11 09:12:53 -07008547 * update_type - The update_type parameter of this request call
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308548 * Return Configuration message posting status, SUCCESS or Fail
8549 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008550QDF_STATUS sme_ch_avoid_update_req(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008551{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308552 QDF_STATUS status = QDF_STATUS_SUCCESS;
8553 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008554 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008555 tSirChAvoidUpdateReq *cauReq;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07008556 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008557
Jeff Johnson01f2c232018-11-21 19:17:44 -08008558 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308559 if (QDF_STATUS_SUCCESS == status) {
Arif Hussain0ef77082018-10-10 16:42:53 -07008560 cauReq = qdf_mem_malloc(sizeof(tSirChAvoidUpdateReq));
8561 if (!cauReq) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08008562 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308563 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008564 }
8565
8566 cauReq->reserved_param = 0;
8567
8568 /* serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08008569 message.bodyptr = cauReq;
8570 message.type = WMA_CH_AVOID_UPDATE_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05308571 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
8572 QDF_MODULE_ID_WMA,
8573 QDF_MODULE_ID_WMA,
8574 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308575 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308576 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008577 "%s: Post Ch Avoid Update MSG fail",
8578 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308579 qdf_mem_free(cauReq);
Jeff Johnson01f2c232018-11-21 19:17:44 -08008580 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308581 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008582 }
Abhishek Singhe4a1f882017-08-10 17:59:44 +05308583 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008584 "%s: Posted Ch Avoid Update MSG", __func__);
Jeff Johnson01f2c232018-11-21 19:17:44 -08008585 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008586 }
8587
8588 return status;
8589}
Nirav Shaheb017be2018-02-15 11:20:58 +05308590#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008591
8592/**
8593 * sme_set_miracast() - Function to set miracast value to UMAC
Jeff Johnsonc7309062018-11-09 20:59:42 -08008594 * @mac_handle: Handle returned by macOpen
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008595 * @filter_type: 0-Disabled, 1-Source, 2-sink
8596 *
8597 * This function passes down the value of miracast set by
8598 * framework to UMAC
8599 *
8600 * Return: Configuration message posting status, SUCCESS or Fail
8601 *
8602 */
Jeff Johnsonc7309062018-11-09 20:59:42 -08008603QDF_STATUS sme_set_miracast(mac_handle_t mac_handle, uint8_t filter_type)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008604{
Rajeev Kumar37d478b2017-04-17 16:59:28 -07008605 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008606 uint32_t *val;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008607 struct mac_context *mac_ptr = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008608
Arif Hussain0ef77082018-10-10 16:42:53 -07008609 if (!mac_ptr) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308610 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008611 "%s: Invalid pointer", __func__);
Arif Hussain0ef77082018-10-10 16:42:53 -07008612 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008613 }
8614
Arif Hussain0ef77082018-10-10 16:42:53 -07008615 val = qdf_mem_malloc(sizeof(*val));
8616 if (!val)
8617 return QDF_STATUS_E_NOMEM;
8618
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008619 *val = filter_type;
8620
8621 msg.type = SIR_HAL_SET_MIRACAST;
8622 msg.reserved = 0;
8623 msg.bodyptr = val;
8624
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308625 if (!QDF_IS_STATUS_SUCCESS(
gaurank kathpalia36b0c582018-08-28 17:45:43 +05308626 scheduler_post_message(QDF_MODULE_ID_SME,
8627 QDF_MODULE_ID_WMA,
8628 QDF_MODULE_ID_WMA,
8629 &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308630 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008631 "%s: Not able to post WDA_SET_MAS_ENABLE_DISABLE to WMA!",
8632 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308633 qdf_mem_free(val);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308634 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008635 }
8636
8637 mac_ptr->sme.miracast_value = filter_type;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308638 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008639}
8640
8641/**
8642 * sme_set_mas() - Function to set MAS value to UMAC
8643 * @val: 1-Enable, 0-Disable
8644 *
8645 * This function passes down the value of MAS to the UMAC. A
8646 * value of 1 will enable MAS and a value of 0 will disable MAS
8647 *
8648 * Return: Configuration message posting status, SUCCESS or Fail
8649 *
8650 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308651QDF_STATUS sme_set_mas(uint32_t val)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008652{
Rajeev Kumar37d478b2017-04-17 16:59:28 -07008653 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008654 uint32_t *ptr_val;
8655
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308656 ptr_val = qdf_mem_malloc(sizeof(*ptr_val));
Arif Hussain0ef77082018-10-10 16:42:53 -07008657 if (!ptr_val)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308658 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008659
8660 *ptr_val = val;
8661
8662 msg.type = SIR_HAL_SET_MAS;
8663 msg.reserved = 0;
8664 msg.bodyptr = ptr_val;
8665
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308666 if (!QDF_IS_STATUS_SUCCESS(
gaurank kathpalia36b0c582018-08-28 17:45:43 +05308667 scheduler_post_message(QDF_MODULE_ID_SME,
8668 QDF_MODULE_ID_WMA,
8669 QDF_MODULE_ID_WMA,
8670 &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308671 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008672 "%s: Not able to post WDA_SET_MAS_ENABLE_DISABLE to WMA!",
8673 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308674 qdf_mem_free(ptr_val);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308675 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008676 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308677 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008678}
8679
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -08008680/**
8681 * sme_roam_channel_change_req() - Channel change to new target channel
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008682 * @mac_handle: handle returned by mac_open
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -08008683 * @bssid: mac address of BSS
8684 * @ch_params: target channel information
8685 * @profile: CSR profile
8686 *
8687 * API to Indicate Channel change to new target channel
8688 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308689 * Return: QDF_STATUS
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -08008690 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008691QDF_STATUS sme_roam_channel_change_req(mac_handle_t mac_handle,
Amar Singhale4f28ee2015-10-21 14:36:56 -07008692 struct qdf_mac_addr bssid,
Amar Singhal5cccafe2017-02-15 12:42:58 -08008693 struct ch_params *ch_params,
Jeff Johnson66ee8a92018-03-17 15:24:26 -07008694 struct csr_roam_profile *profile)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008695{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308696 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008697 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008698
Jeff Johnson01f2c232018-11-21 19:17:44 -08008699 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308700 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008701
Jeff Johnson01f2c232018-11-21 19:17:44 -08008702 status = csr_roam_channel_change_req(mac, bssid, ch_params,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008703 profile);
Jeff Johnson01f2c232018-11-21 19:17:44 -08008704 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008705 }
8706 return status;
8707}
8708
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308709/*
8710 * sme_process_channel_change_resp() -
8711 * API to Indicate Channel change response message to SAP.
8712 *
8713 * Return QDF_STATUS
8714 */
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008715static QDF_STATUS sme_process_channel_change_resp(struct mac_context *mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008716 uint16_t msg_type, void *pMsgBuf)
8717{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308718 QDF_STATUS status = QDF_STATUS_SUCCESS;
Min Liu3621ede2018-11-07 18:36:00 +08008719 struct csr_roam_info *roam_info;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008720 eCsrRoamResult roamResult;
8721 tpSwitchChannelParams pChnlParams = (tpSwitchChannelParams) pMsgBuf;
8722 uint32_t SessionId = pChnlParams->peSessionId;
8723
Min Liu3621ede2018-11-07 18:36:00 +08008724 roam_info = qdf_mem_malloc(sizeof(*roam_info));
8725 if (!roam_info)
8726 return QDF_STATUS_E_NOMEM;
8727
8728 roam_info->channelChangeRespEvent =
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308729 qdf_mem_malloc(sizeof(tSirChanChangeResponse));
Min Liu3621ede2018-11-07 18:36:00 +08008730 if (!roam_info->channelChangeRespEvent) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308731 status = QDF_STATUS_E_NOMEM;
Min Liu3621ede2018-11-07 18:36:00 +08008732 qdf_mem_free(roam_info);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008733 return status;
8734 }
8735 if (msg_type == eWNI_SME_CHANNEL_CHANGE_RSP) {
Min Liu3621ede2018-11-07 18:36:00 +08008736 roam_info->channelChangeRespEvent->sessionId = SessionId;
8737 roam_info->channelChangeRespEvent->newChannelNumber =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008738 pChnlParams->channelNumber;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008739
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308740 if (pChnlParams->status == QDF_STATUS_SUCCESS) {
Abhishek Singhe4a1f882017-08-10 17:59:44 +05308741 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008742 "sapdfs: Received success eWNI_SME_CHANNEL_CHANGE_RSP for sessionId[%d]",
8743 SessionId);
Min Liu3621ede2018-11-07 18:36:00 +08008744 roam_info->channelChangeRespEvent->channelChangeStatus =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008745 1;
8746 roamResult = eCSR_ROAM_RESULT_CHANNEL_CHANGE_SUCCESS;
8747 } else {
Abhishek Singhe4a1f882017-08-10 17:59:44 +05308748 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008749 "sapdfs: Received failure eWNI_SME_CHANNEL_CHANGE_RSP for sessionId[%d]",
8750 SessionId);
Min Liu3621ede2018-11-07 18:36:00 +08008751 roam_info->channelChangeRespEvent->channelChangeStatus =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008752 0;
8753 roamResult = eCSR_ROAM_RESULT_CHANNEL_CHANGE_FAILURE;
8754 }
8755
Min Liu3621ede2018-11-07 18:36:00 +08008756 csr_roam_call_callback(mac, SessionId, roam_info, 0,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008757 eCSR_ROAM_SET_CHANNEL_RSP, roamResult);
8758
8759 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308760 status = QDF_STATUS_E_FAILURE;
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07008761 sme_err("Invalid Channel Change Resp Message: %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008762 status);
8763 }
Min Liu3621ede2018-11-07 18:36:00 +08008764 qdf_mem_free(roam_info->channelChangeRespEvent);
8765 qdf_mem_free(roam_info);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008766
8767 return status;
8768}
8769
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308770/*
8771 * sme_roam_start_beacon_req() -
8772 * API to Indicate LIM to start Beacon Tx after SAP CAC Wait is completed.
8773 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008774 * mac_handle - The handle returned by mac_open
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308775 * sessionId - session ID
8776 * dfsCacWaitStatus - CAC WAIT status flag
8777 * Return QDF_STATUS
8778 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008779QDF_STATUS sme_roam_start_beacon_req(mac_handle_t mac_handle,
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08008780 struct qdf_mac_addr bssid,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008781 uint8_t dfsCacWaitStatus)
8782{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308783 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008784 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308785
Jeff Johnson01f2c232018-11-21 19:17:44 -08008786 status = sme_acquire_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008787
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308788 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08008789 status = csr_roam_start_beacon_req(mac, bssid,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308790 dfsCacWaitStatus);
Jeff Johnson01f2c232018-11-21 19:17:44 -08008791 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008792 }
8793 return status;
8794}
8795
Abhishek Singh20a8e442018-09-12 15:50:44 +05308796#ifdef CONFIG_VDEV_SM
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008797QDF_STATUS sme_csa_restart(struct mac_context *mac_ctx, uint8_t session_id)
Abhishek Singh20a8e442018-09-12 15:50:44 +05308798{
8799 QDF_STATUS status = QDF_STATUS_E_FAILURE;
8800
8801 status = sme_acquire_global_lock(&mac_ctx->sme);
8802 if (QDF_IS_STATUS_SUCCESS(status)) {
8803 status = csr_csa_restart(mac_ctx, session_id);
8804 sme_release_global_lock(&mac_ctx->sme);
8805 }
8806
8807 return status;
8808}
8809#endif
8810
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -08008811/**
8812 * sme_roam_csa_ie_request() - request CSA IE transmission from PE
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008813 * @mac_handle: handle returned by mac_open
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -08008814 * @bssid: SAP bssid
8815 * @targetChannel: target channel information
8816 * @csaIeReqd: CSA IE Request
8817 * @ch_params: channel information
8818 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308819 * Return: QDF_STATUS
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -08008820 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008821QDF_STATUS sme_roam_csa_ie_request(mac_handle_t mac_handle,
8822 struct qdf_mac_addr bssid,
8823 uint8_t targetChannel, uint8_t csaIeReqd,
8824 struct ch_params *ch_params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008825{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308826 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008827 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308828
Jeff Johnson01f2c232018-11-21 19:17:44 -08008829 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308830 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08008831 status = csr_roam_send_chan_sw_ie_request(mac, bssid,
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -08008832 targetChannel, csaIeReqd, ch_params);
Jeff Johnson01f2c232018-11-21 19:17:44 -08008833 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008834 }
8835 return status;
8836}
8837
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308838/*
8839 * sme_init_thermal_info() -
8840 * SME API to initialize the thermal mitigation parameters
8841 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008842 * mac_handle
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308843 * thermalParam : thermal mitigation parameters
8844 * Return QDF_STATUS
8845 */
Manikandan Mohan9045e2e2018-11-26 16:44:19 -08008846QDF_STATUS sme_init_thermal_info(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008847{
8848 t_thermal_mgmt *pWmaParam;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07008849 struct scheduler_msg msg = {0};
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008850 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Manikandan Mohan9045e2e2018-11-26 16:44:19 -08008851 struct wlan_fwol_thermal_temp thermal_temp = {0};
8852 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008853
Arif Hussain0ef77082018-10-10 16:42:53 -07008854 pWmaParam = qdf_mem_malloc(sizeof(t_thermal_mgmt));
8855 if (!pWmaParam)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308856 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008857
Manikandan Mohan9045e2e2018-11-26 16:44:19 -08008858 status = ucfg_fwol_get_thermal_temp(mac->psoc, &thermal_temp);
8859 if (QDF_IS_STATUS_ERROR(status))
8860 return qdf_status_to_os_return(status);
8861
8862 pWmaParam->thermalMgmtEnabled = thermal_temp.thermal_mitigation_enable;
8863 pWmaParam->throttlePeriod = thermal_temp.throttle_period;
Poddar, Siddarth83905022016-04-16 17:56:08 -07008864
8865 pWmaParam->throttle_duty_cycle_tbl[0] =
Manikandan Mohan9045e2e2018-11-26 16:44:19 -08008866 thermal_temp.throttle_dutycycle_level[0];
Poddar, Siddarth83905022016-04-16 17:56:08 -07008867 pWmaParam->throttle_duty_cycle_tbl[1] =
Manikandan Mohan9045e2e2018-11-26 16:44:19 -08008868 thermal_temp.throttle_dutycycle_level[1];
Poddar, Siddarth83905022016-04-16 17:56:08 -07008869 pWmaParam->throttle_duty_cycle_tbl[2] =
Manikandan Mohan9045e2e2018-11-26 16:44:19 -08008870 thermal_temp.throttle_dutycycle_level[2];
Poddar, Siddarth83905022016-04-16 17:56:08 -07008871 pWmaParam->throttle_duty_cycle_tbl[3] =
Manikandan Mohan9045e2e2018-11-26 16:44:19 -08008872 thermal_temp.throttle_dutycycle_level[3];
Poddar, Siddarth83905022016-04-16 17:56:08 -07008873
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008874 pWmaParam->thermalLevels[0].minTempThreshold =
Manikandan Mohan9045e2e2018-11-26 16:44:19 -08008875 thermal_temp.thermal_temp_min_level[0];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008876 pWmaParam->thermalLevels[0].maxTempThreshold =
Manikandan Mohan9045e2e2018-11-26 16:44:19 -08008877 thermal_temp.thermal_temp_max_level[0];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008878 pWmaParam->thermalLevels[1].minTempThreshold =
Manikandan Mohan9045e2e2018-11-26 16:44:19 -08008879 thermal_temp.thermal_temp_min_level[1];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008880 pWmaParam->thermalLevels[1].maxTempThreshold =
Manikandan Mohan9045e2e2018-11-26 16:44:19 -08008881 thermal_temp.thermal_temp_max_level[1];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008882 pWmaParam->thermalLevels[2].minTempThreshold =
Manikandan Mohan9045e2e2018-11-26 16:44:19 -08008883 thermal_temp.thermal_temp_min_level[2];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008884 pWmaParam->thermalLevels[2].maxTempThreshold =
Manikandan Mohan9045e2e2018-11-26 16:44:19 -08008885 thermal_temp.thermal_temp_max_level[2];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008886 pWmaParam->thermalLevels[3].minTempThreshold =
Manikandan Mohan9045e2e2018-11-26 16:44:19 -08008887 thermal_temp.thermal_temp_min_level[3];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008888 pWmaParam->thermalLevels[3].maxTempThreshold =
Manikandan Mohan9045e2e2018-11-26 16:44:19 -08008889 thermal_temp.thermal_temp_max_level[3];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008890
Jeff Johnson01f2c232018-11-21 19:17:44 -08008891 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&mac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008892 msg.type = WMA_INIT_THERMAL_INFO_CMD;
8893 msg.bodyptr = pWmaParam;
8894
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308895 if (!QDF_IS_STATUS_SUCCESS
gaurank kathpalia36b0c582018-08-28 17:45:43 +05308896 (scheduler_post_message(QDF_MODULE_ID_SME,
8897 QDF_MODULE_ID_WMA,
8898 QDF_MODULE_ID_WMA,
8899 &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308900 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008901 "%s: Not able to post WMA_SET_THERMAL_INFO_CMD to WMA!",
8902 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308903 qdf_mem_free(pWmaParam);
Jeff Johnson01f2c232018-11-21 19:17:44 -08008904 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308905 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008906 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08008907 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308908 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008909 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308910 qdf_mem_free(pWmaParam);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308911 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008912}
8913
8914/**
8915 * sme_add_set_thermal_level_callback() - Plug in set thermal level callback
Jeff Johnsonc7309062018-11-09 20:59:42 -08008916 * @mac_handle: Handle returned by macOpen
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008917 * @callback: sme_set_thermal_level_callback
8918 *
8919 * Plug in set thermal level callback
8920 *
8921 * Return: none
8922 */
Jeff Johnsonc7309062018-11-09 20:59:42 -08008923void sme_add_set_thermal_level_callback(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008924 sme_set_thermal_level_callback callback)
8925{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008926 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008927
Jeff Johnson01f2c232018-11-21 19:17:44 -08008928 mac->sme.set_thermal_level_cb = callback;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008929}
8930
8931/**
8932 * sme_set_thermal_level() - SME API to set the thermal mitigation level
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08008933 * @mac_handle: Opaque handle to the global MAC context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008934 * @level: Thermal mitigation level
8935 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308936 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008937 */
Jeff Johnsonc7309062018-11-09 20:59:42 -08008938QDF_STATUS sme_set_thermal_level(mac_handle_t mac_handle, uint8_t level)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008939{
Rajeev Kumar37d478b2017-04-17 16:59:28 -07008940 struct scheduler_msg msg = {0};
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008941 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308942 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008943
Jeff Johnson01f2c232018-11-21 19:17:44 -08008944 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&mac->sme)) {
hangtian127c9532019-01-12 13:29:07 +08008945 qdf_mem_zero(&msg, sizeof(msg));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008946 msg.type = WMA_SET_THERMAL_LEVEL;
8947 msg.bodyval = level;
8948
gaurank kathpalia36b0c582018-08-28 17:45:43 +05308949 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
8950 QDF_MODULE_ID_WMA,
8951 QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308952 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308953 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008954 "%s: Not able to post WMA_SET_THERMAL_LEVEL to WMA!",
8955 __func__);
Jeff Johnson01f2c232018-11-21 19:17:44 -08008956 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308957 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008958 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08008959 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308960 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008961 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308962 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008963}
8964
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308965/*
8966 * sme_txpower_limit() -
8967 * SME API to set txpower limits
8968 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008969 * mac_handle
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308970 * psmetx : power limits for 2g/5g
8971 * Return QDF_STATUS
8972 */
Jeff Johnson19ce8d02019-02-08 22:56:23 -08008973QDF_STATUS sme_txpower_limit(mac_handle_t mac_handle,
8974 struct tx_power_limit *psmetx)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008975{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308976 QDF_STATUS status = QDF_STATUS_SUCCESS;
8977 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07008978 struct scheduler_msg message = {0};
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008979 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Jeff Johnson19ce8d02019-02-08 22:56:23 -08008980 struct tx_power_limit *tx_power_limit;
Prashanth Bhatta75fa9a12016-01-11 18:30:08 -08008981
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308982 tx_power_limit = qdf_mem_malloc(sizeof(*tx_power_limit));
Arif Hussain0ef77082018-10-10 16:42:53 -07008983 if (!tx_power_limit)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308984 return QDF_STATUS_E_FAILURE;
Prashanth Bhatta75fa9a12016-01-11 18:30:08 -08008985
8986 *tx_power_limit = *psmetx;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008987
Jeff Johnson01f2c232018-11-21 19:17:44 -08008988 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308989 if (QDF_IS_STATUS_SUCCESS(status)) {
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08008990 message.type = WMA_TX_POWER_LIMIT;
8991 message.reserved = 0;
8992 message.bodyptr = tx_power_limit;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008993
gaurank kathpalia36b0c582018-08-28 17:45:43 +05308994 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
8995 QDF_MODULE_ID_WMA,
8996 QDF_MODULE_ID_WMA,
8997 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308998 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308999 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009000 "%s: not able to post WMA_TX_POWER_LIMIT",
9001 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309002 status = QDF_STATUS_E_FAILURE;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309003 qdf_mem_free(tx_power_limit);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009004 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08009005 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009006 }
9007 return status;
9008}
9009
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009010QDF_STATUS sme_update_connect_debug(mac_handle_t mac_handle, uint32_t set_value)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009011{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309012 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009013 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309014
Jeff Johnson01f2c232018-11-21 19:17:44 -08009015 mac->mlme_cfg->gen.debug_packet_log = set_value;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009016 return status;
9017}
9018
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309019/*
9020 * sme_ap_disable_intra_bss_fwd() -
9021 * SME will send message to WMA to set Intra BSS in txrx
9022 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009023 * mac_handle - The handle returned by mac_open
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309024 * sessionId - session id ( vdev id)
9025 * disablefwd - bool value that indicate disable intrabss fwd disable
9026 * Return QDF_STATUS
9027 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009028QDF_STATUS sme_ap_disable_intra_bss_fwd(mac_handle_t mac_handle,
9029 uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009030 bool disablefwd)
9031{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009032 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309033 int status = QDF_STATUS_SUCCESS;
9034 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009035 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009036 tpDisableIntraBssFwd pSapDisableIntraFwd = NULL;
9037
9038 /* Prepare the request to send to SME. */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309039 pSapDisableIntraFwd = qdf_mem_malloc(sizeof(tDisableIntraBssFwd));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009040 if (NULL == pSapDisableIntraFwd) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009041 sme_err("Memory Allocation Failure!!!");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309042 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009043 }
9044
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009045 pSapDisableIntraFwd->sessionId = sessionId;
9046 pSapDisableIntraFwd->disableintrabssfwd = disablefwd;
9047
Jeff Johnson01f2c232018-11-21 19:17:44 -08009048 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309049 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009050 /* serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009051 message.bodyptr = pSapDisableIntraFwd;
9052 message.type = WMA_SET_SAP_INTRABSS_DIS;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05309053 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
9054 QDF_MODULE_ID_WMA,
9055 QDF_MODULE_ID_WMA,
9056 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309057 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
9058 status = QDF_STATUS_E_FAILURE;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309059 qdf_mem_free(pSapDisableIntraFwd);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009060 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08009061 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009062 }
9063 return status;
9064}
9065
9066#ifdef WLAN_FEATURE_STATS_EXT
9067
Jeff Johnson45843652018-07-04 12:47:34 -07009068void sme_stats_ext_register_callback(mac_handle_t mac_handle,
9069 stats_ext_cb callback)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009070{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009071 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009072
Jeff Johnson45843652018-07-04 12:47:34 -07009073 if (!mac) {
9074 sme_err("Invalid mac context");
Arun Khandavalli4b55da72016-07-19 19:55:01 +05309075 return;
9076 }
9077
Jeff Johnson45843652018-07-04 12:47:34 -07009078 mac->sme.stats_ext_cb = callback;
Arun Khandavalli4b55da72016-07-19 19:55:01 +05309079}
9080
Jeff Johnson45843652018-07-04 12:47:34 -07009081void sme_stats_ext_deregister_callback(mac_handle_t mac_handle)
9082{
9083 sme_stats_ext_register_callback(mac_handle, NULL);
9084}
9085
9086void sme_stats_ext2_register_callback(mac_handle_t mac_handle,
9087 stats_ext2_cb callback)
9088{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009089 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Jeff Johnson45843652018-07-04 12:47:34 -07009090
9091 if (!mac) {
9092 sme_err("Invalid mac context");
9093 return;
9094 }
9095
9096 mac->sme.stats_ext2_cb = callback;
9097}
Arun Khandavalli4b55da72016-07-19 19:55:01 +05309098
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309099/*
9100 * sme_stats_ext_request() -
9101 * Function called when HDD receives STATS EXT vendor command from userspace
9102 *
9103 * sessionID - vdevID for the stats ext request
9104 * input - Stats Ext Request structure ptr
9105 * Return QDF_STATUS
9106 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309107QDF_STATUS sme_stats_ext_request(uint8_t session_id, tpStatsExtRequestReq input)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009108{
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009109 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009110 tpStatsExtRequest data;
9111 size_t data_len;
9112
9113 data_len = sizeof(tStatsExtRequest) + input->request_data_len;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309114 data = qdf_mem_malloc(data_len);
Arif Hussain0ef77082018-10-10 16:42:53 -07009115 if (!data)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309116 return QDF_STATUS_E_NOMEM;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309117
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009118 data->vdev_id = session_id;
9119 data->request_data_len = input->request_data_len;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309120 if (input->request_data_len)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309121 qdf_mem_copy(data->request_data,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009122 input->request_data, input->request_data_len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009123
9124 msg.type = WMA_STATS_EXT_REQUEST;
9125 msg.reserved = 0;
9126 msg.bodyptr = data;
9127
gaurank kathpalia36b0c582018-08-28 17:45:43 +05309128 if (QDF_STATUS_SUCCESS != scheduler_post_message(QDF_MODULE_ID_SME,
9129 QDF_MODULE_ID_WMA,
9130 QDF_MODULE_ID_WMA,
9131 &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309132 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009133 "%s: Not able to post WMA_STATS_EXT_REQUEST message to WMA",
9134 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309135 qdf_mem_free(data);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309136 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009137 }
9138
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309139 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009140}
9141
Jeff Johnsonfdecd512018-06-10 09:18:32 -07009142/**
9143 * sme_stats_ext_event() - eWNI_SME_STATS_EXT_EVENT processor
9144 * @mac: Global MAC context
9145 * @msg: "stats ext" message
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009146
Jeff Johnsonfdecd512018-06-10 09:18:32 -07009147 * This callback function called when SME received eWNI_SME_STATS_EXT_EVENT
9148 * response from WMA
9149 *
9150 * Return: QDF_STATUS
9151 */
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009152static QDF_STATUS sme_stats_ext_event(struct mac_context *mac,
Jeff Johnson45843652018-07-04 12:47:34 -07009153 struct stats_ext_event *msg)
Jeff Johnsonfdecd512018-06-10 09:18:32 -07009154{
9155 if (!msg) {
9156 sme_err("Null msg");
9157 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009158 }
9159
Jeff Johnson45843652018-07-04 12:47:34 -07009160 if (mac->sme.stats_ext_cb)
9161 mac->sme.stats_ext_cb(mac->hdd_handle, msg);
Jeff Johnsonfdecd512018-06-10 09:18:32 -07009162
9163 return QDF_STATUS_SUCCESS;
9164}
9165
9166#else
9167
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009168static QDF_STATUS sme_stats_ext_event(struct mac_context *mac,
Jeff Johnson45843652018-07-04 12:47:34 -07009169 struct stats_ext_event *msg)
Jeff Johnsonfdecd512018-06-10 09:18:32 -07009170{
9171 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009172}
9173
9174#endif
9175
Qun Zhangef655622019-02-25 10:48:10 +08009176#ifdef FEATURE_FW_STATE
9177QDF_STATUS sme_get_fw_state(mac_handle_t mac_handle,
9178 fw_state_callback callback,
9179 void *context)
9180{
9181 QDF_STATUS status;
9182 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
9183 tp_wma_handle wma_handle;
9184
9185 SME_ENTER();
9186
9187 mac_ctx->sme.fw_state_cb = callback;
9188 mac_ctx->sme.fw_state_context = context;
9189 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
9190 status = wma_get_fw_state(wma_handle);
9191
9192 SME_EXIT();
9193 return status;
9194}
9195
9196/**
9197 * sme_fw_state_resp() - eWNI_SME_FW_STATUS_IND processor
9198 * @mac: Global MAC context
9199
9200 * This callback function called when SME received eWNI_SME_FW_STATUS_IND
9201 * response from WMA
9202 *
9203 * Return: QDF_STATUS
9204 */
9205static QDF_STATUS sme_fw_state_resp(struct mac_context *mac)
9206{
9207 if (mac->sme.fw_state_cb)
9208 mac->sme.fw_state_cb(mac->sme.fw_state_context);
9209 mac->sme.fw_state_cb = NULL;
9210 mac->sme.fw_state_context = NULL;
9211
9212 return QDF_STATUS_SUCCESS;
9213}
9214
9215#else /* FEATURE_FW_STATE */
9216static QDF_STATUS sme_fw_state_resp(struct mac_context *mac)
9217{
9218 return QDF_STATUS_SUCCESS;
9219}
9220
9221#endif /* FEATURE_FW_STATE */
9222
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309223/*
9224 * sme_update_dfs_scan_mode() -
9225 * Update DFS roam scan mode
9226 * This function is called through dynamic setConfig callback function
9227 * to configure allowDFSChannelRoam.
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08009228 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309229 * sessionId - Session Identifier
9230 * allowDFSChannelRoam - DFS roaming scan mode 0 (disable),
9231 * 1 (passive), 2 (active)
9232 * Return QDF_STATUS_SUCCESS - SME update DFS roaming scan config
9233 * successfully.
9234 * Other status means SME failed to update DFS roaming scan config.
9235 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009236QDF_STATUS sme_update_dfs_scan_mode(mac_handle_t mac_handle, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009237 uint8_t allowDFSChannelRoam)
9238{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009239 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309240 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009241
Dustin Brownad06be62019-02-04 14:52:56 -08009242 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08009243 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
9244 FL("Invalid sme session id: %d"), sessionId);
9245 return QDF_STATUS_E_INVAL;
9246 }
9247
Jeff Johnson01f2c232018-11-21 19:17:44 -08009248 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309249 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309250 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309251 "LFR runtime successfully set AllowDFSChannelRoam Mode to %d - old value is %d - roam state is %s",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009252 allowDFSChannelRoam,
Wu Gao51a63562018-11-08 16:29:10 +08009253 mac->mlme_cfg->lfr.roaming_dfs_channel,
Jeff Johnson01f2c232018-11-21 19:17:44 -08009254 mac_trace_get_neighbour_roam_state(mac->roam.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009255 neighborRoamInfo
9256 [sessionId].
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309257 neighborRoamState));
Wu Gao51a63562018-11-08 16:29:10 +08009258 mac->mlme_cfg->lfr.roaming_dfs_channel =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009259 allowDFSChannelRoam;
Wu Gao51a63562018-11-08 16:29:10 +08009260 if (mac->mlme_cfg->lfr.roam_scan_offload_enabled) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08009261 csr_roam_offload_scan(mac, sessionId,
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05309262 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
9263 REASON_ROAM_DFS_SCAN_MODE_CHANGED);
9264 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08009265 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009266 }
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05309267
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009268
9269 return status;
9270}
9271
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309272/*
9273 * sme_get_dfs_scan_mode() - get DFS roam scan mode
9274 * This is a synchronous call
9275 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009276 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309277 * Return DFS roaming scan mode 0 (disable), 1 (passive), 2 (active)
9278 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009279uint8_t sme_get_dfs_scan_mode(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009280{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009281 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309282
Wu Gao51a63562018-11-08 16:29:10 +08009283 return mac->mlme_cfg->lfr.roaming_dfs_channel;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009284}
9285
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309286/*
9287 * sme_modify_add_ie() -
9288 * This function sends msg to updates the additional IE buffers in PE
9289 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009290 * mac_handle - global structure
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309291 * pModifyIE - pointer to tModifyIE structure
9292 * updateType - type of buffer
9293 * Return Success or failure
9294 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009295QDF_STATUS sme_modify_add_ie(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009296 tSirModifyIE *pModifyIE, eUpdateIEsType updateType)
9297{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309298 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009299 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309300
Jeff Johnson01f2c232018-11-21 19:17:44 -08009301 status = sme_acquire_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009302
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309303 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08009304 status = csr_roam_modify_add_ies(mac, pModifyIE, updateType);
9305 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009306 }
9307 return status;
9308}
9309
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309310/*
9311 * sme_update_add_ie() -
9312 * This function sends msg to updates the additional IE buffers in PE
9313 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009314 * mac_handle - global structure
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309315 * pUpdateIE - pointer to structure tUpdateIE
9316 * updateType - type of buffer
9317 * Return Success or failure
9318 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009319QDF_STATUS sme_update_add_ie(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009320 tSirUpdateIE *pUpdateIE, eUpdateIEsType updateType)
9321{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309322 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009323 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309324
Jeff Johnson01f2c232018-11-21 19:17:44 -08009325 status = sme_acquire_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009326
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309327 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08009328 status = csr_roam_update_add_ies(mac, pUpdateIE, updateType);
9329 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009330 }
9331 return status;
9332}
9333
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009334/**
9335 * sme_update_dsc_pto_up_mapping()
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08009336 * @mac_handle: Opaque handle to the global MAC context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009337 * @dscpmapping: pointer to DSCP mapping structure
9338 * @sessionId: SME session id
9339 *
9340 * This routine is called to update dscp mapping
9341 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309342 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009343 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009344QDF_STATUS sme_update_dsc_pto_up_mapping(mac_handle_t mac_handle,
Abhishek Singh12be60f2017-08-11 13:52:42 +05309345 enum sme_qos_wmmuptype *dscpmapping,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009346 uint8_t sessionId)
9347{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009348 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309349 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009350 uint8_t i, j, peSessionId;
gaurank kathpalia14e2f912017-08-31 14:51:45 +05309351 struct csr_roam_session *pCsrSession = NULL;
Jeff Johnson59104482018-11-18 21:30:19 -08009352 struct pe_session *pSession = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009353
Jeff Johnson01f2c232018-11-21 19:17:44 -08009354 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309355 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009356 return status;
Jeff Johnson01f2c232018-11-21 19:17:44 -08009357 pCsrSession = CSR_GET_SESSION(mac, sessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009358 if (pCsrSession == NULL) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309359 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009360 FL("Session lookup fails for CSR session"));
Jeff Johnson01f2c232018-11-21 19:17:44 -08009361 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309362 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009363 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08009364 if (!CSR_IS_SESSION_VALID(mac, sessionId)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309365 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009366 FL("Invalid session Id %u"), sessionId);
Jeff Johnson01f2c232018-11-21 19:17:44 -08009367 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309368 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009369 }
9370
Jeff Johnson01f2c232018-11-21 19:17:44 -08009371 pSession = pe_find_session_by_bssid(mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009372 pCsrSession->connectedProfile.bssid.bytes,
9373 &peSessionId);
9374
9375 if (pSession == NULL) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309376 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009377 FL(" Session lookup fails for BSSID"));
Jeff Johnson01f2c232018-11-21 19:17:44 -08009378 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309379 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009380 }
9381
9382 if (!pSession->QosMapSet.present) {
Srinivas Girigowda2b5d47c2017-03-29 00:28:46 -07009383 sme_debug("QOS Mapping IE not present");
Jeff Johnson01f2c232018-11-21 19:17:44 -08009384 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309385 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009386 }
9387 for (i = 0; i < SME_QOS_WMM_UP_MAX; i++) {
9388 for (j = pSession->QosMapSet.dscp_range[i][0];
9389 j <= pSession->QosMapSet.dscp_range[i][1];
9390 j++) {
9391 if ((pSession->QosMapSet.dscp_range[i][0] == 255)
9392 && (pSession->QosMapSet.dscp_range[i][1] ==
9393 255)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309394 QDF_TRACE(QDF_MODULE_ID_SME,
Kiran Kumar Lokere1d411bb2017-11-29 15:24:05 -08009395 QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009396 FL("User Priority %d isn't used"), i);
9397 break;
9398 } else {
9399 dscpmapping[j] = i;
9400 }
9401 }
9402 }
9403 for (i = 0; i < pSession->QosMapSet.num_dscp_exceptions; i++)
9404 if (pSession->QosMapSet.dscp_exceptions[i][0] != 255)
9405 dscpmapping[pSession->QosMapSet.dscp_exceptions[i][0]] =
9406 pSession->QosMapSet.dscp_exceptions[i][1];
9407
Jeff Johnson01f2c232018-11-21 19:17:44 -08009408 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009409 return status;
9410}
9411
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309412/*
9413 * sme_abort_roam_scan() -
9414 * API to abort current roam scan cycle by roam scan offload module.
9415 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009416 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309417 * sessionId - Session Identifier
9418 * Return QDF_STATUS
9419 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009420
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009421QDF_STATUS sme_abort_roam_scan(mac_handle_t mac_handle, uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009422{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309423 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009424 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009425
Wu Gao51a63562018-11-08 16:29:10 +08009426 if (mac->mlme_cfg->lfr.roam_scan_offload_enabled) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009427 /* acquire the lock for the sme object */
Jeff Johnson01f2c232018-11-21 19:17:44 -08009428 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309429 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08009430 csr_roam_offload_scan(mac, sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009431 ROAM_SCAN_OFFLOAD_ABORT_SCAN,
9432 REASON_ROAM_ABORT_ROAM_SCAN);
9433 /* release the lock for the sme object */
Jeff Johnson01f2c232018-11-21 19:17:44 -08009434 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009435 }
9436 }
9437
9438 return status;
9439}
9440
9441#ifdef FEATURE_WLAN_EXTSCAN
9442/**
9443 * sme_get_valid_channels_by_band() - to fetch valid channels filtered by band
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08009444 * @mac_handle: Opaque handle to the global MAC context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009445 * @wifiBand: RF band information
9446 * @aValidChannels: output array to store channel info
9447 * @pNumChannels: output number of channels
9448 *
9449 * SME API to fetch all valid channels filtered by band
9450 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309451 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009452 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009453QDF_STATUS sme_get_valid_channels_by_band(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009454 uint8_t wifiBand,
9455 uint32_t *aValidChannels,
9456 uint8_t *pNumChannels)
9457{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309458 QDF_STATUS status = QDF_STATUS_SUCCESS;
Wu Gao0821b0d2019-01-11 17:31:11 +08009459 uint8_t chanList[CFG_VALID_CHANNEL_LIST_LEN] = { 0 };
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009460 uint8_t numChannels = 0;
9461 uint8_t i = 0;
Wu Gao0821b0d2019-01-11 17:31:11 +08009462 uint32_t totValidChannels = CFG_VALID_CHANNEL_LIST_LEN;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009463 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009464
9465 if (!aValidChannels || !pNumChannels) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009466 sme_err("Output channel list/NumChannels is NULL");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309467 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009468 }
9469
Sreelakshmi Konamki0d17c6a2017-06-08 12:58:54 +05309470 if (wifiBand >= WIFI_BAND_MAX) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009471 sme_err("Invalid wifiBand: %d", wifiBand);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309472 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009473 }
9474
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -08009475 status = sme_get_cfg_valid_channels(&chanList[0],
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009476 &totValidChannels);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309477 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009478 sme_err("Fail to get valid channel list (err=%d)", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009479 return status;
9480 }
9481
9482 switch (wifiBand) {
9483 case WIFI_BAND_UNSPECIFIED:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009484 sme_debug("Unspec Band, return all %d valid channels",
9485 totValidChannels);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009486 numChannels = totValidChannels;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309487 for (i = 0; i < totValidChannels; i++)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009488 aValidChannels[i] = cds_chan_to_freq(chanList[i]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009489 break;
9490
9491 case WIFI_BAND_BG:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009492 sme_debug("WIFI_BAND_BG (2.4 GHz)");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009493 for (i = 0; i < totValidChannels; i++) {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309494 if (WLAN_REG_IS_24GHZ_CH(chanList[i]))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009495 aValidChannels[numChannels++] =
9496 cds_chan_to_freq(chanList[i]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009497 }
9498 break;
9499
9500 case WIFI_BAND_A:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009501 sme_debug("WIFI_BAND_A (5 GHz without DFS)");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009502 for (i = 0; i < totValidChannels; i++) {
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07009503 if (WLAN_REG_IS_5GHZ_CH(chanList[i]) &&
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309504 !wlan_reg_is_dfs_ch(mac_ctx->pdev, chanList[i]))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009505 aValidChannels[numChannels++] =
9506 cds_chan_to_freq(chanList[i]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009507 }
9508 break;
9509
9510 case WIFI_BAND_ABG:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009511 sme_debug("WIFI_BAND_ABG (2.4 GHz + 5 GHz; no DFS)");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009512 for (i = 0; i < totValidChannels; i++) {
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07009513 if ((WLAN_REG_IS_24GHZ_CH(chanList[i]) ||
9514 WLAN_REG_IS_5GHZ_CH(chanList[i])) &&
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309515 !wlan_reg_is_dfs_ch(mac_ctx->pdev, chanList[i]))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009516 aValidChannels[numChannels++] =
9517 cds_chan_to_freq(chanList[i]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009518 }
9519 break;
9520
9521 case WIFI_BAND_A_DFS_ONLY:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009522 sme_debug("WIFI_BAND_A_DFS (5 GHz DFS only)");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009523 for (i = 0; i < totValidChannels; i++) {
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07009524 if (WLAN_REG_IS_5GHZ_CH(chanList[i]) &&
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309525 wlan_reg_is_dfs_ch(mac_ctx->pdev, chanList[i]))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009526 aValidChannels[numChannels++] =
9527 cds_chan_to_freq(chanList[i]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009528 }
9529 break;
9530
9531 case WIFI_BAND_A_WITH_DFS:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009532 sme_debug("WIFI_BAND_A_WITH_DFS (5 GHz with DFS)");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009533 for (i = 0; i < totValidChannels; i++) {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309534 if (WLAN_REG_IS_5GHZ_CH(chanList[i]))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009535 aValidChannels[numChannels++] =
9536 cds_chan_to_freq(chanList[i]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009537 }
9538 break;
9539
9540 case WIFI_BAND_ABG_WITH_DFS:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009541 sme_debug("WIFI_BAND_ABG_WITH_DFS (2.4 GHz+5 GHz with DFS)");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009542 for (i = 0; i < totValidChannels; i++) {
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07009543 if (WLAN_REG_IS_24GHZ_CH(chanList[i]) ||
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309544 WLAN_REG_IS_5GHZ_CH(chanList[i]))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009545 aValidChannels[numChannels++] =
9546 cds_chan_to_freq(chanList[i]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009547 }
9548 break;
9549
9550 default:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009551 sme_err("Unknown wifiBand: %d", wifiBand);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309552 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009553 }
9554 *pNumChannels = numChannels;
9555
9556 return status;
9557}
9558
Jeff Johnsonfed9a732018-07-18 12:18:03 -07009559QDF_STATUS
9560sme_ext_scan_get_capabilities(mac_handle_t mac_handle,
9561 struct extscan_capabilities_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009562{
Jeff Johnsonfed9a732018-07-18 12:18:03 -07009563 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009564 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009565 struct scheduler_msg message = {0};
Jeff Johnsonfed9a732018-07-18 12:18:03 -07009566 struct extscan_capabilities_params *bodyptr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009567
Jeff Johnsonfed9a732018-07-18 12:18:03 -07009568 /* per contract must make a copy of the params when messaging */
9569 bodyptr = qdf_mem_malloc(sizeof(*bodyptr));
9570 if (!bodyptr)
9571 return QDF_STATUS_E_NOMEM;
9572 *bodyptr = *params;
9573
9574 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309575 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009576 /* Serialize the req through MC thread */
Jeff Johnsonfed9a732018-07-18 12:18:03 -07009577 message.bodyptr = bodyptr;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009578 message.type = WMA_EXTSCAN_GET_CAPABILITIES_REQ;
Jeff Johnsonfed9a732018-07-18 12:18:03 -07009579 qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
9580 NO_SESSION, message.type);
9581 status = scheduler_post_message(QDF_MODULE_ID_SME,
9582 QDF_MODULE_ID_WMA,
9583 QDF_MODULE_ID_WMA,
9584 &message);
9585 sme_release_global_lock(&mac->sme);
9586 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009587
Jeff Johnsonfed9a732018-07-18 12:18:03 -07009588 if (QDF_IS_STATUS_ERROR(status)) {
9589 sme_err("failure: %d", status);
9590 qdf_mem_free(bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009591 }
9592 return status;
9593}
9594
Jeff Johnsondab58602018-07-14 15:30:24 -07009595QDF_STATUS
9596sme_ext_scan_start(mac_handle_t mac_handle,
9597 struct wifi_scan_cmd_req_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009598{
Jeff Johnsondab58602018-07-14 15:30:24 -07009599 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009600 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009601 struct scheduler_msg message = {0};
Jeff Johnsondab58602018-07-14 15:30:24 -07009602 struct wifi_scan_cmd_req_params *bodyptr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009603
Jeff Johnsondab58602018-07-14 15:30:24 -07009604 /* per contract must make a copy of the params when messaging */
9605 bodyptr = qdf_mem_malloc(sizeof(*bodyptr));
9606 if (!bodyptr)
9607 return QDF_STATUS_E_NOMEM;
9608 *bodyptr = *params;
9609
9610 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309611 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009612 /* Serialize the req through MC thread */
Jeff Johnsondab58602018-07-14 15:30:24 -07009613 message.bodyptr = bodyptr;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009614 message.type = WMA_EXTSCAN_START_REQ;
Jeff Johnsondab58602018-07-14 15:30:24 -07009615 qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
9616 NO_SESSION, message.type);
9617 status = scheduler_post_message(QDF_MODULE_ID_SME,
9618 QDF_MODULE_ID_WMA,
9619 QDF_MODULE_ID_WMA,
9620 &message);
9621 sme_release_global_lock(&mac->sme);
9622 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009623
Jeff Johnsondab58602018-07-14 15:30:24 -07009624 if (QDF_IS_STATUS_ERROR(status)) {
9625 sme_err("failure: %d", status);
9626 qdf_mem_free(bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009627 }
9628 return status;
9629}
9630
Jeff Johnson7272ea72018-07-15 17:22:27 -07009631QDF_STATUS sme_ext_scan_stop(mac_handle_t mac_handle,
9632 struct extscan_stop_req_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009633{
Jeff Johnson7272ea72018-07-15 17:22:27 -07009634 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009635 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009636 struct scheduler_msg message = {0};
Jeff Johnson7272ea72018-07-15 17:22:27 -07009637 struct extscan_stop_req_params *bodyptr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009638
Jeff Johnson7272ea72018-07-15 17:22:27 -07009639 /* per contract must make a copy of the params when messaging */
9640 bodyptr = qdf_mem_malloc(sizeof(*bodyptr));
9641 if (!bodyptr)
9642 return QDF_STATUS_E_NOMEM;
9643 *bodyptr = *params;
9644
9645 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309646 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009647 /* Serialize the req through MC thread */
Jeff Johnson7272ea72018-07-15 17:22:27 -07009648 message.bodyptr = bodyptr;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009649 message.type = WMA_EXTSCAN_STOP_REQ;
Jeff Johnson7272ea72018-07-15 17:22:27 -07009650 qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
9651 NO_SESSION, message.type);
9652 status = scheduler_post_message(QDF_MODULE_ID_SME,
9653 QDF_MODULE_ID_WMA,
9654 QDF_MODULE_ID_WMA,
9655 &message);
9656 sme_release_global_lock(&mac->sme);
9657 }
9658
9659 if (QDF_IS_STATUS_ERROR(status)) {
9660 sme_err("failure: %d", status);
9661 qdf_mem_free(bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009662 }
9663 return status;
9664}
9665
Jeff Johnson1148cb02018-07-13 23:14:32 -07009666QDF_STATUS
9667sme_set_bss_hotlist(mac_handle_t mac_handle,
9668 struct extscan_bssid_hotlist_set_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009669{
Jeff Johnson1148cb02018-07-13 23:14:32 -07009670 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009671 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009672 struct scheduler_msg message = {0};
Jeff Johnson1148cb02018-07-13 23:14:32 -07009673 struct extscan_bssid_hotlist_set_params *bodyptr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009674
Jeff Johnson1148cb02018-07-13 23:14:32 -07009675 /* per contract must make a copy of the params when messaging */
9676 bodyptr = qdf_mem_malloc(sizeof(*bodyptr));
Arif Hussain0ef77082018-10-10 16:42:53 -07009677 if (!bodyptr)
Jeff Johnson1148cb02018-07-13 23:14:32 -07009678 return QDF_STATUS_E_NOMEM;
Arif Hussain0ef77082018-10-10 16:42:53 -07009679
Jeff Johnson1148cb02018-07-13 23:14:32 -07009680 *bodyptr = *params;
9681
9682 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309683 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009684 /* Serialize the req through MC thread */
Jeff Johnson1148cb02018-07-13 23:14:32 -07009685 message.bodyptr = bodyptr;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009686 message.type = WMA_EXTSCAN_SET_BSSID_HOTLIST_REQ;
Jeff Johnson1148cb02018-07-13 23:14:32 -07009687 qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
9688 NO_SESSION, message.type);
gaurank kathpalia36b0c582018-08-28 17:45:43 +05309689 status = scheduler_post_message(QDF_MODULE_ID_SME,
9690 QDF_MODULE_ID_WMA,
9691 QDF_MODULE_ID_WMA, &message);
Jeff Johnson1148cb02018-07-13 23:14:32 -07009692 sme_release_global_lock(&mac->sme);
9693 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009694
Jeff Johnson1148cb02018-07-13 23:14:32 -07009695 if (QDF_IS_STATUS_ERROR(status)) {
9696 sme_err("failure: %d", status);
9697 qdf_mem_free(bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009698 }
9699 return status;
9700}
9701
Jeff Johnson9743eb72018-07-14 10:30:04 -07009702QDF_STATUS
9703sme_reset_bss_hotlist(mac_handle_t mac_handle,
9704 struct extscan_bssid_hotlist_reset_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009705{
Jeff Johnson9743eb72018-07-14 10:30:04 -07009706 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009707 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009708 struct scheduler_msg message = {0};
Jeff Johnson9743eb72018-07-14 10:30:04 -07009709 struct extscan_bssid_hotlist_reset_params *bodyptr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009710
Jeff Johnson9743eb72018-07-14 10:30:04 -07009711 /* per contract must make a copy of the params when messaging */
9712 bodyptr = qdf_mem_malloc(sizeof(*bodyptr));
Arif Hussain0ef77082018-10-10 16:42:53 -07009713 if (!bodyptr)
Jeff Johnson9743eb72018-07-14 10:30:04 -07009714 return QDF_STATUS_E_NOMEM;
Arif Hussain0ef77082018-10-10 16:42:53 -07009715
Jeff Johnson9743eb72018-07-14 10:30:04 -07009716 *bodyptr = *params;
9717
9718 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309719 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009720 /* Serialize the req through MC thread */
Jeff Johnson9743eb72018-07-14 10:30:04 -07009721 message.bodyptr = bodyptr;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009722 message.type = WMA_EXTSCAN_RESET_BSSID_HOTLIST_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05309723 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009724 NO_SESSION, message.type));
gaurank kathpalia36b0c582018-08-28 17:45:43 +05309725 status = scheduler_post_message(QDF_MODULE_ID_SME,
9726 QDF_MODULE_ID_WMA,
9727 QDF_MODULE_ID_WMA, &message);
Jeff Johnson9743eb72018-07-14 10:30:04 -07009728 sme_release_global_lock(&mac->sme);
9729 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009730
Jeff Johnson9743eb72018-07-14 10:30:04 -07009731 if (QDF_IS_STATUS_ERROR(status)) {
9732 sme_err("failure: %d", status);
9733 qdf_mem_free(bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009734 }
9735 return status;
9736}
9737
Jeff Johnsonb43ed032018-07-16 06:59:21 -07009738QDF_STATUS
9739sme_set_significant_change(mac_handle_t mac_handle,
9740 struct extscan_set_sig_changereq_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009741{
Jeff Johnsonb43ed032018-07-16 06:59:21 -07009742 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009743 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009744 struct scheduler_msg message = {0};
Jeff Johnsonb43ed032018-07-16 06:59:21 -07009745 struct extscan_set_sig_changereq_params *bodyptr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009746
Jeff Johnsonb43ed032018-07-16 06:59:21 -07009747 /* per contract must make a copy of the params when messaging */
9748 bodyptr = qdf_mem_malloc(sizeof(*bodyptr));
Arif Hussain0ef77082018-10-10 16:42:53 -07009749 if (!bodyptr)
Jeff Johnsonb43ed032018-07-16 06:59:21 -07009750 return QDF_STATUS_E_NOMEM;
Arif Hussain0ef77082018-10-10 16:42:53 -07009751
Jeff Johnsonb43ed032018-07-16 06:59:21 -07009752 *bodyptr = *params;
9753
9754 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309755 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009756 /* Serialize the req through MC thread */
Jeff Johnsonb43ed032018-07-16 06:59:21 -07009757 message.bodyptr = bodyptr;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009758 message.type = WMA_EXTSCAN_SET_SIGNF_CHANGE_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05309759 status = scheduler_post_message(QDF_MODULE_ID_SME,
9760 QDF_MODULE_ID_WMA,
9761 QDF_MODULE_ID_WMA,
9762 &message);
Jeff Johnsonb43ed032018-07-16 06:59:21 -07009763 sme_release_global_lock(&mac->sme);
9764 }
Jeff Johnsonb43ed032018-07-16 06:59:21 -07009765 if (QDF_IS_STATUS_ERROR(status)) {
9766 sme_err("failure: %d", status);
9767 qdf_mem_free(bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009768 }
9769 return status;
9770}
9771
Jeff Johnson0c8dbc32018-07-16 22:10:48 -07009772QDF_STATUS
9773sme_reset_significant_change(mac_handle_t mac_handle,
9774 struct extscan_capabilities_reset_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009775{
Jeff Johnson0c8dbc32018-07-16 22:10:48 -07009776 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009777 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009778 struct scheduler_msg message = {0};
Jeff Johnson0c8dbc32018-07-16 22:10:48 -07009779 struct extscan_capabilities_reset_params *bodyptr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009780
Jeff Johnson0c8dbc32018-07-16 22:10:48 -07009781 /* per contract must make a copy of the params when messaging */
9782 bodyptr = qdf_mem_malloc(sizeof(*bodyptr));
Arif Hussain0ef77082018-10-10 16:42:53 -07009783 if (!bodyptr)
Jeff Johnson0c8dbc32018-07-16 22:10:48 -07009784 return QDF_STATUS_E_NOMEM;
Arif Hussain0ef77082018-10-10 16:42:53 -07009785
Jeff Johnson0c8dbc32018-07-16 22:10:48 -07009786 *bodyptr = *params;
9787
9788 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309789 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009790 /* Serialize the req through MC thread */
Jeff Johnson0c8dbc32018-07-16 22:10:48 -07009791 message.bodyptr = bodyptr;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009792 message.type = WMA_EXTSCAN_RESET_SIGNF_CHANGE_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05309793 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009794 NO_SESSION, message.type));
gaurank kathpalia36b0c582018-08-28 17:45:43 +05309795 status = scheduler_post_message(QDF_MODULE_ID_SME,
9796 QDF_MODULE_ID_WMA,
9797 QDF_MODULE_ID_WMA,
9798 &message);
Jeff Johnson0c8dbc32018-07-16 22:10:48 -07009799 sme_release_global_lock(&mac->sme);
9800 }
Jeff Johnson0c8dbc32018-07-16 22:10:48 -07009801 if (QDF_IS_STATUS_ERROR(status)) {
9802 sme_err("failure: %d", status);
9803 qdf_mem_free(bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009804 }
gaurank kathpalia36b0c582018-08-28 17:45:43 +05309805
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009806 return status;
9807}
9808
Jeff Johnson2ba60092018-07-17 08:19:37 -07009809QDF_STATUS
9810sme_get_cached_results(mac_handle_t mac_handle,
9811 struct extscan_cached_result_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009812{
Jeff Johnson2ba60092018-07-17 08:19:37 -07009813 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009814 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009815 struct scheduler_msg message = {0};
Jeff Johnson2ba60092018-07-17 08:19:37 -07009816 struct extscan_cached_result_params *bodyptr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009817
Jeff Johnson2ba60092018-07-17 08:19:37 -07009818 /* per contract must make a copy of the params when messaging */
9819 bodyptr = qdf_mem_malloc(sizeof(*bodyptr));
9820 if (!bodyptr)
9821 return QDF_STATUS_E_NOMEM;
9822 *bodyptr = *params;
9823
9824 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309825 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009826 /* Serialize the req through MC thread */
Jeff Johnson2ba60092018-07-17 08:19:37 -07009827 message.bodyptr = bodyptr;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009828 message.type = WMA_EXTSCAN_GET_CACHED_RESULTS_REQ;
Jeff Johnson2ba60092018-07-17 08:19:37 -07009829 qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
9830 NO_SESSION, message.type);
9831 status = scheduler_post_message(QDF_MODULE_ID_SME,
9832 QDF_MODULE_ID_WMA,
9833 QDF_MODULE_ID_WMA,
9834 &message);
9835 sme_release_global_lock(&mac->sme);
9836 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009837
Jeff Johnson2ba60092018-07-17 08:19:37 -07009838 if (QDF_IS_STATUS_ERROR(status)) {
9839 sme_err("failure: %d", status);
9840 qdf_mem_free(bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009841 }
9842 return status;
9843}
9844
Jeff Johnson360135b2018-07-18 20:51:47 -07009845QDF_STATUS sme_set_epno_list(mac_handle_t mac_handle,
9846 struct wifi_enhanced_pno_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009847{
Jeff Johnson360135b2018-07-18 20:51:47 -07009848 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009849 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009850 struct scheduler_msg message = {0};
Jeff Johnson360135b2018-07-18 20:51:47 -07009851 struct wifi_enhanced_pno_params *req_msg;
9852 int len;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009853
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009854 SME_ENTER();
Jeff Johnson360135b2018-07-18 20:51:47 -07009855
9856 /* per contract must make a copy of the params when messaging */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009857 len = sizeof(*req_msg) +
Jeff Johnson360135b2018-07-18 20:51:47 -07009858 (params->num_networks * sizeof(req_msg->networks[0]));
Mukul Sharmae8c919f2016-10-02 20:35:15 +05309859
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309860 req_msg = qdf_mem_malloc(len);
Arif Hussain0ef77082018-10-10 16:42:53 -07009861 if (!req_msg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309862 return QDF_STATUS_E_NOMEM;
Jeff Johnson360135b2018-07-18 20:51:47 -07009863 qdf_mem_copy(req_msg, params, len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009864
9865 status = sme_acquire_global_lock(&mac->sme);
Vignesh Viswanathancbb5b952017-08-02 14:32:49 +05309866 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009867 sme_err("sme_acquire_global_lock failed!(status=%d)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009868 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309869 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009870 return status;
9871 }
9872
9873 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009874 message.bodyptr = req_msg;
9875 message.type = WMA_SET_EPNO_LIST_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05309876 status = scheduler_post_message(QDF_MODULE_ID_SME,
9877 QDF_MODULE_ID_WMA,
9878 QDF_MODULE_ID_WMA, &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309879 if (!QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson360135b2018-07-18 20:51:47 -07009880 sme_err("scheduler_post_msg failed!(err=%d)", status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309881 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009882 }
9883 sme_release_global_lock(&mac->sme);
Jeff Johnson360135b2018-07-18 20:51:47 -07009884
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009885 return status;
9886}
9887
Jeff Johnson2a7f1012018-07-19 07:21:06 -07009888QDF_STATUS sme_set_passpoint_list(mac_handle_t mac_handle,
9889 struct wifi_passpoint_req_param *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009890{
Jeff Johnson2a7f1012018-07-19 07:21:06 -07009891 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009892 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009893 struct scheduler_msg message = {0};
Jeff Johnson2a7f1012018-07-19 07:21:06 -07009894 struct wifi_passpoint_req_param *req_msg;
9895 int len;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009896
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009897 SME_ENTER();
Jeff Johnson2a7f1012018-07-19 07:21:06 -07009898
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009899 len = sizeof(*req_msg) +
Jeff Johnson2a7f1012018-07-19 07:21:06 -07009900 (params->num_networks * sizeof(params->networks[0]));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309901 req_msg = qdf_mem_malloc(len);
Arif Hussain0ef77082018-10-10 16:42:53 -07009902 if (!req_msg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309903 return QDF_STATUS_E_NOMEM;
Jeff Johnson2a7f1012018-07-19 07:21:06 -07009904 qdf_mem_copy(req_msg, params, len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009905
9906 status = sme_acquire_global_lock(&mac->sme);
Vignesh Viswanathancbb5b952017-08-02 14:32:49 +05309907 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009908 sme_err("sme_acquire_global_lock failed!(status=%d)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009909 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309910 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009911 return status;
9912 }
9913
9914 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009915 message.bodyptr = req_msg;
9916 message.type = WMA_SET_PASSPOINT_LIST_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05309917 status = scheduler_post_message(QDF_MODULE_ID_SME,
9918 QDF_MODULE_ID_WMA,
9919 QDF_MODULE_ID_WMA, &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309920 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009921 sme_err("scheduler_post_msg failed!(err=%d)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009922 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309923 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009924 }
9925 sme_release_global_lock(&mac->sme);
9926 return status;
9927}
9928
Jeff Johnson2a7f1012018-07-19 07:21:06 -07009929QDF_STATUS sme_reset_passpoint_list(mac_handle_t mac_handle,
9930 struct wifi_passpoint_req_param *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009931{
Jeff Johnson2a7f1012018-07-19 07:21:06 -07009932 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009933 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009934 struct scheduler_msg message = {0};
Jeff Johnson2a7f1012018-07-19 07:21:06 -07009935 struct wifi_passpoint_req_param *req_msg;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009936
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009937 SME_ENTER();
Jeff Johnson2a7f1012018-07-19 07:21:06 -07009938
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309939 req_msg = qdf_mem_malloc(sizeof(*req_msg));
Arif Hussain0ef77082018-10-10 16:42:53 -07009940 if (!req_msg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309941 return QDF_STATUS_E_NOMEM;
Jeff Johnson2a7f1012018-07-19 07:21:06 -07009942 *req_msg = *params;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009943
9944 status = sme_acquire_global_lock(&mac->sme);
Vignesh Viswanathancbb5b952017-08-02 14:32:49 +05309945 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009946 sme_err("sme_acquire_global_lock failed!(status=%d)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009947 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309948 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009949 return status;
9950 }
9951
9952 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009953 message.bodyptr = req_msg;
9954 message.type = WMA_RESET_PASSPOINT_LIST_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05309955 status = scheduler_post_message(QDF_MODULE_ID_SME,
9956 QDF_MODULE_ID_WMA,
9957 QDF_MODULE_ID_WMA, &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309958 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009959 sme_err("scheduler_post_msg failed!(err=%d)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009960 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309961 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009962 }
9963 sme_release_global_lock(&mac->sme);
9964 return status;
9965}
9966
Jeff Johnson17b12392018-07-03 22:21:15 -07009967QDF_STATUS sme_ext_scan_register_callback(mac_handle_t mac_handle,
9968 ext_scan_ind_cb ext_scan_ind_cb)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009969{
Jeff Johnson17b12392018-07-03 22:21:15 -07009970 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009971 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009972
Jeff Johnson17b12392018-07-03 22:21:15 -07009973 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309974 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson17b12392018-07-03 22:21:15 -07009975 mac->sme.ext_scan_ind_cb = ext_scan_ind_cb;
9976 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009977 }
9978 return status;
9979}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009980#endif /* FEATURE_WLAN_EXTSCAN */
9981
Wen Gong7952fbd2018-04-18 11:27:23 +08009982/**
9983 * sme_send_wisa_params(): Pass WISA mode to WMA
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08009984 * @mac_handle: Opaque handle to the global MAC context
Wen Gong7952fbd2018-04-18 11:27:23 +08009985 * @wisa_params: pointer to WISA params struct
9986 * @sessionId: SME session id
9987 *
9988 * Pass WISA params to WMA
9989 *
9990 * Return: QDF_STATUS
9991 */
Jeff Johnsonc7309062018-11-09 20:59:42 -08009992QDF_STATUS sme_set_wisa_params(mac_handle_t mac_handle,
9993 struct sir_wisa_params *wisa_params)
Wen Gong7952fbd2018-04-18 11:27:23 +08009994{
9995 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009996 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Wen Gong7952fbd2018-04-18 11:27:23 +08009997 struct scheduler_msg message = {0};
9998 struct sir_wisa_params *cds_msg_wisa_params;
9999
10000 cds_msg_wisa_params = qdf_mem_malloc(sizeof(struct sir_wisa_params));
10001 if (!cds_msg_wisa_params)
10002 return QDF_STATUS_E_NOMEM;
10003
10004 *cds_msg_wisa_params = *wisa_params;
10005 status = sme_acquire_global_lock(&mac->sme);
10006 if (QDF_IS_STATUS_SUCCESS(status)) {
10007 message.bodyptr = cds_msg_wisa_params;
10008 message.type = WMA_SET_WISA_PARAMS;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010009 status = scheduler_post_message(QDF_MODULE_ID_SME,
10010 QDF_MODULE_ID_WMA,
10011 QDF_MODULE_ID_WMA, &message);
Wen Gong7952fbd2018-04-18 11:27:23 +080010012 sme_release_global_lock(&mac->sme);
10013 }
10014 return status;
10015}
10016
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010017#ifdef WLAN_FEATURE_LINK_LAYER_STATS
10018
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010019/*
10020 * sme_ll_stats_clear_req() -
10021 * SME API to clear Link Layer Statistics
10022 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010023 * mac_handle
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010024 * pclearStatsReq: Link Layer clear stats request params structure
10025 * Return QDF_STATUS
10026 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010027QDF_STATUS sme_ll_stats_clear_req(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010028 tSirLLStatsClearReq *pclearStatsReq)
10029{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010030 QDF_STATUS status = QDF_STATUS_SUCCESS;
10031 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010032 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010033 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010034 tSirLLStatsClearReq *clear_stats_req;
10035
Abhishek Singhe4a1f882017-08-10 17:59:44 +053010036 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010037 "staId = %u", pclearStatsReq->staId);
Abhishek Singhe4a1f882017-08-10 17:59:44 +053010038 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010039 "statsClearReqMask = 0x%X",
10040 pclearStatsReq->statsClearReqMask);
Abhishek Singhe4a1f882017-08-10 17:59:44 +053010041 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010042 "stopReq = %u", pclearStatsReq->stopReq);
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010043 if (!sme_is_session_id_valid(mac_handle, pclearStatsReq->staId)) {
Deepak Dhamdhere6adc08e2017-07-27 09:33:22 -070010044 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
10045 "%s: invalid staId %d",
10046 __func__, pclearStatsReq->staId);
10047 return QDF_STATUS_E_INVAL;
10048 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010049
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010050 clear_stats_req = qdf_mem_malloc(sizeof(*clear_stats_req));
Arif Hussain0ef77082018-10-10 16:42:53 -070010051 if (!clear_stats_req)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010052 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010053
10054 *clear_stats_req = *pclearStatsReq;
10055
Jeff Johnson01f2c232018-11-21 19:17:44 -080010056 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&mac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010057 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010058 message.bodyptr = clear_stats_req;
10059 message.type = WMA_LINK_LAYER_STATS_CLEAR_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053010060 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010061 NO_SESSION, message.type));
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010062 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
10063 QDF_MODULE_ID_WMA,
10064 QDF_MODULE_ID_WMA,
10065 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010066 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010067 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010068 "%s: not able to post WMA_LL_STATS_CLEAR_REQ",
10069 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010070 qdf_mem_free(clear_stats_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010071 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010072 }
Jeff Johnson01f2c232018-11-21 19:17:44 -080010073 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010074 } else {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010075 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
10076 "%s: sme_acquire_global_lock error", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010077 qdf_mem_free(clear_stats_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010078 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010079 }
10080
10081 return status;
10082}
10083
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010084/*
10085 * sme_ll_stats_set_req() -
10086 * SME API to set the Link Layer Statistics
10087 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010088 * mac_handle
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010089 * psetStatsReq: Link Layer set stats request params structure
10090 * Return QDF_STATUS
10091 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010092QDF_STATUS sme_ll_stats_set_req(mac_handle_t mac_handle, tSirLLStatsSetReq
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010093 *psetStatsReq)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010094{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010095 QDF_STATUS status = QDF_STATUS_SUCCESS;
10096 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010097 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010098 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010099 tSirLLStatsSetReq *set_stats_req;
10100
Abhishek Singhe4a1f882017-08-10 17:59:44 +053010101 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010102 "%s: MPDU Size = %u", __func__,
10103 psetStatsReq->mpduSizeThreshold);
Abhishek Singhe4a1f882017-08-10 17:59:44 +053010104 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010105 " Aggressive Stats Collections = %u",
10106 psetStatsReq->aggressiveStatisticsGathering);
10107
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010108 set_stats_req = qdf_mem_malloc(sizeof(*set_stats_req));
Arif Hussain0ef77082018-10-10 16:42:53 -070010109 if (!set_stats_req)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010110 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010111
10112 *set_stats_req = *psetStatsReq;
10113
Jeff Johnson01f2c232018-11-21 19:17:44 -080010114 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&mac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010115 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010116 message.bodyptr = set_stats_req;
10117 message.type = WMA_LINK_LAYER_STATS_SET_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053010118 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010119 NO_SESSION, message.type));
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010120 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
10121 QDF_MODULE_ID_WMA,
10122 QDF_MODULE_ID_WMA,
10123 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010124 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010125 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010126 "%s: not able to post WMA_LL_STATS_SET_REQ",
10127 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010128 qdf_mem_free(set_stats_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010129 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010130 }
Jeff Johnson01f2c232018-11-21 19:17:44 -080010131 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010132 } else {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010133 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
10134 "%s: sme_acquire_global_lock error", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010135 qdf_mem_free(set_stats_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010136 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010137 }
10138
10139 return status;
10140}
10141
Dundi Ravitejae232cf12018-05-16 18:34:34 +053010142QDF_STATUS sme_ll_stats_get_req(mac_handle_t mac_handle,
10143 tSirLLStatsGetReq *get_stats_req,
10144 void *context)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010145{
Dundi Ravitejae232cf12018-05-16 18:34:34 +053010146 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010147 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010148 struct scheduler_msg message = {0};
Dundi Ravitejae232cf12018-05-16 18:34:34 +053010149 tSirLLStatsGetReq *ll_stats_get_req;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010150
Dundi Ravitejae232cf12018-05-16 18:34:34 +053010151 ll_stats_get_req = qdf_mem_malloc(sizeof(*ll_stats_get_req));
Arif Hussain0ef77082018-10-10 16:42:53 -070010152 if (!ll_stats_get_req)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010153 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010154
Dundi Ravitejae232cf12018-05-16 18:34:34 +053010155 *ll_stats_get_req = *get_stats_req;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010156
Dundi Ravitejae232cf12018-05-16 18:34:34 +053010157 mac->sme.ll_stats_context = context;
10158 if (sme_acquire_global_lock(&mac->sme) == QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010159 /* Serialize the req through MC thread */
Dundi Ravitejae232cf12018-05-16 18:34:34 +053010160 message.bodyptr = ll_stats_get_req;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010161 message.type = WMA_LINK_LAYER_STATS_GET_REQ;
Dundi Ravitejae232cf12018-05-16 18:34:34 +053010162 qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
10163 NO_SESSION, message.type);
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010164 status = scheduler_post_message(QDF_MODULE_ID_SME,
10165 QDF_MODULE_ID_WMA,
10166 QDF_MODULE_ID_WMA, &message);
Dundi Ravitejae232cf12018-05-16 18:34:34 +053010167 if (!QDF_IS_STATUS_SUCCESS(status)) {
10168 sme_err("Not able to post WMA_LL_STATS_GET_REQ");
10169 qdf_mem_free(ll_stats_get_req);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010170 }
Dundi Ravitejae232cf12018-05-16 18:34:34 +053010171 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010172 } else {
Dundi Ravitejae232cf12018-05-16 18:34:34 +053010173 sme_err("sme_acquire_global_lock error");
10174 qdf_mem_free(ll_stats_get_req);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010175 }
10176
10177 return status;
10178}
10179
Jeff Johnson959f3692018-07-03 17:30:40 -070010180QDF_STATUS sme_set_link_layer_stats_ind_cb(mac_handle_t mac_handle,
10181 link_layer_stats_cb callback)
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010182{
Jeff Johnson959f3692018-07-03 17:30:40 -070010183 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010184 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010185
Jeff Johnson959f3692018-07-03 17:30:40 -070010186 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010187 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson959f3692018-07-03 17:30:40 -070010188 mac->sme.link_layer_stats_cb = callback;
10189 sme_release_global_lock(&mac->sme);
10190 } else {
10191 sme_err("sme_acquire_global_lock error");
10192 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010193
10194 return status;
10195}
10196
Arun Khandavalli4b55da72016-07-19 19:55:01 +053010197/**
Zhang Qiana6e9c102016-12-22 16:47:24 +080010198 * sme_set_link_layer_ext_cb() - Register callback for link layer statistics
Jeff Johnsonc7309062018-11-09 20:59:42 -080010199 * @mac_handle: Mac global handle
Zhang Qiana6e9c102016-12-22 16:47:24 +080010200 * @ll_stats_ext_cb: HDD callback which needs to be invoked after getting
10201 * status notification from FW
10202 *
Jeff Johnsonc7309062018-11-09 20:59:42 -080010203 * Return: QDF_STATUS
Zhang Qiana6e9c102016-12-22 16:47:24 +080010204 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080010205QDF_STATUS
10206sme_set_link_layer_ext_cb(mac_handle_t mac_handle,
10207 void (*ll_stats_ext_cb)(hdd_handle_t callback_ctx,
10208 tSirLLStatsResults *rsp))
Zhang Qiana6e9c102016-12-22 16:47:24 +080010209{
10210 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010211 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Zhang Qiana6e9c102016-12-22 16:47:24 +080010212
10213 status = sme_acquire_global_lock(&mac->sme);
10214 if (status == QDF_STATUS_SUCCESS) {
10215 mac->sme.link_layer_stats_ext_cb = ll_stats_ext_cb;
10216 sme_release_global_lock(&mac->sme);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010217 } else
Zhang Qiana6e9c102016-12-22 16:47:24 +080010218 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
10219 "%s: sme_qcquire_global_lock error", __func__);
Zhang Qiana6e9c102016-12-22 16:47:24 +080010220 return status;
10221}
10222
10223/**
Arun Khandavalli4b55da72016-07-19 19:55:01 +053010224 * sme_reset_link_layer_stats_ind_cb() - SME API to reset link layer stats
10225 * indication
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080010226 * @mac_handle: Opaque handle to the global MAC context
Arun Khandavalli4b55da72016-07-19 19:55:01 +053010227 *
10228 * This function reset's the link layer stats indication
10229 *
10230 * Return: QDF_STATUS Enumeration
10231 */
10232
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010233QDF_STATUS sme_reset_link_layer_stats_ind_cb(mac_handle_t mac_handle)
Arun Khandavalli4b55da72016-07-19 19:55:01 +053010234{
10235 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010236 struct mac_context *pmac;
Arun Khandavalli4b55da72016-07-19 19:55:01 +053010237
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010238 if (!mac_handle) {
Arun Khandavalli4b55da72016-07-19 19:55:01 +053010239 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010240 FL("mac_handle is not valid"));
Arun Khandavalli4b55da72016-07-19 19:55:01 +053010241 return QDF_STATUS_E_INVAL;
10242 }
Jeff Johnsona0619e42018-11-28 17:43:00 -080010243 pmac = MAC_CONTEXT(mac_handle);
Arun Khandavalli4b55da72016-07-19 19:55:01 +053010244
10245 status = sme_acquire_global_lock(&pmac->sme);
10246 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson959f3692018-07-03 17:30:40 -070010247 pmac->sme.link_layer_stats_cb = NULL;
Arun Khandavalli4b55da72016-07-19 19:55:01 +053010248 sme_release_global_lock(&pmac->sme);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010249 } else
10250 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
10251 "%s: sme_acquire_global_lock error", __func__);
Arun Khandavalli4b55da72016-07-19 19:55:01 +053010252
10253 return status;
10254}
10255
Zhang Qian73c348a2017-03-13 16:15:55 +080010256/**
10257 * sme_ll_stats_set_thresh - set threshold for mac counters
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080010258 * @mac_handle: Opaque handle to the global MAC context
Zhang Qian73c348a2017-03-13 16:15:55 +080010259 * @threshold, threshold for mac counters
10260 *
10261 * Return: QDF_STATUS Enumeration
10262 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080010263QDF_STATUS sme_ll_stats_set_thresh(mac_handle_t mac_handle,
Zhang Qian73c348a2017-03-13 16:15:55 +080010264 struct sir_ll_ext_stats_threshold *threshold)
10265{
10266 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010267 struct mac_context *mac;
Rajeev Kumar658e8492017-12-13 11:35:41 -080010268 struct scheduler_msg message = {0};
Zhang Qian73c348a2017-03-13 16:15:55 +080010269 struct sir_ll_ext_stats_threshold *thresh;
10270
10271 if (!threshold) {
10272 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
10273 FL("threshold is not valid"));
10274 return QDF_STATUS_E_INVAL;
10275 }
10276
Jeff Johnsonc7309062018-11-09 20:59:42 -080010277 if (!mac_handle) {
Zhang Qian73c348a2017-03-13 16:15:55 +080010278 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Jeff Johnsonc7309062018-11-09 20:59:42 -080010279 FL("mac_handle is not valid"));
Zhang Qian73c348a2017-03-13 16:15:55 +080010280 return QDF_STATUS_E_INVAL;
10281 }
Jeff Johnsona0619e42018-11-28 17:43:00 -080010282 mac = MAC_CONTEXT(mac_handle);
Zhang Qian73c348a2017-03-13 16:15:55 +080010283
10284 thresh = qdf_mem_malloc(sizeof(*thresh));
Arif Hussain0ef77082018-10-10 16:42:53 -070010285 if (!thresh)
Zhang Qian73c348a2017-03-13 16:15:55 +080010286 return QDF_STATUS_E_NOMEM;
Arif Hussain0ef77082018-10-10 16:42:53 -070010287
Zhang Qian73c348a2017-03-13 16:15:55 +080010288 *thresh = *threshold;
10289
10290 status = sme_acquire_global_lock(&mac->sme);
10291 if (QDF_IS_STATUS_SUCCESS(status)) {
10292 /* Serialize the req through MC thread */
10293 message.bodyptr = thresh;
10294 message.type = WDA_LINK_LAYER_STATS_SET_THRESHOLD;
10295 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
10296 NO_SESSION, message.type));
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010297 status = scheduler_post_message(QDF_MODULE_ID_SME,
10298 QDF_MODULE_ID_WMA,
10299 QDF_MODULE_ID_WMA, &message);
Zhang Qian73c348a2017-03-13 16:15:55 +080010300 if (!QDF_IS_STATUS_SUCCESS(status)) {
10301 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
10302 "%s: not able to post WDA_LL_STATS_GET_REQ",
10303 __func__);
10304 qdf_mem_free(thresh);
10305 }
10306 sme_release_global_lock(&mac->sme);
10307 } else {
10308 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
10309 FL("sme_acquire_global_lock error"));
10310 qdf_mem_free(thresh);
10311 }
10312 return status;
10313}
Arun Khandavalli4b55da72016-07-19 19:55:01 +053010314
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010315#endif /* WLAN_FEATURE_LINK_LAYER_STATS */
10316
Sridhar Selvarajdc400d22016-10-18 17:18:03 +053010317#ifdef WLAN_POWER_DEBUGFS
10318/**
10319 * sme_power_debug_stats_req() - SME API to collect Power debug stats
10320 * @callback_fn: Pointer to the callback function for Power stats event
10321 * @power_stats_context: Pointer to context
10322 *
10323 * Return: QDF_STATUS
10324 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080010325QDF_STATUS sme_power_debug_stats_req(
10326 mac_handle_t mac_handle,
10327 void (*callback_fn)(struct power_stats_response *response,
10328 void *context),
10329 void *power_stats_context)
Sridhar Selvarajdc400d22016-10-18 17:18:03 +053010330{
10331 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010332 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010333 struct scheduler_msg msg = {0};
Sridhar Selvarajdc400d22016-10-18 17:18:03 +053010334
10335 status = sme_acquire_global_lock(&mac_ctx->sme);
10336 if (QDF_IS_STATUS_SUCCESS(status)) {
10337 if (!callback_fn) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070010338 sme_err("Indication callback did not registered");
Sridhar Selvarajdc400d22016-10-18 17:18:03 +053010339 sme_release_global_lock(&mac_ctx->sme);
10340 return QDF_STATUS_E_FAILURE;
10341 }
10342
10343 mac_ctx->sme.power_debug_stats_context = power_stats_context;
10344 mac_ctx->sme.power_stats_resp_callback = callback_fn;
10345 msg.bodyptr = NULL;
10346 msg.type = WMA_POWER_DEBUG_STATS_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010347 status = scheduler_post_message(QDF_MODULE_ID_SME,
10348 QDF_MODULE_ID_WMA,
10349 QDF_MODULE_ID_WMA, &msg);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010350 if (!QDF_IS_STATUS_SUCCESS(status))
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070010351 sme_err("not able to post WDA_POWER_DEBUG_STATS_REQ");
Sridhar Selvarajdc400d22016-10-18 17:18:03 +053010352 sme_release_global_lock(&mac_ctx->sme);
10353 }
10354 return status;
10355}
10356#endif
10357
Arunk Khandavallica56d4b2018-11-29 15:46:00 +053010358#ifdef WLAN_FEATURE_BEACON_RECEPTION_STATS
10359QDF_STATUS sme_beacon_debug_stats_req(
10360 mac_handle_t mac_handle, uint32_t vdev_id,
10361 void (*callback_fn)(struct bcn_reception_stats_rsp
10362 *response, void *context),
10363 void *beacon_stats_context)
10364{
10365 QDF_STATUS status;
10366 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
10367 uint32_t *val;
10368 struct scheduler_msg msg = {0};
10369
10370 status = sme_acquire_global_lock(&mac_ctx->sme);
10371 if (QDF_IS_STATUS_SUCCESS(status)) {
10372 if (!callback_fn) {
10373 sme_err("Indication callback did not registered");
10374 sme_release_global_lock(&mac_ctx->sme);
10375 return QDF_STATUS_E_FAILURE;
10376 }
10377
Sourav Mohapatrac55bdf32018-12-13 16:16:50 +053010378 if (!mac_ctx->bcn_reception_stats &&
10379 !mac_ctx->mlme_cfg->gen.enable_beacon_reception_stats) {
10380 sme_err("Beacon Reception stats not supported");
Arunk Khandavallica56d4b2018-11-29 15:46:00 +053010381 sme_release_global_lock(&mac_ctx->sme);
10382 return QDF_STATUS_E_NOSUPPORT;
10383 }
10384
10385 val = qdf_mem_malloc(sizeof(*val));
10386 if (!val) {
10387 sme_release_global_lock(&mac_ctx->sme);
10388 return QDF_STATUS_E_NOMEM;
10389 }
10390
10391 *val = vdev_id;
10392 mac_ctx->sme.beacon_stats_context = beacon_stats_context;
10393 mac_ctx->sme.beacon_stats_resp_callback = callback_fn;
10394 msg.bodyptr = val;
10395 msg.type = WMA_BEACON_DEBUG_STATS_REQ;
10396 status = scheduler_post_message(QDF_MODULE_ID_SME,
10397 QDF_MODULE_ID_WMA,
10398 QDF_MODULE_ID_WMA, &msg);
10399 if (!QDF_IS_STATUS_SUCCESS(status)) {
10400 sme_err("not able to post WMA_BEACON_DEBUG_STATS_REQ");
10401 qdf_mem_free(val);
10402 }
10403 sme_release_global_lock(&mac_ctx->sme);
10404 }
10405 return status;
10406}
10407#endif
10408
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010409#ifdef WLAN_FEATURE_ROAM_OFFLOAD
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070010410/**
10411 * sme_update_roam_key_mgmt_offload_enabled() - enable/disable key mgmt offload
10412 * This is a synchronous call
Jeff Johnsond5fb2db2018-11-08 14:20:28 -080010413 * @mac_handle: The handle returned by mac_open.
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070010414 * @session_id: Session Identifier
10415 * @key_mgmt_offload_enabled: key mgmt enable/disable flag
Deepak Dhamdhere828f1892017-02-09 11:51:19 -080010416 * @pmkid_modes: PMKID modes of PMKSA caching and OKC
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070010417 * Return: QDF_STATUS_SUCCESS - SME updated config successfully.
10418 * Other status means SME is failed to update.
10419 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010420
Jeff Johnsond5fb2db2018-11-08 14:20:28 -080010421QDF_STATUS sme_update_roam_key_mgmt_offload_enabled(mac_handle_t mac_handle,
Deepak Dhamdhere828f1892017-02-09 11:51:19 -080010422 uint8_t session_id,
10423 bool key_mgmt_offload_enabled,
10424 struct pmkid_mode_bits *pmkid_modes)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010425{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010426 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010427 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010428
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070010429 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010430 if (QDF_IS_STATUS_SUCCESS(status)) {
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070010431 if (CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
Abhishek Singhe4a1f882017-08-10 17:59:44 +053010432 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070010433 "%s: LFR3: key_mgmt_offload_enabled changed to %d",
10434 __func__, key_mgmt_offload_enabled);
10435 status = csr_roam_set_key_mgmt_offload(mac_ctx,
10436 session_id,
10437 key_mgmt_offload_enabled,
Deepak Dhamdhere828f1892017-02-09 11:51:19 -080010438 pmkid_modes);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010439 } else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010440 status = QDF_STATUS_E_INVAL;
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070010441 sme_release_global_lock(&mac_ctx->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010442 }
10443
10444 return status;
10445}
Prashanth Bhattabfc25292015-11-05 11:16:21 -080010446#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010447
Jeff Johnson3f3ad252019-02-17 20:44:11 -080010448/**
10449 * sme_get_temperature() - SME API to get the pdev temperature
10450 * @mac_handle: Handle to global MAC context
10451 * @cb_context: temperature callback context
10452 * @cb: callback function with response (temperature)
10453 * Return: QDF_STATUS
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010454 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010455QDF_STATUS sme_get_temperature(mac_handle_t mac_handle,
Jeff Johnson3f3ad252019-02-17 20:44:11 -080010456 void *cb_context,
10457 void (*cb)(int temperature,
10458 void *context))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010459{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010460 QDF_STATUS status = QDF_STATUS_SUCCESS;
10461 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010462 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010463 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010464
Jeff Johnson01f2c232018-11-21 19:17:44 -080010465 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010466 if (QDF_STATUS_SUCCESS == status) {
Jeff Johnson3f3ad252019-02-17 20:44:11 -080010467 if ((!cb) &&
10468 (!mac->sme.temperature_cb)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010469 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010470 "Indication Call back did not registered");
Jeff Johnson01f2c232018-11-21 19:17:44 -080010471 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010472 return QDF_STATUS_E_FAILURE;
Jeff Johnson3f3ad252019-02-17 20:44:11 -080010473 } else if (cb) {
10474 mac->sme.temperature_cb_context = cb_context;
10475 mac->sme.temperature_cb = cb;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010476 }
10477 /* serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010478 message.bodyptr = NULL;
10479 message.type = WMA_GET_TEMPERATURE_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010480 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
10481 QDF_MODULE_ID_WMA,
10482 QDF_MODULE_ID_WMA,
10483 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010484 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010485 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010486 FL("Post Get Temperature msg fail"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010487 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010488 }
Jeff Johnson01f2c232018-11-21 19:17:44 -080010489 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010490 }
10491 return status;
10492}
10493
Jeff Johnsonc7309062018-11-09 20:59:42 -080010494QDF_STATUS sme_set_scanning_mac_oui(mac_handle_t mac_handle,
Jeff Johnson9d45f332019-01-29 08:42:00 -080010495 struct scan_mac_oui *scan_mac_oui)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010496{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010497 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010498 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010499 struct scheduler_msg message = {0};
Jeff Johnson9d45f332019-01-29 08:42:00 -080010500 struct scan_mac_oui *bodyptr;
10501
10502 /* per contract must make a copy of the params when messaging */
10503 bodyptr = qdf_mem_malloc(sizeof(*bodyptr));
10504 if (!bodyptr)
10505 return QDF_STATUS_E_NOMEM;
10506 *bodyptr = *scan_mac_oui;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010507
Jeff Johnson01f2c232018-11-21 19:17:44 -080010508 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010509 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010510 /* Serialize the req through MC thread */
Jeff Johnson9d45f332019-01-29 08:42:00 -080010511 message.bodyptr = bodyptr;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010512 message.type = WMA_SET_SCAN_MAC_OUI_REQ;
Jeff Johnson9d45f332019-01-29 08:42:00 -080010513 status = scheduler_post_message(QDF_MODULE_ID_SME,
10514 QDF_MODULE_ID_WMA,
10515 QDF_MODULE_ID_WMA,
10516 &message);
Jeff Johnson01f2c232018-11-21 19:17:44 -080010517 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010518 }
Jeff Johnson9d45f332019-01-29 08:42:00 -080010519
10520 if (QDF_IS_STATUS_ERROR(status)) {
10521 sme_err("failure: %d", status);
10522 qdf_mem_free(bodyptr);
10523 }
10524
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010525 return status;
10526}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010527
10528#ifdef DHCP_SERVER_OFFLOAD
Jeff Johnson8bfc29e2019-02-15 07:58:15 -080010529QDF_STATUS
10530sme_set_dhcp_srv_offload(mac_handle_t mac_handle,
10531 struct dhcp_offload_info_params *dhcp_srv_info)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010532{
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010533 struct scheduler_msg message = {0};
Jeff Johnson8bfc29e2019-02-15 07:58:15 -080010534 struct dhcp_offload_info_params *payload;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010535 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010536 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010537
Jeff Johnson8bfc29e2019-02-15 07:58:15 -080010538 payload = qdf_mem_malloc(sizeof(*payload));
10539 if (!payload)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010540 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010541
Jeff Johnson8bfc29e2019-02-15 07:58:15 -080010542 *payload = *dhcp_srv_info;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010543
Jeff Johnson01f2c232018-11-21 19:17:44 -080010544 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010545 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010546 /* serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010547 message.type = WMA_SET_DHCP_SERVER_OFFLOAD_CMD;
Jeff Johnson8bfc29e2019-02-15 07:58:15 -080010548 message.bodyptr = payload;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010549
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010550 if (!QDF_IS_STATUS_SUCCESS
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010551 (scheduler_post_message(QDF_MODULE_ID_SME,
10552 QDF_MODULE_ID_WMA,
10553 QDF_MODULE_ID_WMA,
10554 &message))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010555 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Varun Reddy Yeturu7b2a6572017-06-15 11:07:28 -070010556 "%s:WMA_SET_DHCP_SERVER_OFFLOAD_CMD failed",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010557 __func__);
Jeff Johnson8bfc29e2019-02-15 07:58:15 -080010558 qdf_mem_free(payload);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010559 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010560 }
Jeff Johnson01f2c232018-11-21 19:17:44 -080010561 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010562 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010563 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010564 "%s: sme_acquire_global_lock error!", __func__);
Jeff Johnson8bfc29e2019-02-15 07:58:15 -080010565 qdf_mem_free(payload);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010566 }
10567
10568 return status;
10569}
10570#endif /* DHCP_SERVER_OFFLOAD */
10571
Krunal Soniaadaa272017-10-04 16:42:55 -070010572QDF_STATUS sme_send_unit_test_cmd(uint32_t vdev_id, uint32_t module_id,
10573 uint32_t arg_count, uint32_t *arg)
10574{
10575 return wma_form_unit_test_cmd_and_send(vdev_id, module_id,
10576 arg_count, arg);
10577}
10578
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010579#ifdef WLAN_FEATURE_GPIO_LED_FLASHING
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010580/*
10581 * sme_set_led_flashing() -
10582 * API to set the Led flashing parameters.
10583 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010584 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010585 * x0, x1 - led flashing parameters
10586 * Return QDF_STATUS
10587 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010588QDF_STATUS sme_set_led_flashing(mac_handle_t mac_handle, uint8_t type,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010589 uint32_t x0, uint32_t x1)
10590{
Jeff Johnson5a6b6602017-10-04 14:44:30 -070010591 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010592 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010593 struct scheduler_msg message = {0};
Jeff Johnson5a6b6602017-10-04 14:44:30 -070010594 struct flashing_req_params *ledflashing;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010595
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010596 ledflashing = qdf_mem_malloc(sizeof(*ledflashing));
Arif Hussain0ef77082018-10-10 16:42:53 -070010597 if (!ledflashing)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010598 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010599
Jeff Johnson5a6b6602017-10-04 14:44:30 -070010600 ledflashing->req_id = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010601 ledflashing->pattern_id = type;
10602 ledflashing->led_x0 = x0;
10603 ledflashing->led_x1 = x1;
10604
Jeff Johnson01f2c232018-11-21 19:17:44 -080010605 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010606 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010607 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010608 message.bodyptr = ledflashing;
10609 message.type = WMA_LED_FLASHING_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010610 status = scheduler_post_message(QDF_MODULE_ID_SME,
10611 QDF_MODULE_ID_WMA,
10612 QDF_MODULE_ID_WMA, &message);
Jeff Johnson01f2c232018-11-21 19:17:44 -080010613 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010614 }
Jeff Johnson5a6b6602017-10-04 14:44:30 -070010615 if (!QDF_IS_STATUS_SUCCESS(status))
10616 qdf_mem_free(ledflashing);
10617
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010618 return status;
10619}
10620#endif
10621
10622/**
Min Liu5eaf7242018-03-13 17:32:15 +080010623 * sme_enable_dfS_chan_scan() - set DFS channel scan enable/disable
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010624 * @mac_handle: corestack handler
Min Liu5eaf7242018-03-13 17:32:15 +080010625 * @dfs_flag: flag indicating dfs channel enable/disable
10626 * Return: QDF_STATUS
10627 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010628QDF_STATUS sme_enable_dfs_chan_scan(mac_handle_t mac_handle, uint8_t dfs_flag)
Min Liu5eaf7242018-03-13 17:32:15 +080010629{
10630 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010631 struct mac_context *mac;
Min Liu5eaf7242018-03-13 17:32:15 +080010632
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010633 if (!mac_handle) {
Jeff Johnsonc7309062018-11-09 20:59:42 -080010634 sme_err("mac_handle is NULL");
Min Liu5eaf7242018-03-13 17:32:15 +080010635 return QDF_STATUS_E_INVAL;
10636 }
10637
Jeff Johnsona0619e42018-11-28 17:43:00 -080010638 mac = MAC_CONTEXT(mac_handle);
Min Liu5eaf7242018-03-13 17:32:15 +080010639
10640 mac->scan.fEnableDFSChnlScan = dfs_flag;
10641
10642 return status;
10643}
10644
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +053010645#ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH
10646/**
10647 * sme_validate_sap_channel_switch() - validate target channel switch w.r.t
10648 * concurreny rules set to avoid channel interference.
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080010649 * @mac_handle: Opaque handle to the global MAC context
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +053010650 * @sap_ch - channel to switch
10651 * @sap_phy_mode - phy mode of SAP
10652 * @cc_switch_mode - concurreny switch mode
10653 * @session_id - sme session id.
10654 *
10655 * Return: true if there is no channel interference else return false
10656 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080010657bool sme_validate_sap_channel_switch(mac_handle_t mac_handle,
10658 uint16_t sap_ch,
10659 eCsrPhyMode sap_phy_mode,
10660 uint8_t cc_switch_mode,
10661 uint8_t session_id)
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +053010662{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010663 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010664 struct mac_context *mac = MAC_CONTEXT(mac_handle);
gaurank kathpalia14e2f912017-08-31 14:51:45 +053010665 struct csr_roam_session *session = CSR_GET_SESSION(mac, session_id);
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +053010666 uint16_t intf_channel = 0;
10667
10668 if (!session)
10669 return false;
10670
10671 session->ch_switch_in_progress = true;
10672 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010673 if (QDF_IS_STATUS_SUCCESS(status)) {
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +053010674 intf_channel = csr_check_concurrent_channel_overlap(mac, sap_ch,
10675 sap_phy_mode,
10676 cc_switch_mode);
10677 sme_release_global_lock(&mac->sme);
10678 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010679 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +053010680 FL("sme_acquire_global_lock error!"));
10681 session->ch_switch_in_progress = false;
10682 return false;
10683 }
10684
10685 session->ch_switch_in_progress = false;
10686 return (intf_channel == 0) ? true : false;
10687}
10688#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010689
10690/**
10691 * sme_configure_stats_avg_factor() - function to config avg. stats factor
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080010692 * @mac_handle: Opaque handle to the global MAC context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010693 * @session_id: session ID
10694 * @stats_avg_factor: average stats factor
10695 *
10696 * This function configures the stats avg factor in firmware
10697 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010698 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010699 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080010700QDF_STATUS sme_configure_stats_avg_factor(mac_handle_t mac_handle,
10701 uint8_t session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010702 uint16_t stats_avg_factor)
10703{
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010704 struct scheduler_msg msg = {0};
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010705 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010706 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010707 struct sir_stats_avg_factor *stats_factor;
10708
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010709 stats_factor = qdf_mem_malloc(sizeof(*stats_factor));
Arif Hussain0ef77082018-10-10 16:42:53 -070010710 if (!stats_factor)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010711 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010712
10713 status = sme_acquire_global_lock(&mac->sme);
10714
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010715 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010716
10717 stats_factor->vdev_id = session_id;
10718 stats_factor->stats_avg_factor = stats_avg_factor;
10719
10720 /* serialize the req through MC thread */
10721 msg.type = SIR_HAL_CONFIG_STATS_FACTOR;
10722 msg.bodyptr = stats_factor;
10723
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010724 if (!QDF_IS_STATUS_SUCCESS(
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010725 scheduler_post_message(QDF_MODULE_ID_SME,
10726 QDF_MODULE_ID_WMA,
10727 QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010728 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010729 "%s: Not able to post SIR_HAL_CONFIG_STATS_FACTOR to WMA!",
10730 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010731 qdf_mem_free(stats_factor);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010732 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010733 }
10734 sme_release_global_lock(&mac->sme);
10735 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010736 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010737 "%s: sme_acquire_global_lock error!",
10738 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010739 qdf_mem_free(stats_factor);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010740 }
10741
10742 return status;
10743}
10744
10745/**
10746 * sme_configure_guard_time() - function to configure guard time
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080010747 * @mac_handle: Opaque handle to the global MAC context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010748 * @session_id: session id
10749 * @guard_time: guard time
10750 *
10751 * This function configures the guard time in firmware
10752 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010753 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010754 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080010755QDF_STATUS sme_configure_guard_time(mac_handle_t mac_handle, uint8_t session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010756 uint32_t guard_time)
10757{
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010758 struct scheduler_msg msg = {0};
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010759 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010760 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010761 struct sir_guard_time_request *g_time;
10762
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010763 g_time = qdf_mem_malloc(sizeof(*g_time));
Arif Hussain0ef77082018-10-10 16:42:53 -070010764 if (!g_time)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010765 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010766
10767 status = sme_acquire_global_lock(&mac->sme);
10768
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010769 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010770
10771 g_time->vdev_id = session_id;
10772 g_time->guard_time = guard_time;
10773
10774 /* serialize the req through MC thread */
10775 msg.type = SIR_HAL_CONFIG_GUARD_TIME;
10776 msg.bodyptr = g_time;
10777
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010778 if (!QDF_IS_STATUS_SUCCESS(
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010779 scheduler_post_message(QDF_MODULE_ID_SME,
10780 QDF_MODULE_ID_WMA,
10781 QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010782 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010783 "%s: Not able to post SIR_HAL_CONFIG_GUARD_TIME to WMA!",
10784 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010785 qdf_mem_free(g_time);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010786 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010787 }
10788 sme_release_global_lock(&mac->sme);
10789 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010790 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010791 "%s: sme_acquire_global_lock error!",
10792 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010793 qdf_mem_free(g_time);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010794 }
10795
10796 return status;
10797}
10798
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010799/*
10800 * sme_wifi_start_logger() - Send the start/stop logging command to WMA
10801 * to either start/stop logging
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080010802 * @mac_handle: Opaque handle to the global MAC context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010803 * @start_log: Structure containing the wifi start logger params
10804 *
10805 * This function sends the start/stop logging command to WMA
10806 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010807 * Return: QDF_STATUS_SUCCESS on successful posting
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010808 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080010809QDF_STATUS sme_wifi_start_logger(mac_handle_t mac_handle,
10810 struct sir_wifi_start_log start_log)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010811{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010812 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010813 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010814 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010815 struct sir_wifi_start_log *req_msg;
10816 uint32_t len;
10817
10818 len = sizeof(*req_msg);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010819 req_msg = qdf_mem_malloc(len);
Arif Hussain0ef77082018-10-10 16:42:53 -070010820 if (!req_msg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010821 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010822
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010823 req_msg->verbose_level = start_log.verbose_level;
Poddar, Siddartheefe3482016-09-21 18:12:59 +053010824 req_msg->is_iwpriv_command = start_log.is_iwpriv_command;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010825 req_msg->ring_id = start_log.ring_id;
Srinivas Girigowdac34f11d2016-02-25 16:02:42 -080010826 req_msg->ini_triggered = start_log.ini_triggered;
10827 req_msg->user_triggered = start_log.user_triggered;
Poddar, Siddarth176c4362016-10-03 12:25:00 +053010828 req_msg->size = start_log.size;
Poddar, Siddarthab99a272017-04-10 12:53:26 +053010829 req_msg->is_pktlog_buff_clear = start_log.is_pktlog_buff_clear;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010830
10831 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010832 if (status != QDF_STATUS_SUCCESS) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070010833 sme_err("sme_acquire_global_lock failed(status=%d)", status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010834 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010835 return status;
10836 }
10837
10838 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010839 message.bodyptr = req_msg;
10840 message.type = SIR_HAL_START_STOP_LOGGING;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010841 status = scheduler_post_message(QDF_MODULE_ID_SME,
10842 QDF_MODULE_ID_WMA,
10843 QDF_MODULE_ID_WMA, &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010844 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070010845 sme_err("scheduler_post_msg failed!(err=%d)", status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010846 qdf_mem_free(req_msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010847 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010848 }
10849 sme_release_global_lock(&mac->sme);
10850
10851 return status;
10852}
10853
10854/**
10855 * sme_neighbor_middle_of_roaming() - Function to know if
10856 * STA is in the middle of roaming states
Jeff Johnsonc7309062018-11-09 20:59:42 -080010857 * @mac_handle: Handle returned by macOpen
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010858 * @sessionId: sessionId of the STA session
10859 *
10860 * This function is a wrapper to call
10861 * csr_neighbor_middle_of_roaming to know STA is in the
10862 * middle of roaming states
10863 *
10864 * Return: True or False
10865 *
10866 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010867bool sme_neighbor_middle_of_roaming(mac_handle_t mac_handle, uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010868{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010869 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Sandeep Puligillaca631612016-11-08 11:53:52 -080010870 bool val = false;
10871
10872 if (CSR_IS_SESSION_VALID(mac_ctx, sessionId))
10873 val = csr_neighbor_middle_of_roaming(mac_ctx, sessionId);
10874 else
Rajeev Kumar9176ca42018-05-03 09:20:40 -070010875 sme_debug("Invalid Session: %d", sessionId);
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070010876
Sandeep Puligillaca631612016-11-08 11:53:52 -080010877 return val;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010878}
10879
Jeff Johnsonc7309062018-11-09 20:59:42 -080010880bool sme_is_any_session_in_middle_of_roaming(mac_handle_t mac_handle)
Padma, Santhosh Kumar86747ec2018-05-29 18:28:29 +053010881{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010882 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Padma, Santhosh Kumar86747ec2018-05-29 18:28:29 +053010883 uint8_t session_id;
10884
Dustin Brownad06be62019-02-04 14:52:56 -080010885 for (session_id = 0; session_id < WLAN_MAX_VDEVS; session_id++) {
Padma, Santhosh Kumar86747ec2018-05-29 18:28:29 +053010886 if (CSR_IS_SESSION_VALID(mac_ctx, session_id) &&
10887 csr_neighbor_middle_of_roaming(mac_ctx, session_id))
10888 return true;
10889 }
10890
10891 return false;
10892}
10893
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010894/*
10895 * sme_send_flush_logs_cmd_to_fw() - Flush FW logs
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010896 *
10897 * This function is used to send the command that will
10898 * be used to flush the logs in the firmware
10899 *
Deepak Dhamdhere0f076bd2016-06-02 11:29:21 -070010900 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010901 */
Jeff Johnson40894142018-11-17 12:05:54 -080010902QDF_STATUS sme_send_flush_logs_cmd_to_fw(void)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010903{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010904 QDF_STATUS status;
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010905 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010906
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010907 /* Serialize the req through MC thread */
10908 message.bodyptr = NULL;
10909 message.type = SIR_HAL_FLUSH_LOG_TO_FW;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010910 status = scheduler_post_message(QDF_MODULE_ID_SME,
10911 QDF_MODULE_ID_WMA,
10912 QDF_MODULE_ID_WMA, &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010913 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070010914 sme_err("scheduler_post_msg failed!(err=%d)", status);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010915 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010916 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010917 return status;
10918}
10919
Jeff Johnsona1e92612017-09-24 15:33:44 -070010920QDF_STATUS sme_enable_uapsd_for_ac(uint8_t sta_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010921 sme_ac_enum_type ac, uint8_t tid,
10922 uint8_t pri, uint32_t srvc_int,
10923 uint32_t sus_int,
Abhishek Singh12be60f2017-08-11 13:52:42 +053010924 enum sme_qos_wmm_dir_type dir,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010925 uint8_t psb, uint32_t sessionId,
10926 uint32_t delay_interval)
10927{
10928 void *wma_handle;
10929 t_wma_trigger_uapsd_params uapsd_params;
10930 enum uapsd_ac access_category;
10931
10932 if (!psb) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010933 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010934 "No need to configure auto trigger:psb is 0");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010935 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010936 }
10937
Anurag Chouhan6d760662016-02-20 16:05:43 +053010938 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010939 if (!wma_handle) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010940 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010941 "wma_handle is NULL");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010942 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010943 }
10944
10945 switch (ac) {
10946 case SME_AC_BK:
10947 access_category = UAPSD_BK;
10948 break;
10949 case SME_AC_BE:
10950 access_category = UAPSD_BE;
10951 break;
10952 case SME_AC_VI:
10953 access_category = UAPSD_VI;
10954 break;
10955 case SME_AC_VO:
10956 access_category = UAPSD_VO;
10957 break;
10958 default:
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010959 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010960 }
10961
10962 uapsd_params.wmm_ac = access_category;
10963 uapsd_params.user_priority = pri;
10964 uapsd_params.service_interval = srvc_int;
10965 uapsd_params.delay_interval = delay_interval;
10966 uapsd_params.suspend_interval = sus_int;
10967
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010968 if (QDF_STATUS_SUCCESS !=
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010969 wma_trigger_uapsd_params(wma_handle, sessionId, &uapsd_params)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010970 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010971 "Failed to Trigger Uapsd params for sessionId %d",
10972 sessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010973 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010974 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010975 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010976}
10977
Jeff Johnsona1e92612017-09-24 15:33:44 -070010978QDF_STATUS sme_disable_uapsd_for_ac(uint8_t sta_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010979 sme_ac_enum_type ac,
10980 uint32_t sessionId)
10981{
10982 void *wma_handle;
10983 enum uapsd_ac access_category;
10984
10985 switch (ac) {
10986 case SME_AC_BK:
10987 access_category = UAPSD_BK;
10988 break;
10989 case SME_AC_BE:
10990 access_category = UAPSD_BE;
10991 break;
10992 case SME_AC_VI:
10993 access_category = UAPSD_VI;
10994 break;
10995 case SME_AC_VO:
10996 access_category = UAPSD_VO;
10997 break;
10998 default:
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010999 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011000 }
11001
Anurag Chouhan6d760662016-02-20 16:05:43 +053011002 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011003 if (!wma_handle) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011004 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011005 "wma handle is NULL");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011006 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011007 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011008 if (QDF_STATUS_SUCCESS !=
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011009 wma_disable_uapsd_per_ac(wma_handle, sessionId, access_category)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011010 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011011 "Failed to disable uapsd for ac %d for sessionId %d",
11012 ac, sessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011013 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011014 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011015 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011016}
11017
11018/**
11019 * sme_update_nss() - SME API to change the number for spatial streams
11020 * (1 or 2)
Jeff Johnsonc7309062018-11-09 20:59:42 -080011021 * @mac_handle: Handle returned by mac open
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011022 * @nss: Number of spatial streams
11023 *
11024 * This function is used to update the number of spatial streams supported.
11025 *
11026 * Return: Success upon successfully changing nss else failure
11027 *
11028 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080011029QDF_STATUS sme_update_nss(mac_handle_t mac_handle, uint8_t nss)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011030{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011031 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011032 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Vignesh Viswanathan21c58cb2018-05-24 15:53:58 +053011033 uint32_t i;
11034 struct mlme_ht_capabilities_info *ht_cap_info;
gaurank kathpalia14e2f912017-08-31 14:51:45 +053011035 struct csr_roam_session *csr_session;
Abhinav Kumard4d6eb72018-12-04 20:30:37 +053011036 struct mlme_vht_capabilities_info *vht_cap_info;
Abhinav Kumarb074f2f2018-09-15 15:32:11 +053011037
Abhinav Kumard4d6eb72018-12-04 20:30:37 +053011038 vht_cap_info = &mac_ctx->mlme_cfg->vht_caps.vht_cap_info;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011039
11040 status = sme_acquire_global_lock(&mac_ctx->sme);
11041
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011042 if (QDF_STATUS_SUCCESS == status) {
Abhinav Kumard4d6eb72018-12-04 20:30:37 +053011043 vht_cap_info->enable2x2 = (nss == 1) ? 0 : 1;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011044
11045 /* get the HT capability info*/
Vignesh Viswanathan21c58cb2018-05-24 15:53:58 +053011046 ht_cap_info = &mac_ctx->mlme_cfg->ht_caps.ht_cap_info;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011047
Dustin Brownad06be62019-02-04 14:52:56 -080011048 for (i = 0; i < WLAN_MAX_VDEVS; i++) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011049 if (CSR_IS_SESSION_VALID(mac_ctx, i)) {
11050 csr_session = &mac_ctx->roam.roamSession[i];
Jeff Johnsonbe119e62019-02-02 12:30:26 -080011051 csr_session->ht_config.ht_tx_stbc =
Vignesh Viswanathan78182502018-08-06 15:13:30 +053011052 ht_cap_info->tx_stbc;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011053 }
11054 }
11055
11056 sme_release_global_lock(&mac_ctx->sme);
11057 }
11058 return status;
11059}
11060
11061/**
Archana Ramachandran5041b252016-04-25 14:29:25 -070011062 * sme_update_user_configured_nss() - sets the nss based on user request
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080011063 * @mac_handle: Opaque handle to the global MAC context
Archana Ramachandran5041b252016-04-25 14:29:25 -070011064 * @nss: number of streams
11065 *
11066 * Return: None
11067 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080011068void sme_update_user_configured_nss(mac_handle_t mac_handle, uint8_t nss)
Archana Ramachandran5041b252016-04-25 14:29:25 -070011069{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011070 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Archana Ramachandran5041b252016-04-25 14:29:25 -070011071
11072 mac_ctx->user_configured_nss = nss;
11073}
11074
Jeff Johnsonc7309062018-11-09 20:59:42 -080011075int sme_update_tx_bfee_supp(mac_handle_t mac_handle, uint8_t session_id,
Kiran Kumar Lokere6c7f3fa2018-05-14 18:12:27 -070011076 uint8_t cfg_val)
11077{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011078 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Jeff Johnsonc18469b2018-06-11 06:48:59 -070011079
Abhinav Kumarb074f2f2018-09-15 15:32:11 +053011080 mac_ctx->mlme_cfg->vht_caps.vht_cap_info.su_bformee = cfg_val;
Kiran Kumar Lokere6c7f3fa2018-05-14 18:12:27 -070011081
Jeff Johnsonc7309062018-11-09 20:59:42 -080011082 return sme_update_he_tx_bfee_supp(mac_handle, session_id, cfg_val);
Kiran Kumar Lokere6c7f3fa2018-05-14 18:12:27 -070011083}
Kiran Kumar Lokeref3044852018-06-27 14:14:24 -070011084
Jeff Johnsonc7309062018-11-09 20:59:42 -080011085int sme_update_tx_bfee_nsts(mac_handle_t mac_handle, uint8_t session_id,
Kiran Kumar Lokeref3044852018-06-27 14:14:24 -070011086 uint8_t usr_cfg_val, uint8_t nsts_val)
11087{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011088 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokeref3044852018-06-27 14:14:24 -070011089 uint8_t nsts_set_val;
Abhinav Kumard4d6eb72018-12-04 20:30:37 +053011090 struct mlme_vht_capabilities_info *vht_cap_info;
Kiran Kumar Lokeref3044852018-06-27 14:14:24 -070011091
Abhinav Kumard4d6eb72018-12-04 20:30:37 +053011092 vht_cap_info = &mac_ctx->mlme_cfg->vht_caps.vht_cap_info;
Kiran Kumar Lokeref3044852018-06-27 14:14:24 -070011093 mac_ctx->usr_cfg_tx_bfee_nsts = usr_cfg_val;
11094 if (usr_cfg_val)
11095 nsts_set_val = usr_cfg_val;
11096 else
11097 nsts_set_val = nsts_val;
Dustin Brown48f27fe2018-10-09 12:47:57 -070011098
Abhinav Kumard4d6eb72018-12-04 20:30:37 +053011099 vht_cap_info->tx_bfee_ant_supp = nsts_set_val;
Kiran Kumar Lokeref3044852018-06-27 14:14:24 -070011100
Kiran Kumar Lokere86e85592018-07-18 15:34:24 -070011101 if (usr_cfg_val)
11102 sme_set_he_tx_bf_cbf_rates(session_id);
11103
Jeff Johnsonc7309062018-11-09 20:59:42 -080011104 return sme_update_he_tx_bfee_nsts(mac_handle, session_id, nsts_set_val);
Kiran Kumar Lokeref3044852018-06-27 14:14:24 -070011105}
Kiran Kumar Lokere44a29432018-01-24 16:10:30 -080011106#ifdef WLAN_FEATURE_11AX
Jinwei Chenffaa4672018-08-30 16:55:09 +080011107void sme_update_tgt_he_cap(mac_handle_t mac_handle,
11108 struct wma_tgt_cfg *cfg,
11109 tDot11fIEhe_cap *he_cap_ini)
Jinwei Chen998a1a02018-06-20 17:20:34 +080011110{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011111 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Jinwei Chen998a1a02018-06-20 17:20:34 +080011112
11113 qdf_mem_copy(&mac_ctx->he_cap_2g,
Jinwei Chenef742dc2018-06-27 12:57:50 +080011114 &cfg->he_cap_2g,
11115 sizeof(tDot11fIEhe_cap));
Jinwei Chen998a1a02018-06-20 17:20:34 +080011116
11117 qdf_mem_copy(&mac_ctx->he_cap_5g,
Jinwei Chenef742dc2018-06-27 12:57:50 +080011118 &cfg->he_cap_5g,
11119 sizeof(tDot11fIEhe_cap));
Jinwei Chenffaa4672018-08-30 16:55:09 +080011120
11121 /* modify HE Caps field according to INI setting */
11122 mac_ctx->he_cap_2g.bfee_sts_lt_80 =
11123 QDF_MIN(cfg->he_cap_2g.bfee_sts_lt_80,
11124 he_cap_ini->bfee_sts_lt_80);
11125
11126 mac_ctx->he_cap_5g.bfee_sts_lt_80 =
11127 QDF_MIN(cfg->he_cap_5g.bfee_sts_lt_80,
11128 he_cap_ini->bfee_sts_lt_80);
Jinwei Chen998a1a02018-06-20 17:20:34 +080011129}
11130
Jeff Johnsonc7309062018-11-09 20:59:42 -080011131void sme_update_he_cap_nss(mac_handle_t mac_handle, uint8_t session_id,
11132 uint8_t nss)
Kiran Kumar Lokere44a29432018-01-24 16:10:30 -080011133{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011134 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokere44a29432018-01-24 16:10:30 -080011135 struct csr_roam_session *csr_session;
11136 uint32_t tx_mcs_map = 0;
11137 uint32_t rx_mcs_map = 0;
Kiran Kumar Lokere8dba1892018-07-24 17:09:52 -070011138 uint32_t mcs_map = 0;
Kiran Kumar Lokere44a29432018-01-24 16:10:30 -080011139
11140 if (!nss || (nss > 2)) {
11141 sme_err("invalid Nss value %d", nss);
11142 }
11143 csr_session = CSR_GET_SESSION(mac_ctx, session_id);
Bala Venkatesh6d537092018-09-25 10:38:36 +053011144 rx_mcs_map =
11145 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.rx_he_mcs_map_lt_80;
11146 tx_mcs_map =
11147 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.tx_he_mcs_map_lt_80;
Kiran Kumar Lokere8dba1892018-07-24 17:09:52 -070011148 mcs_map = rx_mcs_map & 0x3;
Bala Venkatesh6d537092018-09-25 10:38:36 +053011149
Kiran Kumar Lokere44a29432018-01-24 16:10:30 -080011150 if (nss == 1) {
11151 tx_mcs_map = HE_SET_MCS_4_NSS(tx_mcs_map, HE_MCS_DISABLE, 2);
11152 rx_mcs_map = HE_SET_MCS_4_NSS(rx_mcs_map, HE_MCS_DISABLE, 2);
11153 } else {
Kiran Kumar Lokere8dba1892018-07-24 17:09:52 -070011154 tx_mcs_map = HE_SET_MCS_4_NSS(tx_mcs_map, mcs_map, 2);
11155 rx_mcs_map = HE_SET_MCS_4_NSS(rx_mcs_map, mcs_map, 2);
Kiran Kumar Lokere44a29432018-01-24 16:10:30 -080011156 }
11157 sme_info("new HE Nss MCS MAP: Rx 0x%0X, Tx: 0x%0X",
11158 rx_mcs_map, tx_mcs_map);
Bala Venkatesh6d537092018-09-25 10:38:36 +053011159 if (cfg_in_range(CFG_HE_RX_MCS_MAP_LT_80, rx_mcs_map))
11160 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.rx_he_mcs_map_lt_80 =
11161 rx_mcs_map;
11162 if (cfg_in_range(CFG_HE_TX_MCS_MAP_LT_80, tx_mcs_map))
11163 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.tx_he_mcs_map_lt_80 =
11164 tx_mcs_map;
Kiran Kumar Lokere44a29432018-01-24 16:10:30 -080011165 csr_update_session_he_cap(mac_ctx, csr_session);
11166
11167}
Kiran Kumar Lokere96246e52018-01-24 16:44:35 -080011168
Jeff Johnsonc7309062018-11-09 20:59:42 -080011169int sme_update_he_mcs(mac_handle_t mac_handle, uint8_t session_id,
11170 uint16_t he_mcs)
Kiran Kumar Lokere96246e52018-01-24 16:44:35 -080011171{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011172 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokere96246e52018-01-24 16:44:35 -080011173 struct csr_roam_session *csr_session;
11174 uint16_t mcs_val = 0;
11175 uint16_t mcs_map = HE_MCS_ALL_DISABLED;
Kiran Kumar Lokere96246e52018-01-24 16:44:35 -080011176
11177 csr_session = CSR_GET_SESSION(mac_ctx, session_id);
11178 if (!csr_session) {
11179 sme_err("No session for id %d", session_id);
11180 return -EINVAL;
11181 }
11182 if ((he_mcs & 0x3) == HE_MCS_DISABLE) {
11183 sme_err("Invalid HE MCS 0x%0x, can't disable 0-7 for 1ss",
11184 he_mcs);
11185 return -EINVAL;
11186 }
11187 mcs_val = he_mcs & 0x3;
11188 switch (he_mcs) {
11189 case HE_80_MCS0_7:
11190 case HE_80_MCS0_9:
11191 case HE_80_MCS0_11:
Abhinav Kumarb074f2f2018-09-15 15:32:11 +053011192 if (mac_ctx->mlme_cfg->vht_caps.vht_cap_info.enable2x2) {
Kiran Kumar Lokere96246e52018-01-24 16:44:35 -080011193 mcs_map = HE_SET_MCS_4_NSS(mcs_map, mcs_val, 1);
11194 mcs_map = HE_SET_MCS_4_NSS(mcs_map, mcs_val, 2);
11195 } else {
11196 mcs_map = HE_SET_MCS_4_NSS(mcs_map, mcs_val, 1);
11197 }
Bala Venkatesh6d537092018-09-25 10:38:36 +053011198 if (cfg_in_range(CFG_HE_TX_MCS_MAP_LT_80, mcs_map))
11199 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.
11200 tx_he_mcs_map_lt_80 = mcs_map;
11201 if (cfg_in_range(CFG_HE_RX_MCS_MAP_LT_80, mcs_map))
11202 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.
11203 rx_he_mcs_map_lt_80 = mcs_map;
Kiran Kumar Lokere96246e52018-01-24 16:44:35 -080011204 break;
11205
11206 case HE_160_MCS0_7:
11207 case HE_160_MCS0_9:
11208 case HE_160_MCS0_11:
11209 mcs_map = HE_SET_MCS_4_NSS(mcs_map, mcs_val, 1);
Bala Venkatesh6d537092018-09-25 10:38:36 +053011210 if (cfg_in_range(CFG_HE_TX_MCS_MAP_160, mcs_map))
11211 qdf_mem_copy(mac_ctx->mlme_cfg->he_caps.dot11_he_cap.
11212 tx_he_mcs_map_160, &mcs_map,
11213 sizeof(uint16_t));
11214 if (cfg_in_range(CFG_HE_RX_MCS_MAP_160, mcs_map))
11215 qdf_mem_copy(mac_ctx->mlme_cfg->he_caps.dot11_he_cap.
11216 rx_he_mcs_map_160, &mcs_map,
11217 sizeof(uint16_t));
Kiran Kumar Lokere96246e52018-01-24 16:44:35 -080011218 break;
11219
11220 case HE_80p80_MCS0_7:
11221 case HE_80p80_MCS0_9:
11222 case HE_80p80_MCS0_11:
11223 mcs_map = HE_SET_MCS_4_NSS(mcs_map, mcs_val, 1);
Bala Venkatesh6d537092018-09-25 10:38:36 +053011224 if (cfg_in_range(CFG_HE_TX_MCS_MAP_80_80, mcs_map))
11225 qdf_mem_copy(mac_ctx->mlme_cfg->he_caps.dot11_he_cap.
11226 tx_he_mcs_map_80_80, &mcs_map,
11227 sizeof(uint16_t));
11228 if (cfg_in_range(CFG_HE_RX_MCS_MAP_80_80, mcs_map))
11229 qdf_mem_copy(mac_ctx->mlme_cfg->he_caps.dot11_he_cap.
11230 rx_he_mcs_map_80_80, &mcs_map,
11231 sizeof(uint16_t));
Kiran Kumar Lokere96246e52018-01-24 16:44:35 -080011232 break;
11233
11234 default:
11235 sme_err("Invalid HE MCS 0x%0x", he_mcs);
11236 return -EINVAL;
11237 }
11238 sme_info("new HE MCS 0x%0x", mcs_map);
Kiran Kumar Lokere96246e52018-01-24 16:44:35 -080011239 csr_update_session_he_cap(mac_ctx, csr_session);
11240
11241 return 0;
11242}
Kiran Kumar Lokere13dedac2018-02-05 19:51:59 -080011243
Jeff Johnsonc7309062018-11-09 20:59:42 -080011244void sme_set_usr_cfg_mu_edca(mac_handle_t mac_handle, bool val)
Kiran Kumar Lokeref54b8552018-07-10 00:53:38 -070011245{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011246 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokeref54b8552018-07-10 00:53:38 -070011247
11248 mac_ctx->usr_cfg_mu_edca_params = val;
11249}
11250
Jeff Johnsonc7309062018-11-09 20:59:42 -080011251int sme_update_mu_edca_params(mac_handle_t mac_handle, uint8_t session_id)
Kiran Kumar Lokerefba20632018-07-05 16:51:27 -070011252{
11253 struct scheduler_msg msg = {0};
11254 QDF_STATUS status;
11255
11256 qdf_mem_zero(&msg, sizeof(msg));
11257 msg.type = WNI_SME_UPDATE_MU_EDCA_PARAMS;
11258 msg.reserved = 0;
11259 msg.bodyval = session_id;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053011260 status = scheduler_post_message(QDF_MODULE_ID_SME,
11261 QDF_MODULE_ID_PE,
11262 QDF_MODULE_ID_PE, &msg);
Kiran Kumar Lokerefba20632018-07-05 16:51:27 -070011263 if (status != QDF_STATUS_SUCCESS) {
11264 sme_err("Not able to post update edca profile");
11265 return -EIO;
11266 }
11267
11268 return 0;
11269}
Jeff Johnsonc7309062018-11-09 20:59:42 -080011270
11271void sme_set_he_mu_edca_def_cfg(mac_handle_t mac_handle)
Kiran Kumar Lokerefba20632018-07-05 16:51:27 -070011272{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011273 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokerefba20632018-07-05 16:51:27 -070011274 uint8_t i;
11275
Kiran Kumar Lokere8dba1892018-07-24 17:09:52 -070011276 sme_debug("Set MU EDCA params to default");
Kiran Kumar Lokerefba20632018-07-05 16:51:27 -070011277 for (i = 0; i < MAX_NUM_AC; i++) {
11278 mac_ctx->usr_mu_edca_params[i].aci.aifsn = MU_EDCA_DEF_AIFSN;
11279 mac_ctx->usr_mu_edca_params[i].aci.aci = i;
11280 mac_ctx->usr_mu_edca_params[i].cw.max = MU_EDCA_DEF_CW_MAX;
11281 mac_ctx->usr_mu_edca_params[i].cw.min = MU_EDCA_DEF_CW_MIN;
11282 mac_ctx->usr_mu_edca_params[i].mu_edca_timer =
11283 MU_EDCA_DEF_TIMER;
11284 }
11285}
11286
Jeff Johnsonc7309062018-11-09 20:59:42 -080011287int sme_update_he_tx_bfee_supp(mac_handle_t mac_handle, uint8_t session_id,
Kiran Kumar Lokere6c7f3fa2018-05-14 18:12:27 -070011288 uint8_t cfg_val)
11289{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011290 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Bala Venkatesh6d537092018-09-25 10:38:36 +053011291 struct csr_roam_session *session;
11292
11293 session = CSR_GET_SESSION(mac_ctx, session_id);
11294
11295 if (!session) {
11296 sme_err("No session for id %d", session_id);
11297 return -EINVAL;
11298 }
11299 if (cfg_val <= 1)
11300 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.su_beamformee = cfg_val;
11301 else
11302 return -EINVAL;
11303
11304 csr_update_session_he_cap(mac_ctx, session);
11305 return 0;
Kiran Kumar Lokere6c7f3fa2018-05-14 18:12:27 -070011306}
11307
Jeff Johnsonc7309062018-11-09 20:59:42 -080011308int sme_update_he_trigger_frm_mac_pad(mac_handle_t mac_handle,
11309 uint8_t session_id,
Kiran Kumar Lokeref54b8552018-07-10 00:53:38 -070011310 uint8_t cfg_val)
11311{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011312 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Bala Venkatesh6d537092018-09-25 10:38:36 +053011313 struct csr_roam_session *session;
11314
11315 session = CSR_GET_SESSION(mac_ctx, session_id);
11316
11317 if (!session) {
11318 sme_err("No session for id %d", session_id);
11319 return -EINVAL;
11320 }
11321 if (cfg_in_range(CFG_HE_TRIG_PAD, cfg_val))
11322 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.trigger_frm_mac_pad =
11323 cfg_val;
11324 else
11325 return -EINVAL;
11326
11327 csr_update_session_he_cap(mac_ctx, session);
11328 return 0;
11329
Kiran Kumar Lokeref54b8552018-07-10 00:53:38 -070011330}
11331
Jeff Johnsonc7309062018-11-09 20:59:42 -080011332int sme_update_he_om_ctrl_supp(mac_handle_t mac_handle, uint8_t session_id,
Kiran Kumar Lokeref1a96f42018-08-29 18:53:47 -070011333 uint8_t cfg_val)
11334{
Bala Venkatesh2fae18a2018-11-14 12:32:45 +053011335
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011336 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Bala Venkatesh2fae18a2018-11-14 12:32:45 +053011337 struct csr_roam_session *session;
11338
11339 session = CSR_GET_SESSION(mac_ctx, session_id);
11340
11341 if (!session) {
11342 sme_err("No session for id %d", session_id);
11343 return -EINVAL;
11344 }
11345 if (cfg_in_range(CFG_HE_OMI, cfg_val))
11346 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.omi_a_ctrl =
11347 cfg_val;
11348 else
11349 return -EINVAL;
11350
11351 csr_update_session_he_cap(mac_ctx, session);
11352 return 0;
Kiran Kumar Lokeref1a96f42018-08-29 18:53:47 -070011353}
11354
Jeff Johnsonc7309062018-11-09 20:59:42 -080011355int sme_send_he_om_ctrl_bw_update(mac_handle_t mac_handle, uint8_t session_id,
Kiran Kumar Lokere94634152018-09-24 19:08:35 -070011356 uint8_t cfg_val)
11357{
11358 uint32_t om_ctrl_cmd[NUM_OM_CTRL_UPDATE_CFG_PARAMS] = {0};
11359 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011360 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokere94634152018-09-24 19:08:35 -070011361 struct csr_roam_session *session = CSR_GET_SESSION(mac_ctx, session_id);
11362
11363 if (!session) {
11364 sme_err("Session does not exist, Session_id: %d", session_id);
11365 return -EINVAL;
11366 }
11367 if (!csr_is_conn_state_connected_infra(mac_ctx, session_id)) {
11368 sme_info("STA is not connected, Session_id: %d", session_id);
11369 return -EINVAL;
11370 }
11371 if (cfg_val > session->connectedProfile.vht_channel_width) {
11372 sme_info("OM ctrl BW %d is greater than connected BW %d",
11373 cfg_val, session->connectedProfile.vht_channel_width);
11374 return -EINVAL;
11375 }
11376 mac_ctx->he_om_ctrl_cfg_bw_set = true;
11377 mac_ctx->he_om_ctrl_cfg_bw = cfg_val;
11378 om_ctrl_cmd[0] = 1;
11379 qdf_mem_copy((void *)&om_ctrl_cmd[OM_CTRL_CMD_MAC_BITS31],
11380 (void *)session->connectedProfile.bssid.bytes,
11381 sizeof(uint32_t));
11382 qdf_mem_copy((void *)&om_ctrl_cmd[OM_CTRL_CMD_MAC_BITS47],
11383 (void *)&session->connectedProfile.bssid.bytes[4],
11384 sizeof(uint16_t));
11385 if (mac_ctx->he_om_ctrl_cfg_nss_set) {
11386 om_ctrl_cmd[OM_CTRL_CMD_RX_NSS] =
11387 mac_ctx->he_om_ctrl_cfg_nss - 1;
11388 om_ctrl_cmd[OM_CTRL_CMD_TX_NSS] =
11389 mac_ctx->he_om_ctrl_cfg_nss - 1;
11390 } else {
11391 om_ctrl_cmd[OM_CTRL_CMD_RX_NSS] = session->nss - 1;
11392 om_ctrl_cmd[OM_CTRL_CMD_TX_NSS] = session->nss - 1;
11393 }
11394 om_ctrl_cmd[OM_CTRL_CMD_BW] = cfg_val;
11395 om_ctrl_cmd[OM_CTRL_CMD_ULMU] = 1;
11396 status = wma_form_unit_test_cmd_and_send(session_id, 13, 7,
11397 om_ctrl_cmd);
11398 if (QDF_STATUS_SUCCESS != status) {
11399 sme_err("send_unit_test_cmd returned %d", status);
11400 return -EIO;
11401 }
11402
11403 return 0;
11404}
11405
Jeff Johnsonc7309062018-11-09 20:59:42 -080011406int sme_send_he_om_ctrl_nss_update(mac_handle_t mac_handle, uint8_t session_id,
11407 uint8_t cfg_val)
Kiran Kumar Lokere94634152018-09-24 19:08:35 -070011408{
11409 uint32_t om_ctrl_cmd[NUM_OM_CTRL_UPDATE_CFG_PARAMS] = {0};
11410 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011411 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokere94634152018-09-24 19:08:35 -070011412 struct csr_roam_session *session = CSR_GET_SESSION(mac_ctx, session_id);
11413
11414 if (!session) {
11415 sme_err("Session does not exist, Session_id: %d", session_id);
11416 return -EINVAL;
11417 }
11418 if (!csr_is_conn_state_connected_infra(mac_ctx, session_id)) {
11419 sme_info("STA not in connected state Session_id: %d",
11420 session_id);
11421 return -EINVAL;
11422 }
11423 if (cfg_val > session->nss) {
11424 sme_info("OM ctrl Nss %d is greater than connected Nss %d",
11425 cfg_val, session->nss);
11426 return -EINVAL;
11427 }
11428 mac_ctx->he_om_ctrl_cfg_nss_set = true;
11429 mac_ctx->he_om_ctrl_cfg_nss = cfg_val;
11430 om_ctrl_cmd[0] = 1;
11431 qdf_mem_copy((void *)&om_ctrl_cmd[OM_CTRL_CMD_MAC_BITS31],
11432 (void *)session->connectedProfile.bssid.bytes,
11433 sizeof(uint32_t));
11434 qdf_mem_copy((void *)&om_ctrl_cmd[OM_CTRL_CMD_MAC_BITS47],
11435 (void *)&session->connectedProfile.bssid.bytes[4],
11436 sizeof(uint16_t));
11437
11438 if (mac_ctx->he_om_ctrl_cfg_bw_set)
11439 om_ctrl_cmd[OM_CTRL_CMD_BW] = mac_ctx->he_om_ctrl_cfg_bw;
11440 else
11441 om_ctrl_cmd[OM_CTRL_CMD_BW] =
11442 session->connectedProfile.vht_channel_width;
11443
11444 om_ctrl_cmd[OM_CTRL_CMD_RX_NSS] = cfg_val - 1;
11445 om_ctrl_cmd[OM_CTRL_CMD_TX_NSS] = cfg_val - 1;
11446 om_ctrl_cmd[OM_CTRL_CMD_ULMU] = 1;
11447 status = wma_form_unit_test_cmd_and_send(session_id, 13, 7,
11448 om_ctrl_cmd);
11449 if (QDF_STATUS_SUCCESS != status) {
11450 sme_err("send_unit_test_cmd returned %d", status);
11451 return -EIO;
11452 }
11453
11454 return 0;
11455}
11456
Jeff Johnsonc7309062018-11-09 20:59:42 -080011457void sme_reset_he_om_ctrl(mac_handle_t mac_handle)
Kiran Kumar Lokere94634152018-09-24 19:08:35 -070011458{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011459 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokere94634152018-09-24 19:08:35 -070011460
11461 mac_ctx->he_om_ctrl_cfg_bw_set = false;
11462 mac_ctx->he_om_ctrl_cfg_nss_set = false;
11463 mac_ctx->he_om_ctrl_cfg_bw = 0;
11464 mac_ctx->he_om_ctrl_cfg_nss = 0;
11465}
11466
Kiran Kumar Lokereee205772018-09-27 00:27:27 -070011467int sme_config_action_tx_in_tb_ppdu(mac_handle_t mac_handle, uint8_t session_id,
11468 uint8_t cfg_val)
11469{
11470 QDF_STATUS status;
11471 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
11472 struct scheduler_msg msg = {0};
11473 struct sir_cfg_action_frm_tb_ppdu *cfg_msg;
11474
11475 if (!csr_is_conn_state_connected_infra(mac_ctx, session_id)) {
11476 sme_info("STA not in connected state Session_id: %d",
11477 session_id);
11478 return -EINVAL;
11479 }
11480
11481 cfg_msg = qdf_mem_malloc(sizeof(*cfg_msg));
11482
11483 if (!cfg_msg)
11484 return -EIO;
11485
11486 cfg_msg->type = WNI_SME_CFG_ACTION_FRM_HE_TB_PPDU;
11487 cfg_msg->session_id = session_id;
11488 cfg_msg->cfg = cfg_val;
11489
11490 msg.bodyptr = cfg_msg;
11491 msg.type = WNI_SME_CFG_ACTION_FRM_HE_TB_PPDU;
11492 status = scheduler_post_message(QDF_MODULE_ID_SME, QDF_MODULE_ID_PE,
11493 QDF_MODULE_ID_PE, &msg);
11494 if (QDF_STATUS_SUCCESS != status) {
11495 sme_err("Failed to send CFG_ACTION_FRAME_IN_TB_PPDU to PE %d",
11496 status);
11497 qdf_mem_free(cfg_msg);
11498 return -EIO;
11499 }
11500
11501 return 0;
11502}
11503
Jeff Johnsonc7309062018-11-09 20:59:42 -080011504int sme_update_he_tx_bfee_nsts(mac_handle_t mac_handle, uint8_t session_id,
Kiran Kumar Lokeref3044852018-06-27 14:14:24 -070011505 uint8_t cfg_val)
11506{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011507 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Bala Venkatesh6d537092018-09-25 10:38:36 +053011508 struct csr_roam_session *session;
11509
11510 session = CSR_GET_SESSION(mac_ctx, session_id);
11511
11512 if (!session) {
11513 sme_err("No session for id %d", session_id);
11514 return -EINVAL;
11515 }
11516 if (cfg_in_range(CFG_HE_BFEE_STS_LT80, cfg_val))
11517 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.bfee_sts_lt_80 =
11518 cfg_val;
11519 else
11520 return -EINVAL;
11521
11522 csr_update_session_he_cap(mac_ctx, session);
11523 return 0;
Kiran Kumar Lokeref3044852018-06-27 14:14:24 -070011524}
11525
Kiran Kumar Lokere86e85592018-07-18 15:34:24 -070011526void sme_set_he_tx_bf_cbf_rates(uint8_t session_id)
11527{
11528 uint32_t tx_bf_cbf_rates_5g[] = {91, 1, 0, 3, 2, 4, 0};
11529 uint32_t tx_bf_cbf_rates_2g[] = {91, 1, 1, 3, 1, 3, 0};
11530 QDF_STATUS status;
11531
11532 status = wma_form_unit_test_cmd_and_send(session_id, 0x48, 7,
11533 tx_bf_cbf_rates_5g);
11534 if (QDF_STATUS_SUCCESS != status)
11535 sme_err("send_unit_test_cmd returned %d", status);
11536
11537 status = wma_form_unit_test_cmd_and_send(session_id, 0x48, 7,
11538 tx_bf_cbf_rates_2g);
11539 if (QDF_STATUS_SUCCESS != status)
11540 sme_err("send_unit_test_cmd returned %d", status);
11541}
11542
Kiran Kumar Lokereefdbd0b2018-09-25 18:53:46 -070011543void sme_config_su_ppdu_queue(uint8_t session_id, bool enable)
11544{
11545 uint32_t su_ppdu_enable[] = {69, 1, 1, 1};
11546 uint32_t su_ppdu_disable[] = {69, 1, 1, 0};
11547 QDF_STATUS status;
11548
11549 if (enable) {
11550 sme_debug("Send Tx SU PPDU queue ENABLE cmd to FW");
11551 status = wma_form_unit_test_cmd_and_send(session_id, 0x48, 4,
11552 su_ppdu_enable);
11553 } else {
11554 sme_debug("Send Tx SU PPDU queue DISABLE cmd to FW");
11555 status = wma_form_unit_test_cmd_and_send(session_id, 0x48, 4,
11556 su_ppdu_disable);
11557 }
11558 if (QDF_STATUS_SUCCESS != status)
11559 sme_err("send_unit_test_cmd returned %d", status);
11560}
11561
Jeff Johnsonc7309062018-11-09 20:59:42 -080011562int sme_update_he_tx_stbc_cap(mac_handle_t mac_handle, uint8_t session_id,
11563 int value)
Kiran Kumar Lokere13dedac2018-02-05 19:51:59 -080011564{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011565 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Bala Venkatesh6d537092018-09-25 10:38:36 +053011566 struct csr_roam_session *session;
Kiran Kumar Lokere5cc2f0d2018-02-08 17:10:05 -080011567 uint32_t he_cap_val = 0;
11568
11569 he_cap_val = value ? 1 : 0;
Bala Venkatesh6d537092018-09-25 10:38:36 +053011570 session = CSR_GET_SESSION(mac_ctx, session_id);
Kiran Kumar Lokere13dedac2018-02-05 19:51:59 -080011571
Bala Venkatesh6d537092018-09-25 10:38:36 +053011572 if (!session) {
11573 sme_err("No session for id %d", session_id);
11574 return -EINVAL;
11575 }
11576 if (he_cap_val <= 1)
Kiran Kumar Lokere9cab5252019-02-04 14:38:08 -080011577 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.tb_ppdu_tx_stbc_lt_80mhz
11578 = he_cap_val;
Bala Venkatesh6d537092018-09-25 10:38:36 +053011579 else
11580 return -EINVAL;
11581 if (he_cap_val <= 1)
Kiran Kumar Lokere9cab5252019-02-04 14:38:08 -080011582 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.tb_ppdu_tx_stbc_gt_80mhz
11583 = he_cap_val;
Bala Venkatesh6d537092018-09-25 10:38:36 +053011584 else
11585 return -EINVAL;
11586 csr_update_session_he_cap(mac_ctx, session);
11587 return 0;
Kiran Kumar Lokere13dedac2018-02-05 19:51:59 -080011588}
11589
Jeff Johnsonc7309062018-11-09 20:59:42 -080011590int sme_update_he_rx_stbc_cap(mac_handle_t mac_handle, uint8_t session_id,
11591 int value)
Kiran Kumar Lokere13dedac2018-02-05 19:51:59 -080011592{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011593 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Bala Venkatesh6d537092018-09-25 10:38:36 +053011594 struct csr_roam_session *session;
Kiran Kumar Lokere5cc2f0d2018-02-08 17:10:05 -080011595 uint32_t he_cap_val = 0;
11596
11597 he_cap_val = value ? 1 : 0;
Bala Venkatesh6d537092018-09-25 10:38:36 +053011598 session = CSR_GET_SESSION(mac_ctx, session_id);
Kiran Kumar Lokere13dedac2018-02-05 19:51:59 -080011599
Bala Venkatesh6d537092018-09-25 10:38:36 +053011600 if (!session) {
11601 sme_err("No session for id %d", session_id);
11602 return -EINVAL;
11603 }
11604 if (he_cap_val <= 1)
11605 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.rx_stbc_lt_80mhz =
11606 he_cap_val;
11607 else
11608 return -EINVAL;
11609 if (he_cap_val <= 1)
11610 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.rx_stbc_gt_80mhz =
11611 he_cap_val;
11612 else
11613 return -EINVAL;
11614 csr_update_session_he_cap(mac_ctx, session);
11615 return 0;
Kiran Kumar Lokere5cc2f0d2018-02-08 17:10:05 -080011616}
11617
Jeff Johnsonc7309062018-11-09 20:59:42 -080011618int sme_update_he_frag_supp(mac_handle_t mac_handle, uint8_t session_id,
11619 uint16_t he_frag)
Kiran Kumar Lokere5cc2f0d2018-02-08 17:10:05 -080011620{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011621 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Bala Venkatesh6d537092018-09-25 10:38:36 +053011622 struct csr_roam_session *session;
11623
11624 session = CSR_GET_SESSION(mac_ctx, session_id);
11625
11626 if (!session) {
11627 sme_err("No session for id %d", session_id);
11628 return -EINVAL;
11629 }
11630 if (cfg_in_range(CFG_HE_FRAGMENTATION, he_frag))
11631 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.fragmentation = he_frag;
11632 else
11633 return -EINVAL;
11634
11635 csr_update_session_he_cap(mac_ctx, session);
11636 return 0;
11637
Kiran Kumar Lokere13dedac2018-02-05 19:51:59 -080011638}
Kiran Kumar Lokeree43a4582018-05-08 19:54:03 -070011639
Jeff Johnsonc7309062018-11-09 20:59:42 -080011640int sme_update_he_ldpc_supp(mac_handle_t mac_handle, uint8_t session_id,
Kiran Kumar Lokeree43a4582018-05-08 19:54:03 -070011641 uint16_t he_ldpc)
11642{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011643 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Bala Venkatesh6d537092018-09-25 10:38:36 +053011644 struct csr_roam_session *session;
11645
11646 session = CSR_GET_SESSION(mac_ctx, session_id);
11647
11648 if (!session) {
11649 sme_err("No session for id %d", session_id);
11650 return -EINVAL;
11651 }
11652 if (he_ldpc <= 1)
11653 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.ldpc_coding = he_ldpc;
11654 else
11655 return -EINVAL;
11656
11657 csr_update_session_he_cap(mac_ctx, session);
11658 return 0;
11659
Kiran Kumar Lokeree43a4582018-05-08 19:54:03 -070011660}
Kiran Kumar Lokere44a29432018-01-24 16:10:30 -080011661#endif
11662
Archana Ramachandran5041b252016-04-25 14:29:25 -070011663/**
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053011664 * sme_set_nud_debug_stats_cb() - set nud debug stats callback
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080011665 * @mac_handle: Opaque handle to the global MAC context
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053011666 * @cb: callback function pointer
Dundi Raviteja3bcf3a82018-05-22 13:24:18 +053011667 * @context: callback context
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053011668 *
11669 * This function stores nud debug stats callback function.
11670 *
11671 * Return: QDF_STATUS enumeration.
11672 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080011673QDF_STATUS sme_set_nud_debug_stats_cb(mac_handle_t mac_handle,
Dundi Raviteja3bcf3a82018-05-22 13:24:18 +053011674 void (*cb)(void *, struct rsp_stats *, void *),
11675 void *context)
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053011676{
11677 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011678 struct mac_context *mac;
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053011679
Jeff Johnsonc7309062018-11-09 20:59:42 -080011680 if (!mac_handle) {
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053011681 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Jeff Johnsonc7309062018-11-09 20:59:42 -080011682 FL("mac_handle is not valid"));
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053011683 return QDF_STATUS_E_INVAL;
11684 }
Jeff Johnsona0619e42018-11-28 17:43:00 -080011685 mac = MAC_CONTEXT(mac_handle);
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053011686
11687 status = sme_acquire_global_lock(&mac->sme);
11688 if (!QDF_IS_STATUS_SUCCESS(status)) {
11689 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
11690 FL("sme_acquire_global_lock failed!(status=%d)"),
11691 status);
11692 return status;
11693 }
11694
11695 mac->sme.get_arp_stats_cb = cb;
Dundi Raviteja3bcf3a82018-05-22 13:24:18 +053011696 mac->sme.get_arp_stats_context = context;
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053011697 sme_release_global_lock(&mac->sme);
11698 return status;
11699}
11700
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011701/**
11702 * sme_is_any_session_in_connected_state() - SME wrapper API to
11703 * check if any session is in connected state or not.
11704 *
Jeff Johnsonc7309062018-11-09 20:59:42 -080011705 * @mac_handle: Handle returned by mac open
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011706 *
11707 * This function is used to check if any valid sme session is in
11708 * connected state or not.
11709 *
11710 * Return: true if any session is connected, else false.
11711 *
11712 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080011713bool sme_is_any_session_in_connected_state(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011714{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011715 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011716 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011717 bool ret = false;
11718
11719 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011720 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011721 ret = csr_is_any_session_in_connect_state(mac_ctx);
11722 sme_release_global_lock(&mac_ctx->sme);
11723 }
11724 return ret;
11725}
11726
Jeff Johnsonb7fa2562018-07-02 08:36:17 -070011727QDF_STATUS sme_set_chip_pwr_save_fail_cb(mac_handle_t mac_handle,
11728 pwr_save_fail_cb cb)
11729{
11730 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011731 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Ravi Kumar Bokka05c14e52017-03-27 14:48:23 +053011732
11733 status = sme_acquire_global_lock(&mac->sme);
11734 if (status != QDF_STATUS_SUCCESS) {
11735 sme_err("sme_AcquireGlobalLock failed!(status=%d)", status);
11736 return status;
11737 }
11738 mac->sme.chip_power_save_fail_cb = cb;
11739 sme_release_global_lock(&mac->sme);
11740 return status;
11741}
11742
Qiwei Caie689a262018-07-26 15:50:22 +080011743#ifdef FEATURE_RSSI_MONITOR
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011744/**
11745 * sme_set_rssi_monitoring() - set rssi monitoring
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080011746 * @mac_handle: Opaque handle to the global MAC context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011747 * @input: request message
11748 *
11749 * This function constructs the vos message and fill in message type,
11750 * bodyptr with @input and posts it to WDA queue.
11751 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011752 * Return: QDF_STATUS enumeration
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011753 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080011754QDF_STATUS sme_set_rssi_monitoring(mac_handle_t mac_handle,
Jeff Johnson4c6d40f2019-02-22 20:49:56 -080011755 struct rssi_monitor_param *input)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011756{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011757 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011758 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070011759 struct scheduler_msg message = {0};
Jeff Johnson4c6d40f2019-02-22 20:49:56 -080011760 struct rssi_monitor_param *req_msg;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011761
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070011762 SME_ENTER();
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011763 req_msg = qdf_mem_malloc(sizeof(*req_msg));
Arif Hussain0ef77082018-10-10 16:42:53 -070011764 if (!req_msg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011765 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011766
11767 *req_msg = *input;
11768
11769 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011770 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070011771 sme_err("sme_acquire_global_lock failed!(status=%d)", status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011772 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011773 return status;
11774 }
11775
11776 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080011777 message.bodyptr = req_msg;
11778 message.type = WMA_SET_RSSI_MONITOR_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053011779 status = scheduler_post_message(QDF_MODULE_ID_SME,
11780 QDF_MODULE_ID_WMA,
11781 QDF_MODULE_ID_WMA, &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011782 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070011783 sme_err("scheduler_post_msg failed!(err=%d)", status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011784 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011785 }
11786 sme_release_global_lock(&mac->sme);
11787
11788 return status;
11789}
11790
Qiwei Caie689a262018-07-26 15:50:22 +080011791QDF_STATUS sme_set_rssi_threshold_breached_cb(mac_handle_t mac_handle,
11792 rssi_threshold_breached_cb cb)
11793{
11794 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011795 struct mac_context *mac;
Qiwei Caie689a262018-07-26 15:50:22 +080011796
11797 mac = MAC_CONTEXT(mac_handle);
11798 if (!mac) {
11799 sme_err("Invalid mac context");
11800 return QDF_STATUS_E_INVAL;
11801 }
11802
11803 status = sme_acquire_global_lock(&mac->sme);
11804 if (!QDF_IS_STATUS_SUCCESS(status)) {
11805 sme_err("sme_acquire_global_lock failed!(status=%d)",
11806 status);
11807 return status;
11808 }
11809
11810 mac->sme.rssi_threshold_breached_cb = cb;
11811 sme_release_global_lock(&mac->sme);
11812 return status;
11813}
11814#endif /* FEATURE_RSSI_MONITOR */
11815
11816QDF_STATUS sme_reset_rssi_threshold_breached_cb(mac_handle_t mac_handle)
11817{
11818 return sme_set_rssi_threshold_breached_cb(mac_handle, NULL);
11819}
11820
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -070011821static enum band_info sme_get_connected_roaming_vdev_band(void)
11822{
11823 enum band_info band = BAND_ALL;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011824 struct mac_context *mac = sme_get_mac_context();
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -070011825 struct csr_roam_session *session;
11826 uint8_t session_id, channel;
11827
11828 if (!mac) {
11829 sme_debug("MAC Context is NULL");
11830 return band;
11831 }
11832 session_id = csr_get_roam_enabled_sta_sessionid(mac);
11833 if (session_id != CSR_SESSION_ID_INVALID) {
11834 session = CSR_GET_SESSION(mac, session_id);
11835 channel = session->connectedProfile.operationChannel;
11836 band = csr_get_rf_band(channel);
11837 return band;
11838 }
11839
11840 return band;
11841}
11842
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011843/*
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +053011844 * sme_pdev_set_pcl() - Send WMI_PDEV_SET_PCL_CMDID to the WMA
Jeff Johnsonc7309062018-11-09 20:59:42 -080011845 * @mac_handle: Handle returned by macOpen
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011846 * @msg: PCL channel list and length structure
11847 *
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +053011848 * Sends the command to WMA to send WMI_PDEV_SET_PCL_CMDID to FW
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011849 * Return: QDF_STATUS_SUCCESS on successful posting
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011850 */
Krunal Soni8a090df2018-05-03 15:02:54 -070011851QDF_STATUS sme_pdev_set_pcl(struct policy_mgr_pcl_list *msg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011852{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011853 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011854 struct mac_context *mac = sme_get_mac_context();
Rajeev Kumar37d478b2017-04-17 16:59:28 -070011855 struct scheduler_msg message = {0};
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -070011856 struct set_pcl_req *req_msg;
11857 uint32_t i;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011858
Krunal Soni3fa80e22018-01-09 14:16:02 -080011859 if (!mac) {
11860 sme_err("mac is NULL");
11861 return QDF_STATUS_E_FAILURE;
11862 }
Krunal Soni8a090df2018-05-03 15:02:54 -070011863
11864 if (!msg) {
11865 sme_err("msg is NULL");
11866 return QDF_STATUS_E_FAILURE;
11867 }
11868
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -070011869 req_msg = qdf_mem_malloc(sizeof(*req_msg));
Arif Hussain0ef77082018-10-10 16:42:53 -070011870 if (!req_msg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011871 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011872
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -070011873 req_msg->band = BAND_ALL;
11874 if (CSR_IS_ROAM_INTRA_BAND_ENABLED(mac)) {
11875 req_msg->band = sme_get_connected_roaming_vdev_band();
11876 sme_debug("Connected STA band %d", req_msg->band);
11877 }
Krunal Soni8a090df2018-05-03 15:02:54 -070011878 for (i = 0; i < msg->pcl_len; i++) {
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -070011879 req_msg->chan_weights.pcl_list[i] = msg->pcl_list[i];
11880 req_msg->chan_weights.weight_list[i] = msg->weight_list[i];
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +053011881 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011882
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -070011883 req_msg->chan_weights.pcl_len = msg->pcl_len;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011884
11885 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011886 if (status != QDF_STATUS_SUCCESS) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070011887 sme_err("sme_acquire_global_lock failed!(status=%d)", status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011888 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011889 return status;
11890 }
11891
11892 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080011893 message.bodyptr = req_msg;
11894 message.type = SIR_HAL_PDEV_SET_PCL_TO_FW;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053011895 status = scheduler_post_message(QDF_MODULE_ID_SME,
11896 QDF_MODULE_ID_WMA,
11897 QDF_MODULE_ID_WMA, &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011898 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070011899 sme_err("scheduler_post_msg failed!(err=%d)", status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011900 qdf_mem_free(req_msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011901 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011902 }
11903 sme_release_global_lock(&mac->sme);
11904
11905 return status;
11906}
11907
11908/*
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +053011909 * sme_pdev_set_hw_mode() - Send WMI_PDEV_SET_HW_MODE_CMDID to the WMA
Jeff Johnsonc7309062018-11-09 20:59:42 -080011910 * @mac_handle: Handle returned by macOpen
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011911 * @msg: HW mode structure containing hw mode and callback details
11912 *
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +053011913 * Sends the command to CSR to send WMI_PDEV_SET_HW_MODE_CMDID to FW
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011914 * Return: QDF_STATUS_SUCCESS on successful posting
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011915 */
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -080011916QDF_STATUS sme_pdev_set_hw_mode(struct policy_mgr_hw_mode msg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011917{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011918 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011919 struct mac_context *mac = sme_get_mac_context();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011920 tSmeCmd *cmd = NULL;
11921
Krunal Soni3fa80e22018-01-09 14:16:02 -080011922 if (!mac) {
11923 sme_err("mac is NULL");
11924 return QDF_STATUS_E_FAILURE;
11925 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011926 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011927 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070011928 sme_err("Failed to acquire lock");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011929 return QDF_STATUS_E_RESOURCES;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011930 }
11931
Krunal Soni78618d92017-02-14 21:46:31 -080011932 cmd = csr_get_command_buffer(mac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011933 if (!cmd) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070011934 sme_err("Get command buffer failed");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011935 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011936 return QDF_STATUS_E_NULL_VALUE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011937 }
11938
11939 cmd->command = e_sme_command_set_hw_mode;
Ganesh Kondabattiniae1c6a22017-05-02 18:02:11 +053011940 cmd->sessionId = msg.session_id;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011941 cmd->u.set_hw_mode_cmd.hw_mode_index = msg.hw_mode_index;
11942 cmd->u.set_hw_mode_cmd.set_hw_mode_cb = msg.set_hw_mode_cb;
Chandrasekaran, Manishekaref70c0d2015-10-20 19:54:55 +053011943 cmd->u.set_hw_mode_cmd.reason = msg.reason;
11944 cmd->u.set_hw_mode_cmd.session_id = msg.session_id;
Tushnim Bhattacharyyaeab33dd2017-11-15 15:20:02 -080011945 cmd->u.set_hw_mode_cmd.next_action = msg.next_action;
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -080011946 cmd->u.set_hw_mode_cmd.context = msg.context;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011947
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070011948 sme_debug("Queuing set hw mode to CSR, session: %d reason: %d",
Chandrasekaran, Manishekarce2172e2016-02-18 16:12:43 +053011949 cmd->u.set_hw_mode_cmd.session_id,
11950 cmd->u.set_hw_mode_cmd.reason);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011951 csr_queue_sme_command(mac, cmd, false);
11952
11953 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011954 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011955}
11956
11957/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011958 * sme_nss_update_request() - Send beacon templete update to FW with new
11959 * nss value
Jeff Johnsonc7309062018-11-09 20:59:42 -080011960 * @mac_handle: Handle returned by macOpen
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011961 * @vdev_id: the session id
11962 * @new_nss: the new nss value
11963 * @cback: hdd callback
11964 * @next_action: next action to happen at policy mgr after beacon update
Liangwei Dong1ba99482018-10-19 02:57:29 -040011965 * @original_vdev_id: original request hwmode change vdev id
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011966 *
11967 * Sends the command to CSR to send to PE
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011968 * Return: QDF_STATUS_SUCCESS on successful posting
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011969 */
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -080011970QDF_STATUS sme_nss_update_request(uint32_t vdev_id,
11971 uint8_t new_nss, policy_mgr_nss_update_cback cback,
11972 uint8_t next_action, struct wlan_objmgr_psoc *psoc,
Liangwei Dong1ba99482018-10-19 02:57:29 -040011973 enum policy_mgr_conn_update_reason reason,
11974 uint32_t original_vdev_id)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011975{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011976 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011977 struct mac_context *mac = sme_get_mac_context();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011978 tSmeCmd *cmd = NULL;
11979
Krunal Soni3fa80e22018-01-09 14:16:02 -080011980 if (!mac) {
11981 sme_err("mac is null");
11982 return status;
11983 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011984 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011985 if (QDF_IS_STATUS_SUCCESS(status)) {
Krunal Soni78618d92017-02-14 21:46:31 -080011986 cmd = csr_get_command_buffer(mac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011987 if (!cmd) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070011988 sme_err("Get command buffer failed");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011989 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011990 return QDF_STATUS_E_NULL_VALUE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011991 }
11992 cmd->command = e_sme_command_nss_update;
11993 /* Sessionized modules may require this info */
11994 cmd->sessionId = vdev_id;
11995 cmd->u.nss_update_cmd.new_nss = new_nss;
11996 cmd->u.nss_update_cmd.session_id = vdev_id;
11997 cmd->u.nss_update_cmd.nss_update_cb = cback;
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -080011998 cmd->u.nss_update_cmd.context = psoc;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011999 cmd->u.nss_update_cmd.next_action = next_action;
Chandrasekaran, Manishekarce2172e2016-02-18 16:12:43 +053012000 cmd->u.nss_update_cmd.reason = reason;
Liangwei Dong1ba99482018-10-19 02:57:29 -040012001 cmd->u.nss_update_cmd.original_vdev_id = original_vdev_id;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012002
Liangwei Dong1ba99482018-10-19 02:57:29 -040012003 sme_debug("Queuing e_sme_command_nss_update to CSR:vdev (%d %d) ss %d r %d",
12004 vdev_id, original_vdev_id, new_nss, reason);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012005 csr_queue_sme_command(mac, cmd, false);
12006 sme_release_global_lock(&mac->sme);
12007 }
12008 return status;
12009}
12010
12011/**
12012 * sme_soc_set_dual_mac_config() - Set dual mac configurations
Jeff Johnsonc7309062018-11-09 20:59:42 -080012013 * @mac_handle: Handle returned by macOpen
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012014 * @msg: Structure containing the dual mac config parameters
12015 *
12016 * Queues configuration information to CSR to configure
12017 * WLAN firmware for the dual MAC features
12018 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012019 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012020 */
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -080012021QDF_STATUS sme_soc_set_dual_mac_config(struct policy_mgr_dual_mac_config msg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012022{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012023 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012024 struct mac_context *mac = sme_get_mac_context();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012025 tSmeCmd *cmd;
12026
Krunal Soni3fa80e22018-01-09 14:16:02 -080012027 if (!mac) {
12028 sme_err("mac is null");
12029 return QDF_STATUS_E_FAILURE;
12030 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012031 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012032 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012033 sme_err("Failed to acquire lock");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012034 return QDF_STATUS_E_RESOURCES;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012035 }
12036
Krunal Soni78618d92017-02-14 21:46:31 -080012037 cmd = csr_get_command_buffer(mac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012038 if (!cmd) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012039 sme_err("Get command buffer failed");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012040 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012041 return QDF_STATUS_E_NULL_VALUE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012042 }
12043
12044 cmd->command = e_sme_command_set_dual_mac_config;
12045 cmd->u.set_dual_mac_cmd.scan_config = msg.scan_config;
12046 cmd->u.set_dual_mac_cmd.fw_mode_config = msg.fw_mode_config;
12047 cmd->u.set_dual_mac_cmd.set_dual_mac_cb = msg.set_dual_mac_cb;
12048
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012049 sme_debug("set_dual_mac_config scan_config: %x fw_mode_config: %x",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012050 cmd->u.set_dual_mac_cmd.scan_config,
12051 cmd->u.set_dual_mac_cmd.fw_mode_config);
12052 csr_queue_sme_command(mac, cmd, false);
12053
12054 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012055 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012056}
12057
Ravi Joshi9e891ba2015-11-09 19:03:46 -080012058#ifdef FEATURE_LFR_SUBNET_DETECTION
12059/**
12060 * sme_gateway_param_update() - to update gateway parameters with WMA
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080012061 * @mac_handle: Opaque handle to the global MAC context
Ravi Joshi9e891ba2015-11-09 19:03:46 -080012062 * @gw_params: request parameters from HDD
12063 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012064 * Return: QDF_STATUS
Ravi Joshi9e891ba2015-11-09 19:03:46 -080012065 *
12066 * This routine will update gateway parameters to WMA
12067 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080012068QDF_STATUS sme_gateway_param_update(mac_handle_t mac_handle,
Jeff Johnson38d0ce62019-02-22 17:05:14 -080012069 struct gateway_update_req_param *gw_params)
Ravi Joshi9e891ba2015-11-09 19:03:46 -080012070{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012071 QDF_STATUS qdf_status;
Rajeev Kumar37d478b2017-04-17 16:59:28 -070012072 struct scheduler_msg message = {0};
Jeff Johnson38d0ce62019-02-22 17:05:14 -080012073 struct gateway_update_req_param *request_buf;
Ravi Joshi9e891ba2015-11-09 19:03:46 -080012074
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012075 request_buf = qdf_mem_malloc(sizeof(*request_buf));
Arif Hussain0ef77082018-10-10 16:42:53 -070012076 if (!request_buf)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012077 return QDF_STATUS_E_NOMEM;
Ravi Joshi9e891ba2015-11-09 19:03:46 -080012078
12079 *request_buf = *gw_params;
12080
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080012081 message.type = WMA_GW_PARAM_UPDATE_REQ;
12082 message.reserved = 0;
12083 message.bodyptr = request_buf;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053012084 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
12085 QDF_MODULE_ID_WMA,
12086 QDF_MODULE_ID_WMA, &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012087 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012088 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053012089 "Not able to post WMA_GW_PARAM_UPDATE_REQ message to HAL");
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012090 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012091 return QDF_STATUS_E_FAILURE;
Ravi Joshi9e891ba2015-11-09 19:03:46 -080012092 }
12093
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012094 return QDF_STATUS_SUCCESS;
Ravi Joshi9e891ba2015-11-09 19:03:46 -080012095}
12096#endif /* FEATURE_LFR_SUBNET_DETECTION */
12097
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012098/**
Archana Ramachandrana20ef812015-11-13 16:12:13 -080012099 * sme_soc_set_antenna_mode() - set antenna mode
Jeff Johnsonc7309062018-11-09 20:59:42 -080012100 * @mac_handle: Handle returned by macOpen
Archana Ramachandrana20ef812015-11-13 16:12:13 -080012101 * @msg: Structure containing the antenna mode parameters
12102 *
12103 * Send the command to CSR to send
12104 * WMI_SOC_SET_ANTENNA_MODE_CMDID to FW
12105 *
12106 * Return: QDF_STATUS
12107 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080012108QDF_STATUS sme_soc_set_antenna_mode(mac_handle_t mac_handle,
12109 struct sir_antenna_mode_param *msg)
Archana Ramachandrana20ef812015-11-13 16:12:13 -080012110{
12111 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012112 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Archana Ramachandrana20ef812015-11-13 16:12:13 -080012113 tSmeCmd *cmd;
12114
12115 if (NULL == msg) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012116 sme_err("antenna mode mesg is NULL");
Archana Ramachandrana20ef812015-11-13 16:12:13 -080012117 return QDF_STATUS_E_FAILURE;
12118 }
12119
12120 status = sme_acquire_global_lock(&mac->sme);
12121 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012122 sme_err("Failed to acquire lock");
Archana Ramachandrana20ef812015-11-13 16:12:13 -080012123 return QDF_STATUS_E_RESOURCES;
12124 }
12125
Krunal Soni78618d92017-02-14 21:46:31 -080012126 cmd = csr_get_command_buffer(mac);
Archana Ramachandrana20ef812015-11-13 16:12:13 -080012127 if (!cmd) {
12128 sme_release_global_lock(&mac->sme);
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012129 sme_err("Get command buffer failed");
Archana Ramachandrana20ef812015-11-13 16:12:13 -080012130 return QDF_STATUS_E_NULL_VALUE;
12131 }
12132
12133 cmd->command = e_sme_command_set_antenna_mode;
12134 cmd->u.set_antenna_mode_cmd = *msg;
12135
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012136 sme_debug("Antenna mode rx_chains: %d tx_chains: %d",
Archana Ramachandrana20ef812015-11-13 16:12:13 -080012137 cmd->u.set_antenna_mode_cmd.num_rx_chains,
12138 cmd->u.set_antenna_mode_cmd.num_tx_chains);
12139
12140 csr_queue_sme_command(mac, cmd, false);
12141 sme_release_global_lock(&mac->sme);
12142
12143 return QDF_STATUS_SUCCESS;
12144}
12145
12146/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012147 * sme_set_peer_authorized() - call peer authorized callback
12148 * @peer_addr: peer mac address
12149 * @auth_cb: auth callback
12150 * @vdev_id: vdev id
12151 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +053012152 * Return: QDF Status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012153 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012154QDF_STATUS sme_set_peer_authorized(uint8_t *peer_addr,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012155 sme_peer_authorized_fp auth_cb,
12156 uint32_t vdev_id)
12157{
12158 void *wma_handle;
12159
Anurag Chouhan6d760662016-02-20 16:05:43 +053012160 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012161 if (!wma_handle) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012162 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012163 "wma handle is NULL");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012164 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012165 }
12166
12167 wma_set_peer_authorized_cb(wma_handle, auth_cb);
12168 return wma_set_peer_param(wma_handle, peer_addr, WMI_PEER_AUTHORIZE,
12169 1, vdev_id);
12170}
12171
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012172/**
Jeff Johnson01f2c232018-11-21 19:17:44 -080012173 * sme_setdef_dot11mode() - Updates mac with default dot11mode
Jeff Johnsonc7309062018-11-09 20:59:42 -080012174 * @mac_handle: Global MAC pointer
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012175 *
12176 * Return: NULL.
12177 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080012178void sme_setdef_dot11mode(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012179{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012180 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053012181
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012182 csr_set_default_dot11_mode(mac_ctx);
12183}
12184
12185/**
Krishna Kumaar Natarajan052c6e62015-09-28 15:32:55 -070012186 * sme_update_tgt_services() - update the target services config.
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080012187 * @mac_handle: Opaque handle to the global MAC context.
Krishna Kumaar Natarajan052c6e62015-09-28 15:32:55 -070012188 * @cfg: wma_tgt_services parameters.
12189 *
12190 * update the target services config.
12191 *
12192 * Return: None.
12193 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080012194void sme_update_tgt_services(mac_handle_t mac_handle,
12195 struct wma_tgt_services *cfg)
Krishna Kumaar Natarajan052c6e62015-09-28 15:32:55 -070012196{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012197 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Krishna Kumaar Natarajan052c6e62015-09-28 15:32:55 -070012198
Liangwei Dong0da14262018-07-03 03:30:23 -040012199 mac_ctx->obss_scan_offload = cfg->obss_scan_offload;
12200 sme_debug("obss_scan_offload: %d", mac_ctx->obss_scan_offload);
Krunal Sonie6a1cda2017-09-27 15:23:02 -070012201 mac_ctx->lteCoexAntShare = cfg->lte_coex_ant_share;
Krishna Kumaar Natarajan052c6e62015-09-28 15:32:55 -070012202 mac_ctx->beacon_offload = cfg->beacon_offload;
mukul sharma72c8b222015-09-04 17:02:01 +053012203 mac_ctx->pmf_offload = cfg->pmf_offload;
Abhishek Singhe4a1f882017-08-10 17:59:44 +053012204 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
mukul sharma72c8b222015-09-04 17:02:01 +053012205 FL("mac_ctx->pmf_offload: %d"), mac_ctx->pmf_offload);
Vignesh Viswanathan731186f2017-09-18 13:47:37 +053012206 mac_ctx->is_fils_roaming_supported =
12207 cfg->is_fils_roaming_supported;
Vignesh Viswanathan694e28e2018-01-18 20:53:57 +053012208 mac_ctx->is_11k_offload_supported =
12209 cfg->is_11k_offload_supported;
12210 sme_debug("pmf_offload: %d fils_roam support %d 11k_offload %d",
12211 mac_ctx->pmf_offload, mac_ctx->is_fils_roaming_supported,
12212 mac_ctx->is_11k_offload_supported);
Arunk Khandavallica56d4b2018-11-29 15:46:00 +053012213 mac_ctx->bcn_reception_stats = cfg->bcn_reception_stats;
Krishna Kumaar Natarajan052c6e62015-09-28 15:32:55 -070012214}
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053012215
Chandrasekaran, Manishekar2859de42016-02-11 16:17:38 +053012216/**
12217 * sme_is_session_id_valid() - Check if the session id is valid
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080012218 * @mac_handle: Opaque handle to the global MAC context
Chandrasekaran, Manishekar2859de42016-02-11 16:17:38 +053012219 * @session_id: Session id
12220 *
12221 * Checks if the session id is valid or not
12222 *
12223 * Return: True is the session id is valid, false otherwise
12224 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080012225bool sme_is_session_id_valid(mac_handle_t mac_handle, uint32_t session_id)
Chandrasekaran, Manishekar2859de42016-02-11 16:17:38 +053012226{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012227 struct mac_context *mac;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053012228
Jeff Johnsonc7309062018-11-09 20:59:42 -080012229 if (NULL != mac_handle) {
Jeff Johnsona0619e42018-11-28 17:43:00 -080012230 mac = MAC_CONTEXT(mac_handle);
Pragaspathi Thilagarajb11dbe42018-07-23 16:42:17 +053012231 } else {
Chandrasekaran, Manishekard3cb4772016-02-22 22:21:10 +053012232 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
12233 "%s: null mac pointer", __func__);
Chandrasekaran, Manishekar2859de42016-02-11 16:17:38 +053012234 return false;
12235 }
12236
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053012237 if (CSR_IS_SESSION_VALID(mac, session_id))
Chandrasekaran, Manishekar2859de42016-02-11 16:17:38 +053012238 return true;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053012239
12240 return false;
Chandrasekaran, Manishekar2859de42016-02-11 16:17:38 +053012241}
12242
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053012243#ifdef FEATURE_WLAN_TDLS
12244
12245/**
12246 * sme_get_opclass() - determine operating class
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080012247 * @mac_handle: Opaque handle to the global MAC context
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053012248 * @channel: channel id
12249 * @bw_offset: bandwidth offset
12250 * @opclass: pointer to operating class
12251 *
12252 * Function will determine operating class from regdm_get_opclass_from_channel
12253 *
12254 * Return: none
12255 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080012256void sme_get_opclass(mac_handle_t mac_handle, uint8_t channel,
12257 uint8_t bw_offset, uint8_t *opclass)
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053012258{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012259 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053012260
12261 /* redgm opclass table contains opclass for 40MHz low primary,
12262 * 40MHz high primary and 20MHz. No support for 80MHz yet. So
12263 * first we will check if bit for 40MHz is set and if so find
12264 * matching opclass either with low primary or high primary
12265 * (a channel would never be in both) and then search for opclass
12266 * matching 20MHz, else for any BW.
12267 */
12268 if (bw_offset & (1 << BW_40_OFFSET_BIT)) {
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070012269 *opclass = wlan_reg_dmn_get_opclass_from_channel(
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053012270 mac_ctx->scan.countryCodeCurrent,
12271 channel, BW40_LOW_PRIMARY);
12272 if (!(*opclass)) {
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070012273 *opclass = wlan_reg_dmn_get_opclass_from_channel(
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053012274 mac_ctx->scan.countryCodeCurrent,
12275 channel, BW40_HIGH_PRIMARY);
12276 }
12277 } else if (bw_offset & (1 << BW_20_OFFSET_BIT)) {
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070012278 *opclass = wlan_reg_dmn_get_opclass_from_channel(
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053012279 mac_ctx->scan.countryCodeCurrent,
12280 channel, BW20);
12281 } else {
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070012282 *opclass = wlan_reg_dmn_get_opclass_from_channel(
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053012283 mac_ctx->scan.countryCodeCurrent,
12284 channel, BWALL);
12285 }
12286}
12287#endif
Ryan Hsu3c8f79f2015-12-02 16:45:09 -080012288
Sandeep Puligillae0875662016-02-12 16:09:21 -080012289/**
Anurag Chouhanbf5e0e22016-09-12 12:54:09 +053012290 * sme_set_fw_test() - set fw test
12291 * @fw_test: fw test param
12292 *
12293 * Return: Return QDF_STATUS, otherwise appropriate failure code
12294 */
12295QDF_STATUS sme_set_fw_test(struct set_fwtest_params *fw_test)
12296{
12297 void *wma_handle;
12298
12299 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
12300 if (!wma_handle) {
12301 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
12302 "wma handle is NULL");
12303 return QDF_STATUS_E_FAILURE;
12304 }
12305 wma_process_fw_test_cmd(wma_handle, fw_test);
12306 return QDF_STATUS_SUCCESS;
12307}
12308
12309/**
Sandeep Puligillae0875662016-02-12 16:09:21 -080012310 * sme_ht40_stop_obss_scan() - ht40 obss stop scan
Jeff Johnsonc7309062018-11-09 20:59:42 -080012311 * @mac_handle: mac handel
Sandeep Puligillae0875662016-02-12 16:09:21 -080012312 * @vdev_id: vdev identifier
12313 *
12314 * Return: Return QDF_STATUS, otherwise appropriate failure code
12315 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080012316QDF_STATUS sme_ht40_stop_obss_scan(mac_handle_t mac_handle, uint32_t vdev_id)
Sandeep Puligillae0875662016-02-12 16:09:21 -080012317{
12318 void *wma_handle;
12319
12320 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
12321 if (!wma_handle) {
12322 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
12323 "wma handle is NULL");
12324 return QDF_STATUS_E_FAILURE;
12325 }
12326 wma_ht40_stop_obss_scan(wma_handle, vdev_id);
12327 return QDF_STATUS_SUCCESS;
12328}
Archana Ramachandran20d2e232016-02-11 16:58:40 -080012329
12330/**
12331 * sme_update_mimo_power_save() - Update MIMO power save
12332 * configuration
Jeff Johnsonc7309062018-11-09 20:59:42 -080012333 * @mac_handle: The handle returned by macOpen
Archana Ramachandran20d2e232016-02-11 16:58:40 -080012334 * @is_ht_smps_enabled: enable/disable ht smps
12335 * @ht_smps_mode: smps mode disabled/static/dynamic
Archana Ramachandranfec24812016-02-16 16:31:56 -080012336 * @send_smps_action: flag to send smps force mode command
12337 * to FW
Archana Ramachandran20d2e232016-02-11 16:58:40 -080012338 *
12339 * Return: QDF_STATUS if SME update mimo power save
Jeff Johnson698eacd2018-05-12 17:00:03 -070012340 * configuration success else failure status
Archana Ramachandran20d2e232016-02-11 16:58:40 -080012341 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080012342QDF_STATUS sme_update_mimo_power_save(mac_handle_t mac_handle,
Archana Ramachandran20d2e232016-02-11 16:58:40 -080012343 uint8_t is_ht_smps_enabled,
Archana Ramachandranfec24812016-02-16 16:31:56 -080012344 uint8_t ht_smps_mode,
12345 bool send_smps_action)
Archana Ramachandran20d2e232016-02-11 16:58:40 -080012346{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012347 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Archana Ramachandranfec24812016-02-16 16:31:56 -080012348
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012349 sme_debug("SMPS enable: %d mode: %d send action: %d",
Archana Ramachandranfec24812016-02-16 16:31:56 -080012350 is_ht_smps_enabled, ht_smps_mode,
12351 send_smps_action);
Vignesh Viswanathanddc89e52018-11-02 18:43:42 +053012352 mac_ctx->mlme_cfg->ht_caps.enable_smps =
Archana Ramachandran20d2e232016-02-11 16:58:40 -080012353 is_ht_smps_enabled;
Vignesh Viswanathanddc89e52018-11-02 18:43:42 +053012354 mac_ctx->mlme_cfg->ht_caps.smps = ht_smps_mode;
Archana Ramachandranfec24812016-02-16 16:31:56 -080012355 mac_ctx->roam.configParam.send_smps_action =
12356 send_smps_action;
Archana Ramachandran20d2e232016-02-11 16:58:40 -080012357
12358 return QDF_STATUS_SUCCESS;
12359}
12360
12361/**
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012362 * sme_add_beacon_filter() - set the beacon filter configuration
Jeff Johnsonc7309062018-11-09 20:59:42 -080012363 * @mac_handle: The handle returned by macOpen
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012364 * @session_id: session id
12365 * @ie_map: bitwise array of IEs
12366 *
12367 * Return: Return QDF_STATUS, otherwise appropriate failure code
12368 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080012369QDF_STATUS sme_add_beacon_filter(mac_handle_t mac_handle,
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012370 uint32_t session_id,
12371 uint32_t *ie_map)
12372{
Rajeev Kumar37d478b2017-04-17 16:59:28 -070012373 struct scheduler_msg message = {0};
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012374 QDF_STATUS qdf_status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012375 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012376 struct beacon_filter_param *filter_param;
12377
12378 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012379 sme_err("CSR session not valid: %d", session_id);
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012380 return QDF_STATUS_E_FAILURE;
12381 }
12382
12383 filter_param = qdf_mem_malloc(sizeof(*filter_param));
Arif Hussain0ef77082018-10-10 16:42:53 -070012384 if (!filter_param)
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012385 return QDF_STATUS_E_FAILURE;
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012386
12387 filter_param->vdev_id = session_id;
12388
12389 qdf_mem_copy(filter_param->ie_map, ie_map,
12390 BCN_FLT_MAX_ELEMS_IE_LIST * sizeof(uint32_t));
12391
12392 message.type = WMA_ADD_BCN_FILTER_CMDID;
12393 message.bodyptr = filter_param;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053012394 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
12395 QDF_MODULE_ID_WMA,
12396 QDF_MODULE_ID_WMA,
12397 &message);
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012398 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
12399 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
12400 "%s: Not able to post msg to WDA!",
12401 __func__);
12402
12403 qdf_mem_free(filter_param);
12404 }
12405 return qdf_status;
12406}
12407
12408/**
12409 * sme_remove_beacon_filter() - set the beacon filter configuration
Jeff Johnsonc7309062018-11-09 20:59:42 -080012410 * @mac_handle: The handle returned by macOpen
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012411 * @session_id: session id
12412 *
12413 * Return: Return QDF_STATUS, otherwise appropriate failure code
12414 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080012415QDF_STATUS sme_remove_beacon_filter(mac_handle_t mac_handle,
12416 uint32_t session_id)
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012417{
Rajeev Kumar37d478b2017-04-17 16:59:28 -070012418 struct scheduler_msg message = {0};
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012419 QDF_STATUS qdf_status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012420 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012421 struct beacon_filter_param *filter_param;
12422
12423 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012424 sme_err("CSR session not valid: %d", session_id);
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012425 return QDF_STATUS_E_FAILURE;
12426 }
12427
12428 filter_param = qdf_mem_malloc(sizeof(*filter_param));
Arif Hussain0ef77082018-10-10 16:42:53 -070012429 if (!filter_param)
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012430 return QDF_STATUS_E_FAILURE;
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012431
12432 filter_param->vdev_id = session_id;
12433
12434 message.type = WMA_REMOVE_BCN_FILTER_CMDID;
12435 message.bodyptr = filter_param;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053012436 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
12437 QDF_MODULE_ID_WMA,
12438 QDF_MODULE_ID_WMA,
12439 &message);
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012440 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
12441 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
12442 "%s: Not able to post msg to WDA!",
12443 __func__);
12444
12445 qdf_mem_free(filter_param);
12446 }
12447 return qdf_status;
12448}
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012449
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012450/**
Kondabattini, Ganesh3f2d02c2016-09-13 12:23:47 +053012451 * sme_send_disassoc_req_frame - send disassoc req
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080012452 * @mac_handle: Opaque handle to the global MAC context
Kondabattini, Ganesh3f2d02c2016-09-13 12:23:47 +053012453 * @session_id: session id
12454 * @peer_mac: peer mac address
12455 * @reason: reason for disassociation
12456 * wait_for_ack: wait for acknowledgment
12457 *
12458 * function to send disassoc request to lim
12459 *
12460 * return: none
12461 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080012462void sme_send_disassoc_req_frame(mac_handle_t mac_handle, uint8_t session_id,
12463 uint8_t *peer_mac, uint16_t reason,
12464 uint8_t wait_for_ack)
Kondabattini, Ganesh3f2d02c2016-09-13 12:23:47 +053012465{
12466 struct sme_send_disassoc_frm_req *msg;
12467 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Kondabattini, Ganesh3f2d02c2016-09-13 12:23:47 +053012468
Jeff Johnson0e1e7682019-02-20 13:36:04 -080012469 msg = qdf_mem_malloc(sizeof(*msg));
Arif Hussain0ef77082018-10-10 16:42:53 -070012470 if (!msg)
Kondabattini, Ganesh3f2d02c2016-09-13 12:23:47 +053012471 return;
12472
Jeff Johnson0e1e7682019-02-20 13:36:04 -080012473 msg->msg_type = eWNI_SME_SEND_DISASSOC_FRAME;
12474 msg->length = sizeof(*msg);
12475 msg->session_id = session_id;
12476 qdf_mem_copy(msg->peer_mac, peer_mac, QDF_MAC_ADDR_SIZE);
12477 msg->reason = reason;
12478 msg->wait_for_ack = wait_for_ack;
Kondabattini, Ganesh3f2d02c2016-09-13 12:23:47 +053012479
Rajeev Kumard138ac52017-01-30 18:38:37 -080012480 qdf_status = umac_send_mb_message_to_mac(msg);
Jeff Johnson0e1e7682019-02-20 13:36:04 -080012481 if (QDF_IS_STATUS_ERROR(qdf_status))
12482 sme_err("umac_send_mb_message_to_mac failed, %d",
12483 qdf_status);
Kondabattini, Ganesh3f2d02c2016-09-13 12:23:47 +053012484}
12485
Nachiket Kukade177b5b02018-05-22 20:52:17 +053012486#ifdef FEATURE_WLAN_APF
Jeff Johnsonc7309062018-11-09 20:59:42 -080012487QDF_STATUS sme_get_apf_capabilities(mac_handle_t mac_handle,
Nachiket Kukade177b5b02018-05-22 20:52:17 +053012488 apf_get_offload_cb callback,
12489 void *context)
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012490{
12491 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012492 struct mac_context * mac_ctx = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070012493 struct scheduler_msg cds_msg = {0};
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012494
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012495 SME_ENTER();
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012496
12497 status = sme_acquire_global_lock(&mac_ctx->sme);
12498 if (QDF_STATUS_SUCCESS == status) {
12499 /* Serialize the req through MC thread */
Nachiket Kukadee547a482018-05-22 16:43:30 +053012500 mac_ctx->sme.apf_get_offload_cb = callback;
12501 mac_ctx->sme.apf_get_offload_context = context;
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012502 cds_msg.bodyptr = NULL;
Nachiket Kukadee547a482018-05-22 16:43:30 +053012503 cds_msg.type = WDA_APF_GET_CAPABILITIES_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053012504 status = scheduler_post_message(QDF_MODULE_ID_SME,
12505 QDF_MODULE_ID_WMA,
12506 QDF_MODULE_ID_WMA, &cds_msg);
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012507 if (!QDF_IS_STATUS_SUCCESS(status)) {
12508 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Nachiket Kukadee547a482018-05-22 16:43:30 +053012509 FL("Post apf get offload msg fail"));
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012510 status = QDF_STATUS_E_FAILURE;
12511 }
12512 sme_release_global_lock(&mac_ctx->sme);
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012513 }
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +053012514
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012515 SME_EXIT();
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012516 return status;
12517}
12518
Jeff Johnsonc7309062018-11-09 20:59:42 -080012519QDF_STATUS sme_set_apf_instructions(mac_handle_t mac_handle,
Nachiket Kukadee547a482018-05-22 16:43:30 +053012520 struct sir_apf_set_offload *req)
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012521{
Nachiket Kukade4f686582018-11-19 19:18:27 +053012522 void *wma_handle;
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012523
Nachiket Kukade4f686582018-11-19 19:18:27 +053012524 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
12525 if (!wma_handle) {
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012526 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Nachiket Kukade4f686582018-11-19 19:18:27 +053012527 "wma handle is NULL");
12528 return QDF_STATUS_E_FAILURE;
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012529 }
Nachiket Kukade4f686582018-11-19 19:18:27 +053012530
12531 return wma_set_apf_instructions(wma_handle, req);
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012532}
12533
Jeff Johnsonc7309062018-11-09 20:59:42 -080012534QDF_STATUS sme_set_apf_enable_disable(mac_handle_t mac_handle, uint8_t vdev_id,
Nachiket Kukade177b5b02018-05-22 20:52:17 +053012535 bool apf_enable)
12536{
12537 void *wma_handle;
12538
12539 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
12540 if (!wma_handle) {
12541 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
12542 "wma handle is NULL");
12543 return QDF_STATUS_E_FAILURE;
12544 }
12545
12546 return wma_send_apf_enable_cmd(wma_handle, vdev_id, apf_enable);
12547}
12548
12549QDF_STATUS
Jeff Johnsonc7309062018-11-09 20:59:42 -080012550sme_apf_write_work_memory(mac_handle_t mac_handle,
Nachiket Kukade177b5b02018-05-22 20:52:17 +053012551 struct wmi_apf_write_memory_params *write_params)
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 }
12561
12562 return wma_send_apf_write_work_memory_cmd(wma_handle, write_params);
12563}
12564
12565QDF_STATUS
Jeff Johnsonc7309062018-11-09 20:59:42 -080012566sme_apf_read_work_memory(mac_handle_t mac_handle,
Nachiket Kukade177b5b02018-05-22 20:52:17 +053012567 struct wmi_apf_read_memory_params *read_params,
12568 apf_read_mem_cb callback)
12569{
12570 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012571 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Nachiket Kukade177b5b02018-05-22 20:52:17 +053012572 void *wma_handle;
12573
12574 status = sme_acquire_global_lock(&mac->sme);
12575 if (QDF_IS_STATUS_SUCCESS(status)) {
12576 mac->sme.apf_read_mem_cb = callback;
12577 sme_release_global_lock(&mac->sme);
12578 } else {
12579 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
12580 FL("sme_acquire_global_lock failed"));
12581 }
12582
12583 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
12584 if (!wma_handle) {
12585 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
12586 "wma handle is NULL");
12587 return QDF_STATUS_E_FAILURE;
12588 }
12589
12590 return wma_send_apf_read_work_memory_cmd(wma_handle, read_params);
12591}
12592#endif /* FEATURE_WLAN_APF */
12593
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012594/**
Abhishek Singh1c676222016-05-09 14:20:28 +053012595 * sme_get_wni_dot11_mode() - return configured wni dot11mode
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080012596 * @mac_handle: Opaque handle to the global MAC context
Abhishek Singh1c676222016-05-09 14:20:28 +053012597 *
12598 * Return: wni dot11 mode.
12599 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080012600uint32_t sme_get_wni_dot11_mode(mac_handle_t mac_handle)
Abhishek Singh1c676222016-05-09 14:20:28 +053012601{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012602 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Abhishek Singh1c676222016-05-09 14:20:28 +053012603
12604 return csr_translate_to_wni_cfg_dot11_mode(mac_ctx,
12605 mac_ctx->roam.configParam.uCfgDot11Mode);
12606}
12607
12608/**
Manjunathappa Prakash59f861d2016-04-21 10:33:31 -070012609 * sme_create_mon_session() - post message to create PE session for monitormode
12610 * operation
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080012611 * @mac_handle: Opaque handle to the global MAC context
Manjunathappa Prakash59f861d2016-04-21 10:33:31 -070012612 * @bssid: pointer to bssid
Rajeev Kumar Sirasanagandlae3b59912018-08-24 15:53:31 +053012613 * @vdev_id: sme session id
Manjunathappa Prakash59f861d2016-04-21 10:33:31 -070012614 *
12615 * Return: QDF_STATUS_SUCCESS on success, non-zero error code on failure.
12616 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080012617QDF_STATUS sme_create_mon_session(mac_handle_t mac_handle, tSirMacAddr bss_id,
Rajeev Kumar Sirasanagandlae3b59912018-08-24 15:53:31 +053012618 uint8_t vdev_id)
Manjunathappa Prakash59f861d2016-04-21 10:33:31 -070012619{
12620 QDF_STATUS status = QDF_STATUS_E_FAILURE;
12621 struct sir_create_session *msg;
12622
12623 msg = qdf_mem_malloc(sizeof(*msg));
chenguo92af4bf2018-10-25 13:54:58 +080012624 if (msg) {
Manjunathappa Prakash59f861d2016-04-21 10:33:31 -070012625 msg->type = eWNI_SME_MON_INIT_SESSION;
Rajeev Kumar Sirasanagandlae3b59912018-08-24 15:53:31 +053012626 msg->vdev_id = vdev_id;
Manjunathappa Prakash59f861d2016-04-21 10:33:31 -070012627 msg->msg_len = sizeof(*msg);
12628 qdf_mem_copy(msg->bss_id.bytes, bss_id, QDF_MAC_ADDR_SIZE);
Rajeev Kumard138ac52017-01-30 18:38:37 -080012629 status = umac_send_mb_message_to_mac(msg);
Manjunathappa Prakash59f861d2016-04-21 10:33:31 -070012630 }
12631 return status;
12632}
Gupta, Kapil96c7f2f2016-04-25 19:13:41 +053012633
Jeff Johnsonb460dd72018-11-08 10:26:51 -080012634void sme_set_chan_info_callback(mac_handle_t mac_handle,
Kapil Gupta4f0c0c12017-02-07 15:21:15 +053012635 void (*callback)(struct scan_chan_info *chan_info))
12636{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012637 struct mac_context *mac;
Kapil Gupta4f0c0c12017-02-07 15:21:15 +053012638
Jeff Johnsonb460dd72018-11-08 10:26:51 -080012639 if (mac_handle == NULL) {
Kapil Gupta4f0c0c12017-02-07 15:21:15 +053012640 QDF_ASSERT(0);
12641 return;
12642 }
Jeff Johnsona0619e42018-11-28 17:43:00 -080012643 mac = MAC_CONTEXT(mac_handle);
Kapil Gupta4f0c0c12017-02-07 15:21:15 +053012644 mac->chan_info_cb = callback;
12645}
12646
Gupta, Kapil96c7f2f2016-04-25 19:13:41 +053012647/**
Naveen Rawata410c5a2016-09-19 14:22:33 -070012648 * sme_set_vdev_ies_per_band() - sends the per band IEs to vdev
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080012649 * @mac_handle: Opaque handle to the global MAC context
Naveen Rawata410c5a2016-09-19 14:22:33 -070012650 * @vdev_id: vdev_id for which IE is targeted
12651 *
12652 * Return: None
12653 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080012654void sme_set_vdev_ies_per_band(mac_handle_t mac_handle, uint8_t vdev_id)
Naveen Rawata410c5a2016-09-19 14:22:33 -070012655{
Naveen Rawata410c5a2016-09-19 14:22:33 -070012656 struct sir_set_vdev_ies_per_band *p_msg;
12657 QDF_STATUS status = QDF_STATUS_E_FAILURE;
12658
12659 p_msg = qdf_mem_malloc(sizeof(*p_msg));
Arif Hussain0ef77082018-10-10 16:42:53 -070012660 if (!p_msg)
Naveen Rawata410c5a2016-09-19 14:22:33 -070012661 return;
Naveen Rawata410c5a2016-09-19 14:22:33 -070012662
12663 p_msg->vdev_id = vdev_id;
12664 p_msg->msg_type = eWNI_SME_SET_VDEV_IES_PER_BAND;
12665 p_msg->len = sizeof(*p_msg);
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012666 sme_debug("sending eWNI_SME_SET_VDEV_IES_PER_BAND: vdev_id: %d",
Naveen Rawata410c5a2016-09-19 14:22:33 -070012667 vdev_id);
Rajeev Kumard138ac52017-01-30 18:38:37 -080012668 status = umac_send_mb_message_to_mac(p_msg);
Naveen Rawata410c5a2016-09-19 14:22:33 -070012669 if (QDF_STATUS_SUCCESS != status)
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012670 sme_err("Send eWNI_SME_SET_VDEV_IES_PER_BAND fail");
Naveen Rawata410c5a2016-09-19 14:22:33 -070012671}
12672
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070012673/**
12674 * sme_set_pdev_ht_vht_ies() - sends the set pdev IE req
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080012675 * @mac_handle: Opaque handle to the global MAC context
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070012676 * @enable2x2: 1x1 or 2x2 mode.
12677 *
12678 * Sends the set pdev IE req with Nss value.
12679 *
12680 * Return: None
12681 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080012682void sme_set_pdev_ht_vht_ies(mac_handle_t mac_handle, bool enable2x2)
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070012683{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012684 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070012685 struct sir_set_ht_vht_cfg *ht_vht_cfg;
12686 QDF_STATUS status = QDF_STATUS_E_FAILURE;
12687
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070012688 if (!((mac_ctx->roam.configParam.uCfgDot11Mode ==
12689 eCSR_CFG_DOT11_MODE_AUTO) ||
12690 (mac_ctx->roam.configParam.uCfgDot11Mode ==
12691 eCSR_CFG_DOT11_MODE_11N) ||
12692 (mac_ctx->roam.configParam.uCfgDot11Mode ==
12693 eCSR_CFG_DOT11_MODE_11N_ONLY) ||
12694 (mac_ctx->roam.configParam.uCfgDot11Mode ==
12695 eCSR_CFG_DOT11_MODE_11AC) ||
12696 (mac_ctx->roam.configParam.uCfgDot11Mode ==
12697 eCSR_CFG_DOT11_MODE_11AC_ONLY)))
12698 return;
12699
12700 status = sme_acquire_global_lock(&mac_ctx->sme);
12701 if (QDF_STATUS_SUCCESS == status) {
12702 ht_vht_cfg = qdf_mem_malloc(sizeof(*ht_vht_cfg));
Arif Hussain0ef77082018-10-10 16:42:53 -070012703 if (!ht_vht_cfg) {
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070012704 sme_release_global_lock(&mac_ctx->sme);
12705 return;
12706 }
12707
12708 ht_vht_cfg->pdev_id = 0;
12709 if (enable2x2)
12710 ht_vht_cfg->nss = 2;
12711 else
12712 ht_vht_cfg->nss = 1;
12713 ht_vht_cfg->dot11mode =
12714 (uint8_t)csr_translate_to_wni_cfg_dot11_mode(mac_ctx,
12715 mac_ctx->roam.configParam.uCfgDot11Mode);
12716
12717 ht_vht_cfg->msg_type = eWNI_SME_PDEV_SET_HT_VHT_IE;
12718 ht_vht_cfg->len = sizeof(*ht_vht_cfg);
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012719 sme_debug("SET_HT_VHT_IE with nss: %d, dot11mode: %d",
12720 ht_vht_cfg->nss,
12721 ht_vht_cfg->dot11mode);
Rajeev Kumard138ac52017-01-30 18:38:37 -080012722 status = umac_send_mb_message_to_mac(ht_vht_cfg);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053012723 if (QDF_STATUS_SUCCESS != status)
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012724 sme_err("Send SME_PDEV_SET_HT_VHT_IE fail");
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053012725
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070012726 sme_release_global_lock(&mac_ctx->sme);
12727 }
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070012728}
12729
Jeff Johnsonc7309062018-11-09 20:59:42 -080012730void sme_update_vdev_type_nss(mac_handle_t mac_handle, uint8_t max_supp_nss,
gaurank kathpalia651abcd2018-11-12 22:41:23 +053012731 enum nss_chains_band_info band)
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070012732{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012733 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070012734 struct vdev_type_nss *vdev_nss;
12735
gaurank kathpalia651abcd2018-11-12 22:41:23 +053012736 struct wlan_mlme_nss_chains *nss_chains_ini_cfg =
12737 &mac_ctx->mlme_cfg->nss_chains_ini_cfg;
12738
12739 if (band == NSS_CHAINS_BAND_5GHZ)
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070012740 vdev_nss = &mac_ctx->vdev_type_nss_5g;
12741 else
12742 vdev_nss = &mac_ctx->vdev_type_nss_2g;
12743
gaurank kathpalia651abcd2018-11-12 22:41:23 +053012744 vdev_nss->sta = QDF_MIN(max_supp_nss, GET_VDEV_NSS_CHAIN(
12745 nss_chains_ini_cfg->
gaurank kathpalia42911082019-01-22 17:39:49 +053012746 rx_nss[band],
gaurank kathpalia651abcd2018-11-12 22:41:23 +053012747 STA_NSS_CHAINS_SHIFT));
12748 vdev_nss->sap = QDF_MIN(max_supp_nss, GET_VDEV_NSS_CHAIN(
12749 nss_chains_ini_cfg->
gaurank kathpalia42911082019-01-22 17:39:49 +053012750 rx_nss[band],
gaurank kathpalia651abcd2018-11-12 22:41:23 +053012751 SAP_NSS_CHAINS_SHIFT));
12752 vdev_nss->p2p_go = QDF_MIN(max_supp_nss, GET_VDEV_NSS_CHAIN(
12753 nss_chains_ini_cfg->
gaurank kathpalia42911082019-01-22 17:39:49 +053012754 rx_nss[band],
gaurank kathpalia651abcd2018-11-12 22:41:23 +053012755 P2P_GO_NSS_CHAINS_SHIFT));
12756 vdev_nss->p2p_cli = QDF_MIN(max_supp_nss, GET_VDEV_NSS_CHAIN(
12757 nss_chains_ini_cfg->
gaurank kathpalia42911082019-01-22 17:39:49 +053012758 rx_nss[band],
gaurank kathpalia651abcd2018-11-12 22:41:23 +053012759 P2P_CLI_CHAINS_SHIFT));
12760 vdev_nss->p2p_dev = QDF_MIN(max_supp_nss, GET_VDEV_NSS_CHAIN(
12761 nss_chains_ini_cfg->
gaurank kathpalia42911082019-01-22 17:39:49 +053012762 rx_nss[band],
gaurank kathpalia651abcd2018-11-12 22:41:23 +053012763 P2P_DEV_NSS_CHAINS_SHIFT));
12764 vdev_nss->ibss = QDF_MIN(max_supp_nss, GET_VDEV_NSS_CHAIN(
12765 nss_chains_ini_cfg->
gaurank kathpalia42911082019-01-22 17:39:49 +053012766 rx_nss[band],
gaurank kathpalia651abcd2018-11-12 22:41:23 +053012767 IBSS_NSS_CHAINS_SHIFT));
12768 vdev_nss->tdls = QDF_MIN(max_supp_nss, GET_VDEV_NSS_CHAIN(
12769 nss_chains_ini_cfg->
gaurank kathpalia42911082019-01-22 17:39:49 +053012770 rx_nss[band],
gaurank kathpalia651abcd2018-11-12 22:41:23 +053012771 TDLS_NSS_CHAINS_SHIFT));
12772 vdev_nss->ocb = QDF_MIN(max_supp_nss, GET_VDEV_NSS_CHAIN(
12773 nss_chains_ini_cfg->
gaurank kathpalia42911082019-01-22 17:39:49 +053012774 rx_nss[band],
gaurank kathpalia651abcd2018-11-12 22:41:23 +053012775 OCB_NSS_CHAINS_SHIFT));
Nachiket Kukadecf941602018-12-12 14:32:35 +053012776 vdev_nss->nan = QDF_MIN(max_supp_nss, GET_VDEV_NSS_CHAIN(
12777 nss_chains_ini_cfg->
gaurank kathpalia42911082019-01-22 17:39:49 +053012778 rx_nss[band],
Nachiket Kukadecf941602018-12-12 14:32:35 +053012779 NAN_NSS_CHAIN_SHIFT));
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070012780
Nachiket Kukadecf941602018-12-12 14:32:35 +053012781 sme_debug("band %d NSS:sta %d sap %d cli %d go %d dev %d ibss %d tdls %d ocb %d nan %d",
12782 band, vdev_nss->sta, vdev_nss->sap, vdev_nss->p2p_cli,
12783 vdev_nss->p2p_go, vdev_nss->p2p_dev, vdev_nss->ibss,
12784 vdev_nss->tdls, vdev_nss->ocb, vdev_nss->nan);
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070012785}
Peng Xu8fdaa492016-06-22 10:20:47 -070012786
Kiran Kumar Lokeree6476b22017-10-16 23:40:32 -070012787#ifdef WLAN_FEATURE_11AX_BSS_COLOR
12788#define MAX_BSS_COLOR_VAL 63
12789#define MIN_BSS_COLOR_VAL 1
12790
Jeff Johnsonc7309062018-11-09 20:59:42 -080012791QDF_STATUS sme_set_he_bss_color(mac_handle_t mac_handle, uint8_t session_id,
12792 uint8_t bss_color)
Kiran Kumar Lokeree6476b22017-10-16 23:40:32 -070012793
12794{
12795 struct sir_set_he_bss_color *bss_color_msg;
12796 uint8_t len;
12797
Jeff Johnsonc7309062018-11-09 20:59:42 -080012798 if (!mac_handle) {
12799 sme_err("Invalid mac_handle pointer");
Kiran Kumar Lokeree6476b22017-10-16 23:40:32 -070012800 return QDF_STATUS_E_FAULT;
12801 }
12802
12803 sme_debug("Set HE bss_color %d", bss_color);
12804
12805 if (bss_color < MIN_BSS_COLOR_VAL || bss_color > MAX_BSS_COLOR_VAL) {
12806 sme_debug("Invalid HE bss_color %d", bss_color);
12807 return QDF_STATUS_E_INVAL;
12808 }
12809 len = sizeof(*bss_color_msg);
12810 bss_color_msg = qdf_mem_malloc(len);
Arif Hussain0ef77082018-10-10 16:42:53 -070012811 if (!bss_color_msg)
Kiran Kumar Lokeree6476b22017-10-16 23:40:32 -070012812 return QDF_STATUS_E_NOMEM;
Arif Hussain0ef77082018-10-10 16:42:53 -070012813
Kiran Kumar Lokeree6476b22017-10-16 23:40:32 -070012814 bss_color_msg->message_type = eWNI_SME_SET_HE_BSS_COLOR;
12815 bss_color_msg->length = len;
12816 bss_color_msg->session_id = session_id;
12817 bss_color_msg->bss_color = bss_color;
12818 return umac_send_mb_message_to_mac(bss_color_msg);
12819}
12820#endif
12821
Peng Xu8fdaa492016-06-22 10:20:47 -070012822/**
Nitesh Shahdb5ea0d2017-03-22 15:17:47 +053012823 * sme_update_hw_dbs_capable() - sets the HW DBS capability
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080012824 * @mac_handle: Opaque handle to the global MAC context
Nitesh Shahdb5ea0d2017-03-22 15:17:47 +053012825 * @hw_dbs_capable: HW DBS capability
12826 *
12827 * Sets HW DBS capability based on INI and fw capability.
12828 *
12829 * Return: None
12830 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080012831void sme_update_hw_dbs_capable(mac_handle_t mac_handle, uint8_t hw_dbs_capable)
Nitesh Shahdb5ea0d2017-03-22 15:17:47 +053012832{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012833 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053012834
Nitesh Shahdb5ea0d2017-03-22 15:17:47 +053012835 mac_ctx->hw_dbs_capable = hw_dbs_capable;
12836}
12837
Rachit Kankane026e77a2018-07-31 16:21:09 +053012838#ifdef FEATURE_P2P_LISTEN_OFFLOAD
Nitesh Shahdb5ea0d2017-03-22 15:17:47 +053012839/**
Peng Xu8fdaa492016-06-22 10:20:47 -070012840 * sme_register_p2p_lo_event() - Register for the p2p lo event
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080012841 * @mac_handle: Opaque handle to the global MAC context
Peng Xu8fdaa492016-06-22 10:20:47 -070012842 * @context: the context of the call
12843 * @callback: the callback to hdd
12844 *
12845 * This function registers the callback function for P2P listen
12846 * offload stop event.
12847 *
12848 * Return: none
12849 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080012850void sme_register_p2p_lo_event(mac_handle_t mac_handle, void *context,
Jeff Johnsonf7e36d62018-07-04 21:14:02 -070012851 p2p_lo_callback callback)
Peng Xu8fdaa492016-06-22 10:20:47 -070012852{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012853 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Peng Xu8fdaa492016-06-22 10:20:47 -070012854 QDF_STATUS status = QDF_STATUS_E_FAILURE;
12855
Jeff Johnson01f2c232018-11-21 19:17:44 -080012856 status = sme_acquire_global_lock(&mac->sme);
12857 mac->sme.p2p_lo_event_callback = callback;
12858 mac->sme.p2p_lo_event_context = context;
12859 sme_release_global_lock(&mac->sme);
Peng Xu8fdaa492016-06-22 10:20:47 -070012860}
Rachit Kankane026e77a2018-07-31 16:21:09 +053012861#endif
Manjeet Singhf82ed072016-07-08 11:40:00 +053012862
12863/**
12864 * sme_process_mac_pwr_dbg_cmd() - enable mac pwr debugging
Jeff Johnsonc7309062018-11-09 20:59:42 -080012865 * @mac_handle: The handle returned by macOpen
Manjeet Singhf82ed072016-07-08 11:40:00 +053012866 * @session_id: session id
12867 * @dbg_args: args for mac pwr debug command
12868 * Return: Return QDF_STATUS, otherwise appropriate failure code
12869 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080012870QDF_STATUS sme_process_mac_pwr_dbg_cmd(mac_handle_t mac_handle,
12871 uint32_t session_id,
12872 struct sir_mac_pwr_dbg_cmd *dbg_args)
Manjeet Singhf82ed072016-07-08 11:40:00 +053012873{
Rajeev Kumar37d478b2017-04-17 16:59:28 -070012874 struct scheduler_msg message = {0};
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012875 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Manjeet Singhf82ed072016-07-08 11:40:00 +053012876 struct sir_mac_pwr_dbg_cmd *req;
12877 int i;
12878
12879 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012880 sme_err("CSR session not valid: %d", session_id);
Manjeet Singhf82ed072016-07-08 11:40:00 +053012881 return QDF_STATUS_E_FAILURE;
12882 }
12883
12884 req = qdf_mem_malloc(sizeof(*req));
Arif Hussain0ef77082018-10-10 16:42:53 -070012885 if (!req)
Manjeet Singhf82ed072016-07-08 11:40:00 +053012886 return QDF_STATUS_E_FAILURE;
Arif Hussain0ef77082018-10-10 16:42:53 -070012887
Manjeet Singhf82ed072016-07-08 11:40:00 +053012888 req->module_id = dbg_args->module_id;
12889 req->pdev_id = dbg_args->pdev_id;
12890 req->num_args = dbg_args->num_args;
12891 for (i = 0; i < req->num_args; i++)
12892 req->args[i] = dbg_args->args[i];
12893
12894 message.type = SIR_HAL_POWER_DBG_CMD;
12895 message.bodyptr = req;
12896
gaurank kathpalia36b0c582018-08-28 17:45:43 +053012897 if (!QDF_IS_STATUS_SUCCESS(scheduler_post_message(QDF_MODULE_ID_SME,
12898 QDF_MODULE_ID_WMA,
12899 QDF_MODULE_ID_WMA,
12900 &message))) {
Manjeet Singhf82ed072016-07-08 11:40:00 +053012901 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
12902 "%s: Not able to post msg to WDA!",
12903 __func__);
12904 qdf_mem_free(req);
12905 }
12906 return QDF_STATUS_SUCCESS;
12907}
Tushnim Bhattacharyyaf44a9d82016-07-05 10:52:06 -070012908/**
12909 * sme_get_vdev_type_nss() - gets the nss per vdev type
Tushnim Bhattacharyyaf44a9d82016-07-05 10:52:06 -070012910 * @dev_mode: connection type.
12911 * @nss2g: Pointer to the 2G Nss parameter.
12912 * @nss5g: Pointer to the 5G Nss parameter.
12913 *
12914 * Fills the 2G and 5G Nss values based on connection type.
12915 *
12916 * Return: None
12917 */
Jeff Johnsonc1e62782017-11-09 09:50:17 -080012918void sme_get_vdev_type_nss(enum QDF_OPMODE dev_mode,
12919 uint8_t *nss_2g, uint8_t *nss_5g)
Tushnim Bhattacharyyaf44a9d82016-07-05 10:52:06 -070012920{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012921 struct mac_context *mac_ctx = sme_get_mac_context();
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -080012922
12923 if (NULL == mac_ctx) {
12924 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
12925 FL("Invalid MAC context"));
12926 return;
12927 }
Tushnim Bhattacharyyaf44a9d82016-07-05 10:52:06 -070012928 csr_get_vdev_type_nss(mac_ctx, dev_mode, nss_2g, nss_5g);
12929}
Agrawal Ashish21ba2572016-09-03 16:40:10 +053012930
12931/**
12932 * sme_update_sta_roam_policy() - update sta roam policy for
12933 * unsafe and DFS channels.
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080012934 * @mac_handle: Opaque handle to the global MAC context
Agrawal Ashish21ba2572016-09-03 16:40:10 +053012935 * @dfs_mode: dfs mode which tell if dfs channel needs to be
12936 * skipped or not
12937 * @skip_unsafe_channels: Param to tell if driver needs to
12938 * skip unsafe channels or not.
12939 * @param session_id: sme_session_id
Agrawal, Ashish9f84c402016-11-30 16:19:44 +053012940 * @sap_operating_band: Band on which SAP is operating
Agrawal Ashish21ba2572016-09-03 16:40:10 +053012941 *
12942 * sme_update_sta_roam_policy update sta rome policies to csr
12943 * this function will call csrUpdateChannelList as well
12944 * to include/exclude DFS channels and unsafe channels.
12945 *
12946 * Return: eHAL_STATUS_SUCCESS or non-zero on failure.
12947 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080012948QDF_STATUS sme_update_sta_roam_policy(mac_handle_t mac_handle,
Jeff Johnsonc7309062018-11-09 20:59:42 -080012949 enum sta_roam_policy_dfs_mode dfs_mode,
12950 bool skip_unsafe_channels,
12951 uint8_t session_id,
12952 uint8_t sap_operating_band)
Agrawal Ashish21ba2572016-09-03 16:40:10 +053012953{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012954 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Agrawal Ashish21ba2572016-09-03 16:40:10 +053012955 QDF_STATUS status = QDF_STATUS_SUCCESS;
Sridhar Selvaraj48c47092017-07-31 18:18:14 +053012956 tSmeConfigParams *sme_config;
Agrawal Ashish21ba2572016-09-03 16:40:10 +053012957
12958 if (!mac_ctx) {
12959 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_FATAL,
12960 "%s: mac_ctx is null", __func__);
12961 return QDF_STATUS_E_FAILURE;
12962 }
Agrawal Ashish21ba2572016-09-03 16:40:10 +053012963
Sridhar Selvaraj48c47092017-07-31 18:18:14 +053012964 sme_config = qdf_mem_malloc(sizeof(*sme_config));
Arif Hussain0ef77082018-10-10 16:42:53 -070012965 if (!sme_config)
Sridhar Selvaraj48c47092017-07-31 18:18:14 +053012966 return QDF_STATUS_E_FAILURE;
Arif Hussain0ef77082018-10-10 16:42:53 -070012967
Sridhar Selvaraj48c47092017-07-31 18:18:14 +053012968 qdf_mem_zero(sme_config, sizeof(*sme_config));
Jeff Johnsonb460dd72018-11-08 10:26:51 -080012969 sme_get_config_param(mac_handle, sme_config);
Sridhar Selvaraj48c47092017-07-31 18:18:14 +053012970
12971 sme_config->csrConfig.sta_roam_policy_params.dfs_mode =
Agrawal Ashish21ba2572016-09-03 16:40:10 +053012972 dfs_mode;
Sridhar Selvaraj48c47092017-07-31 18:18:14 +053012973 sme_config->csrConfig.sta_roam_policy_params.skip_unsafe_channels =
Agrawal Ashish21ba2572016-09-03 16:40:10 +053012974 skip_unsafe_channels;
Sridhar Selvaraj48c47092017-07-31 18:18:14 +053012975 sme_config->csrConfig.sta_roam_policy_params.sap_operating_band =
Agrawal, Ashish9f84c402016-11-30 16:19:44 +053012976 sap_operating_band;
Agrawal Ashish21ba2572016-09-03 16:40:10 +053012977
Jeff Johnsonb460dd72018-11-08 10:26:51 -080012978 sme_update_config(mac_handle, sme_config);
Agrawal Ashish21ba2572016-09-03 16:40:10 +053012979
12980 status = csr_update_channel_list(mac_ctx);
12981 if (QDF_STATUS_SUCCESS != status) {
12982 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
12983 FL("failed to update the supported channel list"));
12984 }
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +053012985
Wu Gao51a63562018-11-08 16:29:10 +080012986 if (mac_ctx->mlme_cfg->lfr.roam_scan_offload_enabled) {
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +053012987 status = sme_acquire_global_lock(&mac_ctx->sme);
12988 if (QDF_IS_STATUS_SUCCESS(status)) {
12989 csr_roam_offload_scan(mac_ctx, session_id,
Agrawal Ashish21ba2572016-09-03 16:40:10 +053012990 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
12991 REASON_ROAM_SCAN_STA_ROAM_POLICY_CHANGED);
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +053012992 sme_release_global_lock(&mac_ctx->sme);
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +053012993 }
12994 }
Sridhar Selvaraj48c47092017-07-31 18:18:14 +053012995 qdf_mem_free(sme_config);
Selvaraj, Sridharebda0f22016-08-29 16:05:23 +053012996 return status;
12997}
12998
12999/**
13000 * sme_enable_disable_chanavoidind_event - configure ca event ind
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080013001 * @mac_handle: Opaque handle to the global MAC context
Selvaraj, Sridharebda0f22016-08-29 16:05:23 +053013002 * @set_value: enable/disable
13003 *
13004 * function to enable/disable chan avoidance indication
13005 *
13006 * Return: QDF_STATUS
13007 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080013008QDF_STATUS sme_enable_disable_chanavoidind_event(mac_handle_t mac_handle,
13009 uint8_t set_value)
Selvaraj, Sridharebda0f22016-08-29 16:05:23 +053013010{
13011 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080013012 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070013013 struct scheduler_msg msg = {0};
Selvaraj, Sridharebda0f22016-08-29 16:05:23 +053013014
Vignesh Viswanathana1f3a1a2018-10-04 13:10:46 +053013015 if (!mac_ctx->mlme_cfg->gen.optimize_ca_event) {
13016 sme_err("optimize_ca_event not enabled in ini");
13017 return QDF_STATUS_E_NOSUPPORT;
13018 }
13019
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070013020 sme_debug("set_value: %d", set_value);
Selvaraj, Sridharebda0f22016-08-29 16:05:23 +053013021 status = sme_acquire_global_lock(&mac_ctx->sme);
13022 if (QDF_STATUS_SUCCESS == status) {
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080013023 qdf_mem_zero(&msg, sizeof(struct scheduler_msg));
Selvaraj, Sridharebda0f22016-08-29 16:05:23 +053013024 msg.type = WMA_SEND_FREQ_RANGE_CONTROL_IND;
13025 msg.bodyval = set_value;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053013026 status = scheduler_post_message(QDF_MODULE_ID_SME,
13027 QDF_MODULE_ID_WMA,
13028 QDF_MODULE_ID_WMA, &msg);
Selvaraj, Sridharebda0f22016-08-29 16:05:23 +053013029 sme_release_global_lock(&mac_ctx->sme);
13030 return status;
13031 }
Deepak Dhamdhereb106ae52016-08-10 20:55:30 +053013032 return status;
13033}
Agrawal Ashish21ba2572016-09-03 16:40:10 +053013034
Deepak Dhamdhereb106ae52016-08-10 20:55:30 +053013035/*
13036 * sme_set_default_scan_ie() - API to send default scan IE to LIM
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080013037 * @mac_handle: Opaque handle to the global MAC context
Deepak Dhamdhereb106ae52016-08-10 20:55:30 +053013038 * @session_id: current session ID
13039 * @ie_data: Pointer to Scan IE data
13040 * @ie_len: Length of @ie_data
13041 *
13042 * Return: QDF_STATUS
13043 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080013044QDF_STATUS sme_set_default_scan_ie(mac_handle_t mac_handle, uint16_t session_id,
13045 uint8_t *ie_data, uint16_t ie_len)
Deepak Dhamdhereb106ae52016-08-10 20:55:30 +053013046{
13047 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080013048 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Deepak Dhamdhereb106ae52016-08-10 20:55:30 +053013049 struct hdd_default_scan_ie *set_ie_params;
13050
Rajeev Kumar5d17dd52017-12-19 16:17:42 -080013051 if (!ie_data)
13052 return QDF_STATUS_E_INVAL;
13053
Deepak Dhamdhereb106ae52016-08-10 20:55:30 +053013054 status = sme_acquire_global_lock(&mac_ctx->sme);
13055 if (QDF_IS_STATUS_SUCCESS(status)) {
13056 set_ie_params = qdf_mem_malloc(sizeof(*set_ie_params));
13057 if (!set_ie_params)
13058 status = QDF_STATUS_E_NOMEM;
13059 else {
13060 set_ie_params->message_type = eWNI_SME_DEFAULT_SCAN_IE;
13061 set_ie_params->length = sizeof(*set_ie_params);
13062 set_ie_params->session_id = session_id;
13063 set_ie_params->ie_len = ie_len;
13064 qdf_mem_copy(set_ie_params->ie_data, ie_data, ie_len);
Rajeev Kumard138ac52017-01-30 18:38:37 -080013065 status = umac_send_mb_message_to_mac(set_ie_params);
Deepak Dhamdhereb106ae52016-08-10 20:55:30 +053013066 }
13067 sme_release_global_lock(&mac_ctx->sme);
13068 }
Agrawal Ashish21ba2572016-09-03 16:40:10 +053013069 return status;
13070}
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +053013071
Jeff Johnsonc7309062018-11-09 20:59:42 -080013072QDF_STATUS sme_get_sar_power_limits(mac_handle_t mac_handle,
Jeff Johnsonf0e54b02017-12-18 15:22:25 -080013073 wma_sar_cb callback, void *context)
13074{
13075 void *wma_handle;
13076
13077 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
13078 if (!wma_handle) {
13079 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
13080 "wma handle is NULL");
13081 return QDF_STATUS_E_FAILURE;
13082 }
13083
13084 return wma_get_sar_limit(wma_handle, callback, context);
13085}
13086
Jeff Johnsonc7309062018-11-09 20:59:42 -080013087QDF_STATUS sme_set_sar_power_limits(mac_handle_t mac_handle,
Kabilan Kannan3c0a7352016-12-02 18:49:38 -080013088 struct sar_limit_cmd_params *sar_limit_cmd)
13089{
13090 void *wma_handle;
13091
13092 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
13093 if (!wma_handle) {
13094 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
13095 "wma handle is NULL");
13096 return QDF_STATUS_E_FAILURE;
13097 }
13098
13099 return wma_set_sar_limit(wma_handle, sar_limit_cmd);
13100}
13101
Dundi Raviteja3b637092018-09-12 13:42:50 +053013102QDF_STATUS sme_send_coex_config_cmd(struct coex_config_params *coex_cfg_params)
13103{
13104 void *wma_handle;
13105
13106 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
13107 if (!wma_handle) {
13108 sme_err("wma handle is NULL");
13109 return QDF_STATUS_E_FAILURE;
13110 }
13111 return wma_send_coex_config_cmd(wma_handle, coex_cfg_params);
13112}
13113
Jeff Johnson6136fb92017-03-30 15:21:49 -070013114#ifdef WLAN_FEATURE_FIPS
Jeff Johnsonc7309062018-11-09 20:59:42 -080013115QDF_STATUS sme_fips_request(mac_handle_t mac_handle, struct fips_params *param,
Jeff Johnson6136fb92017-03-30 15:21:49 -070013116 wma_fips_cb callback, void *context)
13117{
13118 void *wma_handle;
13119
13120 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
13121 if (!wma_handle) {
13122 sme_err("wma handle is NULL");
13123 return QDF_STATUS_E_FAILURE;
13124 }
13125
13126 return wma_fips_request(wma_handle, param, callback, context);
13127}
13128#endif
13129
Jeff Johnsonb460dd72018-11-08 10:26:51 -080013130QDF_STATUS sme_set_cts2self_for_p2p_go(mac_handle_t mac_handle)
Agrawal Ashishb2d1a452016-05-05 12:23:58 +053013131{
Agrawal Ashishb2d1a452016-05-05 12:23:58 +053013132 void *wma_handle;
13133
13134 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
13135 if (!wma_handle) {
13136 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
13137 "wma_handle is NULL");
13138 return QDF_STATUS_E_FAILURE;
13139 }
Agrawal Ashishb2d1a452016-05-05 12:23:58 +053013140 if (QDF_STATUS_SUCCESS !=
13141 wma_set_cts2self_for_p2p_go(wma_handle, true)) {
13142 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
13143 "%s: Failed to set cts2self for p2p GO to firmware",
13144 __func__);
13145 return QDF_STATUS_E_FAILURE;
13146 }
13147 return QDF_STATUS_SUCCESS;
13148}
Yingying Tang95409972016-10-20 15:16:15 +080013149
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053013150/**
13151 * sme_update_tx_fail_cnt_threshold() - update tx fail count Threshold
Jeff Johnsonb460dd72018-11-08 10:26:51 -080013152 * @mac_handle: Handle returned by mac_open
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053013153 * @session_id: Session ID on which tx fail count needs to be updated to FW
13154 * @tx_fail_count: Count for tx fail threshold after which FW will disconnect
13155 *
13156 * This function is used to set tx fail count threshold to firmware.
13157 * firmware will issue disocnnect with peer device once this threshold is
13158 * reached.
13159 *
13160 * Return: Return QDF_STATUS, otherwise appropriate failure code
13161 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080013162QDF_STATUS sme_update_tx_fail_cnt_threshold(mac_handle_t mac_handle,
Jeff Johnsonc7309062018-11-09 20:59:42 -080013163 uint8_t session_id,
13164 uint32_t tx_fail_count)
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053013165{
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053013166 QDF_STATUS status = QDF_STATUS_E_FAILURE;
13167 struct sme_tx_fail_cnt_threshold *tx_fail_cnt;
Rajeev Kumar37d478b2017-04-17 16:59:28 -070013168 struct scheduler_msg msg = {0};
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053013169
13170 tx_fail_cnt = qdf_mem_malloc(sizeof(*tx_fail_cnt));
Arif Hussain0ef77082018-10-10 16:42:53 -070013171 if (!tx_fail_cnt)
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053013172 return QDF_STATUS_E_FAILURE;
Arif Hussain0ef77082018-10-10 16:42:53 -070013173
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070013174 sme_debug("session_id: %d tx_fail_count: %d",
13175 session_id, tx_fail_count);
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053013176 tx_fail_cnt->session_id = session_id;
13177 tx_fail_cnt->tx_fail_cnt_threshold = tx_fail_count;
13178
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080013179 qdf_mem_zero(&msg, sizeof(struct scheduler_msg));
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053013180 msg.type = SIR_HAL_UPDATE_TX_FAIL_CNT_TH;
13181 msg.reserved = 0;
13182 msg.bodyptr = tx_fail_cnt;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053013183 status = scheduler_post_message(QDF_MODULE_ID_SME,
13184 QDF_MODULE_ID_WMA,
13185 QDF_MODULE_ID_WMA, &msg);
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053013186
13187 if (!QDF_IS_STATUS_SUCCESS(status)) {
13188 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053013189 FL("Not able to post Tx fail count message to WDA"));
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053013190 qdf_mem_free(tx_fail_cnt);
13191 }
Sreelakshmi Konamki58c72432016-11-09 17:06:44 +053013192 return status;
13193}
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053013194
Jeff Johnsondc198ec2018-07-04 17:39:53 -070013195QDF_STATUS sme_set_lost_link_info_cb(mac_handle_t mac_handle,
13196 lost_link_info_cb cb)
Sreelakshmi Konamki58c72432016-11-09 17:06:44 +053013197{
Jeff Johnsondc198ec2018-07-04 17:39:53 -070013198 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080013199 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Sreelakshmi Konamki58c72432016-11-09 17:06:44 +053013200
13201 status = sme_acquire_global_lock(&mac->sme);
13202 if (QDF_IS_STATUS_SUCCESS(status)) {
13203 mac->sme.lost_link_info_cb = cb;
13204 sme_release_global_lock(&mac->sme);
Sreelakshmi Konamki58c72432016-11-09 17:06:44 +053013205 }
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053013206
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053013207 return status;
13208}
Yingying Tang95409972016-10-20 15:16:15 +080013209
yeshwanth sriram guntukaa1ba9a22017-02-28 16:17:32 +053013210#ifdef FEATURE_WLAN_ESE
Jeff Johnson172237b2017-11-07 15:32:59 -080013211bool sme_roam_is_ese_assoc(struct csr_roam_info *roam_info)
yeshwanth sriram guntukaa1ba9a22017-02-28 16:17:32 +053013212{
13213 return roam_info->isESEAssoc;
13214}
Manjeet Singh2f785062017-03-08 18:14:18 +053013215#endif
yeshwanth sriram guntukaa1ba9a22017-02-28 16:17:32 +053013216
Jeff Johnsond5fb2db2018-11-08 14:20:28 -080013217bool sme_neighbor_roam_is11r_assoc(mac_handle_t mac_handle, uint8_t session_id)
yeshwanth sriram guntukaa1ba9a22017-02-28 16:17:32 +053013218{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080013219 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053013220
yeshwanth sriram guntukaa1ba9a22017-02-28 16:17:32 +053013221 return csr_neighbor_roam_is11r_assoc(mac_ctx, session_id);
13222}
Yingying Tang95409972016-10-20 15:16:15 +080013223
13224#ifdef WLAN_FEATURE_WOW_PULSE
13225/**
13226 * sme_set_wow_pulse() - set wow pulse info
13227 * @wow_pulse_set_info: wow_pulse_mode structure pointer
13228 *
13229 * Return: QDF_STATUS
13230 */
13231QDF_STATUS sme_set_wow_pulse(struct wow_pulse_mode *wow_pulse_set_info)
13232{
Rajeev Kumar37d478b2017-04-17 16:59:28 -070013233 struct scheduler_msg message = {0};
Yingying Tang95409972016-10-20 15:16:15 +080013234 QDF_STATUS status;
13235 struct wow_pulse_mode *wow_pulse_set_cmd;
13236
13237 if (!wow_pulse_set_info) {
13238 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
13239 "%s: invalid wow_pulse_set_info pointer", __func__);
13240 return QDF_STATUS_E_FAILURE;
13241 }
13242
13243 wow_pulse_set_cmd = qdf_mem_malloc(sizeof(*wow_pulse_set_cmd));
Arif Hussain0ef77082018-10-10 16:42:53 -070013244 if (!wow_pulse_set_cmd)
Yingying Tang95409972016-10-20 15:16:15 +080013245 return QDF_STATUS_E_NOMEM;
Yingying Tang95409972016-10-20 15:16:15 +080013246
13247 *wow_pulse_set_cmd = *wow_pulse_set_info;
13248
13249 message.type = WMA_SET_WOW_PULSE_CMD;
13250 message.bodyptr = wow_pulse_set_cmd;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053013251 status = scheduler_post_message(QDF_MODULE_ID_SME,
13252 QDF_MODULE_ID_WMA,
13253 QDF_MODULE_ID_WMA,
Yingying Tang95409972016-10-20 15:16:15 +080013254 &message);
13255 if (!QDF_IS_STATUS_SUCCESS(status)) {
13256 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
13257 "%s: Not able to post msg to WDA!",
13258 __func__);
13259 qdf_mem_free(wow_pulse_set_cmd);
13260 status = QDF_STATUS_E_FAILURE;
13261 }
13262
13263 return status;
13264}
13265#endif
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013266
13267/**
13268 * sme_prepare_beacon_from_bss_descp() - prepares beacon frame by populating
13269 * different fields and IEs from bss descriptor.
13270 * @frame_buf: frame buffer to populate
13271 * @bss_descp: bss descriptor
13272 * @bssid: bssid of the beacon frame to populate
13273 * @ie_len: length of IE fields
13274 *
13275 * Return: None
13276 */
13277static void sme_prepare_beacon_from_bss_descp(uint8_t *frame_buf,
13278 tSirBssDescription *bss_descp,
13279 const tSirMacAddr bssid,
Naveen Rawat6dabf4e2017-02-08 15:55:49 -080013280 uint32_t ie_len)
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013281{
13282 tDot11fBeacon1 *bcn_fixed;
13283 tpSirMacMgmtHdr mac_hdr = (tpSirMacMgmtHdr)frame_buf;
13284
13285 /* populate mac header first to indicate beacon */
13286 mac_hdr->fc.protVer = SIR_MAC_PROTOCOL_VERSION;
13287 mac_hdr->fc.type = SIR_MAC_MGMT_FRAME;
13288 mac_hdr->fc.subType = SIR_MAC_MGMT_BEACON;
13289 qdf_mem_copy((uint8_t *) mac_hdr->da,
13290 (uint8_t *) "\xFF\xFF\xFF\xFF\xFF\xFF",
13291 sizeof(struct qdf_mac_addr));
13292 qdf_mem_copy((uint8_t *) mac_hdr->sa, bssid,
13293 sizeof(struct qdf_mac_addr));
13294 qdf_mem_copy((uint8_t *) mac_hdr->bssId, bssid,
13295 sizeof(struct qdf_mac_addr));
13296
13297 /* now populate fixed params */
13298 bcn_fixed = (tDot11fBeacon1 *)(frame_buf + SIR_MAC_HDR_LEN_3A);
13299 /* populate timestamp */
13300 qdf_mem_copy(&bcn_fixed->TimeStamp.timestamp, &bss_descp->timeStamp,
13301 sizeof(bss_descp->timeStamp));
13302 /* populate beacon interval */
13303 bcn_fixed->BeaconInterval.interval = bss_descp->beaconInterval;
13304 /* populate capability */
13305 qdf_mem_copy(&bcn_fixed->Capabilities, &bss_descp->capabilityInfo,
13306 sizeof(bss_descp->capabilityInfo));
13307
13308 /* copy IEs now */
13309 qdf_mem_copy(frame_buf + SIR_MAC_HDR_LEN_3A
13310 + SIR_MAC_B_PR_SSID_OFFSET,
13311 &bss_descp->ieFields, ie_len);
13312}
13313
Jeff Johnsonc7309062018-11-09 20:59:42 -080013314QDF_STATUS sme_get_rssi_snr_by_bssid(mac_handle_t mac_handle,
13315 struct csr_roam_profile *profile,
13316 const uint8_t *bssid,
13317 int8_t *rssi, int8_t *snr)
Hanumanth Reddy Pothula90051782017-05-04 22:14:43 +053013318{
13319 tSirBssDescription *bss_descp;
13320 tCsrScanResultFilter *scan_filter;
13321 struct scan_result_list *bss_list;
13322 tScanResultHandle result_handle = NULL;
13323 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080013324 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Hanumanth Reddy Pothula90051782017-05-04 22:14:43 +053013325
13326 scan_filter = qdf_mem_malloc(sizeof(tCsrScanResultFilter));
Arif Hussain0ef77082018-10-10 16:42:53 -070013327 if (!scan_filter) {
Hanumanth Reddy Pothula90051782017-05-04 22:14:43 +053013328 status = QDF_STATUS_E_NOMEM;
13329 goto free_scan_flter;
13330 }
13331
13332 status = csr_roam_prepare_filter_from_profile(mac_ctx,
13333 profile, scan_filter);
13334 if (QDF_STATUS_SUCCESS != status) {
13335 sme_err("prepare_filter failed");
13336 goto free_scan_flter;
13337 }
13338
13339 /* update filter to get scan result with just target BSSID */
13340 if (NULL == scan_filter->BSSIDs.bssid) {
13341 scan_filter->BSSIDs.bssid =
13342 qdf_mem_malloc(sizeof(struct qdf_mac_addr));
Arif Hussain0ef77082018-10-10 16:42:53 -070013343 if (!scan_filter->BSSIDs.bssid) {
Hanumanth Reddy Pothula90051782017-05-04 22:14:43 +053013344 status = QDF_STATUS_E_NOMEM;
13345 goto free_scan_flter;
13346 }
13347 }
13348
13349 scan_filter->BSSIDs.numOfBSSIDs = 1;
13350 qdf_mem_copy(scan_filter->BSSIDs.bssid[0].bytes,
13351 bssid, sizeof(struct qdf_mac_addr));
13352
13353 status = csr_scan_get_result(mac_ctx, scan_filter, &result_handle);
13354 if (QDF_STATUS_SUCCESS != status) {
13355 sme_err("parse_scan_result failed");
13356 goto free_scan_flter;
13357 }
13358
13359 bss_list = (struct scan_result_list *)result_handle;
13360 bss_descp = csr_get_fst_bssdescr_ptr(bss_list);
13361 if (!bss_descp) {
13362 sme_err("unable to fetch bss descriptor");
13363 status = QDF_STATUS_E_FAULT;
13364 goto free_scan_flter;
13365 }
13366
13367 sme_debug("snr: %d, rssi: %d, raw_rssi: %d",
13368 bss_descp->sinr, bss_descp->rssi, bss_descp->rssi_raw);
13369
13370 if (rssi)
13371 *rssi = bss_descp->rssi;
13372 if (snr)
13373 *snr = bss_descp->sinr;
13374
13375free_scan_flter:
13376 /* free scan filter and exit */
13377 if (scan_filter) {
13378 csr_free_scan_filter(mac_ctx, scan_filter);
13379 qdf_mem_free(scan_filter);
13380 }
13381
13382 if (result_handle)
13383 csr_scan_result_purge(mac_ctx, result_handle);
13384
13385 return status;
13386}
13387
Jeff Johnsonc7309062018-11-09 20:59:42 -080013388QDF_STATUS sme_get_beacon_frm(mac_handle_t mac_handle,
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080013389 struct csr_roam_profile *profile,
Jeff Johnson66ee8a92018-03-17 15:24:26 -070013390 const tSirMacAddr bssid,
13391 uint8_t **frame_buf, uint32_t *frame_len,
13392 int *channel)
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013393{
13394 QDF_STATUS status = QDF_STATUS_SUCCESS;
Naveen Rawat56b4de82017-02-17 14:38:49 -080013395 tScanResultHandle result_handle = NULL;
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013396 tCsrScanResultFilter *scan_filter;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080013397 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013398 tSirBssDescription *bss_descp;
Yeshwanth Sriram Guntuka36c09902017-09-26 11:34:26 +053013399 struct scan_result_list *bss_list;
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013400 uint32_t ie_len;
13401
13402 scan_filter = qdf_mem_malloc(sizeof(tCsrScanResultFilter));
Arif Hussain0ef77082018-10-10 16:42:53 -070013403 if (!scan_filter) {
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013404 status = QDF_STATUS_E_NOMEM;
13405 goto free_scan_flter;
13406 }
13407 status = csr_roam_prepare_filter_from_profile(mac_ctx,
13408 profile, scan_filter);
13409 if (QDF_IS_STATUS_ERROR(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070013410 sme_err("prepare_filter failed");
Selvaraj, Sridhar64b0a9c2017-05-11 16:50:15 +053013411 status = QDF_STATUS_E_FAULT;
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013412 goto free_scan_flter;
13413 }
13414
13415 /* update filter to get scan result with just target BSSID */
13416 if (NULL == scan_filter->BSSIDs.bssid) {
13417 scan_filter->BSSIDs.bssid =
13418 qdf_mem_malloc(sizeof(struct qdf_mac_addr));
Arif Hussain0ef77082018-10-10 16:42:53 -070013419 if (!scan_filter->BSSIDs.bssid) {
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013420 status = QDF_STATUS_E_NOMEM;
13421 goto free_scan_flter;
13422 }
13423 }
13424 scan_filter->BSSIDs.numOfBSSIDs = 1;
13425 qdf_mem_copy(scan_filter->BSSIDs.bssid[0].bytes,
13426 bssid, sizeof(struct qdf_mac_addr));
13427
13428 status = csr_scan_get_result(mac_ctx, scan_filter, &result_handle);
13429 if (QDF_STATUS_SUCCESS != status) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070013430 sme_err("parse_scan_result failed");
Selvaraj, Sridhar64b0a9c2017-05-11 16:50:15 +053013431 status = QDF_STATUS_E_FAULT;
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013432 goto free_scan_flter;
13433 }
13434
Yeshwanth Sriram Guntuka36c09902017-09-26 11:34:26 +053013435 bss_list = (struct scan_result_list *)result_handle;
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013436 bss_descp = csr_get_fst_bssdescr_ptr(bss_list);
Naveen Rawatae0aaa82017-02-17 14:41:19 -080013437 if (!bss_descp) {
Srinivas Girigowda2c263352017-03-17 17:49:53 -070013438 sme_err("unable to fetch bss descriptor");
Naveen Rawatae0aaa82017-02-17 14:41:19 -080013439 status = QDF_STATUS_E_FAULT;
13440 goto free_scan_flter;
13441 }
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013442
Naveen Rawat81f058c2017-06-02 16:02:39 -070013443 /**
13444 * Length of BSS descriptor is without length of
13445 * length itself and length of pointer that holds ieFields.
13446 *
13447 * tSirBssDescription
13448 * +--------+---------------------------------+---------------+
13449 * | length | other fields | pointer to IEs|
13450 * +--------+---------------------------------+---------------+
13451 * ^
13452 * ieFields
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013453 */
Naveen Rawat81f058c2017-06-02 16:02:39 -070013454 ie_len = bss_descp->length + sizeof(bss_descp->length)
13455 - (uint16_t)(offsetof(tSirBssDescription, ieFields[0]));
Selvaraj, Sridhar64b0a9c2017-05-11 16:50:15 +053013456 sme_debug("found bss_descriptor ie_len: %d channel %d",
13457 ie_len, bss_descp->channelId);
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013458
13459 /* include mac header and fixed params along with IEs in frame */
13460 *frame_len = SIR_MAC_HDR_LEN_3A + SIR_MAC_B_PR_SSID_OFFSET + ie_len;
13461 *frame_buf = qdf_mem_malloc(*frame_len);
Arif Hussain0ef77082018-10-10 16:42:53 -070013462 if (!*frame_buf) {
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013463 status = QDF_STATUS_E_NOMEM;
13464 goto free_scan_flter;
13465 }
13466
13467 sme_prepare_beacon_from_bss_descp(*frame_buf, bss_descp, bssid, ie_len);
13468
Selvaraj, Sridhar64b0a9c2017-05-11 16:50:15 +053013469 if (!*channel)
13470 *channel = bss_descp->channelId;
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013471free_scan_flter:
13472 /* free scan filter and exit */
13473 if (scan_filter) {
13474 csr_free_scan_filter(mac_ctx, scan_filter);
13475 qdf_mem_free(scan_filter);
13476 }
Arif Hussainfdb25e22017-02-05 17:38:16 -080013477 if (result_handle)
13478 csr_scan_result_purge(mac_ctx, result_handle);
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013479
Naveen Rawatae0aaa82017-02-17 14:41:19 -080013480 return status;
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013481}
13482
Paul Zhangc3fc0a82018-01-09 16:38:20 +080013483#ifdef WLAN_FEATURE_ROAM_OFFLOAD
Jeff Johnsonc7309062018-11-09 20:59:42 -080013484QDF_STATUS sme_fast_reassoc(mac_handle_t mac_handle,
13485 struct csr_roam_profile *profile,
Naveen Rawat4195c5e2017-05-22 17:07:45 -070013486 const tSirMacAddr bssid, int channel,
Krunal Soni332f4af2017-06-01 14:36:17 -070013487 uint8_t vdev_id, const tSirMacAddr connected_bssid)
Naveen Rawat4195c5e2017-05-22 17:07:45 -070013488{
13489 QDF_STATUS status;
13490 struct wma_roam_invoke_cmd *fastreassoc;
13491 struct scheduler_msg msg = {0};
Jeff Johnson0a8786a2018-12-02 10:49:01 -080013492 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Abhinav Kumareab25932018-07-13 11:48:43 +053013493 struct csr_roam_session *session;
13494 struct csr_roam_profile *roam_profile;
Naveen Rawat4195c5e2017-05-22 17:07:45 -070013495
Abhinav Kumareab25932018-07-13 11:48:43 +053013496 session = CSR_GET_SESSION(mac_ctx, vdev_id);
13497 if (!session || !session->pCurRoamProfile) {
13498 sme_err("session %d not found", vdev_id);
13499 return QDF_STATUS_E_FAILURE;
13500 }
13501
13502 roam_profile = session->pCurRoamProfile;
13503 if (roam_profile->supplicant_disabled_roaming ||
13504 roam_profile->driver_disabled_roaming) {
13505 sme_debug("roaming status in Supplicant %d and in driver %d",
13506 roam_profile->supplicant_disabled_roaming,
13507 roam_profile->driver_disabled_roaming);
13508 return QDF_STATUS_E_FAILURE;
13509 }
Naveen Rawat4195c5e2017-05-22 17:07:45 -070013510 fastreassoc = qdf_mem_malloc(sizeof(*fastreassoc));
Arif Hussain0ef77082018-10-10 16:42:53 -070013511 if (!fastreassoc)
Naveen Rawat4195c5e2017-05-22 17:07:45 -070013512 return QDF_STATUS_E_NOMEM;
Arif Hussain0ef77082018-10-10 16:42:53 -070013513
Krunal Soni332f4af2017-06-01 14:36:17 -070013514 /* if both are same then set the flag */
13515 if (!qdf_mem_cmp(connected_bssid, bssid, ETH_ALEN)) {
13516 fastreassoc->is_same_bssid = true;
13517 sme_debug("bssid same, bssid[%pM]", bssid);
13518 }
Naveen Rawat4195c5e2017-05-22 17:07:45 -070013519 fastreassoc->vdev_id = vdev_id;
Naveen Rawat4195c5e2017-05-22 17:07:45 -070013520 fastreassoc->bssid[0] = bssid[0];
13521 fastreassoc->bssid[1] = bssid[1];
13522 fastreassoc->bssid[2] = bssid[2];
13523 fastreassoc->bssid[3] = bssid[3];
13524 fastreassoc->bssid[4] = bssid[4];
13525 fastreassoc->bssid[5] = bssid[5];
13526
Jeff Johnsonc7309062018-11-09 20:59:42 -080013527 status = sme_get_beacon_frm(mac_handle, profile, bssid,
Naveen Rawat4195c5e2017-05-22 17:07:45 -070013528 &fastreassoc->frame_buf,
Selvaraj, Sridhar64b0a9c2017-05-11 16:50:15 +053013529 &fastreassoc->frame_len,
13530 &channel);
Naveen Rawat4195c5e2017-05-22 17:07:45 -070013531
Selvaraj, Sridhar64b0a9c2017-05-11 16:50:15 +053013532 if (!channel) {
13533 sme_err("channel retrieval from BSS desc fails!");
13534 qdf_mem_free(fastreassoc);
13535 return QDF_STATUS_E_FAULT;
13536 }
13537
13538 fastreassoc->channel = channel;
Naveen Rawat4195c5e2017-05-22 17:07:45 -070013539 if (QDF_STATUS_SUCCESS != status) {
13540 sme_warn("sme_get_beacon_frm failed");
13541 fastreassoc->frame_buf = NULL;
13542 fastreassoc->frame_len = 0;
13543 }
13544
Padma, Santhosh Kumar5bc0c242017-11-29 15:44:27 +053013545 if (csr_is_auth_type_ese(mac_ctx->roam.roamSession[vdev_id].
13546 connectedProfile.AuthType)) {
13547 sme_debug("Beacon is not required for ESE");
13548 if (fastreassoc->frame_len) {
13549 qdf_mem_free(fastreassoc->frame_buf);
13550 fastreassoc->frame_buf = NULL;
13551 fastreassoc->frame_len = 0;
13552 }
13553 }
13554
Paul Zhang624f88d2018-11-07 15:29:45 +080013555 msg.type = eWNI_SME_ROAM_INVOKE;
Naveen Rawat4195c5e2017-05-22 17:07:45 -070013556 msg.reserved = 0;
13557 msg.bodyptr = fastreassoc;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053013558 status = scheduler_post_message(QDF_MODULE_ID_SME,
Paul Zhang624f88d2018-11-07 15:29:45 +080013559 QDF_MODULE_ID_PE,
13560 QDF_MODULE_ID_PE, &msg);
Naveen Rawat4195c5e2017-05-22 17:07:45 -070013561 if (QDF_STATUS_SUCCESS != status) {
Paul Zhang624f88d2018-11-07 15:29:45 +080013562 sme_err("Not able to post ROAM_INVOKE_CMD message to PE");
Naveen Rawat4195c5e2017-05-22 17:07:45 -070013563 qdf_mem_free(fastreassoc);
13564 }
13565
13566 return status;
13567}
Paul Zhangc3fc0a82018-01-09 16:38:20 +080013568#endif
Naveen Rawat4195c5e2017-05-22 17:07:45 -070013569
Jeff Johnsonc7309062018-11-09 20:59:42 -080013570QDF_STATUS sme_set_del_pmkid_cache(mac_handle_t mac_handle, uint8_t session_id,
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +053013571 tPmkidCacheInfo *pmk_cache_info,
13572 bool is_add)
13573{
13574 struct wmi_unified_pmk_cache *pmk_cache;
13575 struct scheduler_msg msg;
13576
13577 pmk_cache = qdf_mem_malloc(sizeof(*pmk_cache));
Arif Hussain0ef77082018-10-10 16:42:53 -070013578 if (!pmk_cache)
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +053013579 return QDF_STATUS_E_NOMEM;
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +053013580
hangtian127c9532019-01-12 13:29:07 +080013581 qdf_mem_zero(pmk_cache, sizeof(*pmk_cache));
Vignesh Viswanathane8a26b22017-10-11 20:38:47 +053013582
Jeff Johnson622aad62018-12-07 15:05:37 -080013583 pmk_cache->vdev_id = session_id;
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +053013584
Vignesh Viswanathane8a26b22017-10-11 20:38:47 +053013585 if (!pmk_cache_info)
13586 goto send_flush_cmd;
13587
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +053013588 if (!pmk_cache_info->ssid_len) {
13589 pmk_cache->cat_flag = WMI_PMK_CACHE_CAT_FLAG_BSSID;
13590 WMI_CHAR_ARRAY_TO_MAC_ADDR(pmk_cache_info->BSSID.bytes,
13591 &pmk_cache->bssid);
13592 } else {
13593 pmk_cache->cat_flag = WMI_PMK_CACHE_CAT_FLAG_SSID_CACHE_ID;
13594 pmk_cache->ssid.length = pmk_cache_info->ssid_len;
13595 qdf_mem_copy(pmk_cache->ssid.mac_ssid,
13596 pmk_cache_info->ssid,
13597 pmk_cache->ssid.length);
13598 }
13599 pmk_cache->cache_id = (uint32_t) (pmk_cache_info->cache_id[0] << 8 |
13600 pmk_cache_info->cache_id[1]);
13601
13602 if (is_add)
13603 pmk_cache->action_flag = WMI_PMK_CACHE_ACTION_FLAG_ADD_ENTRY;
13604 else
13605 pmk_cache->action_flag = WMI_PMK_CACHE_ACTION_FLAG_DEL_ENTRY;
13606
13607 pmk_cache->pmkid_len = CSR_RSN_PMKID_SIZE;
13608 qdf_mem_copy(pmk_cache->pmkid, pmk_cache_info->PMKID,
13609 CSR_RSN_PMKID_SIZE);
13610
13611 pmk_cache->pmk_len = pmk_cache_info->pmk_len;
13612 qdf_mem_copy(pmk_cache->pmk, pmk_cache_info->pmk,
13613 pmk_cache->pmk_len);
13614
Vignesh Viswanathane8a26b22017-10-11 20:38:47 +053013615send_flush_cmd:
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +053013616 msg.type = SIR_HAL_SET_DEL_PMKID_CACHE;
13617 msg.reserved = 0;
13618 msg.bodyptr = pmk_cache;
13619 if (QDF_STATUS_SUCCESS !=
gaurank kathpalia36b0c582018-08-28 17:45:43 +053013620 scheduler_post_message(QDF_MODULE_ID_SME,
13621 QDF_MODULE_ID_WMA,
13622 QDF_MODULE_ID_WMA, &msg)) {
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +053013623 sme_err("Not able to post message to WDA");
13624 qdf_mem_free(pmk_cache);
13625 return QDF_STATUS_E_FAILURE;
13626 }
13627
13628 return QDF_STATUS_SUCCESS;
13629}
13630
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053013631/* ARP DEBUG STATS */
13632
13633/**
13634 * sme_set_nud_debug_stats() - sme api to set nud debug stats
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080013635 * @mac_handle: Opaque handle to the global MAC context
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053013636 * @set_stats_param: pointer to set stats param
13637 *
13638 * Return: Return QDF_STATUS.
13639 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080013640QDF_STATUS sme_set_nud_debug_stats(mac_handle_t mac_handle,
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053013641 struct set_arp_stats_params
13642 *set_stats_param)
13643{
13644 struct set_arp_stats_params *arp_set_param;
13645 struct scheduler_msg msg;
13646
13647 arp_set_param = qdf_mem_malloc(sizeof(*arp_set_param));
Arif Hussain0ef77082018-10-10 16:42:53 -070013648 if (!arp_set_param)
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053013649 return QDF_STATUS_E_NOMEM;
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053013650
13651 qdf_mem_copy(arp_set_param, set_stats_param, sizeof(*arp_set_param));
13652
13653 msg.type = WMA_SET_ARP_STATS_REQ;
13654 msg.reserved = 0;
13655 msg.bodyptr = arp_set_param;
13656
13657 if (QDF_STATUS_SUCCESS !=
gaurank kathpalia36b0c582018-08-28 17:45:43 +053013658 scheduler_post_message(QDF_MODULE_ID_SME,
13659 QDF_MODULE_ID_WMA,
13660 QDF_MODULE_ID_WMA, &msg)) {
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053013661 sme_err("Not able to post message to WDA");
13662 qdf_mem_free(arp_set_param);
13663 return QDF_STATUS_E_FAILURE;
13664 }
13665
13666 return QDF_STATUS_SUCCESS;
13667}
13668
13669/**
13670 * sme_get_nud_debug_stats() - sme api to get nud debug stats
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080013671 * @mac_handle: Opaque handle to the global MAC context
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053013672 * @get_stats_param: pointer to set stats param
13673 *
13674 * Return: Return QDF_STATUS.
13675 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080013676QDF_STATUS sme_get_nud_debug_stats(mac_handle_t mac_handle,
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053013677 struct get_arp_stats_params
13678 *get_stats_param)
13679{
13680 struct get_arp_stats_params *arp_get_param;
13681 struct scheduler_msg msg;
13682
13683 arp_get_param = qdf_mem_malloc(sizeof(*arp_get_param));
Arif Hussain0ef77082018-10-10 16:42:53 -070013684 if (!arp_get_param)
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053013685 return QDF_STATUS_E_NOMEM;
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053013686
13687 qdf_mem_copy(arp_get_param, get_stats_param, sizeof(*arp_get_param));
13688
13689 msg.type = WMA_GET_ARP_STATS_REQ;
13690 msg.reserved = 0;
13691 msg.bodyptr = arp_get_param;
13692
13693 if (QDF_STATUS_SUCCESS !=
gaurank kathpalia36b0c582018-08-28 17:45:43 +053013694 scheduler_post_message(QDF_MODULE_ID_SME,
13695 QDF_MODULE_ID_WMA,
13696 QDF_MODULE_ID_WMA, &msg)) {
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053013697 sme_err("Not able to post message to WDA");
13698 qdf_mem_free(arp_get_param);
13699 return QDF_STATUS_E_FAILURE;
13700 }
13701
13702 return QDF_STATUS_SUCCESS;
13703}
13704
Krishna Kumaar Natarajanf1581df2017-02-21 13:42:08 -080013705QDF_STATUS sme_set_peer_param(uint8_t *peer_addr, uint32_t param_id,
13706 uint32_t param_value, uint32_t vdev_id)
13707{
13708 void *wma_handle;
13709
13710 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
13711 if (!wma_handle) {
Srinivas Girigowda2c263352017-03-17 17:49:53 -070013712 sme_err("wma handle is NULL");
Krishna Kumaar Natarajanf1581df2017-02-21 13:42:08 -080013713 return QDF_STATUS_E_FAILURE;
13714 }
13715
13716 return wma_set_peer_param(wma_handle, peer_addr, param_id,
13717 param_value, vdev_id);
13718}
Tushnim Bhattacharyya9e81b4c2017-02-15 17:11:14 -080013719
Jeff Johnsonb460dd72018-11-08 10:26:51 -080013720QDF_STATUS sme_register_set_connection_info_cb(mac_handle_t mac_handle,
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -080013721 bool (*set_connection_info_cb)(bool),
13722 bool (*get_connection_info_cb)(uint8_t *session_id,
13723 enum scan_reject_states *reason))
Tushnim Bhattacharyya9e81b4c2017-02-15 17:11:14 -080013724{
13725 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080013726 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Tushnim Bhattacharyya9e81b4c2017-02-15 17:11:14 -080013727
Jeff Johnson01f2c232018-11-21 19:17:44 -080013728 status = sme_acquire_global_lock(&mac->sme);
Tushnim Bhattacharyya9e81b4c2017-02-15 17:11:14 -080013729 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -080013730 mac->sme.set_connection_info_cb = set_connection_info_cb;
13731 mac->sme.get_connection_info_cb = get_connection_info_cb;
13732 sme_release_global_lock(&mac->sme);
Tushnim Bhattacharyya9e81b4c2017-02-15 17:11:14 -080013733 }
13734 return status;
13735}
Sreelakshmi Konamki88a2a412017-04-14 15:11:55 +053013736
Jeff Johnson43975142018-07-04 15:33:47 -070013737QDF_STATUS sme_rso_cmd_status_cb(mac_handle_t mac_handle,
13738 rso_cmd_status_cb cb)
Sreelakshmi Konamki88a2a412017-04-14 15:11:55 +053013739{
13740 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080013741 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Sreelakshmi Konamki88a2a412017-04-14 15:11:55 +053013742
13743 mac->sme.rso_cmd_status_cb = cb;
Srinivas Girigowda2c263352017-03-17 17:49:53 -070013744 sme_debug("Registered RSO command status callback");
Sreelakshmi Konamki88a2a412017-04-14 15:11:55 +053013745 return status;
13746}
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070013747
Jeff Johnsonc7309062018-11-09 20:59:42 -080013748QDF_STATUS sme_set_dbs_scan_selection_config(mac_handle_t mac_handle,
Nitesh Shahf9a09ff2017-05-22 15:46:25 +053013749 struct wmi_dbs_scan_sel_params *params)
13750{
13751 struct scheduler_msg message = {0};
13752 QDF_STATUS status;
13753 struct wmi_dbs_scan_sel_params *dbs_scan_params;
13754 uint32_t i;
13755
13756 if (0 == params->num_clients) {
13757 sme_err("Num of clients is 0");
13758 return QDF_STATUS_E_FAILURE;
13759 }
13760
13761 dbs_scan_params = qdf_mem_malloc(sizeof(*dbs_scan_params));
Arif Hussain0ef77082018-10-10 16:42:53 -070013762 if (!dbs_scan_params)
Nitesh Shahf9a09ff2017-05-22 15:46:25 +053013763 return QDF_STATUS_E_NOMEM;
Nitesh Shahf9a09ff2017-05-22 15:46:25 +053013764
13765 dbs_scan_params->num_clients = params->num_clients;
13766 dbs_scan_params->pdev_id = params->pdev_id;
13767 for (i = 0; i < params->num_clients; i++) {
13768 dbs_scan_params->module_id[i] = params->module_id[i];
13769 dbs_scan_params->num_dbs_scans[i] = params->num_dbs_scans[i];
13770 dbs_scan_params->num_non_dbs_scans[i] =
13771 params->num_non_dbs_scans[i];
13772 }
13773 message.type = WMA_SET_DBS_SCAN_SEL_CONF_PARAMS;
13774 message.bodyptr = dbs_scan_params;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053013775 status = scheduler_post_message(QDF_MODULE_ID_SME,
13776 QDF_MODULE_ID_WMA,
13777 QDF_MODULE_ID_WMA, &message);
Nitesh Shahf9a09ff2017-05-22 15:46:25 +053013778 if (!QDF_IS_STATUS_SUCCESS(status)) {
13779 sme_err("Not able to post msg to WMA!");
13780 qdf_mem_free(dbs_scan_params);
13781 }
13782
13783 return status;
13784}
13785
Jeff Johnsonc7309062018-11-09 20:59:42 -080013786QDF_STATUS sme_get_rcpi(mac_handle_t mac_handle, struct sme_rcpi_req *rcpi)
Rajeev Kumar Sirasanagandla996e5292016-11-22 21:20:33 +053013787{
13788 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080013789 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Naveen Rawatb7be1ed2017-11-16 16:52:08 -080013790 struct scheduler_msg msg = {0};
Rajeev Kumar Sirasanagandla996e5292016-11-22 21:20:33 +053013791 struct sme_rcpi_req *rcpi_req;
13792
13793 rcpi_req = qdf_mem_malloc(sizeof(*rcpi_req));
Arif Hussain0ef77082018-10-10 16:42:53 -070013794 if (!rcpi_req)
Rajeev Kumar Sirasanagandla996e5292016-11-22 21:20:33 +053013795 return QDF_STATUS_E_NOMEM;
Arif Hussain0ef77082018-10-10 16:42:53 -070013796
Rajeev Kumar Sirasanagandla996e5292016-11-22 21:20:33 +053013797 qdf_mem_copy(rcpi_req, rcpi, sizeof(*rcpi_req));
13798
Jeff Johnson01f2c232018-11-21 19:17:44 -080013799 status = sme_acquire_global_lock(&mac->sme);
Rajeev Kumar Sirasanagandla996e5292016-11-22 21:20:33 +053013800 if (QDF_IS_STATUS_SUCCESS(status)) {
13801 msg.bodyptr = rcpi_req;
13802 msg.type = WMA_GET_RCPI_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053013803 status = scheduler_post_message(QDF_MODULE_ID_SME,
13804 QDF_MODULE_ID_WMA,
13805 QDF_MODULE_ID_WMA, &msg);
Jeff Johnson01f2c232018-11-21 19:17:44 -080013806 sme_release_global_lock(&mac->sme);
Rajeev Kumar Sirasanagandla996e5292016-11-22 21:20:33 +053013807 if (!QDF_IS_STATUS_SUCCESS(status)) {
13808 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
13809 FL("post get rcpi req failed"));
13810 status = QDF_STATUS_E_FAILURE;
13811 qdf_mem_free(rcpi_req);
13812 }
13813 } else {
Rajeev Kumar Sirasanagandla996e5292016-11-22 21:20:33 +053013814 qdf_mem_free(rcpi_req);
13815 }
13816
13817 return status;
13818}
13819
Jeff Johnsonc7309062018-11-09 20:59:42 -080013820void sme_store_pdev(mac_handle_t mac_handle, struct wlan_objmgr_pdev *pdev)
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070013821{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080013822 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070013823 void *wma_handle;
13824 QDF_STATUS status;
13825
Kiran Kumar Lokeref089a3a2017-04-20 21:39:26 -070013826 status = wlan_objmgr_pdev_try_get_ref(pdev, WLAN_LEGACY_MAC_ID);
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070013827 if (QDF_STATUS_SUCCESS != status) {
13828 mac_ctx->pdev = NULL;
13829 return;
13830 }
13831 mac_ctx->pdev = pdev;
13832 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
13833 if (!wma_handle) {
13834 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Kiran Kumar Lokeref089a3a2017-04-20 21:39:26 -070013835 FL("wma handle is NULL"));
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070013836 return;
13837 }
13838 wma_store_pdev(wma_handle, pdev);
Kiran Kumar Lokere4ce40482018-08-30 16:31:00 -070013839 pdev->pdev_nif.pdev_fw_caps |= SUPPORTED_CRYPTO_CAPS;
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070013840}
13841
Jeff Johnsonc7309062018-11-09 20:59:42 -080013842QDF_STATUS sme_congestion_register_callback(mac_handle_t mac_handle,
Jeff Johnsonf6182e42018-07-03 14:46:17 -070013843 congestion_cb congestion_cb)
Padma, Santhosh Kumar16dacfb2017-03-21 19:05:40 +053013844{
13845 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080013846 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Padma, Santhosh Kumar16dacfb2017-03-21 19:05:40 +053013847
13848 status = sme_acquire_global_lock(&mac->sme);
13849 if (QDF_IS_STATUS_SUCCESS(status)) {
13850 mac->sme.congestion_cb = congestion_cb;
13851 sme_release_global_lock(&mac->sme);
Srinivas Girigowda2c263352017-03-17 17:49:53 -070013852 sme_debug("congestion callback set");
Padma, Santhosh Kumar16dacfb2017-03-21 19:05:40 +053013853 }
13854
13855 return status;
13856}
Sandeep Puligillaf587adf2017-04-27 19:53:21 -070013857
Jeff Johnsonda2afa42018-07-04 10:25:42 -070013858QDF_STATUS sme_register_tx_queue_cb(mac_handle_t mac_handle,
13859 tx_queue_cb tx_queue_cb)
Varun Reddy Yeturu076eaa82018-01-16 12:16:14 -080013860{
13861 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080013862 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Varun Reddy Yeturu076eaa82018-01-16 12:16:14 -080013863
13864 status = sme_acquire_global_lock(&mac->sme);
13865 if (QDF_IS_STATUS_SUCCESS(status)) {
13866 mac->sme.tx_queue_cb = tx_queue_cb;
13867 sme_release_global_lock(&mac->sme);
13868 sme_debug("Tx queue callback set");
Varun Reddy Yeturu076eaa82018-01-16 12:16:14 -080013869 }
13870
13871 return status;
13872}
13873
Jeff Johnsonda2afa42018-07-04 10:25:42 -070013874QDF_STATUS sme_deregister_tx_queue_cb(mac_handle_t mac_handle)
Varun Reddy Yeturu076eaa82018-01-16 12:16:14 -080013875{
Jeff Johnsonda2afa42018-07-04 10:25:42 -070013876 return sme_register_tx_queue_cb(mac_handle, NULL);
Varun Reddy Yeturu076eaa82018-01-16 12:16:14 -080013877}
13878
Varun Reddy Yeturud33033f2018-06-11 10:58:30 -070013879#ifdef WLAN_SUPPORT_TWT
Jeff Johnson3a08ff92018-07-03 19:40:44 -070013880QDF_STATUS sme_register_twt_enable_complete_cb(mac_handle_t mac_handle,
13881 twt_enable_cb twt_enable_cb)
Varun Reddy Yeturu3c9f89c2018-04-18 19:10:34 -070013882{
13883 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080013884 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Varun Reddy Yeturu3c9f89c2018-04-18 19:10:34 -070013885
13886 status = sme_acquire_global_lock(&mac->sme);
13887 if (QDF_IS_STATUS_SUCCESS(status)) {
13888 mac->sme.twt_enable_cb = twt_enable_cb;
13889 sme_release_global_lock(&mac->sme);
13890 sme_debug("TWT: enable callback set");
Varun Reddy Yeturu3c9f89c2018-04-18 19:10:34 -070013891 }
13892
13893 return status;
13894}
13895
Jeff Johnson3a08ff92018-07-03 19:40:44 -070013896QDF_STATUS sme_register_twt_disable_complete_cb(mac_handle_t mac_handle,
13897 twt_disable_cb twt_disable_cb)
Varun Reddy Yeturu3c9f89c2018-04-18 19:10:34 -070013898{
13899 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080013900 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Varun Reddy Yeturu3c9f89c2018-04-18 19:10:34 -070013901
13902 status = sme_acquire_global_lock(&mac->sme);
13903 if (QDF_IS_STATUS_SUCCESS(status)) {
13904 mac->sme.twt_disable_cb = twt_disable_cb;
13905 sme_release_global_lock(&mac->sme);
13906 sme_debug("TWT: disable callback set");
Varun Reddy Yeturu3c9f89c2018-04-18 19:10:34 -070013907 }
13908
13909 return status;
13910}
13911
Jeff Johnson3a08ff92018-07-03 19:40:44 -070013912QDF_STATUS sme_deregister_twt_enable_complete_cb(mac_handle_t mac_handle)
Varun Reddy Yeturu3c9f89c2018-04-18 19:10:34 -070013913{
Jeff Johnson3a08ff92018-07-03 19:40:44 -070013914 return sme_register_twt_enable_complete_cb(mac_handle, NULL);
Varun Reddy Yeturu3c9f89c2018-04-18 19:10:34 -070013915}
13916
Jeff Johnson3a08ff92018-07-03 19:40:44 -070013917QDF_STATUS sme_deregister_twt_disable_complete_cb(mac_handle_t mac_handle)
Varun Reddy Yeturu3c9f89c2018-04-18 19:10:34 -070013918{
Jeff Johnson3a08ff92018-07-03 19:40:44 -070013919 return sme_register_twt_disable_complete_cb(mac_handle, NULL);
Varun Reddy Yeturu3c9f89c2018-04-18 19:10:34 -070013920}
13921#endif
13922
Ashish Kumar Dhanotiyab28338c2017-07-21 20:12:34 +053013923QDF_STATUS sme_set_smps_cfg(uint32_t vdev_id, uint32_t param_id,
13924 uint32_t param_val)
13925{
13926 return wma_configure_smps_params(vdev_id, param_id, param_val);
13927}
13928
Jeff Johnsonc7309062018-11-09 20:59:42 -080013929QDF_STATUS sme_set_reorder_timeout(mac_handle_t mac_handle,
13930 struct sir_set_rx_reorder_timeout_val *req)
lifeng66831662017-05-19 16:01:35 +080013931{
13932 QDF_STATUS status;
Zhang Qian1e7649e2018-06-04 13:07:18 +080013933 tp_wma_handle wma_handle;
lifeng66831662017-05-19 16:01:35 +080013934
Zhang Qian1e7649e2018-06-04 13:07:18 +080013935 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
13936 status = wma_set_rx_reorder_timeout_val(wma_handle, req);
lifeng66831662017-05-19 16:01:35 +080013937
13938 return status;
13939}
13940
Jeff Johnsonc7309062018-11-09 20:59:42 -080013941QDF_STATUS sme_set_rx_set_blocksize(mac_handle_t mac_handle,
13942 struct sir_peer_set_rx_blocksize *req)
lifeng66831662017-05-19 16:01:35 +080013943{
13944 QDF_STATUS status;
Zhang Qian1e7649e2018-06-04 13:07:18 +080013945 tp_wma_handle wma_handle;
lifeng66831662017-05-19 16:01:35 +080013946
Zhang Qian1e7649e2018-06-04 13:07:18 +080013947 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
13948 status = wma_set_rx_blocksize(wma_handle, req);
lifeng66831662017-05-19 16:01:35 +080013949
13950 return status;
13951}
Naveen Rawat247a8682017-06-05 15:00:31 -070013952
13953int sme_cli_set_command(int vdev_id, int param_id, int sval, int vpdev)
13954{
13955 return wma_cli_set_command(vdev_id, param_id, sval, vpdev);
13956}
Vidyullatha Kanchanapallybe0ebb32017-03-23 14:36:21 +053013957
Vignesh Viswanathana851d752018-10-03 19:44:38 +053013958int sme_set_enable_mem_deep_sleep(mac_handle_t mac_handle, int vdev_id)
13959{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080013960 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Vignesh Viswanathana851d752018-10-03 19:44:38 +053013961
13962 return wma_cli_set_command(vdev_id, WMI_PDEV_PARAM_HYST_EN,
13963 mac_ctx->mlme_cfg->gen.memory_deep_sleep,
13964 PDEV_CMD);
13965}
13966
13967int sme_set_cck_tx_fir_override(mac_handle_t mac_handle, int vdev_id)
13968{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080013969 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Vignesh Viswanathana851d752018-10-03 19:44:38 +053013970
13971 return wma_cli_set_command(vdev_id,
13972 WMI_PDEV_PARAM_ENABLE_CCK_TXFIR_OVERRIDE,
13973 mac_ctx->mlme_cfg->gen.cck_tx_fir_override,
13974 PDEV_CMD);
13975}
13976
Jeff Johnsond0b6c7e2018-07-04 14:53:06 -070013977QDF_STATUS sme_set_bt_activity_info_cb(mac_handle_t mac_handle,
13978 bt_activity_info_cb cb)
Vidyullatha Kanchanapallybe0ebb32017-03-23 14:36:21 +053013979{
13980 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080013981 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Vidyullatha Kanchanapallybe0ebb32017-03-23 14:36:21 +053013982
13983 status = sme_acquire_global_lock(&mac->sme);
13984 if (QDF_IS_STATUS_SUCCESS(status)) {
13985 mac->sme.bt_activity_info_cb = cb;
13986 sme_release_global_lock(&mac->sme);
13987 sme_debug("bt activity info callback set");
Vidyullatha Kanchanapallybe0ebb32017-03-23 14:36:21 +053013988 }
13989
13990 return status;
13991}
lifengd217d192017-05-09 19:44:16 +080013992
Jeff Johnsonc7309062018-11-09 20:59:42 -080013993QDF_STATUS sme_get_chain_rssi(mac_handle_t mac_handle,
lifengd217d192017-05-09 19:44:16 +080013994 struct get_chain_rssi_req_params *input,
13995 get_chain_rssi_callback callback,
13996 void *context)
13997{
13998 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080013999 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Zhang Qian1e7649e2018-06-04 13:07:18 +080014000 tp_wma_handle wma_handle;
lifengd217d192017-05-09 19:44:16 +080014001
14002 SME_ENTER();
14003
14004 if (NULL == input) {
14005 sme_err("Invalid req params");
14006 return QDF_STATUS_E_INVAL;
14007 }
14008
14009 mac_ctx->sme.get_chain_rssi_cb = callback;
14010 mac_ctx->sme.get_chain_rssi_context = context;
Zhang Qian1e7649e2018-06-04 13:07:18 +080014011 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
14012 wma_get_chain_rssi(wma_handle, input);
lifengd217d192017-05-09 19:44:16 +080014013
14014 SME_EXIT();
14015 return status;
14016}
Vignesh Viswanathan66c951d2017-09-06 12:23:42 +053014017
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014018QDF_STATUS sme_process_msg_callback(struct mac_context *mac,
Jeff Johnson5f9ce2d2018-06-09 21:20:45 -070014019 struct scheduler_msg *msg)
Sandeep Puligilla1426d612017-04-12 18:22:06 -070014020{
14021 QDF_STATUS status = QDF_STATUS_E_FAILURE;
14022
14023 if (msg == NULL) {
14024 sme_err("Empty message for SME Msg callback");
14025 return status;
14026 }
Jeff Johnson5f9ce2d2018-06-09 21:20:45 -070014027 status = sme_process_msg(mac, msg);
Sandeep Puligilla1426d612017-04-12 18:22:06 -070014028 return status;
14029}
14030
Jeff Johnsonc7309062018-11-09 20:59:42 -080014031void sme_display_disconnect_stats(mac_handle_t mac_handle, uint8_t session_id)
Vignesh Viswanathan66c951d2017-09-06 12:23:42 +053014032{
14033 struct csr_roam_session *session;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014034 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Vignesh Viswanathan66c951d2017-09-06 12:23:42 +053014035
14036 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
14037 sme_err("%s Invalid session id: %d", __func__, session_id);
14038 return;
14039 }
14040
14041 session = CSR_GET_SESSION(mac_ctx, session_id);
14042 if (!session) {
14043 sme_err("%s Failed to get session for id: %d",
14044 __func__, session_id);
14045 return;
14046 }
14047
Nirav Shahe6194ac2018-07-13 11:04:41 +053014048 sme_nofl_info("Total No. of Disconnections: %d",
14049 session->disconnect_stats.disconnection_cnt);
Vignesh Viswanathan66c951d2017-09-06 12:23:42 +053014050
Nirav Shahe6194ac2018-07-13 11:04:41 +053014051 sme_nofl_info("No. of Diconnects Triggered by Application: %d",
14052 session->disconnect_stats.disconnection_by_app);
Vignesh Viswanathan66c951d2017-09-06 12:23:42 +053014053
Nirav Shahe6194ac2018-07-13 11:04:41 +053014054 sme_nofl_info("No. of Disassoc Sent by Peer: %d",
14055 session->disconnect_stats.disassoc_by_peer);
Vignesh Viswanathan66c951d2017-09-06 12:23:42 +053014056
Nirav Shahe6194ac2018-07-13 11:04:41 +053014057 sme_nofl_info("No. of Deauth Sent by Peer: %d",
14058 session->disconnect_stats.deauth_by_peer);
Vignesh Viswanathan66c951d2017-09-06 12:23:42 +053014059
Nirav Shahe6194ac2018-07-13 11:04:41 +053014060 sme_nofl_info("No. of Disconnections due to Beacon Miss: %d",
14061 session->disconnect_stats.bmiss);
Vignesh Viswanathan66c951d2017-09-06 12:23:42 +053014062
Nirav Shahe6194ac2018-07-13 11:04:41 +053014063 sme_nofl_info("No. of Disconnections due to Peer Kickout: %d",
14064 session->disconnect_stats.peer_kickout);
Vignesh Viswanathan66c951d2017-09-06 12:23:42 +053014065}
Nachiket Kukadeaaf8a712017-07-27 19:15:36 +053014066
Rachit Kankanef6834c42018-08-02 18:47:50 +053014067#ifdef FEATURE_WLAN_DYNAMIC_CVM
Nachiket Kukade8983cf62017-10-12 18:14:48 +053014068 /**
14069 * sme_set_vc_mode_config() - Set voltage corner config to FW
14070 * @bitmap: Bitmap that referes to voltage corner config with
14071 * different phymode and bw configuration
14072 *
14073 * Return: QDF_STATUS
14074 */
14075QDF_STATUS sme_set_vc_mode_config(uint32_t vc_bitmap)
14076{
14077 void *wma_handle;
14078
14079 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
14080 if (!wma_handle) {
14081 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
14082 "wma_handle is NULL");
14083 return QDF_STATUS_E_FAILURE;
14084 }
14085 if (QDF_STATUS_SUCCESS !=
14086 wma_set_vc_mode_config(wma_handle, vc_bitmap)) {
14087 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
14088 "%s: Failed to set Voltage Control config to FW",
14089 __func__);
14090 return QDF_STATUS_E_FAILURE;
14091 }
14092 return QDF_STATUS_SUCCESS;
14093}
Rachit Kankanef6834c42018-08-02 18:47:50 +053014094#endif
Nachiket Kukade8983cf62017-10-12 18:14:48 +053014095
Nachiket Kukadeaaf8a712017-07-27 19:15:36 +053014096/**
14097 * sme_set_bmiss_bcnt() - set bmiss config parameters
14098 * @vdev_id: virtual device for the command
14099 * @first_cnt: bmiss first value
14100 * @final_cnt: bmiss final value
14101 *
14102 * Return: QDF_STATUS_SUCCESS or non-zero on failure
14103 */
14104QDF_STATUS sme_set_bmiss_bcnt(uint32_t vdev_id, uint32_t first_cnt,
14105 uint32_t final_cnt)
14106{
14107 return wma_config_bmiss_bcnt_params(vdev_id, first_cnt, final_cnt);
14108}
Ganesh Kondabattini479a8ae2017-10-03 16:49:24 +053014109
Jeff Johnsonc7309062018-11-09 20:59:42 -080014110QDF_STATUS sme_send_limit_off_channel_params(mac_handle_t mac_handle,
14111 uint8_t vdev_id,
14112 bool is_tos_active,
14113 uint32_t max_off_chan_time,
14114 uint32_t rest_time,
14115 bool skip_dfs_chan)
Ganesh Kondabattini479a8ae2017-10-03 16:49:24 +053014116{
14117 struct sir_limit_off_chan *cmd;
14118 struct scheduler_msg msg = {0};
14119
14120 cmd = qdf_mem_malloc(sizeof(*cmd));
Arif Hussain0ef77082018-10-10 16:42:53 -070014121 if (!cmd)
Ganesh Kondabattini479a8ae2017-10-03 16:49:24 +053014122 return QDF_STATUS_E_NOMEM;
Ganesh Kondabattini479a8ae2017-10-03 16:49:24 +053014123
14124 cmd->vdev_id = vdev_id;
14125 cmd->is_tos_active = is_tos_active;
14126 cmd->max_off_chan_time = max_off_chan_time;
14127 cmd->rest_time = rest_time;
14128 cmd->skip_dfs_chans = skip_dfs_chan;
14129
14130 msg.type = WMA_SET_LIMIT_OFF_CHAN;
14131 msg.reserved = 0;
14132 msg.bodyptr = cmd;
14133
gaurank kathpalia36b0c582018-08-28 17:45:43 +053014134 if (!QDF_IS_STATUS_SUCCESS(scheduler_post_message(QDF_MODULE_ID_SME,
14135 QDF_MODULE_ID_WMA,
14136 QDF_MODULE_ID_WMA,
14137 &msg))) {
Ganesh Kondabattini479a8ae2017-10-03 16:49:24 +053014138 sme_err("Not able to post WMA_SET_LIMIT_OFF_CHAN to WMA");
14139 qdf_mem_free(cmd);
14140 return QDF_STATUS_E_FAILURE;
14141 }
14142
14143 return QDF_STATUS_SUCCESS;
14144}
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014145
Jeff Johnsonc7309062018-11-09 20:59:42 -080014146uint32_t sme_unpack_rsn_ie(mac_handle_t mac_handle, uint8_t *buf,
Qiwei Caie689a262018-07-26 15:50:22 +080014147 uint8_t buf_len, tDot11fIERSN *rsn_ie,
14148 bool append_ie)
14149{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014150 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Qiwei Caie689a262018-07-26 15:50:22 +080014151
14152 return dot11f_unpack_ie_rsn(mac_ctx, buf, buf_len, rsn_ie, append_ie);
14153}
14154
14155#ifdef FEATURE_BSS_TRANSITION
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014156/**
14157 * sme_get_status_for_candidate() - Get bss transition status for candidate
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080014158 * @mac_handle: Opaque handle to the global MAC context
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014159 * @conn_bss_desc: connected bss descriptor
14160 * @bss_desc: candidate bss descriptor
14161 * @info: candiadate bss information
14162 * @trans_reason: transition reason code
14163 * @is_bt_in_progress: bt activity indicator
14164 *
14165 * Return : true if candidate is rejected and reject reason is filled
14166 * @info->status. Otherwise returns false.
14167 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080014168static bool sme_get_status_for_candidate(mac_handle_t mac_handle,
14169 tSirBssDescription *conn_bss_desc,
14170 tSirBssDescription *bss_desc,
14171 struct bss_candidate_info *info,
14172 uint8_t trans_reason,
14173 bool is_bt_in_progress)
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014174{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014175 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Pragaspathi Thilagarajcd6aef02018-09-11 20:30:23 +053014176 struct wlan_mlme_mbo *mbo_cfg;
14177 int8_t current_rssi_mcc_thres;
14178
14179 if (!(mac_ctx->mlme_cfg)) {
14180 pe_err("mlme cfg is NULL");
14181 return false;
14182 }
14183 mbo_cfg = &mac_ctx->mlme_cfg->mbo_cfg;
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014184
14185 /*
14186 * Low RSSI based rejection
14187 * If candidate rssi is less than mbo_candidate_rssi_thres and connected
14188 * bss rssi is greater than mbo_current_rssi_thres, then reject the
14189 * candidate with MBO reason code 4.
14190 */
Pragaspathi Thilagarajcd6aef02018-09-11 20:30:23 +053014191 if ((bss_desc->rssi < mbo_cfg->mbo_candidate_rssi_thres) &&
14192 (conn_bss_desc->rssi > mbo_cfg->mbo_current_rssi_thres)) {
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014193 sme_err("Candidate BSS "MAC_ADDRESS_STR" has LOW RSSI(%d), hence reject",
14194 MAC_ADDR_ARRAY(bss_desc->bssId), bss_desc->rssi);
14195 info->status = QCA_STATUS_REJECT_LOW_RSSI;
14196 return true;
14197 }
14198
14199 if (trans_reason == MBO_TRANSITION_REASON_LOAD_BALANCING ||
14200 trans_reason == MBO_TRANSITION_REASON_TRANSITIONING_TO_PREMIUM_AP) {
14201 /*
14202 * MCC rejection
14203 * If moving to candidate's channel will result in MCC scenario
14204 * and the rssi of connected bss is greater than
14205 * mbo_current_rssi_mss_thres, then reject the candidate with
14206 * MBO reason code 3.
14207 */
Pragaspathi Thilagarajcd6aef02018-09-11 20:30:23 +053014208 current_rssi_mcc_thres = mbo_cfg->mbo_current_rssi_mcc_thres;
14209 if ((conn_bss_desc->rssi > current_rssi_mcc_thres) &&
Jeff Johnson9d118852018-06-10 16:54:59 -070014210 csr_is_mcc_channel(mac_ctx, bss_desc->channelId)) {
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014211 sme_err("Candidate BSS "MAC_ADDRESS_STR" causes MCC, hence reject",
14212 MAC_ADDR_ARRAY(bss_desc->bssId));
14213 info->status =
14214 QCA_STATUS_REJECT_INSUFFICIENT_QOS_CAPACITY;
14215 return true;
14216 }
14217
14218 /*
14219 * BT coex rejection
14220 * If AP is trying to move the client from 5G to 2.4G and moving
14221 * to 2.4G will result in BT coex and candidate channel rssi is
14222 * less than mbo_candidate_rssi_btc_thres, then reject the
14223 * candidate with MBO reason code 2.
14224 */
14225 if (WLAN_REG_IS_5GHZ_CH(conn_bss_desc->channelId) &&
14226 WLAN_REG_IS_24GHZ_CH(bss_desc->channelId) &&
14227 is_bt_in_progress &&
Pragaspathi Thilagarajcd6aef02018-09-11 20:30:23 +053014228 (bss_desc->rssi < mbo_cfg->mbo_candidate_rssi_btc_thres)) {
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014229 sme_err("Candidate BSS "MAC_ADDRESS_STR" causes BT coex, hence reject",
14230 MAC_ADDR_ARRAY(bss_desc->bssId));
14231 info->status =
14232 QCA_STATUS_REJECT_EXCESSIVE_DELAY_EXPECTED;
14233 return true;
14234 }
14235
14236 /*
14237 * LTE coex rejection
14238 * If moving to candidate's channel can cause LTE coex, then
14239 * reject the candidate with MBO reason code 5.
14240 */
14241 if (policy_mgr_is_safe_channel(mac_ctx->psoc,
14242 conn_bss_desc->channelId) &&
14243 !(policy_mgr_is_safe_channel(mac_ctx->psoc,
14244 bss_desc->channelId))) {
14245 sme_err("High interference expected if transitioned to BSS "
14246 MAC_ADDRESS_STR" hence reject",
14247 MAC_ADDR_ARRAY(bss_desc->bssId));
14248 info->status =
14249 QCA_STATUS_REJECT_HIGH_INTERFERENCE;
14250 return true;
14251 }
14252 }
14253
14254 return false;
14255}
14256
Jeff Johnson62737252018-11-17 10:59:43 -080014257QDF_STATUS sme_get_bss_transition_status(mac_handle_t mac_handle,
14258 uint8_t transition_reason,
14259 struct qdf_mac_addr *bssid,
14260 struct bss_candidate_info *info,
14261 uint16_t n_candidates,
14262 bool is_bt_in_progress)
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014263{
14264 QDF_STATUS status = QDF_STATUS_SUCCESS;
14265 tSirBssDescription *bss_desc, *conn_bss_desc;
14266 tCsrScanResultInfo *res, *conn_res;
14267 uint16_t i;
14268
14269 if (!n_candidates || !info) {
14270 sme_err("No candidate info available");
14271 return QDF_STATUS_E_INVAL;
14272 }
14273
14274 conn_res = qdf_mem_malloc(sizeof(tCsrScanResultInfo));
Arif Hussain0ef77082018-10-10 16:42:53 -070014275 if (!conn_res)
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014276 return QDF_STATUS_E_NOMEM;
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014277
14278 res = qdf_mem_malloc(sizeof(tCsrScanResultInfo));
14279 if (!res) {
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014280 status = QDF_STATUS_E_NOMEM;
14281 goto free;
14282 }
14283
14284 /* Get the connected BSS descriptor */
Jeff Johnsonc7309062018-11-09 20:59:42 -080014285 status = sme_scan_get_result_for_bssid(mac_handle, bssid, conn_res);
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014286 if (!QDF_IS_STATUS_SUCCESS(status)) {
14287 sme_err("Failed to find connected BSS in scan list");
14288 goto free;
14289 }
14290 conn_bss_desc = &conn_res->BssDescriptor;
14291
14292 for (i = 0; i < n_candidates; i++) {
14293 /* Get candidate BSS descriptors */
Jeff Johnsonc7309062018-11-09 20:59:42 -080014294 status = sme_scan_get_result_for_bssid(mac_handle,
14295 &info[i].bssid,
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014296 res);
14297 if (!QDF_IS_STATUS_SUCCESS(status)) {
14298 sme_err("BSS "MAC_ADDRESS_STR" not present in scan list",
14299 MAC_ADDR_ARRAY(info[i].bssid.bytes));
14300 info[i].status = QCA_STATUS_REJECT_UNKNOWN;
14301 continue;
14302 }
14303
14304 bss_desc = &res->BssDescriptor;
Jeff Johnsonc7309062018-11-09 20:59:42 -080014305 if (!sme_get_status_for_candidate(mac_handle, conn_bss_desc,
14306 bss_desc, &info[i],
14307 transition_reason,
14308 is_bt_in_progress)) {
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014309 /*
14310 * If status is not over written, it means it is a
14311 * candidate for accept.
14312 */
14313 info[i].status = QCA_STATUS_ACCEPT;
14314 }
14315 }
14316
14317 /* success */
14318 status = QDF_STATUS_SUCCESS;
14319
14320free:
14321 /* free allocated memory */
14322 if (conn_res)
14323 qdf_mem_free(conn_res);
14324 if (res)
14325 qdf_mem_free(res);
14326
14327 return status;
14328}
Qiwei Caie689a262018-07-26 15:50:22 +080014329#endif /* FEATURE_BSS_TRANSITION */
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014330
Jeff Johnsonc7309062018-11-09 20:59:42 -080014331bool sme_is_conn_state_connected(mac_handle_t mac_handle, uint8_t session_id)
Vignesh Viswanathan79f7e3f2018-09-30 23:56:10 +053014332{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014333 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Vignesh Viswanathan79f7e3f2018-09-30 23:56:10 +053014334
14335 return csr_is_conn_state_connected(mac_ctx, session_id);
14336}
14337
Jeff Johnsonc7309062018-11-09 20:59:42 -080014338void sme_enable_roaming_on_connected_sta(mac_handle_t mac_handle)
Abhishek Singh1f217ec2017-12-22 11:48:27 +053014339{
14340 uint8_t session_id;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014341 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Abhishek Singh1f217ec2017-12-22 11:48:27 +053014342 QDF_STATUS status;
14343
14344 session_id = csr_get_roam_enabled_sta_sessionid(mac_ctx);
14345 if (session_id != CSR_SESSION_ID_INVALID)
14346 return;
14347
14348 session_id = csr_get_connected_infra(mac_ctx);
14349 if (session_id == CSR_SESSION_ID_INVALID) {
14350 sme_debug("No STA in conencted state");
14351 return;
14352 }
14353
14354 sme_debug("Roaming not enabled on any STA, enable roaming on session %d",
14355 session_id);
14356 status = sme_acquire_global_lock(&mac_ctx->sme);
14357 if (QDF_IS_STATUS_SUCCESS(status)) {
14358 csr_roam_offload_scan(mac_ctx, session_id,
14359 ROAM_SCAN_OFFLOAD_START,
14360 REASON_CTX_INIT);
14361 sme_release_global_lock(&mac_ctx->sme);
14362 }
Sandeep Puligilla063a4342018-01-10 02:50:14 -080014363}
Abhishek Singh1f217ec2017-12-22 11:48:27 +053014364
Sandeep Puligilla063a4342018-01-10 02:50:14 -080014365int16_t sme_get_oper_chan_freq(struct wlan_objmgr_vdev *vdev)
14366{
14367 uint8_t vdev_id, chan;
14368 struct csr_roam_session *session;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014369 struct mac_context *mac_ctx;
Jeff Johnsonb460dd72018-11-08 10:26:51 -080014370 mac_handle_t mac_handle;
Sandeep Puligilla063a4342018-01-10 02:50:14 -080014371 int16_t freq = 0;
14372
14373 if (vdev == NULL) {
14374 sme_err("Invalid vdev id is passed");
14375 return 0;
14376 }
14377
Jeff Johnsonb460dd72018-11-08 10:26:51 -080014378 mac_handle = cds_get_context(QDF_MODULE_ID_SME);
14379 if (!mac_handle) {
14380 sme_err("mac_handle is null");
Arif Hussaind15902c2018-03-02 00:08:29 -080014381 return 0;
14382 }
Jeff Johnsona0619e42018-11-28 17:43:00 -080014383 mac_ctx = MAC_CONTEXT(mac_handle);
Sandeep Puligilla063a4342018-01-10 02:50:14 -080014384 vdev_id = wlan_vdev_get_id(vdev);
14385 if (!CSR_IS_SESSION_VALID(mac_ctx, vdev_id)) {
14386 sme_err("Invalid vdev id is passed");
14387 return 0;
14388 }
14389
14390 session = CSR_GET_SESSION(mac_ctx, vdev_id);
14391 chan = csr_get_infra_operation_channel(mac_ctx, vdev_id);
14392 if (chan)
14393 freq = cds_chan_to_freq(chan);
14394
14395 return freq;
14396}
14397
14398enum phy_ch_width sme_get_oper_ch_width(struct wlan_objmgr_vdev *vdev)
14399{
14400 uint8_t vdev_id;
14401 struct csr_roam_session *session;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014402 struct mac_context *mac_ctx;
Jeff Johnsonb460dd72018-11-08 10:26:51 -080014403 mac_handle_t mac_handle;
Sandeep Puligilla063a4342018-01-10 02:50:14 -080014404 enum phy_ch_width ch_width = CH_WIDTH_20MHZ;
14405
14406 if (vdev == NULL) {
14407 sme_err("Invalid vdev id is passed");
14408 return CH_WIDTH_INVALID;
14409 }
14410
Jeff Johnsonb460dd72018-11-08 10:26:51 -080014411 mac_handle = cds_get_context(QDF_MODULE_ID_SME);
14412 if (!mac_handle) {
14413 sme_err("mac_handle is null");
Arif Hussaind15902c2018-03-02 00:08:29 -080014414 return CH_WIDTH_INVALID;
14415 }
Jeff Johnsona0619e42018-11-28 17:43:00 -080014416 mac_ctx = MAC_CONTEXT(mac_handle);
Sandeep Puligilla063a4342018-01-10 02:50:14 -080014417 vdev_id = wlan_vdev_get_id(vdev);
14418 if (!CSR_IS_SESSION_VALID(mac_ctx, vdev_id)) {
14419 sme_err("Invalid vdev id is passed");
14420 return CH_WIDTH_INVALID;
14421 }
14422
14423 session = CSR_GET_SESSION(mac_ctx, vdev_id);
14424
14425 if (csr_is_conn_state_connected(mac_ctx, vdev_id))
14426 ch_width = session->connectedProfile.vht_channel_width;
14427
14428 return ch_width;
14429}
14430
14431int sme_get_sec20chan_freq_mhz(struct wlan_objmgr_vdev *vdev,
14432 uint16_t *sec20chan_freq)
14433{
14434 uint8_t vdev_id;
14435
14436 vdev_id = wlan_vdev_get_id(vdev);
14437 /* Need to extend */
14438 return 0;
Abhishek Singh1f217ec2017-12-22 11:48:27 +053014439}
14440
Padma, Santhosh Kumardd3f4852018-01-16 18:51:51 +053014441#ifdef WLAN_FEATURE_SAE
Srinivas Dasarie854ff02019-02-11 17:24:48 +053014442QDF_STATUS sme_handle_sae_msg(mac_handle_t mac_handle,
14443 uint8_t session_id,
14444 uint8_t sae_status,
14445 struct qdf_mac_addr peer_mac_addr)
Padma, Santhosh Kumardd3f4852018-01-16 18:51:51 +053014446{
14447 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014448 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Padma, Santhosh Kumardd3f4852018-01-16 18:51:51 +053014449 struct sir_sae_msg *sae_msg;
14450 struct scheduler_msg sch_msg = {0};
14451
14452 qdf_status = sme_acquire_global_lock(&mac->sme);
14453 if (QDF_IS_STATUS_SUCCESS(qdf_status)) {
14454 sae_msg = qdf_mem_malloc(sizeof(*sae_msg));
14455 if (!sae_msg) {
14456 qdf_status = QDF_STATUS_E_NOMEM;
Padma, Santhosh Kumardd3f4852018-01-16 18:51:51 +053014457 } else {
14458 sae_msg->message_type = eWNI_SME_SEND_SAE_MSG;
14459 sae_msg->length = sizeof(*sae_msg);
14460 sae_msg->session_id = session_id;
14461 sae_msg->sae_status = sae_status;
Srinivas Dasarie854ff02019-02-11 17:24:48 +053014462 qdf_mem_copy(sae_msg->peer_mac_addr,
14463 peer_mac_addr.bytes,
14464 QDF_MAC_ADDR_SIZE);
14465 sme_debug("SAE: sae_status %d session_id %d Peer: "
14466 MAC_ADDRESS_STR, sae_msg->sae_status,
14467 sae_msg->session_id,
14468 MAC_ADDR_ARRAY(sae_msg->peer_mac_addr));
Padma, Santhosh Kumardd3f4852018-01-16 18:51:51 +053014469
14470 sch_msg.type = eWNI_SME_SEND_SAE_MSG;
14471 sch_msg.bodyptr = sae_msg;
14472
14473 qdf_status =
gaurank kathpalia36b0c582018-08-28 17:45:43 +053014474 scheduler_post_message(QDF_MODULE_ID_SME,
14475 QDF_MODULE_ID_PE,
14476 QDF_MODULE_ID_PE,
Jeff Johnsonc7309062018-11-09 20:59:42 -080014477 &sch_msg);
Padma, Santhosh Kumardd3f4852018-01-16 18:51:51 +053014478 }
14479 sme_release_global_lock(&mac->sme);
14480 }
14481
14482 return qdf_status;
14483}
14484#endif
Vignesh Viswanathan0a569292018-02-14 15:34:47 +053014485
Jeff Johnsonc7309062018-11-09 20:59:42 -080014486bool sme_is_sta_key_exchange_in_progress(mac_handle_t mac_handle,
14487 uint8_t session_id)
Vignesh Viswanathan0a569292018-02-14 15:34:47 +053014488{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014489 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Vignesh Viswanathan0a569292018-02-14 15:34:47 +053014490
14491 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
14492 sme_err("Invalid session id: %d", session_id);
14493 return false;
14494 }
14495
14496 return CSR_IS_WAIT_FOR_KEY(mac_ctx, session_id);
14497}
Vignesh Viswanathana2f5ce582018-05-09 20:38:39 +053014498
Jeff Johnsonc7309062018-11-09 20:59:42 -080014499bool sme_validate_channel_list(mac_handle_t mac_handle,
14500 uint8_t *chan_list,
14501 uint8_t num_channels)
Vignesh Viswanathana2f5ce582018-05-09 20:38:39 +053014502{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014503 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Vignesh Viswanathana2f5ce582018-05-09 20:38:39 +053014504 uint8_t i = 0;
14505 uint8_t j;
14506 bool found;
14507 struct csr_channel *ch_lst_info = &mac_ctx->scan.base_channels;
14508
14509 if (!chan_list || !num_channels) {
14510 sme_err("Chan list empty %pK or num_channels is 0", chan_list);
14511 return false;
14512 }
14513
14514 while (i < num_channels) {
14515 found = false;
14516 for (j = 0; j < ch_lst_info->numChannels; j++) {
14517 if (ch_lst_info->channelList[j] == chan_list[i]) {
14518 found = true;
14519 break;
14520 }
14521 }
14522
14523 if (!found) {
14524 sme_debug("Invalid channel %d", chan_list[i]);
14525 return false;
14526 }
14527
14528 i++;
14529 }
Arif Hussain0e246802018-05-01 18:13:44 -070014530
Vignesh Viswanathana2f5ce582018-05-09 20:38:39 +053014531 return true;
14532}
Arif Hussain0e246802018-05-01 18:13:44 -070014533
Jeff Johnsonc7309062018-11-09 20:59:42 -080014534void sme_set_amsdu(mac_handle_t mac_handle, bool enable)
Arif Hussain0e246802018-05-01 18:13:44 -070014535{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014536 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Arif Hussain0e246802018-05-01 18:13:44 -070014537 mac_ctx->is_usr_cfg_amsdu_enabled = enable;
14538}
Naveen Rawatfa2a1002018-05-17 16:06:37 -070014539
14540uint8_t sme_get_mcs_idx(uint16_t max_rate, uint8_t rate_flags,
Hanumanth Reddy Pothula834f9432018-05-30 14:20:32 +053014541 uint8_t *nss, uint8_t *mcs_rate_flags)
Naveen Rawatfa2a1002018-05-17 16:06:37 -070014542{
14543 return wma_get_mcs_idx(max_rate, rate_flags, nss, mcs_rate_flags);
14544}
Chaoli Zhou75b062f2018-06-11 12:36:54 +080014545
Jeff Johnsonc7309062018-11-09 20:59:42 -080014546bool sme_find_session_by_bssid(mac_handle_t mac_handle, uint8_t *bssid)
Chaoli Zhou75b062f2018-06-11 12:36:54 +080014547{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014548 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Chaoli Zhou75b062f2018-06-11 12:36:54 +080014549 bool ret;
14550
14551 ret = csr_find_session_by_bssid(mac_ctx, bssid);
14552
14553 return ret;
14554}
Rajeev Kumar Sirasanagandla4f20b672018-03-12 13:52:50 +053014555
Krunal Soni5e483782018-10-25 15:42:44 -070014556#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
14557QDF_STATUS sme_get_sta_cxn_info(mac_handle_t mac_handle, uint32_t session_id,
14558 char *buf, uint32_t buf_sz)
14559{
14560 QDF_STATUS status;
14561 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
14562 struct tagCsrRoamConnectedProfile *conn_profile;
14563 struct csr_roam_session *session = CSR_GET_SESSION(mac_ctx, session_id);
14564
14565 status = sme_acquire_global_lock(&mac_ctx->sme);
14566 if (!QDF_IS_STATUS_SUCCESS(status))
14567 return status;
14568 if (!session || !session->pCurRoamProfile) {
14569 status = QDF_STATUS_E_FAILURE;
14570 goto end;
14571 }
14572 conn_profile = &session->connectedProfile;
14573 if (!conn_profile) {
14574 status = QDF_STATUS_E_FAILURE;
14575 goto end;
14576 }
14577 csr_get_sta_cxn_info(mac_ctx, session, conn_profile, buf, buf_sz);
14578end:
14579 sme_release_global_lock(&mac_ctx->sme);
14580
14581 return status;
14582}
14583#endif
Rajeev Kumar Sirasanagandla4f20b672018-03-12 13:52:50 +053014584QDF_STATUS
Jeff Johnsonc7309062018-11-09 20:59:42 -080014585sme_get_roam_scan_stats(mac_handle_t mac_handle,
14586 roam_scan_stats_cb cb, void *context,
Rajeev Kumar Sirasanagandla4f20b672018-03-12 13:52:50 +053014587 uint32_t vdev_id)
14588{
14589 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014590 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar Sirasanagandla4f20b672018-03-12 13:52:50 +053014591 struct scheduler_msg msg = {0};
14592 struct sir_roam_scan_stats *req;
14593
14594 req = qdf_mem_malloc(sizeof(*req));
Arif Hussain0ef77082018-10-10 16:42:53 -070014595 if (!req)
Rajeev Kumar Sirasanagandla4f20b672018-03-12 13:52:50 +053014596 return QDF_STATUS_E_NOMEM;
Rajeev Kumar Sirasanagandla4f20b672018-03-12 13:52:50 +053014597
14598 req->vdev_id = vdev_id;
14599 req->cb = cb;
14600 req->context = context;
14601
14602 status = sme_acquire_global_lock(&mac->sme);
14603 if (QDF_IS_STATUS_SUCCESS(status)) {
14604 msg.bodyptr = req;
14605 msg.type = WMA_GET_ROAM_SCAN_STATS;
14606 msg.reserved = 0;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053014607 status = scheduler_post_message(QDF_MODULE_ID_SME,
14608 QDF_MODULE_ID_WMA,
14609 QDF_MODULE_ID_WMA,
14610 &msg);
Rajeev Kumar Sirasanagandla4f20b672018-03-12 13:52:50 +053014611 sme_release_global_lock(&mac->sme);
14612 if (!QDF_IS_STATUS_SUCCESS(status)) {
14613 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
14614 FL("post roam scan stats req failed"));
14615 status = QDF_STATUS_E_FAILURE;
14616 qdf_mem_free(req);
14617 }
14618 } else {
Rajeev Kumar Sirasanagandla4f20b672018-03-12 13:52:50 +053014619 qdf_mem_free(req);
14620 }
14621
14622 return status;
14623}
Vignesh Viswanathan987f0bb2018-09-17 17:00:29 +053014624
Jeff Johnsonc7309062018-11-09 20:59:42 -080014625void sme_update_score_config(mac_handle_t mac_handle,
Vignesh Viswanathan987f0bb2018-09-17 17:00:29 +053014626 struct scoring_config *score_config)
14627{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014628 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Vignesh Viswanathan987f0bb2018-09-17 17:00:29 +053014629 struct wlan_mlme_scoring_cfg *mlme_scoring_cfg;
14630
14631 mlme_scoring_cfg = &mac_ctx->mlme_cfg->scoring;
14632
14633 score_config->weight_cfg.rssi_weightage =
14634 mlme_scoring_cfg->weight_cfg.rssi_weightage;
14635 score_config->weight_cfg.ht_caps_weightage =
14636 mlme_scoring_cfg->weight_cfg.ht_caps_weightage;
14637 score_config->weight_cfg.vht_caps_weightage =
14638 mlme_scoring_cfg->weight_cfg.vht_caps_weightage;
14639 score_config->weight_cfg.he_caps_weightage =
14640 mlme_scoring_cfg->weight_cfg.he_caps_weightage;
14641 score_config->weight_cfg.chan_width_weightage =
14642 mlme_scoring_cfg->weight_cfg.chan_width_weightage;
14643 score_config->weight_cfg.chan_band_weightage =
14644 mlme_scoring_cfg->weight_cfg.chan_band_weightage;
14645 score_config->weight_cfg.nss_weightage =
14646 mlme_scoring_cfg->weight_cfg.nss_weightage;
14647 score_config->weight_cfg.beamforming_cap_weightage =
14648 mlme_scoring_cfg->weight_cfg.beamforming_cap_weightage;
14649 score_config->weight_cfg.pcl_weightage =
14650 mlme_scoring_cfg->weight_cfg.pcl_weightage;
14651 score_config->weight_cfg.channel_congestion_weightage =
14652 mlme_scoring_cfg->weight_cfg.channel_congestion_weightage;
14653 score_config->weight_cfg.oce_wan_weightage =
14654 mlme_scoring_cfg->weight_cfg.oce_wan_weightage;
14655
14656 score_config->bandwidth_weight_per_index =
14657 mlme_scoring_cfg->bandwidth_weight_per_index;
14658 score_config->nss_weight_per_index =
14659 mlme_scoring_cfg->nss_weight_per_index;
14660 score_config->band_weight_per_index =
14661 mlme_scoring_cfg->band_weight_per_index;
14662
14663 score_config->rssi_score.best_rssi_threshold =
14664 mlme_scoring_cfg->rssi_score.best_rssi_threshold;
14665 score_config->rssi_score.good_rssi_threshold =
14666 mlme_scoring_cfg->rssi_score.good_rssi_threshold;
14667 score_config->rssi_score.bad_rssi_threshold =
14668 mlme_scoring_cfg->rssi_score.bad_rssi_threshold;
14669 score_config->rssi_score.good_rssi_pcnt =
14670 mlme_scoring_cfg->rssi_score.good_rssi_pcnt;
14671 score_config->rssi_score.bad_rssi_pcnt =
14672 mlme_scoring_cfg->rssi_score.bad_rssi_pcnt;
14673 score_config->rssi_score.good_rssi_bucket_size =
14674 mlme_scoring_cfg->rssi_score.good_rssi_bucket_size;
14675 score_config->rssi_score.bad_rssi_bucket_size =
14676 mlme_scoring_cfg->rssi_score.bad_rssi_bucket_size;
14677 score_config->rssi_score.rssi_pref_5g_rssi_thresh =
14678 mlme_scoring_cfg->rssi_score.rssi_pref_5g_rssi_thresh;
14679
14680 score_config->esp_qbss_scoring.num_slot =
14681 mlme_scoring_cfg->esp_qbss_scoring.num_slot;
14682 score_config->esp_qbss_scoring.score_pcnt3_to_0 =
14683 mlme_scoring_cfg->esp_qbss_scoring.score_pcnt3_to_0;
14684 score_config->esp_qbss_scoring.score_pcnt7_to_4 =
14685 mlme_scoring_cfg->esp_qbss_scoring.score_pcnt7_to_4;
14686 score_config->esp_qbss_scoring.score_pcnt11_to_8 =
14687 mlme_scoring_cfg->esp_qbss_scoring.score_pcnt11_to_8;
14688 score_config->esp_qbss_scoring.score_pcnt15_to_12 =
14689 mlme_scoring_cfg->esp_qbss_scoring.score_pcnt15_to_12;
14690
14691 score_config->oce_wan_scoring.num_slot =
14692 mlme_scoring_cfg->oce_wan_scoring.num_slot;
14693 score_config->oce_wan_scoring.score_pcnt3_to_0 =
14694 mlme_scoring_cfg->oce_wan_scoring.score_pcnt3_to_0;
14695 score_config->oce_wan_scoring.score_pcnt7_to_4 =
14696 mlme_scoring_cfg->oce_wan_scoring.score_pcnt7_to_4;
14697 score_config->oce_wan_scoring.score_pcnt11_to_8 =
14698 mlme_scoring_cfg->oce_wan_scoring.score_pcnt11_to_8;
14699 score_config->oce_wan_scoring.score_pcnt15_to_12 =
14700 mlme_scoring_cfg->oce_wan_scoring.score_pcnt15_to_12;
14701}
lifengfaa83cb2018-11-24 01:53:56 +080014702
14703void sme_enable_fw_module_log_level(mac_handle_t mac_handle, int vdev_id)
14704{
14705 QDF_STATUS status;
14706 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
14707 uint8_t *enable_fw_module_log_level;
14708 uint8_t enable_fw_module_log_level_num;
14709 uint8_t count = 0;
14710 uint32_t value = 0;
14711 int ret;
14712
14713 status = ucfg_fwol_get_enable_fw_module_log_level(
14714 mac_ctx->psoc, &enable_fw_module_log_level,
14715 &enable_fw_module_log_level_num);
14716 if (QDF_IS_STATUS_ERROR(status))
14717 return;
14718
14719 while (count < enable_fw_module_log_level_num) {
14720 /*
14721 * FW module log level input array looks like
14722 * below:
14723 * enable_fw_module_log_level = {<FW Module ID>,
14724 * <Log Level>,...}
14725 * For example:
14726 * enable_fw_module_log_level=
14727 * {1,0,2,1,3,2,4,3,5,4,6,5,7,6}
14728 * Above input array means :
14729 * For FW module ID 1 enable log level 0
14730 * For FW module ID 2 enable log level 1
14731 * For FW module ID 3 enable log level 2
14732 * For FW module ID 4 enable log level 3
14733 * For FW module ID 5 enable log level 4
14734 * For FW module ID 6 enable log level 5
14735 * For FW module ID 7 enable log level 6
14736 */
14737
14738 if ((enable_fw_module_log_level[count] > WLAN_MODULE_ID_MAX) ||
14739 (enable_fw_module_log_level[count + 1] > DBGLOG_LVL_MAX)) {
14740 sme_err("Module id %d or dbglog level %d input value is more than max",
14741 enable_fw_module_log_level[count],
14742 enable_fw_module_log_level[count + 1]);
wadesongeb865bb2019-01-09 19:01:06 +080014743 count += 2;
lifengfaa83cb2018-11-24 01:53:56 +080014744 continue;
14745 }
14746
14747 value = enable_fw_module_log_level[count] << 16;
14748 value |= enable_fw_module_log_level[count + 1];
14749 ret = sme_cli_set_command(vdev_id,
14750 WMI_DBGLOG_MOD_LOG_LEVEL,
14751 value, DBG_CMD);
14752 if (ret != 0)
14753 sme_err("Failed to enable FW module log level %d ret %d",
14754 value, ret);
14755
14756 count += 2;
14757 }
14758}
Visweswara Tanuku633976b2019-01-07 16:13:12 +053014759
14760#ifdef WLAN_FEATURE_MOTION_DETECTION
14761/**
14762 * sme_set_md_host_evt_cb - Register/set motion detection callback
14763 * @mac_handle: mac handle
14764 * @callback_fn: motion detection callback function pointer
14765 * @hdd_ctx: hdd context
14766 *
14767 * Return: QDF_STATUS_SUCCESS or non-zero on failure
14768 */
14769QDF_STATUS sme_set_md_host_evt_cb(
14770 mac_handle_t mac_handle,
14771 QDF_STATUS (*callback_fn)(void *ctx, struct sir_md_evt *event),
14772 void *hdd_ctx
14773)
14774{
14775 struct mac_context *mac = MAC_CONTEXT(mac_handle);
14776 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
14777
14778 qdf_status = sme_acquire_global_lock(&mac->sme);
14779 if (QDF_IS_STATUS_SUCCESS(qdf_status)) {
14780 mac->sme.md_host_evt_cb = callback_fn;
14781 mac->sme.md_ctx = hdd_ctx;
14782 sme_release_global_lock(&mac->sme);
14783 }
14784 return qdf_status;
14785}
14786
14787/**
14788 * sme_motion_det_config - Post motion detection configuration msg to scheduler
14789 * @mac_handle: mac handle
14790 * @motion_det_config: motion detection configuration
14791 *
14792 * Return: QDF_STATUS_SUCCESS or non-zero on failure
14793 */
14794QDF_STATUS sme_motion_det_config(mac_handle_t mac_handle,
14795 struct sme_motion_det_cfg *motion_det_config)
14796{
Visweswara Tanuku025f5862019-01-08 17:35:33 +053014797 struct scheduler_msg msg;
Visweswara Tanuku633976b2019-01-07 16:13:12 +053014798 struct sme_motion_det_cfg *motion_det_cfg;
14799 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
14800 struct mac_context *mac = MAC_CONTEXT(mac_handle);
14801
14802 qdf_status = sme_acquire_global_lock(&mac->sme);
14803 if (QDF_IS_STATUS_SUCCESS(qdf_status)) {
14804 motion_det_cfg =
14805 qdf_mem_malloc(sizeof(*motion_det_cfg));
14806 if (!motion_det_cfg) {
14807 sme_release_global_lock(&mac->sme);
14808 return QDF_STATUS_E_NOMEM;
14809 }
14810
14811 *motion_det_cfg = *motion_det_config;
14812
14813 qdf_mem_set(&msg, sizeof(msg), 0);
14814 msg.type = WMA_SET_MOTION_DET_CONFIG;
14815 msg.bodyptr = motion_det_cfg;
14816
14817 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
14818 QDF_MODULE_ID_WMA,
14819 QDF_MODULE_ID_WMA,
14820 &msg);
14821 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
14822 qdf_mem_free(motion_det_cfg);
14823 qdf_status = QDF_STATUS_E_FAILURE;
14824 }
14825 sme_release_global_lock(&mac->sme);
14826 }
14827 return qdf_status;
14828}
14829
14830/**
14831 * sme_motion_det_enable - Post motion detection start/stop msg to scheduler
14832 * @mac_handle: mac handle
14833 * @motion_det_enable: motion detection start/stop
14834 *
14835 * Return: QDF_STATUS_SUCCESS or non-zero on failure
14836 */
14837QDF_STATUS sme_motion_det_enable(mac_handle_t mac_handle,
14838 struct sme_motion_det_en *motion_det_enable)
14839{
Visweswara Tanuku025f5862019-01-08 17:35:33 +053014840 struct scheduler_msg msg;
Visweswara Tanuku633976b2019-01-07 16:13:12 +053014841 struct sme_motion_det_en *motion_det_en;
14842 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
14843 struct mac_context *mac = MAC_CONTEXT(mac_handle);
14844
14845 qdf_status = sme_acquire_global_lock(&mac->sme);
14846 if (QDF_IS_STATUS_SUCCESS(qdf_status)) {
14847 motion_det_en = qdf_mem_malloc(sizeof(*motion_det_en));
14848 if (!motion_det_en) {
14849 sme_release_global_lock(&mac->sme);
14850 return QDF_STATUS_E_NOMEM;
14851 }
14852
14853 *motion_det_en = *motion_det_enable;
14854
14855 qdf_mem_set(&msg, sizeof(msg), 0);
14856 msg.type = WMA_SET_MOTION_DET_ENABLE;
14857 msg.bodyptr = motion_det_en;
14858
14859 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
14860 QDF_MODULE_ID_WMA,
14861 QDF_MODULE_ID_WMA,
14862 &msg);
14863 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
14864 qdf_mem_free(motion_det_en);
14865 qdf_status = QDF_STATUS_E_FAILURE;
14866 }
14867 sme_release_global_lock(&mac->sme);
14868 }
14869 return qdf_status;
14870}
14871
14872/**
14873 * sme_motion_det_base_line_config - Post md baselining cfg msg to scheduler
14874 * @mac_handle: mac handle
14875 * @motion_det_base_line_config: motion detection baselining configuration
14876 *
14877 * Return: QDF_STATUS_SUCCESS or non-zero on failure
14878 */
14879QDF_STATUS sme_motion_det_base_line_config(
14880 mac_handle_t mac_handle,
14881 struct sme_motion_det_base_line_cfg *motion_det_base_line_config)
14882{
Visweswara Tanuku025f5862019-01-08 17:35:33 +053014883 struct scheduler_msg msg;
Visweswara Tanuku633976b2019-01-07 16:13:12 +053014884 struct sme_motion_det_base_line_cfg *motion_det_base_line_cfg;
14885 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
14886 struct mac_context *mac = MAC_CONTEXT(mac_handle);
14887
14888 qdf_status = sme_acquire_global_lock(&mac->sme);
14889 if (QDF_IS_STATUS_SUCCESS(qdf_status)) {
14890 motion_det_base_line_cfg =
14891 qdf_mem_malloc(sizeof(*motion_det_base_line_cfg));
14892
14893 if (!motion_det_base_line_cfg) {
14894 sme_release_global_lock(&mac->sme);
14895 return QDF_STATUS_E_NOMEM;
14896 }
14897
14898 *motion_det_base_line_cfg = *motion_det_base_line_config;
14899
Visweswara Tanuku025f5862019-01-08 17:35:33 +053014900 qdf_mem_set(&msg, sizeof(msg), 0);
Visweswara Tanuku633976b2019-01-07 16:13:12 +053014901 msg.type = WMA_SET_MOTION_DET_BASE_LINE_CONFIG;
14902 msg.bodyptr = motion_det_base_line_cfg;
14903
14904 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
14905 QDF_MODULE_ID_WMA,
14906 QDF_MODULE_ID_WMA,
14907 &msg);
14908 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
14909 qdf_mem_free(motion_det_base_line_cfg);
14910 qdf_status = QDF_STATUS_E_FAILURE;
14911 }
14912 sme_release_global_lock(&mac->sme);
14913 }
14914 return qdf_status;
14915}
14916
14917/**
14918 * sme_motion_det_base_line_enable - Post md baselining enable msg to scheduler
14919 * @mac_handle: mac handle
14920 * @motion_det_base_line_enable: motion detection baselining start/stop
14921 *
14922 * Return: QDF_STATUS_SUCCESS or non-zero on failure
14923 */
14924QDF_STATUS sme_motion_det_base_line_enable(
14925 mac_handle_t mac_handle,
14926 struct sme_motion_det_base_line_en *motion_det_base_line_enable)
14927{
Visweswara Tanuku025f5862019-01-08 17:35:33 +053014928 struct scheduler_msg msg;
Visweswara Tanuku633976b2019-01-07 16:13:12 +053014929 struct sme_motion_det_base_line_en *motion_det_base_line_en;
14930 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
14931 struct mac_context *mac = MAC_CONTEXT(mac_handle);
14932
14933 qdf_status = sme_acquire_global_lock(&mac->sme);
14934 if (QDF_IS_STATUS_SUCCESS(qdf_status)) {
14935 motion_det_base_line_en =
14936 qdf_mem_malloc(sizeof(*motion_det_base_line_en));
14937
14938 if (!motion_det_base_line_en) {
14939 sme_release_global_lock(&mac->sme);
14940 return QDF_STATUS_E_NOMEM;
14941 }
14942
14943 *motion_det_base_line_en = *motion_det_base_line_enable;
14944
Visweswara Tanuku025f5862019-01-08 17:35:33 +053014945 qdf_mem_set(&msg, sizeof(msg), 0);
Visweswara Tanuku633976b2019-01-07 16:13:12 +053014946 msg.type = WMA_SET_MOTION_DET_BASE_LINE_ENABLE;
14947 msg.bodyptr = motion_det_base_line_en;
14948
14949 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
14950 QDF_MODULE_ID_WMA,
14951 QDF_MODULE_ID_WMA,
14952 &msg);
14953 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
14954 qdf_mem_free(motion_det_base_line_en);
14955 qdf_status = QDF_STATUS_E_FAILURE;
14956 }
14957 sme_release_global_lock(&mac->sme);
14958 }
14959 return qdf_status;
14960}
14961#endif /* WLAN_FEATURE_MOTION_DETECTION */
Visweswara Tanuku025f5862019-01-08 17:35:33 +053014962#ifdef FW_THERMAL_THROTTLE_SUPPORT
14963/**
14964 * sme_set_thermal_throttle_cfg() - SME API to set the thermal throttle
14965 * configuration parameters
14966 * @mac_handle: Opaque handle to the global MAC context
14967 * @enable: Enable Throttle
14968 * @dc: duty cycle in msecs
14969 * @dc_off_percent: duty cycle off percentage
14970 * @prio: Disables the transmit queues in fw that have lower priority
14971 * than value defined by prio
14972 * @target_temp: Target temperature
14973 *
14974 * Return: QDF_STATUS
14975 */
14976QDF_STATUS sme_set_thermal_throttle_cfg(mac_handle_t mac_handle, bool enable,
14977 uint32_t dc, uint32_t dc_off_percent,
14978 uint32_t prio, uint32_t target_temp)
14979{
14980 struct scheduler_msg msg;
14981 struct mac_context *mac = MAC_CONTEXT(mac_handle);
14982 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
14983 struct thermal_mitigation_params *therm_cfg_params;
14984
14985 qdf_status = sme_acquire_global_lock(&mac->sme);
14986 if (QDF_STATUS_SUCCESS == qdf_status) {
14987 therm_cfg_params = qdf_mem_malloc(sizeof(*therm_cfg_params));
14988 if (!therm_cfg_params) {
14989 sme_release_global_lock(&mac->sme);
14990 return QDF_STATUS_E_NOMEM;
14991 }
14992
14993 therm_cfg_params->enable = enable;
14994 therm_cfg_params->dc = dc;
14995 therm_cfg_params->levelconf[0].dcoffpercent = dc_off_percent;
14996 therm_cfg_params->levelconf[0].priority = prio;
14997 therm_cfg_params->levelconf[0].tmplwm = target_temp;
14998
14999 qdf_mem_set(&msg, sizeof(msg), 0);
15000 msg.type = WMA_SET_THERMAL_THROTTLE_CFG;
15001 msg.reserved = 0;
15002 msg.bodyptr = therm_cfg_params;
15003
15004 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
15005 QDF_MODULE_ID_WMA,
15006 QDF_MODULE_ID_WMA, &msg);
15007 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
15008 qdf_mem_free(therm_cfg_params);
15009 qdf_status = QDF_STATUS_E_FAILURE;
15010 }
15011 sme_release_global_lock(&mac->sme);
15012 }
15013 return qdf_status;
15014}
15015
15016/**
15017 * sme_set_thermal_mgmt() - SME API to set the thermal management params
15018 * @mac_handle: Opaque handle to the global MAC context
15019 * @lower_thresh_deg: Lower threshold value of Temperature
15020 * @higher_thresh_deg: Higher threshold value of Temperature
15021 *
15022 * Return: QDF_STATUS
15023 */
15024QDF_STATUS sme_set_thermal_mgmt(mac_handle_t mac_handle,
15025 uint16_t lower_thresh_deg,
15026 uint16_t higher_thresh_deg)
15027{
15028 struct scheduler_msg msg;
15029 struct mac_context *mac = MAC_CONTEXT(mac_handle);
15030 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
15031 t_thermal_cmd_params *therm_mgmt_cmd;
15032
15033 qdf_status = sme_acquire_global_lock(&mac->sme);
15034 if (QDF_STATUS_SUCCESS == qdf_status) {
15035 therm_mgmt_cmd = qdf_mem_malloc(sizeof(*therm_mgmt_cmd));
15036 if (!therm_mgmt_cmd) {
15037 sme_release_global_lock(&mac->sme);
15038 return QDF_STATUS_E_NOMEM;
15039 }
15040
15041 therm_mgmt_cmd->minTemp = lower_thresh_deg;
15042 therm_mgmt_cmd->maxTemp = higher_thresh_deg;
15043 therm_mgmt_cmd->thermalEnable = 1;
15044
15045 qdf_mem_set(&msg, sizeof(msg), 0);
15046 msg.type = WMA_SET_THERMAL_MGMT;
15047 msg.reserved = 0;
15048 msg.bodyptr = therm_mgmt_cmd;
15049
15050 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
15051 QDF_MODULE_ID_WMA,
15052 QDF_MODULE_ID_WMA, &msg);
15053 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
15054 qdf_mem_free(therm_mgmt_cmd);
15055 qdf_status = QDF_STATUS_E_FAILURE;
15056 }
15057 sme_release_global_lock(&mac->sme);
15058 }
15059 return qdf_status;
15060}
15061#endif /* FW_THERMAL_THROTTLE_SUPPORT */
Abhinav Kumar338e57d2019-02-04 17:30:10 +053015062
15063QDF_STATUS sme_update_hidden_ssid_status_cb(mac_handle_t mac_handle,
15064 hidden_ssid_cb cb)
15065{
15066 QDF_STATUS status;
15067 struct mac_context *mac = MAC_CONTEXT(mac_handle);
15068
15069 status = sme_acquire_global_lock(&mac->sme);
15070 if (QDF_IS_STATUS_SUCCESS(status)) {
15071 mac->sme.hidden_ssid_cb = cb;
15072 sme_release_global_lock(&mac->sme);
15073 }
15074
15075 return status;
15076}
Min Liu0daa0982019-02-01 17:50:44 +080015077
15078QDF_STATUS sme_update_owe_info(struct mac_context *mac,
15079 struct assoc_ind *assoc_ind)
15080{
15081 QDF_STATUS status;
15082
15083 status = sme_acquire_global_lock(&mac->sme);
15084 if (QDF_IS_STATUS_SUCCESS(status)) {
15085 status = csr_update_owe_info(mac, assoc_ind);
15086 sme_release_global_lock(&mac->sme);
15087 }
15088
15089 return status;
15090}