blob: 7296c2b607bf26a4dfa6b470c94a3539067fad14 [file] [log] [blame]
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001/*
Yeshwanth Sriram Guntukaadfeade2018-12-28 15:39:16 +05302 * Copyright (c) 2013-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
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080019/**
20 * DOC: wma_scan_roam.c
21 * This file contains functions related to scan and
22 * roaming functionality.
23 */
24
25/* Header files */
26
27#include "wma.h"
28#include "wma_api.h"
29#include "cds_api.h"
30#include "wmi_unified_api.h"
31#include "wlan_qct_sys.h"
32#include "wni_api.h"
33#include "ani_global.h"
34#include "wmi_unified.h"
35#include "wni_cfg.h"
Manjunathappa Prakash10d357a2016-03-31 19:20:49 -070036#include <cdp_txrx_peer_ops.h>
37#include <cdp_txrx_cfg.h>
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080038
Nirav Shahcbc6d722016-03-01 16:24:53 +053039#include "qdf_nbuf.h"
Anurag Chouhan6d760662016-02-20 16:05:43 +053040#include "qdf_types.h"
Anurag Chouhan600c3a02016-03-01 10:33:54 +053041#include "qdf_mem.h"
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080042
43#include "wma_types.h"
44#include "lim_api.h"
45#include "lim_session_utils.h"
46
47#include "cds_utils.h"
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -070048#include "wlan_policy_mgr_api.h"
Pragaspathi Thilagaraj8b12fbe2019-01-22 15:59:28 +053049#include <wlan_utility.h>
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080050
51#if !defined(REMOVE_PKT_LOG)
52#include "pktlog_ac.h"
53#endif /* REMOVE_PKT_LOG */
54
55#include "dbglog_host.h"
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080056#include "csr_api.h"
57#include "ol_fw.h"
58
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080059#include "wma_internal.h"
Ajit Pal Singha70e3152019-01-03 17:13:41 +053060#if defined(CONFIG_HL_SUPPORT)
61#include "wlan_tgt_def_config_hl.h"
62#else
Leo Chang96464902016-10-28 11:10:54 -070063#include "wlan_tgt_def_config.h"
Ajit Pal Singha70e3152019-01-03 17:13:41 +053064#endif
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070065#include "wlan_reg_services_api.h"
Deepak Dhamdheref918d422017-07-06 12:56:29 -070066#include "wlan_roam_debug.h"
Vignesh Viswanathan21c58cb2018-05-24 15:53:58 +053067#include "wlan_mlme_public_struct.h"
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070068
Leo Chang96464902016-10-28 11:10:54 -070069/* This is temporary, should be removed */
70#include "ol_htt_api.h"
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -080071#include <cdp_txrx_handle.h>
Krishna Kumaar Natarajan0103ef82017-02-17 18:15:56 -080072#include "wma_he.h"
Sandeep Puligilla1fcdb772017-02-22 21:14:59 -080073#include <wlan_scan_public_structs.h>
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -070074#include <wlan_scan_ucfg_api.h>
Ravi Joshi3750de92017-06-01 13:26:09 -070075#include "wma_nan_datapath.h"
Karthik Kantamnenie3bbd7f2018-09-19 20:27:32 +053076#include "wlan_mlme_api.h"
Abhishek Singh7c1c7432019-04-04 12:11:57 +053077#include <wlan_mlme_main.h>
Abhishek Singhf880a7d2019-04-29 14:51:11 +053078#include <wlan_crypto_global_api.h>
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -070079
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080080#ifdef FEATURE_WLAN_EXTSCAN
Dustin Brownd0a76562017-10-13 14:48:37 -070081#define WMA_EXTSCAN_CYCLE_WAKE_LOCK_DURATION WAKELOCK_DURATION_RECOMMENDED
Sridhar Selvaraj22943572017-07-26 15:06:40 +053082
83/*
84 * Maximum number of entires that could be present in the
85 * WMI_EXTSCAN_HOTLIST_MATCH_EVENT buffer from the firmware
86 */
87#define WMA_EXTSCAN_MAX_HOTLIST_ENTRIES 10
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080088#endif
89
90/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080091 * wma_update_channel_list() - update channel list
92 * @handle: wma handle
93 * @chan_list: channel list
94 *
95 * Function is used to update the support channel list in fw.
96 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +053097 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080098 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053099QDF_STATUS wma_update_channel_list(WMA_HANDLE handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800100 tSirUpdateChanList *chan_list)
101{
102 tp_wma_handle wma_handle = (tp_wma_handle) handle;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530103 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Will Huange40a6cc2018-12-10 12:32:42 +0800104 int i, len;
105 struct scan_chan_list_params *scan_ch_param;
106 struct channel_param *chan_p;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800107
Will Huange40a6cc2018-12-10 12:32:42 +0800108 len = sizeof(struct channel_param) * chan_list->numChan +
109 offsetof(struct scan_chan_list_params, ch_param[0]);
110 scan_ch_param = qdf_mem_malloc(len);
111 if (!scan_ch_param)
Govind Singhbc64c9e2016-02-25 17:42:38 +0530112 return QDF_STATUS_E_NOMEM;
Arif Hussain157263f2018-10-03 13:07:15 -0700113
Will Huange40a6cc2018-12-10 12:32:42 +0800114 qdf_mem_zero(scan_ch_param, len);
Govind Singhbc64c9e2016-02-25 17:42:38 +0530115 WMA_LOGD("no of channels = %d", chan_list->numChan);
Will Huange40a6cc2018-12-10 12:32:42 +0800116 chan_p = &scan_ch_param->ch_param[0];
117 scan_ch_param->nallchans = chan_list->numChan;
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +0530118 wma_handle->saved_chan.num_channels = chan_list->numChan;
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -0700119 WMA_LOGD("ht %d, vht %d, vht_24 %d", chan_list->ht_en,
120 chan_list->vht_en, chan_list->vht_24_en);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800121
122 for (i = 0; i < chan_list->numChan; ++i) {
Will Huange40a6cc2018-12-10 12:32:42 +0800123 chan_p->mhz =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800124 cds_chan_to_freq(chan_list->chanParam[i].chanId);
Will Huange40a6cc2018-12-10 12:32:42 +0800125 chan_p->cfreq1 = chan_p->mhz;
126 chan_p->cfreq2 = 0;
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +0530127 wma_handle->saved_chan.channel_list[i] =
128 chan_list->chanParam[i].chanId;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800129
Amar Singhal4b7b78b2016-08-23 15:49:41 -0700130 WMA_LOGD("chan[%d] = freq:%u chan:%d DFS:%d tx power:%d",
Will Huange40a6cc2018-12-10 12:32:42 +0800131 i, chan_p->mhz,
Amar Singhal4b7b78b2016-08-23 15:49:41 -0700132 chan_list->chanParam[i].chanId,
133 chan_list->chanParam[i].dfsSet,
134 chan_list->chanParam[i].pwr);
135
Ganesh Kondabattinidadf1fb2017-09-13 11:15:06 +0530136 if (chan_list->chanParam[i].dfsSet) {
Will Huange40a6cc2018-12-10 12:32:42 +0800137 chan_p->is_chan_passive = 1;
138 chan_p->dfs_set = 1;
Ganesh Kondabattinidadf1fb2017-09-13 11:15:06 +0530139 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800140
Will Huange40a6cc2018-12-10 12:32:42 +0800141 if (chan_p->mhz < WMA_2_4_GHZ_MAX_FREQ) {
142 chan_p->phy_mode = MODE_11G;
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -0700143 if (chan_list->vht_en && chan_list->vht_24_en)
Will Huange40a6cc2018-12-10 12:32:42 +0800144 chan_p->allow_vht = 1;
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -0700145 } else {
Will Huange40a6cc2018-12-10 12:32:42 +0800146 chan_p->phy_mode = MODE_11A;
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -0700147 if (chan_list->vht_en)
Will Huange40a6cc2018-12-10 12:32:42 +0800148 chan_p->allow_vht = 1;
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -0700149 }
150
151 if (chan_list->ht_en)
Will Huange40a6cc2018-12-10 12:32:42 +0800152 chan_p->allow_ht = 1;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800153
154 if (chan_list->chanParam[i].half_rate)
Will Huange40a6cc2018-12-10 12:32:42 +0800155 chan_p->half_rate = 1;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800156 else if (chan_list->chanParam[i].quarter_rate)
Will Huange40a6cc2018-12-10 12:32:42 +0800157 chan_p->quarter_rate = 1;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800158
Will Huange40a6cc2018-12-10 12:32:42 +0800159 /*TODO: Set WMI_SET_CHANNEL_MIN_POWER */
160 /*TODO: Set WMI_SET_CHANNEL_ANTENNA_MAX */
161 /*TODO: WMI_SET_CHANNEL_REG_CLASSID */
162 chan_p->maxregpower = chan_list->chanParam[i].pwr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800163
Will Huange40a6cc2018-12-10 12:32:42 +0800164 chan_p++;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800165 }
166
Govind Singhbc64c9e2016-02-25 17:42:38 +0530167 qdf_status = wmi_unified_scan_chan_list_cmd_send(wma_handle->wmi_handle,
Will Huange40a6cc2018-12-10 12:32:42 +0800168 scan_ch_param);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800169
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700170 if (QDF_IS_STATUS_ERROR(qdf_status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800171 WMA_LOGE("Failed to send WMI_SCAN_CHAN_LIST_CMDID");
Govind Singhbc64c9e2016-02-25 17:42:38 +0530172
Will Huange40a6cc2018-12-10 12:32:42 +0800173 qdf_mem_free(scan_ch_param);
Govind Singhbc64c9e2016-02-25 17:42:38 +0530174
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530175 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800176}
177
Varun Reddy Yeturu061d4d62017-07-20 09:39:32 -0700178QDF_STATUS wma_roam_scan_mawc_params(tp_wma_handle wma_handle,
Jeff Johnsone6da4b02019-02-06 22:22:04 -0800179 struct roam_offload_scan_req *roam_req)
Varun Reddy Yeturu061d4d62017-07-20 09:39:32 -0700180{
181 struct wmi_mawc_roam_params *params;
182 QDF_STATUS status;
183
184 if (!roam_req) {
185 WMA_LOGE("No MAWC parameters to send");
186 return QDF_STATUS_E_INVAL;
187 }
188 params = qdf_mem_malloc(sizeof(*params));
Arif Hussain157263f2018-10-03 13:07:15 -0700189 if (!params)
Varun Reddy Yeturu061d4d62017-07-20 09:39:32 -0700190 return QDF_STATUS_E_NOMEM;
Arif Hussain157263f2018-10-03 13:07:15 -0700191
Varun Reddy Yeturu061d4d62017-07-20 09:39:32 -0700192 params->vdev_id = roam_req->sessionId;
193 params->enable = roam_req->mawc_roam_params.mawc_enabled &&
194 roam_req->mawc_roam_params.mawc_roam_enabled;
195 params->traffic_load_threshold =
196 roam_req->mawc_roam_params.mawc_roam_traffic_threshold;
Yeshwanth Sriram Guntuka14ab04c2018-09-21 15:06:49 +0530197 if (wmi_service_enabled(wma_handle->wmi_handle,
198 wmi_service_hw_db2dbm_support))
199 params->best_ap_rssi_threshold =
200 roam_req->mawc_roam_params.mawc_roam_ap_rssi_threshold;
201 else
202 params->best_ap_rssi_threshold =
203 roam_req->mawc_roam_params.mawc_roam_ap_rssi_threshold -
204 WMA_NOISE_FLOOR_DBM_DEFAULT;
Varun Reddy Yeturu061d4d62017-07-20 09:39:32 -0700205 params->rssi_stationary_high_adjust =
206 roam_req->mawc_roam_params.mawc_roam_rssi_high_adjust;
207 params->rssi_stationary_low_adjust =
208 roam_req->mawc_roam_params.mawc_roam_rssi_low_adjust;
209 status = wmi_unified_roam_mawc_params_cmd(
210 wma_handle->wmi_handle, params);
211 qdf_mem_free(params);
212
213 return status;
214}
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +0530215#ifdef WLAN_FEATURE_FILS_SK
216/**
217 * wma_roam_scan_fill_fils_params() - API to fill FILS params in RSO command
218 * @wma_handle: WMA handle
219 * @params: Pointer to destination RSO params to be filled
220 * @roam_req: Pointer to RSO params from CSR
221 *
222 * Return: None
223 */
224static void wma_roam_scan_fill_fils_params(tp_wma_handle wma_handle,
225 struct roam_offload_scan_params
Jeff Johnsone6da4b02019-02-06 22:22:04 -0800226 *params, struct roam_offload_scan_req
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +0530227 *roam_req)
228{
229 struct roam_fils_params *dst_fils_params, *src_fils_params;
230
231 if (!params || !roam_req || !roam_req->is_fils_connection) {
Srinivas Girigowda09625b02018-09-10 15:28:09 -0700232 wma_err("Invalid input");
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +0530233 return;
234 }
235
236 src_fils_params = &roam_req->roam_fils_params;
237 dst_fils_params = &params->roam_fils_params;
238
239 params->add_fils_tlv = true;
240
241 dst_fils_params->username_length = src_fils_params->username_length;
242 qdf_mem_copy(dst_fils_params->username, src_fils_params->username,
243 dst_fils_params->username_length);
244
245 dst_fils_params->next_erp_seq_num = src_fils_params->next_erp_seq_num;
246 dst_fils_params->rrk_length = src_fils_params->rrk_length;
247 qdf_mem_copy(dst_fils_params->rrk, src_fils_params->rrk,
248 dst_fils_params->rrk_length);
249
250 dst_fils_params->rik_length = src_fils_params->rik_length;
251 qdf_mem_copy(dst_fils_params->rik, src_fils_params->rik,
252 dst_fils_params->rik_length);
253
Pragaspathi Thilagaraj5f510772019-03-12 18:06:01 +0530254 dst_fils_params->fils_ft_len = src_fils_params->fils_ft_len;
255 qdf_mem_copy(dst_fils_params->fils_ft, src_fils_params->fils_ft,
256 dst_fils_params->fils_ft_len);
257
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +0530258 dst_fils_params->realm_len = src_fils_params->realm_len;
259 qdf_mem_copy(dst_fils_params->realm, src_fils_params->realm,
260 dst_fils_params->realm_len);
261}
262#else
263static inline void wma_roam_scan_fill_fils_params(
264 tp_wma_handle wma_handle,
265 struct roam_offload_scan_params *params,
Jeff Johnsone6da4b02019-02-06 22:22:04 -0800266 struct roam_offload_scan_req *roam_req)
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +0530267
268{ }
269#endif
Varun Reddy Yeturu061d4d62017-07-20 09:39:32 -0700270
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800271/**
Jianmin Zhue932fb02018-12-17 22:25:44 +0800272 * wma_roam_scan_offload_set_params() - Set roam scan offload params
273 * @wma_handle: pointer to wma context
274 * @params: pointer to roam scan offload params
275 * @roam_req: roam request param
276 *
277 * Get roam scan offload parameters from roam req and prepare to fill
278 * WMI_ROAM_SCAN_MODE TLV
279 *
280 * Return: None
281 */
282#ifdef WLAN_FEATURE_ROAM_OFFLOAD
283static void wma_roam_scan_offload_set_params(
284 tp_wma_handle wma_handle,
285 struct roam_offload_scan_params *params,
Jeff Johnsone6da4b02019-02-06 22:22:04 -0800286 struct roam_offload_scan_req *roam_req)
Jianmin Zhue932fb02018-12-17 22:25:44 +0800287{
288 params->auth_mode = WMI_AUTH_NONE;
289 if (!roam_req)
290 return;
291 params->auth_mode = e_csr_auth_type_to_rsn_authmode
292 (roam_req->ConnectedNetwork.authentication,
293 roam_req->ConnectedNetwork.encryption);
294 WMA_LOGD("%s : auth mode = %d", __func__, params->auth_mode);
295
Jianmin Zhubf845932018-12-17 11:52:50 +0800296 params->roam_offload_enabled = roam_req->roam_offload_enabled;
Jianmin Zhue932fb02018-12-17 22:25:44 +0800297 params->roam_offload_params.ho_delay_for_rx =
298 roam_req->ho_delay_for_rx;
299 params->roam_offload_params.roam_preauth_retry_count =
300 roam_req->roam_preauth_retry_count;
301 params->roam_offload_params.roam_preauth_no_ack_timeout =
302 roam_req->roam_preauth_no_ack_timeout;
303 params->prefer_5ghz = roam_req->Prefer5GHz;
304 params->roam_rssi_cat_gap = roam_req->RoamRssiCatGap;
305 params->select_5ghz_margin = roam_req->Select5GHzMargin;
306 params->reassoc_failure_timeout =
307 roam_req->ReassocFailureTimeout;
308 params->rokh_id_length = roam_req->R0KH_ID_Length;
309 qdf_mem_copy(params->rokh_id, roam_req->R0KH_ID,
310 WMI_ROAM_R0KH_ID_MAX_LEN);
311 qdf_mem_copy(params->krk, roam_req->KRK, WMI_KRK_KEY_LEN);
312 qdf_mem_copy(params->btk, roam_req->BTK, WMI_BTK_KEY_LEN);
313 qdf_mem_copy(params->psk_pmk, roam_req->PSK_PMK,
Pragaspathi Thilagarajeb367282019-02-19 00:42:28 +0530314 roam_req->pmk_len);
Jianmin Zhue932fb02018-12-17 22:25:44 +0800315 params->pmk_len = roam_req->pmk_len;
316 params->roam_key_mgmt_offload_enabled =
317 roam_req->RoamKeyMgmtOffloadEnabled;
318 wma_roam_scan_fill_self_caps(wma_handle,
319 &params->roam_offload_params, roam_req);
320 params->fw_okc = roam_req->pmkid_modes.fw_okc;
321 params->fw_pmksa_cache = roam_req->pmkid_modes.fw_pmksa_cache;
Pragaspathi Thilagarajae7dc762018-12-12 18:10:50 +0530322 params->rct_validity_timer = roam_req->rct_validity_timer;
Pragaspathi Thilagaraj1f3f99f2019-04-24 23:48:47 +0530323 params->is_adaptive_11r = roam_req->is_adaptive_11r_connection;
Jianmin Zhue932fb02018-12-17 22:25:44 +0800324 WMA_LOGD(FL("qos_caps: %d, qos_enabled: %d, ho_delay_for_rx: %d, roam_scan_mode: %d"),
325 params->roam_offload_params.qos_caps,
326 params->roam_offload_params.qos_enabled,
327 params->roam_offload_params.ho_delay_for_rx, params->mode);
328 WMA_LOGD(FL("roam_preauth_retry_count: %d, roam_preauth_no_ack_timeout: %d"),
329 params->roam_offload_params.roam_preauth_retry_count,
330 params->roam_offload_params.roam_preauth_no_ack_timeout);
331}
332#else
333static void wma_roam_scan_offload_set_params(
334 tp_wma_handle wma_handle,
335 struct roam_offload_scan_params *params,
Jeff Johnsone6da4b02019-02-06 22:22:04 -0800336 struct roam_offload_scan_req *roam_req)
Jianmin Zhue932fb02018-12-17 22:25:44 +0800337{}
338#endif
339
340/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800341 * wma_roam_scan_offload_mode() - send roam scan mode request to fw
Jianmin Zhue932fb02018-12-17 22:25:44 +0800342 * @wma_handle: pointer to wma context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800343 * @scan_cmd_fp: start scan command ptr
344 * @roam_req: roam request param
345 * @mode: mode
346 * @vdev_id: vdev id
347 *
348 * send WMI_ROAM_SCAN_MODE TLV to firmware. It has a piggyback
349 * of WMI_ROAM_SCAN_MODE.
350 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +0530351 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800352 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530353QDF_STATUS wma_roam_scan_offload_mode(tp_wma_handle wma_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800354 wmi_start_scan_cmd_fixed_param *
355 scan_cmd_fp,
Jeff Johnsone6da4b02019-02-06 22:22:04 -0800356 struct roam_offload_scan_req *roam_req,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800357 uint32_t mode, uint32_t vdev_id)
358{
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +0530359 QDF_STATUS status = QDF_STATUS_SUCCESS;
Selvaraj, Sridhara7fc7632016-09-04 13:13:38 +0530360 struct roam_offload_scan_params *params =
361 qdf_mem_malloc(sizeof(*params));
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +0530362
Arif Hussain157263f2018-10-03 13:07:15 -0700363 if (!params)
Arif Hussaincf6b9602016-10-25 14:46:53 -0700364 return QDF_STATUS_E_NOMEM;
Arif Hussain157263f2018-10-03 13:07:15 -0700365
Pragaspathi Thilagarajecb60732018-11-02 12:26:24 +0530366 if (!wma_is_vdev_valid(vdev_id)) {
367 WMA_LOGE("%s: Invalid vdev id:%d", __func__, vdev_id);
368 qdf_mem_free(params);
369 return QDF_STATUS_E_FAILURE;
370 }
371
Selvaraj, Sridhara7fc7632016-09-04 13:13:38 +0530372 params->is_roam_req_valid = 0;
373 params->mode = mode;
374 params->vdev_id = vdev_id;
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +0530375 if (roam_req) {
Selvaraj, Sridhara7fc7632016-09-04 13:13:38 +0530376 params->is_roam_req_valid = 1;
Abhinav Kumara95af7c2018-04-06 17:08:00 +0530377 params->min_delay_btw_roam_scans =
378 roam_req->min_delay_btw_roam_scans;
379 params->roam_trigger_reason_bitmask =
380 roam_req->roam_trigger_reason_bitmask;
Selvaraj, Sridhara7fc7632016-09-04 13:13:38 +0530381 params->is_ese_assoc = roam_req->IsESEAssoc;
Abhinav Kumar271f0632018-03-29 16:01:30 +0530382 params->is_11r_assoc = roam_req->is_11r_assoc;
Jeff Johnson9e760832018-12-15 12:41:36 -0800383 params->mdid = roam_req->mdid;
Selvaraj, Sridhara7fc7632016-09-04 13:13:38 +0530384 params->assoc_ie_length = roam_req->assoc_ie.length;
385 qdf_mem_copy(params->assoc_ie, roam_req->assoc_ie.addIEdata,
386 roam_req->assoc_ie.length);
Abhinav Kumar990fea62019-02-14 12:38:38 +0530387 /* Configure roaming scan behavior (DBS/Non-DBS scan) */
388 if (roam_req->roaming_scan_policy)
389 scan_cmd_fp->scan_ctrl_flags_ext |=
390 WMI_SCAN_DBS_POLICY_FORCE_NONDBS;
391 else
392 scan_cmd_fp->scan_ctrl_flags_ext |=
393 WMI_SCAN_DBS_POLICY_DEFAULT;
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +0530394
395 wma_roam_scan_fill_fils_params(wma_handle, params, roam_req);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800396 }
Abhinav Kumaredd1d372018-05-11 15:33:35 +0530397 WMA_LOGD(FL("min_delay_btw_roam_scans:%d, roam_tri_reason_bitmask:%d"),
398 params->min_delay_btw_roam_scans,
399 params->roam_trigger_reason_bitmask);
400
Jianmin Zhue932fb02018-12-17 22:25:44 +0800401 wma_roam_scan_offload_set_params(
402 wma_handle,
403 params,
404 roam_req);
Sourav Mohapatra5ba8da32018-07-16 09:21:15 +0530405
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +0530406 status = wmi_unified_roam_scan_offload_mode_cmd(wma_handle->wmi_handle,
Selvaraj, Sridhara7fc7632016-09-04 13:13:38 +0530407 scan_cmd_fp, params);
gaurank kathpalia6d25c972019-03-07 20:25:28 +0530408 qdf_mem_zero(params, sizeof(*params));
Abhinav Kumar1138a912018-09-04 11:45:53 +0530409 qdf_mem_free(params);
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +0530410 if (QDF_IS_STATUS_ERROR(status))
411 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800412
Srinivas Girigowdaf1472122017-03-09 15:44:12 -0800413 WMA_LOGD("%s: WMA --> WMI_ROAM_SCAN_MODE", __func__);
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +0530414 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800415}
416
Jeff Johnsone6da4b02019-02-06 22:22:04 -0800417QDF_STATUS
418wma_roam_scan_offload_rssi_thresh(tp_wma_handle wma_handle,
419 struct roam_offload_scan_req *roam_req)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800420{
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +0530421 struct roam_offload_scan_rssi_params params = {0};
422 QDF_STATUS status = QDF_STATUS_SUCCESS;
423 int rssi_thresh, rssi_thresh_diff;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800424 struct roam_ext_params *roam_params;
425 int32_t good_rssi_threshold;
426 uint32_t hirssi_scan_max_count;
427 uint32_t hirssi_scan_delta;
428 int32_t hirssi_upper_bound;
Yeshwanth Sriram Guntuka14ab04c2018-09-21 15:06:49 +0530429 bool db2dbm_enabled;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800430
431 /* Send rssi threshold */
432 roam_params = &roam_req->roam_params;
Yeshwanth Sriram Guntuka14ab04c2018-09-21 15:06:49 +0530433 db2dbm_enabled = wmi_service_enabled(wma_handle->wmi_handle,
434 wmi_service_hw_db2dbm_support);
435 if (db2dbm_enabled) {
436 rssi_thresh = roam_req->LookupThreshold;
437 } else {
438 rssi_thresh = roam_req->LookupThreshold -
439 WMA_NOISE_FLOOR_DBM_DEFAULT;
440 rssi_thresh &= 0x000000ff;
441 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800442 rssi_thresh_diff = roam_req->OpportunisticScanThresholdDiff;
443 hirssi_scan_max_count = roam_req->hi_rssi_scan_max_count;
444 hirssi_scan_delta = roam_req->hi_rssi_scan_rssi_delta;
445 hirssi_upper_bound = roam_req->hi_rssi_scan_rssi_ub -
446 WMA_NOISE_FLOOR_DBM_DEFAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800447
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800448 /* fill in threshold values */
Jeff Johnson23503ac2019-02-22 21:29:32 -0800449 params.vdev_id = roam_req->sessionId;
Yeshwanth Sriram Guntuka14ab04c2018-09-21 15:06:49 +0530450 params.rssi_thresh = rssi_thresh;
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +0530451 params.rssi_thresh_diff = rssi_thresh_diff & 0x000000ff;
452 params.hi_rssi_scan_max_count = hirssi_scan_max_count;
453 params.hi_rssi_scan_rssi_delta = hirssi_scan_delta;
454 params.hi_rssi_scan_rssi_ub = hirssi_upper_bound & 0x00000ff;
455 params.raise_rssi_thresh_5g = roam_params->raise_rssi_thresh_5g;
Gupta, Kapilc68ad462016-02-01 19:17:23 +0530456 params.dense_rssi_thresh_offset =
457 roam_params->dense_rssi_thresh_offset;
458 params.dense_min_aps_cnt = roam_params->dense_min_aps_cnt;
459 params.traffic_threshold =
460 roam_params->traffic_threshold;
Kapil Gupta0a2477b2016-08-23 18:00:34 +0530461 params.initial_dense_status = roam_params->initial_dense_status;
Yeshwanth Sriram Guntuka14ab04c2018-09-21 15:06:49 +0530462 if (db2dbm_enabled)
463 params.bg_scan_bad_rssi_thresh =
464 roam_params->bg_scan_bad_rssi_thresh;
465 else
466 params.bg_scan_bad_rssi_thresh =
467 roam_params->bg_scan_bad_rssi_thresh -
468 WMA_NOISE_FLOOR_DBM_DEFAULT;
469
Varun Reddy Yeturufaad37e2017-07-26 10:54:13 -0700470 params.bg_scan_client_bitmap = roam_params->bg_scan_client_bitmap;
Vignesh Viswanathanc018e982017-09-07 18:49:19 +0530471 params.roam_bad_rssi_thresh_offset_2g =
472 roam_params->roam_bad_rssi_thresh_offset_2g;
473 if (params.roam_bad_rssi_thresh_offset_2g)
474 params.flags |= WMI_ROAM_BG_SCAN_FLAGS_2G_TO_5G_ONLY;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800475
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800476 /*
477 * The current Noise floor in firmware is -96dBm. Penalty/Boost
478 * threshold is applied on a weaker signal to make it even more weaker.
479 * So, there is a chance that the user may configure a very low
480 * Penalty/Boost threshold beyond the noise floor. If that is the case,
481 * then suppress the penalty/boost threshold to the noise floor.
482 */
Yeshwanth Sriram Guntuka14ab04c2018-09-21 15:06:49 +0530483 if (roam_params->raise_rssi_thresh_5g < WMA_NOISE_FLOOR_DBM_DEFAULT) {
484 if (db2dbm_enabled) {
485 params.penalty_threshold_5g = WMA_RSSI_MIN_VALUE;
486 params.boost_threshold_5g = WMA_RSSI_MAX_VALUE;
487 } else {
488 params.penalty_threshold_5g = 0;
489 }
490 } else {
491 if (db2dbm_enabled)
492 params.boost_threshold_5g =
493 roam_params->raise_rssi_thresh_5g;
494 else
495 params.boost_threshold_5g =
496 (roam_params->raise_rssi_thresh_5g -
497 WMA_NOISE_FLOOR_DBM_DEFAULT) & 0x000000ff;
498 }
499 if (roam_params->drop_rssi_thresh_5g < WMA_NOISE_FLOOR_DBM_DEFAULT) {
500 if (db2dbm_enabled)
501 params.penalty_threshold_5g = WMA_RSSI_MIN_VALUE;
502 else
503 params.penalty_threshold_5g = 0;
504
505 } else {
506 if (db2dbm_enabled)
507 params.penalty_threshold_5g =
508 roam_params->drop_rssi_thresh_5g;
509 else
510 params.penalty_threshold_5g =
511 (roam_params->drop_rssi_thresh_5g -
512 WMA_NOISE_FLOOR_DBM_DEFAULT) & 0x000000ff;
513 }
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +0530514 params.raise_factor_5g = roam_params->raise_factor_5g;
515 params.drop_factor_5g = roam_params->drop_factor_5g;
516 params.max_raise_rssi_5g = roam_params->max_raise_rssi_5g;
517 params.max_drop_rssi_5g = roam_params->max_drop_rssi_5g;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800518
519 if (roam_params->good_rssi_roam)
520 good_rssi_threshold = WMA_NOISE_FLOOR_DBM_DEFAULT;
521 else
522 good_rssi_threshold = 0;
Yeshwanth Sriram Guntuka14ab04c2018-09-21 15:06:49 +0530523
524 if (db2dbm_enabled)
525 params.good_rssi_threshold = good_rssi_threshold;
526 else
527 params.good_rssi_threshold = (good_rssi_threshold -
528 WMA_NOISE_FLOOR_DBM_DEFAULT) &
529 0x000000ff;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800530
531 WMA_LOGD("WMA --> good_rssi_threshold=%d",
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +0530532 params.good_rssi_threshold);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800533
Varun Reddy Yeturu21953a22016-05-17 15:16:44 -0700534 if (roam_req->early_stop_scan_enable) {
Yeshwanth Sriram Guntuka14ab04c2018-09-21 15:06:49 +0530535 if (db2dbm_enabled) {
536 params.roam_earlystop_thres_min =
537 roam_req->early_stop_scan_min_threshold;
538 params.roam_earlystop_thres_max =
539 roam_req->early_stop_scan_max_threshold;
540 } else {
541 params.roam_earlystop_thres_min =
542 roam_req->early_stop_scan_min_threshold -
543 WMA_NOISE_FLOOR_DBM_DEFAULT;
544 params.roam_earlystop_thres_max =
545 roam_req->early_stop_scan_max_threshold -
546 WMA_NOISE_FLOOR_DBM_DEFAULT;
547 }
Varun Reddy Yeturu21953a22016-05-17 15:16:44 -0700548 } else {
Yeshwanth Sriram Guntuka14ab04c2018-09-21 15:06:49 +0530549 if (db2dbm_enabled) {
550 params.roam_earlystop_thres_min =
551 WMA_RSSI_MIN_VALUE;
552 params.roam_earlystop_thres_max =
553 WMA_RSSI_MIN_VALUE;
554 } else {
555 params.roam_earlystop_thres_min = 0;
556 params.roam_earlystop_thres_max = 0;
557 }
Varun Reddy Yeturu21953a22016-05-17 15:16:44 -0700558 }
Varun Reddy Yeturu168134f2017-06-26 13:46:05 -0700559 params.rssi_thresh_offset_5g =
560 roam_req->rssi_thresh_offset_5g;
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +0530561
Varun Reddy Yeturu05186292015-09-28 17:12:33 -0700562 WMA_LOGD("early_stop_thresholds en=%d, min=%d, max=%d",
563 roam_req->early_stop_scan_enable,
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +0530564 params.roam_earlystop_thres_min,
565 params.roam_earlystop_thres_max);
Varun Reddy Yeturu168134f2017-06-26 13:46:05 -0700566 WMA_LOGD("rssi_thresh_offset_5g = %d", params.rssi_thresh_offset_5g);
Varun Reddy Yeturu05186292015-09-28 17:12:33 -0700567
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +0530568 status = wmi_unified_roam_scan_offload_rssi_thresh_cmd(
569 wma_handle->wmi_handle, &params);
Varun Reddy Yeturufaad37e2017-07-26 10:54:13 -0700570 if (QDF_IS_STATUS_ERROR(status)) {
571 WMA_LOGE("roam_scan_offload_rssi_thresh_cmd failed %d", status);
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +0530572 return status;
Varun Reddy Yeturufaad37e2017-07-26 10:54:13 -0700573 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800574
Srinivas Girigowdaf1472122017-03-09 15:44:12 -0800575 WMA_LOGD(FL("roam_scan_rssi_thresh=%d, roam_rssi_thresh_diff=%d"),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800576 rssi_thresh, rssi_thresh_diff);
Srinivas Girigowdaf1472122017-03-09 15:44:12 -0800577 WMA_LOGD(
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800578 FL("hirssi_scan max_count=%d, delta=%d, hirssi_upper_bound=%d"),
579 hirssi_scan_max_count, hirssi_scan_delta, hirssi_upper_bound);
Srinivas Girigowdaf1472122017-03-09 15:44:12 -0800580 WMA_LOGD(
Kapil Gupta0a2477b2016-08-23 18:00:34 +0530581 FL("dense_rssi_thresh_offset=%d, dense_min_aps_cnt=%d, traffic_threshold=%d initial_dense_status=%d"),
Gupta, Kapilc68ad462016-02-01 19:17:23 +0530582 roam_params->dense_rssi_thresh_offset,
583 roam_params->dense_min_aps_cnt,
Kapil Gupta0a2477b2016-08-23 18:00:34 +0530584 roam_params->traffic_threshold,
585 roam_params->initial_dense_status);
Vignesh Viswanathanc018e982017-09-07 18:49:19 +0530586 WMA_LOGD(FL("BG Scan Bad RSSI:%d, bitmap:0x%x Offset for 2G to 5G Roam:%d"),
Varun Reddy Yeturufaad37e2017-07-26 10:54:13 -0700587 roam_params->bg_scan_bad_rssi_thresh,
Vignesh Viswanathanc018e982017-09-07 18:49:19 +0530588 roam_params->bg_scan_client_bitmap,
589 roam_params->roam_bad_rssi_thresh_offset_2g);
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +0530590 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800591}
592
593/**
594 * wma_roam_scan_offload_scan_period() - set roam offload scan period
595 * @wma_handle: wma handle
Pragaspathi Thilagaraj2b8ea352019-04-12 02:23:50 +0530596 * @roam_req: Pointer to roam_offload_scan_req
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800597 *
598 * Send WMI_ROAM_SCAN_PERIOD parameters to fw.
599 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +0530600 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800601 */
Pragaspathi Thilagaraj2b8ea352019-04-12 02:23:50 +0530602QDF_STATUS
603wma_roam_scan_offload_scan_period(tp_wma_handle wma_handle,
604 struct roam_offload_scan_req *roam_req)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800605{
Pragaspathi Thilagaraj2b8ea352019-04-12 02:23:50 +0530606 uint8_t vdev_id;
607 struct roam_scan_period_params scan_period_params;
608
609 vdev_id = roam_req->sessionId;
Pragaspathi Thilagarajecb60732018-11-02 12:26:24 +0530610 if (!wma_is_vdev_valid(vdev_id)) {
611 WMA_LOGE("%s: Invalid vdev id:%d", __func__, vdev_id);
612 return QDF_STATUS_E_FAILURE;
613 }
614
Pragaspathi Thilagaraj2b8ea352019-04-12 02:23:50 +0530615 scan_period_params.vdev_id = vdev_id;
616 scan_period_params.scan_period = roam_req->EmptyRefreshScanPeriod;
617 scan_period_params.scan_age = (3 * roam_req->EmptyRefreshScanPeriod);
618 scan_period_params.roam_scan_inactivity_time =
619 roam_req->roam_scan_inactivity_time;
620 scan_period_params.roam_inactive_data_packet_count =
621 roam_req->roam_inactive_data_packet_count;
622 scan_period_params.roam_scan_period_after_inactivity =
623 roam_req->roam_scan_period_after_inactivity;
624
Govind Singh64b5e112016-03-08 11:53:50 +0530625 return wmi_unified_roam_scan_offload_scan_period(wma_handle->wmi_handle,
Pragaspathi Thilagaraj2b8ea352019-04-12 02:23:50 +0530626 &scan_period_params);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800627}
628
629/**
630 * wma_roam_scan_offload_rssi_change() - set roam offload RSSI change threshold
631 * @wma_handle: wma handle
632 * @rssi_change_thresh: RSSI Change threshold
633 * @bcn_rssi_weight: beacon RSSI weight
634 * @vdev_id: vdev id
635 *
636 * Send WMI_ROAM_SCAN_RSSI_CHANGE_THRESHOLD parameters to fw.
637 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +0530638 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800639 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530640QDF_STATUS wma_roam_scan_offload_rssi_change(tp_wma_handle wma_handle,
Pragaspathi Thilagarajecb60732018-11-02 12:26:24 +0530641 uint32_t vdev_id,
642 int32_t rssi_change_thresh,
643 uint32_t bcn_rssi_weight,
644 uint32_t hirssi_delay_btw_scans)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800645{
Pragaspathi Thilagarajecb60732018-11-02 12:26:24 +0530646 if (!wma_is_vdev_valid(vdev_id)) {
Dustin Brownfd578602019-02-22 13:52:24 -0800647 wma_err("Invalid vdev id:%d", vdev_id);
Pragaspathi Thilagarajecb60732018-11-02 12:26:24 +0530648 return QDF_STATUS_E_FAILURE;
649 }
650
Dustin Brownfd578602019-02-22 13:52:24 -0800651 return wmi_unified_roam_scan_offload_rssi_change_cmd(
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700652 wma_handle->wmi_handle,
653 vdev_id, rssi_change_thresh,
654 bcn_rssi_weight, hirssi_delay_btw_scans);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800655}
656
657/**
658 * wma_roam_scan_offload_chan_list() - set roam offload channel list
659 * @wma_handle: wma handle
660 * @chan_count: channel count
661 * @chan_list: channel list
662 * @list_type: list type
663 * @vdev_id: vdev id
664 *
665 * Set roam offload channel list.
666 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +0530667 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800668 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530669QDF_STATUS wma_roam_scan_offload_chan_list(tp_wma_handle wma_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800670 uint8_t chan_count,
671 uint8_t *chan_list,
672 uint8_t list_type, uint32_t vdev_id)
673{
Govind Singh64b5e112016-03-08 11:53:50 +0530674 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800675 int i;
Varun Reddy Yeturu823e9c22016-07-07 17:38:44 -0700676 uint32_t *chan_list_mhz;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800677
678 if (chan_count == 0) {
679 WMA_LOGD("%s : invalid number of channels %d", __func__,
680 chan_count);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530681 return QDF_STATUS_E_EMPTY;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800682 }
Pragaspathi Thilagarajecb60732018-11-02 12:26:24 +0530683
684 if (!wma_is_vdev_valid(vdev_id)) {
685 WMA_LOGE("%s: Invalid vdev id:%d", __func__, vdev_id);
686 return QDF_STATUS_E_FAILURE;
687 }
688
Varun Reddy Yeturu823e9c22016-07-07 17:38:44 -0700689 chan_list_mhz = qdf_mem_malloc(chan_count * sizeof(*chan_list_mhz));
Arif Hussain157263f2018-10-03 13:07:15 -0700690 if (!chan_list_mhz)
Naveen Rawat35804772016-06-27 15:40:28 -0700691 return QDF_STATUS_E_NOMEM;
Naveen Rawat35804772016-06-27 15:40:28 -0700692
Govind Singh64b5e112016-03-08 11:53:50 +0530693 for (i = 0; ((i < chan_count) &&
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800694 (i < SIR_ROAM_MAX_CHANNELS)); i++) {
Varun Reddy Yeturu823e9c22016-07-07 17:38:44 -0700695 chan_list_mhz[i] = cds_chan_to_freq(chan_list[i]);
Srinivas Girigowdaf1472122017-03-09 15:44:12 -0800696 WMA_LOGD("%d,", chan_list_mhz[i]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800697 }
698
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700699 status = wmi_unified_roam_scan_offload_chan_list_cmd(
700 wma_handle->wmi_handle,
701 chan_count, chan_list_mhz,
702 list_type, vdev_id);
Varun Reddy Yeturu823e9c22016-07-07 17:38:44 -0700703 qdf_mem_free(chan_list_mhz);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800704
Govind Singh64b5e112016-03-08 11:53:50 +0530705 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800706}
707
708/**
709 * e_csr_auth_type_to_rsn_authmode() - map csr auth type to rsn authmode
710 * @authtype: CSR authtype
711 * @encr: CSR Encryption
712 *
713 * Map CSR's authentication type into RSN auth mode used by firmware
714 *
715 * Return: WMI RSN auth mode
716 */
717A_UINT32 e_csr_auth_type_to_rsn_authmode(eCsrAuthType authtype,
718 eCsrEncryptionType encr)
719{
720 switch (authtype) {
721 case eCSR_AUTH_TYPE_OPEN_SYSTEM:
722 return WMI_AUTH_OPEN;
723 case eCSR_AUTH_TYPE_WPA:
724 return WMI_AUTH_WPA;
725 case eCSR_AUTH_TYPE_WPA_PSK:
726 return WMI_AUTH_WPA_PSK;
727 case eCSR_AUTH_TYPE_RSN:
728 return WMI_AUTH_RSNA;
729 case eCSR_AUTH_TYPE_RSN_PSK:
730 return WMI_AUTH_RSNA_PSK;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800731 case eCSR_AUTH_TYPE_FT_RSN:
732 return WMI_AUTH_FT_RSNA;
733 case eCSR_AUTH_TYPE_FT_RSN_PSK:
734 return WMI_AUTH_FT_RSNA_PSK;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800735#ifdef FEATURE_WLAN_WAPI
736 case eCSR_AUTH_TYPE_WAPI_WAI_CERTIFICATE:
737 return WMI_AUTH_WAPI;
738 case eCSR_AUTH_TYPE_WAPI_WAI_PSK:
739 return WMI_AUTH_WAPI_PSK;
740#endif /* FEATURE_WLAN_WAPI */
741#ifdef FEATURE_WLAN_ESE
742 case eCSR_AUTH_TYPE_CCKM_WPA:
Varun Reddy Yeturu101f9542016-05-24 10:07:52 -0700743 return WMI_AUTH_CCKM_WPA;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800744 case eCSR_AUTH_TYPE_CCKM_RSN:
Varun Reddy Yeturu101f9542016-05-24 10:07:52 -0700745 return WMI_AUTH_CCKM_RSNA;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800746#endif /* FEATURE_WLAN_ESE */
747#ifdef WLAN_FEATURE_11W
748 case eCSR_AUTH_TYPE_RSN_PSK_SHA256:
749 return WMI_AUTH_RSNA_PSK_SHA256;
750 case eCSR_AUTH_TYPE_RSN_8021X_SHA256:
751 return WMI_AUTH_RSNA_8021X_SHA256;
752#endif /* WLAN_FEATURE_11W */
753 case eCSR_AUTH_TYPE_NONE:
754 case eCSR_AUTH_TYPE_AUTOSWITCH:
755 /* In case of WEP and other keys, NONE means OPEN auth */
756 if (encr == eCSR_ENCRYPT_TYPE_WEP40_STATICKEY ||
757 encr == eCSR_ENCRYPT_TYPE_WEP104_STATICKEY ||
758 encr == eCSR_ENCRYPT_TYPE_WEP40 ||
759 encr == eCSR_ENCRYPT_TYPE_WEP104 ||
760 encr == eCSR_ENCRYPT_TYPE_TKIP ||
Mukul Sharma05504ac2017-06-08 12:35:53 +0530761 encr == eCSR_ENCRYPT_TYPE_AES ||
762 encr == eCSR_ENCRYPT_TYPE_AES_GCMP ||
763 encr == eCSR_ENCRYPT_TYPE_AES_GCMP_256) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800764 return WMI_AUTH_OPEN;
765 }
766 return WMI_AUTH_NONE;
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +0530767 case eCSR_AUTH_TYPE_FILS_SHA256:
768 return WMI_AUTH_RSNA_FILS_SHA256;
769 case eCSR_AUTH_TYPE_FILS_SHA384:
770 return WMI_AUTH_RSNA_FILS_SHA384;
Pragaspathi Thilagarajeb367282019-02-19 00:42:28 +0530771 case eCSR_AUTH_TYPE_FT_FILS_SHA256:
772 return WMI_AUTH_FT_RSNA_FILS_SHA256;
773 case eCSR_AUTH_TYPE_FT_FILS_SHA384:
774 return WMI_AUTH_FT_RSNA_FILS_SHA384;
Padma, Santhosh Kumar96682402018-02-02 18:16:27 +0530775 case eCSR_AUTH_TYPE_SUITEB_EAP_SHA256:
776 return WMI_AUTH_RSNA_SUITE_B_8021X_SHA256;
777 case eCSR_AUTH_TYPE_SUITEB_EAP_SHA384:
778 return WMI_AUTH_RSNA_SUITE_B_8021X_SHA384;
Pragaspathi Thilagarajeb367282019-02-19 00:42:28 +0530779 case eCSR_AUTH_TYPE_FT_SAE:
780 return WMI_AUTH_FT_RSNA_SAE;
781 case eCSR_AUTH_TYPE_FT_SUITEB_EAP_SHA384:
782 return WMI_AUTH_FT_RSNA_SUITE_B_8021X_SHA384;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800783 default:
784 return WMI_AUTH_NONE;
785 }
786}
787
788/**
789 * e_csr_encryption_type_to_rsn_cipherset() - map csr enc type to ESN cipher
790 * @encr: CSR Encryption
791 *
792 * Map CSR's encryption type into RSN cipher types used by firmware
793 *
794 * Return: WMI RSN cipher
795 */
796A_UINT32 e_csr_encryption_type_to_rsn_cipherset(eCsrEncryptionType encr)
797{
798
799 switch (encr) {
800 case eCSR_ENCRYPT_TYPE_WEP40_STATICKEY:
801 case eCSR_ENCRYPT_TYPE_WEP104_STATICKEY:
802 case eCSR_ENCRYPT_TYPE_WEP40:
803 case eCSR_ENCRYPT_TYPE_WEP104:
804 return WMI_CIPHER_WEP;
805 case eCSR_ENCRYPT_TYPE_TKIP:
806 return WMI_CIPHER_TKIP;
807 case eCSR_ENCRYPT_TYPE_AES:
808 return WMI_CIPHER_AES_CCM;
Mukul Sharma05504ac2017-06-08 12:35:53 +0530809 /* FWR will use key length to distinguish GCMP 128 or 256 */
810 case eCSR_ENCRYPT_TYPE_AES_GCMP:
811 case eCSR_ENCRYPT_TYPE_AES_GCMP_256:
812 return WMI_CIPHER_AES_GCM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800813#ifdef FEATURE_WLAN_WAPI
814 case eCSR_ENCRYPT_TYPE_WPI:
815 return WMI_CIPHER_WAPI;
816#endif /* FEATURE_WLAN_WAPI */
817 case eCSR_ENCRYPT_TYPE_ANY:
818 return WMI_CIPHER_ANY;
819 case eCSR_ENCRYPT_TYPE_NONE:
820 default:
821 return WMI_CIPHER_NONE;
822 }
823}
824
Varun Reddy Yeturu101f9542016-05-24 10:07:52 -0700825#ifdef WLAN_FEATURE_ROAM_OFFLOAD
826/**
827 * wma_roam_scan_get_cckm_mode() - Get the CCKM auth mode
828 * @roam_req: Roaming request buffer
829 * @auth_mode: Auth mode to be converted
830 *
831 * Based on LFR2.0 or LFR3.0, return the proper auth type
832 *
833 * Return: if LFR2.0, then return WMI_AUTH_CCKM for backward compatibility
834 * if LFR3.0 then return the appropriate auth type
835 */
Jeff Johnsone6da4b02019-02-06 22:22:04 -0800836static
837uint32_t wma_roam_scan_get_cckm_mode(struct roam_offload_scan_req *roam_req,
838 uint32_t auth_mode)
Varun Reddy Yeturu101f9542016-05-24 10:07:52 -0700839{
Jianmin Zhubf845932018-12-17 11:52:50 +0800840 if (roam_req->roam_offload_enabled)
Varun Reddy Yeturu101f9542016-05-24 10:07:52 -0700841 return auth_mode;
842 else
843 return WMI_AUTH_CCKM;
844
845}
Jeff Johnsone6da4b02019-02-06 22:22:04 -0800846#else
847static
848uint32_t wma_roam_scan_get_cckm_mode(struct roam_offload_scan_req *roam_req,
849 uint32_t auth_mode)
850{
851 return WMI_AUTH_CCKM;
852}
Varun Reddy Yeturu101f9542016-05-24 10:07:52 -0700853#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800854/**
855 * wma_roam_scan_fill_ap_profile() - fill ap_profile
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800856 * @roam_req: roam offload scan request
Himanshu Agarwal8bcec572017-09-28 11:54:37 +0530857 * @profile: ap profile
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800858 *
859 * Fill ap_profile structure from configured parameters
860 *
861 * Return: none
862 */
Jeff Johnsone6da4b02019-02-06 22:22:04 -0800863static void
864wma_roam_scan_fill_ap_profile(struct roam_offload_scan_req *roam_req,
865 struct ap_profile *profile)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800866{
Varun Reddy Yeturu101f9542016-05-24 10:07:52 -0700867 uint32_t rsn_authmode;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700868
Himanshu Agarwal8bcec572017-09-28 11:54:37 +0530869 qdf_mem_zero(profile, sizeof(*profile));
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -0700870 if (!roam_req) {
Himanshu Agarwal8bcec572017-09-28 11:54:37 +0530871 profile->ssid.length = 0;
872 profile->ssid.mac_ssid[0] = 0;
873 profile->rsn_authmode = WMI_AUTH_NONE;
874 profile->rsn_ucastcipherset = WMI_CIPHER_NONE;
875 profile->rsn_mcastcipherset = WMI_CIPHER_NONE;
876 profile->rsn_mcastmgmtcipherset = WMI_CIPHER_NONE;
877 profile->rssi_threshold = WMA_ROAM_RSSI_DIFF_DEFAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800878 } else {
Himanshu Agarwal8bcec572017-09-28 11:54:37 +0530879 profile->ssid.length =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800880 roam_req->ConnectedNetwork.ssId.length;
Himanshu Agarwal8bcec572017-09-28 11:54:37 +0530881 qdf_mem_copy(profile->ssid.mac_ssid,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800882 roam_req->ConnectedNetwork.ssId.ssId,
Himanshu Agarwal8bcec572017-09-28 11:54:37 +0530883 profile->ssid.length);
884 profile->rsn_authmode =
Varun Reddy Yeturu101f9542016-05-24 10:07:52 -0700885 e_csr_auth_type_to_rsn_authmode(
886 roam_req->ConnectedNetwork.authentication,
887 roam_req->ConnectedNetwork.encryption);
Himanshu Agarwal8bcec572017-09-28 11:54:37 +0530888 rsn_authmode = profile->rsn_authmode;
Varun Reddy Yeturu101f9542016-05-24 10:07:52 -0700889
890 if ((rsn_authmode == WMI_AUTH_CCKM_WPA) ||
891 (rsn_authmode == WMI_AUTH_CCKM_RSNA))
Himanshu Agarwal8bcec572017-09-28 11:54:37 +0530892 profile->rsn_authmode =
Varun Reddy Yeturu101f9542016-05-24 10:07:52 -0700893 wma_roam_scan_get_cckm_mode(
894 roam_req, rsn_authmode);
Himanshu Agarwal8bcec572017-09-28 11:54:37 +0530895 profile->rsn_ucastcipherset =
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700896 e_csr_encryption_type_to_rsn_cipherset(
897 roam_req->ConnectedNetwork.encryption);
Himanshu Agarwal8bcec572017-09-28 11:54:37 +0530898 profile->rsn_mcastcipherset =
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700899 e_csr_encryption_type_to_rsn_cipherset(
900 roam_req->ConnectedNetwork.mcencryption);
Himanshu Agarwal8bcec572017-09-28 11:54:37 +0530901 profile->rsn_mcastmgmtcipherset =
902 profile->rsn_mcastcipherset;
903 profile->rssi_threshold = roam_req->RoamRssiDiff;
Abhishek Singh34c0e632017-09-28 14:39:29 +0530904 if (roam_req->rssi_abs_thresh)
Yeshwanth Sriram Guntuka14ab04c2018-09-21 15:06:49 +0530905 profile->rssi_abs_thresh = roam_req->rssi_abs_thresh;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800906#ifdef WLAN_FEATURE_11W
907 if (roam_req->ConnectedNetwork.mfp_enabled)
Himanshu Agarwal8bcec572017-09-28 11:54:37 +0530908 profile->flags |= WMI_AP_PROFILE_FLAG_PMF;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800909#endif
910 }
911}
912
913/**
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -0700914 * wma_process_set_pdev_ie_req() - process the pdev set IE req
915 * @wma: Pointer to wma handle
916 * @ie_params: Pointer to IE data.
917 *
918 * Sends the WMI req to set the IE to FW.
919 *
920 * Return: None
921 */
922void wma_process_set_pdev_ie_req(tp_wma_handle wma,
923 struct set_ie_param *ie_params)
924{
925 if (ie_params->ie_type == DOT11_HT_IE)
926 wma_process_set_pdev_ht_ie_req(wma, ie_params);
927 if (ie_params->ie_type == DOT11_VHT_IE)
928 wma_process_set_pdev_vht_ie_req(wma, ie_params);
929
930 qdf_mem_free(ie_params->ie_ptr);
931}
932
933/**
934 * wma_process_set_pdev_ht_ie_req() - sends HT IE data to FW
935 * @wma: Pointer to wma handle
936 * @ie_params: Pointer to IE data.
937 * @nss: Nss values to prepare the HT IE.
938 *
939 * Sends the WMI req to set the HT IE to FW.
940 *
941 * Return: None
942 */
943void wma_process_set_pdev_ht_ie_req(tp_wma_handle wma,
944 struct set_ie_param *ie_params)
945{
Dustin Brownfd578602019-02-22 13:52:24 -0800946 QDF_STATUS status;
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -0700947 wmi_pdev_set_ht_ie_cmd_fixed_param *cmd;
948 wmi_buf_t buf;
949 uint16_t len;
950 uint16_t ie_len_pad;
951 uint8_t *buf_ptr;
952
953 len = sizeof(*cmd) + WMI_TLV_HDR_SIZE;
954 ie_len_pad = roundup(ie_params->ie_len, sizeof(uint32_t));
955 len += ie_len_pad;
956
957 buf = wmi_buf_alloc(wma->wmi_handle, len);
Arif Hussain157263f2018-10-03 13:07:15 -0700958 if (!buf)
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -0700959 return;
Arif Hussain157263f2018-10-03 13:07:15 -0700960
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -0700961 cmd = (wmi_pdev_set_ht_ie_cmd_fixed_param *) wmi_buf_data(buf);
962 WMITLV_SET_HDR(&cmd->tlv_header,
963 WMITLV_TAG_STRUC_wmi_pdev_set_ht_ie_cmd_fixed_param,
964 WMITLV_GET_STRUCT_TLVLEN(
965 wmi_pdev_set_ht_ie_cmd_fixed_param));
966 cmd->reserved0 = 0;
967 cmd->ie_len = ie_params->ie_len;
968 cmd->tx_streams = ie_params->nss;
969 cmd->rx_streams = ie_params->nss;
970 WMA_LOGD("Setting pdev HT ie with Nss = %u",
971 ie_params->nss);
972 buf_ptr = (uint8_t *)cmd + sizeof(*cmd);
973 WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_ARRAY_BYTE, ie_len_pad);
974 if (ie_params->ie_len) {
975 qdf_mem_copy(buf_ptr + WMI_TLV_HDR_SIZE,
976 (uint8_t *)ie_params->ie_ptr,
977 ie_params->ie_len);
978 }
Dustin Brownfd578602019-02-22 13:52:24 -0800979
980 status = wmi_unified_cmd_send(wma->wmi_handle, buf, len,
981 WMI_PDEV_SET_HT_CAP_IE_CMDID);
982 if (QDF_IS_STATUS_ERROR(status))
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -0700983 wmi_buf_free(buf);
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -0700984}
985
986/**
987 * wma_process_set_pdev_vht_ie_req() - sends VHT IE data to FW
988 * @wma: Pointer to wma handle
989 * @ie_params: Pointer to IE data.
990 * @nss: Nss values to prepare the VHT IE.
991 *
992 * Sends the WMI req to set the VHT IE to FW.
993 *
994 * Return: None
995 */
996void wma_process_set_pdev_vht_ie_req(tp_wma_handle wma,
997 struct set_ie_param *ie_params)
998{
Dustin Brownfd578602019-02-22 13:52:24 -0800999 QDF_STATUS status;
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -07001000 wmi_pdev_set_vht_ie_cmd_fixed_param *cmd;
1001 wmi_buf_t buf;
1002 uint16_t len;
1003 uint16_t ie_len_pad;
1004 uint8_t *buf_ptr;
1005
1006 len = sizeof(*cmd) + WMI_TLV_HDR_SIZE;
1007 ie_len_pad = roundup(ie_params->ie_len, sizeof(uint32_t));
1008 len += ie_len_pad;
1009
1010 buf = wmi_buf_alloc(wma->wmi_handle, len);
Arif Hussain157263f2018-10-03 13:07:15 -07001011 if (!buf)
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -07001012 return;
Arif Hussain157263f2018-10-03 13:07:15 -07001013
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -07001014 cmd = (wmi_pdev_set_vht_ie_cmd_fixed_param *) wmi_buf_data(buf);
1015 WMITLV_SET_HDR(&cmd->tlv_header,
1016 WMITLV_TAG_STRUC_wmi_pdev_set_vht_ie_cmd_fixed_param,
1017 WMITLV_GET_STRUCT_TLVLEN(
1018 wmi_pdev_set_vht_ie_cmd_fixed_param));
1019 cmd->reserved0 = 0;
1020 cmd->ie_len = ie_params->ie_len;
1021 cmd->tx_streams = ie_params->nss;
1022 cmd->rx_streams = ie_params->nss;
1023 WMA_LOGD("Setting pdev VHT ie with Nss = %u",
1024 ie_params->nss);
1025 buf_ptr = (uint8_t *)cmd + sizeof(*cmd);
1026 WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_ARRAY_BYTE, ie_len_pad);
1027 if (ie_params->ie_len) {
1028 qdf_mem_copy(buf_ptr + WMI_TLV_HDR_SIZE,
1029 (uint8_t *)ie_params->ie_ptr,
1030 ie_params->ie_len);
1031 }
Dustin Brownfd578602019-02-22 13:52:24 -08001032
1033 status = wmi_unified_cmd_send(wma->wmi_handle, buf, len,
1034 WMI_PDEV_SET_VHT_CAP_IE_CMDID);
1035 if (QDF_IS_STATUS_ERROR(status))
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -07001036 wmi_buf_free(buf);
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -07001037}
1038
1039/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001040 * wma_roam_scan_scan_params() - fill roam scan params
1041 * @wma_handle: wma handle
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08001042 * @mac: Mac ptr
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001043 * @scan_params: scan parameters
1044 * @roam_req: NULL if this routine is called before connect
1045 * It will be non-NULL if called after assoc.
1046 *
1047 * Fill scan_params structure from configured parameters
1048 *
1049 * Return: none
1050 */
1051void wma_roam_scan_fill_scan_params(tp_wma_handle wma_handle,
Jeff Johnson9f18aa72018-12-02 12:05:12 -08001052 struct mac_context *mac,
Jeff Johnsone6da4b02019-02-06 22:22:04 -08001053 struct roam_offload_scan_req *roam_req,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001054 wmi_start_scan_cmd_fixed_param *
1055 scan_params)
1056{
1057 uint8_t channels_per_burst = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001058
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07001059 if (!mac) {
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08001060 WMA_LOGE("%s: mac is NULL", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001061 return;
1062 }
1063
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301064 qdf_mem_zero(scan_params, sizeof(wmi_start_scan_cmd_fixed_param));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001065 scan_params->scan_ctrl_flags = WMI_SCAN_ADD_CCK_RATES |
Sreelakshmi Konamki75deb332015-09-14 10:58:03 +05301066 WMI_SCAN_ADD_OFDM_RATES |
1067 WMI_SCAN_ADD_DS_IE_IN_PROBE_REQ;
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07001068 if (roam_req) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001069 /* Parameters updated after association is complete */
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001070 WMA_LOGD("%s: NeighborScanChannelMinTime: %d NeighborScanChannelMaxTime: %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001071 __func__,
1072 roam_req->NeighborScanChannelMinTime,
1073 roam_req->NeighborScanChannelMaxTime);
Sridhar Selvaraj1b2330c2017-07-21 15:16:42 +05301074 WMA_LOGD("%s: NeighborScanTimerPeriod: %d "
1075 "neighbor_scan_min_timer_period %d "
1076 "HomeAwayTime: %d nProbes: %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001077 __func__,
1078 roam_req->NeighborScanTimerPeriod,
Sridhar Selvaraj1b2330c2017-07-21 15:16:42 +05301079 roam_req->neighbor_scan_min_timer_period,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001080 roam_req->HomeAwayTime, roam_req->nProbes);
1081
Abhishek Singh8ebda9db2018-12-18 15:15:01 +05301082 wlan_scan_cfg_get_passive_dwelltime(wma_handle->psoc,
1083 &scan_params->dwell_time_passive);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001084 /*
1085 * Here is the formula,
1086 * T(HomeAway) = N * T(dwell) + (N+1) * T(cs)
1087 * where N is number of channels scanned in single burst
1088 */
1089 scan_params->dwell_time_active =
1090 roam_req->NeighborScanChannelMaxTime;
1091 if (roam_req->HomeAwayTime <
1092 2 * WMA_ROAM_SCAN_CHANNEL_SWITCH_TIME) {
1093 /* clearly we can't follow home away time.
1094 * Make it a split scan.
1095 */
1096 scan_params->burst_duration = 0;
1097 } else {
1098 channels_per_burst =
1099 (roam_req->HomeAwayTime -
1100 WMA_ROAM_SCAN_CHANNEL_SWITCH_TIME)
1101 / (scan_params->dwell_time_active +
1102 WMA_ROAM_SCAN_CHANNEL_SWITCH_TIME);
1103
1104 if (channels_per_burst < 1) {
1105 /* dwell time and home away time conflicts */
1106 /* we will override dwell time */
1107 scan_params->dwell_time_active =
1108 roam_req->HomeAwayTime -
1109 2 * WMA_ROAM_SCAN_CHANNEL_SWITCH_TIME;
1110 scan_params->burst_duration =
1111 scan_params->dwell_time_active;
1112 } else {
1113 scan_params->burst_duration =
1114 channels_per_burst *
1115 scan_params->dwell_time_active;
1116 }
1117 }
1118 if (roam_req->allowDFSChannelRoam ==
1119 SIR_ROAMING_DFS_CHANNEL_ENABLED_NORMAL
1120 && roam_req->HomeAwayTime > 0
1121 && roam_req->ChannelCacheType != CHANNEL_LIST_STATIC) {
1122 /* Roaming on DFS channels is supported and it is not
1123 * app channel list. It is ok to override homeAwayTime
Jeff Johnsonc97816c2018-05-12 17:13:23 -07001124 * to accommodate DFS dwell time in burst
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001125 * duration.
1126 */
1127 scan_params->burst_duration =
Anurag Chouhan6d760662016-02-20 16:05:43 +05301128 QDF_MAX(scan_params->burst_duration,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001129 scan_params->dwell_time_passive);
1130 }
Sridhar Selvaraj1b2330c2017-07-21 15:16:42 +05301131 scan_params->min_rest_time =
1132 roam_req->neighbor_scan_min_timer_period;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001133 scan_params->max_rest_time = roam_req->NeighborScanTimerPeriod;
1134 scan_params->repeat_probe_time = (roam_req->nProbes > 0) ?
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001135 QDF_MAX(scan_params->dwell_time_active /
1136 roam_req->nProbes, 1) : 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001137 scan_params->probe_spacing_time = 0;
1138 scan_params->probe_delay = 0;
1139 /* 30 seconds for full scan cycle */
1140 scan_params->max_scan_time = WMA_HW_DEF_SCAN_MAX_DURATION;
1141 scan_params->idle_time = scan_params->min_rest_time;
1142 scan_params->n_probes = roam_req->nProbes;
1143 if (roam_req->allowDFSChannelRoam ==
1144 SIR_ROAMING_DFS_CHANNEL_DISABLED) {
1145 scan_params->scan_ctrl_flags |= WMI_SCAN_BYPASS_DFS_CHN;
1146 } else {
1147 /* Roaming scan on DFS channel is allowed.
1148 * No need to change any flags for default
1149 * allowDFSChannelRoam = 1.
1150 * Special case where static channel list is given by\
1151 * application that contains DFS channels.
1152 * Assume that the application has knowledge of matching
1153 * APs being active and that probe request transmission
1154 * is permitted on those channel.
1155 * Force active scans on those channels.
1156 */
1157
1158 if (roam_req->allowDFSChannelRoam ==
1159 SIR_ROAMING_DFS_CHANNEL_ENABLED_ACTIVE &&
1160 roam_req->ChannelCacheType == CHANNEL_LIST_STATIC &&
1161 roam_req->ConnectedNetwork.ChannelCount > 0) {
1162 scan_params->scan_ctrl_flags |=
1163 WMI_SCAN_FLAG_FORCE_ACTIVE_ON_DFS;
1164 }
1165 }
Gupta, Kapil96c7f2f2016-04-25 19:13:41 +05301166 WMI_SCAN_SET_DWELL_MODE(scan_params->scan_ctrl_flags,
1167 roam_req->roamscan_adaptive_dwell_mode);
1168
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001169 } else {
1170 /* roam_req = NULL during initial or pre-assoc invocation */
1171 scan_params->dwell_time_active =
1172 WMA_ROAM_DWELL_TIME_ACTIVE_DEFAULT;
1173 scan_params->dwell_time_passive =
1174 WMA_ROAM_DWELL_TIME_PASSIVE_DEFAULT;
1175 scan_params->min_rest_time = WMA_ROAM_MIN_REST_TIME_DEFAULT;
1176 scan_params->max_rest_time = WMA_ROAM_MAX_REST_TIME_DEFAULT;
1177 scan_params->repeat_probe_time = 0;
1178 scan_params->probe_spacing_time = 0;
1179 scan_params->probe_delay = 0;
1180 scan_params->max_scan_time = WMA_HW_DEF_SCAN_MAX_DURATION;
1181 scan_params->idle_time = scan_params->min_rest_time;
1182 scan_params->burst_duration = 0;
1183 scan_params->n_probes = 0;
1184 }
1185
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001186 WMA_LOGD("%s: Rome roam scan parameters: dwell_time_active = %d, dwell_time_passive = %d",
1187 __func__, scan_params->dwell_time_active,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001188 scan_params->dwell_time_passive);
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001189 WMA_LOGD("%s: min_rest_time = %d, max_rest_time = %d, repeat_probe_time = %d n_probes = %d",
1190 __func__, scan_params->min_rest_time,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001191 scan_params->max_rest_time,
1192 scan_params->repeat_probe_time, scan_params->n_probes);
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001193 WMA_LOGD("%s: max_scan_time = %d, idle_time = %d, burst_duration = %d, scan_ctrl_flags = 0x%x",
1194 __func__, scan_params->max_scan_time, scan_params->idle_time,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001195 scan_params->burst_duration, scan_params->scan_ctrl_flags);
1196}
1197
1198/**
1199 * wma_roam_scan_offload_ap_profile() - set roam ap profile in fw
1200 * @wma_handle: wma handle
Himanshu Agarwal8bcec572017-09-28 11:54:37 +05301201 * @mac_ctx: Mac ptr
1202 * @roam_req: Request which contains the ap profile
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001203 *
1204 * Send WMI_ROAM_AP_PROFILE to firmware
1205 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05301206 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001207 */
Himanshu Agarwal8bcec572017-09-28 11:54:37 +05301208static QDF_STATUS wma_roam_scan_offload_ap_profile(tp_wma_handle wma_handle,
Jeff Johnsone6da4b02019-02-06 22:22:04 -08001209 struct roam_offload_scan_req *roam_req)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001210{
Himanshu Agarwal8bcec572017-09-28 11:54:37 +05301211 struct ap_profile_params ap_profile;
Yeshwanth Sriram Guntukaadfeade2018-12-28 15:39:16 +05301212 bool db2dbm_enabled;
Himanshu Agarwal8bcec572017-09-28 11:54:37 +05301213
Pragaspathi Thilagarajecb60732018-11-02 12:26:24 +05301214 if (!wma_is_vdev_valid(roam_req->sessionId)) {
1215 WMA_LOGE("%s: Invalid vdev id:%d", __func__,
1216 roam_req->sessionId);
1217 return QDF_STATUS_E_FAILURE;
1218 }
Himanshu Agarwal8bcec572017-09-28 11:54:37 +05301219 ap_profile.vdev_id = roam_req->sessionId;
1220 wma_roam_scan_fill_ap_profile(roam_req, &ap_profile.profile);
Yeshwanth Sriram Guntukaadfeade2018-12-28 15:39:16 +05301221
1222 db2dbm_enabled = wmi_service_enabled(wma_handle->wmi_handle,
1223 wmi_service_hw_db2dbm_support);
1224 if (!ap_profile.profile.rssi_abs_thresh) {
1225 if (db2dbm_enabled)
1226 ap_profile.profile.rssi_abs_thresh = WMA_RSSI_MIN_VALUE;
1227 } else {
1228 if (!db2dbm_enabled)
1229 ap_profile.profile.rssi_abs_thresh -=
Yeshwanth Sriram Guntuka14ab04c2018-09-21 15:06:49 +05301230 WMA_NOISE_FLOOR_DBM_DEFAULT;
Yeshwanth Sriram Guntukaadfeade2018-12-28 15:39:16 +05301231 }
Himanshu Agarwal8bcec572017-09-28 11:54:37 +05301232 ap_profile.param = roam_req->score_params;
Pragaspathi Thilagaraj2b8ea352019-04-12 02:23:50 +05301233 ap_profile.min_rssi_params[DEAUTH_MIN_RSSI] =
1234 roam_req->min_rssi_params[DEAUTH_MIN_RSSI];
1235 ap_profile.min_rssi_params[BMISS_MIN_RSSI] =
1236 roam_req->min_rssi_params[BMISS_MIN_RSSI];
1237
1238 ap_profile.score_delta_param[IDLE_ROAM_TRIGGER] =
1239 roam_req->score_delta_param[IDLE_ROAM_TRIGGER];
1240 ap_profile.score_delta_param[BTM_ROAM_TRIGGER] =
1241 roam_req->score_delta_param[BTM_ROAM_TRIGGER];
1242
Govind Singh64b5e112016-03-08 11:53:50 +05301243 return wmi_unified_send_roam_scan_offload_ap_cmd(wma_handle->wmi_handle,
Himanshu Agarwal8bcec572017-09-28 11:54:37 +05301244 &ap_profile);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001245}
1246
1247/**
1248 * wma_roam_scan_filter() - Filter to be applied while roaming
1249 * @wma_handle: Global WMA Handle
1250 * @roam_req: Request which contains the filters
1251 *
1252 * There are filters such as whitelist, blacklist and preferred
1253 * list that need to be applied to the scan results to form the
1254 * probable candidates for roaming.
1255 *
Jeff Johnson3370f3a2018-05-11 09:54:12 -07001256 * Return: Return success upon successfully passing the
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001257 * parameters to the firmware, otherwise failure.
1258 */
Jeff Johnsonc4b47a92016-10-07 12:34:41 -07001259static QDF_STATUS wma_roam_scan_filter(tp_wma_handle wma_handle,
Jeff Johnsone6da4b02019-02-06 22:22:04 -08001260 struct roam_offload_scan_req *roam_req)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001261{
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05301262 int i;
1263 QDF_STATUS status = QDF_STATUS_SUCCESS;
Abhishek Singh2e1a11a2017-07-06 11:24:11 +05301264 uint32_t num_bssid_black_list = 0, num_ssid_white_list = 0,
Abhishek Singh4db8c152017-07-18 10:40:08 +05301265 num_bssid_preferred_list = 0, num_rssi_rejection_ap = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001266 uint32_t op_bitmap = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001267 struct roam_ext_params *roam_params;
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05301268 struct roam_scan_filter_params *params;
Selvaraj, Sridhar57ce4df2017-05-29 18:30:49 +05301269 struct lca_disallow_config_params *lca_config_params;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001270
Pragaspathi Thilagarajecb60732018-11-02 12:26:24 +05301271 if (!wma_is_vdev_valid(roam_req->sessionId)) {
1272 WMA_LOGE("%s: Invalid vdev id:%d", __func__,
1273 roam_req->sessionId);
1274 return QDF_STATUS_E_FAILURE;
1275 }
1276
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05301277 params = qdf_mem_malloc(sizeof(struct roam_scan_filter_params));
Arif Hussain157263f2018-10-03 13:07:15 -07001278 if (!params)
Naveen Rawat35804772016-06-27 15:40:28 -07001279 return QDF_STATUS_E_NOMEM;
Naveen Rawat35804772016-06-27 15:40:28 -07001280
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001281 roam_params = &roam_req->roam_params;
Selvaraj, Sridhar57ce4df2017-05-29 18:30:49 +05301282 lca_config_params = &roam_req->lca_config_params;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001283 if (roam_req->Command != ROAM_SCAN_OFFLOAD_STOP) {
1284 switch (roam_req->reason) {
1285 case REASON_ROAM_SET_BLACKLIST_BSSID:
1286 op_bitmap |= 0x1;
1287 num_bssid_black_list =
1288 roam_params->num_bssid_avoid_list;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001289 break;
1290 case REASON_ROAM_SET_SSID_ALLOWED:
1291 op_bitmap |= 0x2;
1292 num_ssid_white_list =
1293 roam_params->num_ssid_allowed_list;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001294 break;
1295 case REASON_ROAM_SET_FAVORED_BSSID:
1296 op_bitmap |= 0x4;
1297 num_bssid_preferred_list =
1298 roam_params->num_bssid_favored;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001299 break;
Selvaraj, Sridhar57ce4df2017-05-29 18:30:49 +05301300 case REASON_CTX_INIT:
1301 if (roam_req->Command == ROAM_SCAN_OFFLOAD_START) {
1302 params->lca_disallow_config_present = true;
Abhishek Singh4db8c152017-07-18 10:40:08 +05301303 op_bitmap |=
1304 ROAM_FILTER_OP_BITMAP_LCA_DISALLOW |
1305 ROAM_FILTER_OP_BITMAP_RSSI_REJECTION_OCE;
1306 num_rssi_rejection_ap =
1307 roam_params->num_rssi_rejection_ap;
Selvaraj, Sridhar57ce4df2017-05-29 18:30:49 +05301308 } else {
1309 WMA_LOGD("%s : Roam Filter need not be sent", __func__);
1310 qdf_mem_free(params);
1311 return QDF_STATUS_SUCCESS;
1312 }
1313 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001314 default:
1315 WMA_LOGD("%s : Roam Filter need not be sent", __func__);
Arif Hussaina915f492016-07-29 15:29:42 -07001316 qdf_mem_free(params);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301317 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001318 }
1319 } else {
1320 /* In case of STOP command, reset all the variables
1321 * except for blacklist BSSID which should be retained
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001322 * across connections.
1323 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001324 op_bitmap = 0x2 | 0x4;
1325 num_ssid_white_list = roam_params->num_ssid_allowed_list;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001326 num_bssid_preferred_list = roam_params->num_bssid_favored;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001327 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001328
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001329 /* fill in fixed values */
Jeff Johnsonc060ac42019-02-28 12:23:18 -08001330 params->vdev_id = roam_req->sessionId;
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05301331 params->op_bitmap = op_bitmap;
1332 params->num_bssid_black_list = num_bssid_black_list;
1333 params->num_ssid_white_list = num_ssid_white_list;
1334 params->num_bssid_preferred_list = num_bssid_preferred_list;
Abhishek Singh4db8c152017-07-18 10:40:08 +05301335 params->num_rssi_rejection_ap = num_rssi_rejection_ap;
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05301336 qdf_mem_copy(params->bssid_avoid_list, roam_params->bssid_avoid_list,
1337 MAX_BSSID_AVOID_LIST * sizeof(struct qdf_mac_addr));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001338
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001339 for (i = 0; i < num_ssid_white_list; i++) {
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05301340 qdf_mem_copy(params->ssid_allowed_list[i].mac_ssid,
1341 roam_params->ssid_allowed_list[i].ssId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001342 roam_params->ssid_allowed_list[i].length);
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05301343 params->ssid_allowed_list[i].length =
1344 roam_params->ssid_allowed_list[i].length;
1345 WMA_LOGD("%s: SSID length=%d", __func__,
1346 params->ssid_allowed_list[i].length);
1347 qdf_trace_hex_dump(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_DEBUG,
1348 (uint8_t *)params->ssid_allowed_list[i].mac_ssid,
1349 params->ssid_allowed_list[i].length);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001350 }
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05301351 qdf_mem_copy(params->bssid_favored, roam_params->bssid_favored,
1352 MAX_BSSID_FAVORED * sizeof(struct qdf_mac_addr));
1353 qdf_mem_copy(params->bssid_favored_factor,
1354 roam_params->bssid_favored_factor, MAX_BSSID_FAVORED);
Abhishek Singh4db8c152017-07-18 10:40:08 +05301355 qdf_mem_copy(params->rssi_rejection_ap,
gaurank kathpalia3ebc17b2019-05-29 10:25:09 +05301356 roam_params->rssi_reject_bssid_list,
Abhishek Singh4db8c152017-07-18 10:40:08 +05301357 MAX_RSSI_AVOID_BSSID_LIST *
gaurank kathpalia3ebc17b2019-05-29 10:25:09 +05301358 sizeof(struct reject_ap_config_params));
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05301359
Selvaraj, Sridhar57ce4df2017-05-29 18:30:49 +05301360 if (params->lca_disallow_config_present) {
1361 params->disallow_duration
1362 = lca_config_params->disallow_duration;
1363 params->rssi_channel_penalization
1364 = lca_config_params->rssi_channel_penalization;
1365 params->num_disallowed_aps
1366 = lca_config_params->num_disallowed_aps;
1367 }
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05301368 status = wmi_unified_roam_scan_filter_cmd(wma_handle->wmi_handle,
Jeff Johnsonc060ac42019-02-28 12:23:18 -08001369 params);
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05301370
1371 qdf_mem_free(params);
1372 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001373}
1374
1375/**
1376 * wma_roam_scan_bmiss_cnt() - set bmiss count to fw
1377 * @wma_handle: wma handle
1378 * @first_bcnt: first bmiss count
1379 * @final_bcnt: final bmiss count
1380 * @vdev_id: vdev id
1381 *
1382 * set first & final biss count to fw.
1383 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05301384 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001385 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301386QDF_STATUS wma_roam_scan_bmiss_cnt(tp_wma_handle wma_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001387 A_INT32 first_bcnt,
1388 A_UINT32 final_bcnt, uint32_t vdev_id)
1389{
Govind Singhd76a5b02016-03-08 15:12:14 +05301390 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001391
Srinivas Girigowdaf1472122017-03-09 15:44:12 -08001392 WMA_LOGD("%s: first_bcnt: %d, final_bcnt: %d", __func__, first_bcnt,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001393 final_bcnt);
1394
Govind Singhd76a5b02016-03-08 15:12:14 +05301395 status = wma_vdev_set_param(wma_handle->wmi_handle,
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001396 vdev_id, WMI_VDEV_PARAM_BMISS_FIRST_BCNT,
1397 first_bcnt);
Govind Singhd76a5b02016-03-08 15:12:14 +05301398 if (QDF_IS_STATUS_ERROR(status)) {
1399 WMA_LOGE("wma_vdev_set_param WMI_VDEV_PARAM_BMISS_FIRST_BCNT returned Error %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001400 status);
Govind Singhd76a5b02016-03-08 15:12:14 +05301401 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001402 }
1403
Govind Singhd76a5b02016-03-08 15:12:14 +05301404 status = wma_vdev_set_param(wma_handle->wmi_handle,
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001405 vdev_id, WMI_VDEV_PARAM_BMISS_FINAL_BCNT,
1406 final_bcnt);
Govind Singhd76a5b02016-03-08 15:12:14 +05301407 if (QDF_IS_STATUS_ERROR(status)) {
1408 WMA_LOGE("wma_vdev_set_param WMI_VDEV_PARAM_BMISS_FINAL_BCNT returned Error %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001409 status);
Govind Singhd76a5b02016-03-08 15:12:14 +05301410 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001411 }
1412
Govind Singhd76a5b02016-03-08 15:12:14 +05301413 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001414}
1415
1416/**
1417 * wma_roam_scan_offload_command() - set roam offload command
1418 * @wma_handle: wma handle
1419 * @command: command
1420 * @vdev_id: vdev id
1421 *
1422 * This function set roam offload command to fw.
1423 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05301424 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001425 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301426QDF_STATUS wma_roam_scan_offload_command(tp_wma_handle wma_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001427 uint32_t command, uint32_t vdev_id)
1428{
Pragaspathi Thilagarajecb60732018-11-02 12:26:24 +05301429 if (!wma_is_vdev_valid(vdev_id)) {
1430 WMA_LOGE("%s: Invalid vdev id:%d", __func__, vdev_id);
1431 return QDF_STATUS_E_FAILURE;
1432 }
1433
Govind Singh64b5e112016-03-08 11:53:50 +05301434 return wmi_unified_roam_scan_offload_cmd(wma_handle->wmi_handle,
Pragaspathi Thilagarajecb60732018-11-02 12:26:24 +05301435 command, vdev_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001436}
1437
1438/**
yeshwanth sriram guntuka41f936c2017-09-01 17:53:49 +05301439 * wma_roam_scan_btm_offload() - Send BTM offload config
1440 * @wma_handle: wma handle
1441 * @roam_req: roam request parameters
1442 *
1443 * This function is used to send BTM offload config to fw
1444 *
1445 * Return: QDF status
1446 */
Jeff Johnsone6da4b02019-02-06 22:22:04 -08001447static QDF_STATUS
1448wma_roam_scan_btm_offload(tp_wma_handle wma_handle,
1449 struct roam_offload_scan_req *roam_req)
yeshwanth sriram guntuka41f936c2017-09-01 17:53:49 +05301450{
1451 struct wmi_btm_config *params;
1452 QDF_STATUS status;
1453
1454 params = qdf_mem_malloc(sizeof(struct wmi_btm_config));
Arif Hussain157263f2018-10-03 13:07:15 -07001455 if (!params)
yeshwanth sriram guntuka41f936c2017-09-01 17:53:49 +05301456 return QDF_STATUS_E_FAILURE;
yeshwanth sriram guntuka41f936c2017-09-01 17:53:49 +05301457
1458 params->vdev_id = roam_req->sessionId;
1459 params->btm_offload_config = roam_req->btm_offload_config;
Jiachao Wu84bb2ea2018-01-08 16:17:33 +08001460 params->btm_solicited_timeout = roam_req->btm_solicited_timeout;
1461 params->btm_max_attempt_cnt = roam_req->btm_max_attempt_cnt;
1462 params->btm_sticky_time = roam_req->btm_sticky_time;
Pragaspathi Thilagarajae7dc762018-12-12 18:10:50 +05301463 params->disassoc_timer_threshold = roam_req->disassoc_timer_threshold;
Abhinav Kumar43565942019-03-02 01:34:12 +05301464 params->btm_query_bitmask = roam_req->btm_query_bitmask;
Pragaspathi Thilagaraj2b8ea352019-04-12 02:23:50 +05301465 params->btm_candidate_min_score =
1466 roam_req->btm_trig_min_candidate_score;
Vignesh Viswanathana3d5c272018-06-04 19:36:02 +05301467
Pragaspathi Thilagaraj2b8ea352019-04-12 02:23:50 +05301468 WMA_LOGD("%s: vdev %u btm_offload:%u btm_query_bitmask:%u btm_candidate_min_score:%d",
Abhinav Kumar43565942019-03-02 01:34:12 +05301469 __func__, params->vdev_id, params->btm_offload_config,
Pragaspathi Thilagaraj2b8ea352019-04-12 02:23:50 +05301470 params->btm_query_bitmask, params->btm_candidate_min_score);
Vignesh Viswanathana3d5c272018-06-04 19:36:02 +05301471
yeshwanth sriram guntuka41f936c2017-09-01 17:53:49 +05301472 status = wmi_unified_send_btm_config(wma_handle->wmi_handle, params);
1473 qdf_mem_free(params);
1474
1475 return status;
1476}
1477
1478/**
Pragaspathi Thilagaraj69f0b692018-12-16 22:23:04 +05301479 * wma_send_roam_bss_load_config() - API to send load bss trigger
1480 * related parameters to fw
Pragaspathi Thilagaraj69f0b692018-12-16 22:23:04 +05301481 * @handle: WMA handle
1482 * @roam_req: bss load config parameters from csr to be sent to fw
1483 *
1484 * Return: None
1485 */
1486static
1487void wma_send_roam_bss_load_config(WMA_HANDLE handle,
1488 struct wmi_bss_load_config *params)
1489{
1490 QDF_STATUS status;
1491 tp_wma_handle wma_handle = (tp_wma_handle) handle;
1492
1493 if (!wma_handle || !wma_handle->wmi_handle) {
1494 WMA_LOGE("WMA is closed, cannot send bss load config");
1495 return;
1496 }
1497
Pragaspathi Thilagaraj39d61602018-12-24 14:46:53 +05301498 WMA_LOGD("%s: Sending bss load trig params vdev %u bss_load_threshold %u bss_load_sample_time: %u",
1499 __func__, params->vdev_id, params->bss_load_threshold,
1500 params->bss_load_sample_time);
Pragaspathi Thilagaraj69f0b692018-12-16 22:23:04 +05301501
1502 status = wmi_unified_send_bss_load_config(wma_handle->wmi_handle,
1503 params);
1504 if (QDF_IS_STATUS_ERROR(status))
1505 WMA_LOGE("failed to send bss load trigger config command");
1506}
1507
1508/**
Vignesh Viswanathanfb9d0752018-02-06 16:19:00 +05301509 * wma_send_offload_11k_params() - API to send 11k offload params to FW
1510 * @handle: WMA handle
1511 * @params: Pointer to 11k offload params
1512 *
1513 * Return: None
1514 */
1515static
1516QDF_STATUS wma_send_offload_11k_params(WMA_HANDLE handle,
1517 struct wmi_11k_offload_params *params)
1518{
1519 QDF_STATUS status;
1520 tp_wma_handle wma_handle = (tp_wma_handle) handle;
1521
1522 if (!wma_handle || !wma_handle->wmi_handle) {
1523 WMA_LOGE("%s: WMA is closed, cannot send 11k offload cmd",
1524 __func__);
1525 return QDF_STATUS_E_FAILURE;
1526 }
1527
Vignesh Viswanathanb58161c2018-06-07 16:39:46 +05301528 if (!wmi_service_enabled(wma_handle->wmi_handle,
1529 wmi_service_11k_neighbour_report_support)) {
1530 WMA_LOGE(FL("FW doesn't support 11k offload"));
Vignesh Viswanathanfb9d0752018-02-06 16:19:00 +05301531 return QDF_STATUS_E_NOSUPPORT;
1532 }
1533
Vignesh Viswanathane25af782018-03-23 14:49:50 +05301534 /*
1535 * If 11k enable command and ssid length is 0, drop it
1536 */
1537 if (params->offload_11k_bitmask &&
1538 !params->neighbor_report_params.ssid.length) {
Vignesh Viswanathanfb9d0752018-02-06 16:19:00 +05301539 WMA_LOGD("%s: SSID Len 0", __func__);
1540 return QDF_STATUS_E_INVAL;
1541 }
1542
1543 status = wmi_unified_offload_11k_cmd(wma_handle->wmi_handle, params);
1544
1545 if (status != QDF_STATUS_SUCCESS)
1546 WMA_LOGE("failed to send 11k offload command");
1547
1548 return status;
1549}
1550
Pragaspathi Thilagaraj4f529f22019-03-31 16:53:17 +05301551#ifdef WLAN_FEATURE_ROAM_OFFLOAD
1552/**
1553 * wma_send_disconnect_roam_params() - Send the disconnect roam parameters
1554 * to wmi
1555 * @handle: WMA handle
1556 * @roam_req: Pointer to roam_offload_scan_req sent from CSR
1557 *
1558 * Return: None
1559 */
1560static void
1561wma_send_disconnect_roam_params(tp_wma_handle wma_handle,
1562 struct roam_offload_scan_req *roam_req)
1563{
1564 QDF_STATUS status;
1565 struct wmi_disconnect_roam_params *params =
1566 &roam_req->disconnect_roam_params;
1567
1568 if (!wma_handle || !wma_handle->wmi_handle) {
1569 WMA_LOGE("WMA is closed, cannot send disconnect roam params");
1570 return;
1571 }
1572
1573 switch (roam_req->Command) {
1574 case ROAM_SCAN_OFFLOAD_START:
1575 case ROAM_SCAN_OFFLOAD_UPDATE_CFG:
1576 if (!params->enable)
1577 return;
Pragaspathi Thilagarajb0176502019-04-26 02:33:13 +05301578 break;
Pragaspathi Thilagaraj4f529f22019-03-31 16:53:17 +05301579 case ROAM_SCAN_OFFLOAD_STOP:
1580 params->enable = false;
1581 break;
1582 default:
1583 break;
1584 }
1585
1586 status = wmi_unified_send_disconnect_roam_params(wma_handle->wmi_handle,
1587 params);
1588 if (QDF_IS_STATUS_ERROR(status))
1589 WMA_LOGE("failed to send disconnect roam parameters");
1590}
1591
1592/**
1593 * wma_send_idle_roam_params() - Send the idle roam parameters to wmi
1594 * @handle: WMA handle
1595 * @roam_req: Pointer to roam_offload_scan_req sent from CSR
1596 *
1597 * Return: None
1598 */
1599static void
1600wma_send_idle_roam_params(tp_wma_handle wma_handle,
1601 struct roam_offload_scan_req *roam_req)
1602{
1603 QDF_STATUS status;
1604
1605 if (!wma_handle || !wma_handle->wmi_handle) {
1606 WMA_LOGE("WMA is closed, cannot send idle roam params");
1607 return;
1608 }
1609
1610 switch (roam_req->Command) {
1611 case ROAM_SCAN_OFFLOAD_START:
1612 case ROAM_SCAN_OFFLOAD_UPDATE_CFG:
1613 if (!roam_req->idle_roam_params.enable)
1614 return;
Pragaspathi Thilagarajb0176502019-04-26 02:33:13 +05301615 break;
Pragaspathi Thilagaraj4f529f22019-03-31 16:53:17 +05301616 case ROAM_SCAN_OFFLOAD_STOP:
1617 roam_req->idle_roam_params.enable = false;
1618 break;
1619 default:
1620 break;
1621 }
1622
1623 status = wmi_unified_send_idle_roam_params(wma_handle->wmi_handle,
1624 &roam_req->idle_roam_params);
1625 if (QDF_IS_STATUS_ERROR(status))
1626 WMA_LOGE("failed to send idle roam parameters");
1627}
1628
1629#else
1630static inline void
1631wma_send_disconnect_roam_params(tp_wma_handle wma_handle,
1632 struct roam_offload_scan_req *roam_req)
1633{}
1634
1635static inline void
1636wma_send_idle_roam_params(tp_wma_handle wma_handle,
1637 struct roam_offload_scan_req *roam_req)
1638{}
1639#endif
1640
Vignesh Viswanathanfb9d0752018-02-06 16:19:00 +05301641/**
Varun Reddy Yeturu30bc42c2016-02-04 10:07:30 -08001642 * wma_process_roaming_config() - process roam request
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001643 * @wma_handle: wma handle
1644 * @roam_req: roam request parameters
1645 *
1646 * Main routine to handle ROAM commands coming from CSR module.
1647 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05301648 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001649 */
Varun Reddy Yeturu30bc42c2016-02-04 10:07:30 -08001650QDF_STATUS wma_process_roaming_config(tp_wma_handle wma_handle,
Jeff Johnsone6da4b02019-02-06 22:22:04 -08001651 struct roam_offload_scan_req *roam_req)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001652{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301653 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001654 wmi_start_scan_cmd_fixed_param scan_params;
Jeff Johnson9f18aa72018-12-02 12:05:12 -08001655 struct mac_context *mac = cds_get_context(QDF_MODULE_ID_PE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001656 uint32_t mode = 0;
1657 struct wma_txrx_node *intr = NULL;
Pragaspathi Thilagaraj69f0b692018-12-16 22:23:04 +05301658 struct wmi_bss_load_config *bss_load_cfg;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001659
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07001660 if (!mac) {
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08001661 WMA_LOGE("%s: mac is NULL", __func__);
gaurank kathpalia6d25c972019-03-07 20:25:28 +05301662 qdf_mem_zero(roam_req, sizeof(*roam_req));
Selvaraj, Sridhar8fe6c672017-01-10 11:37:29 +05301663 qdf_mem_free(roam_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301664 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001665 }
1666
Wu Gao8cd29482018-12-14 15:11:50 +08001667 if (!wma_handle->interfaces[roam_req->sessionId].roam_offload_enabled) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001668 /* roam scan offload is not enabled in firmware.
1669 * Cannot initialize it in the middle of connection.
1670 */
gaurank kathpalia6d25c972019-03-07 20:25:28 +05301671 qdf_mem_zero(roam_req, sizeof(*roam_req));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301672 qdf_mem_free(roam_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301673 return QDF_STATUS_E_PERM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001674 }
Liangwei Dongd108cf22018-08-30 03:41:57 -04001675 WMA_LOGD("%s: RSO Command:%d, reason:%d session ID %d en %d", __func__,
1676 roam_req->Command, roam_req->reason, roam_req->sessionId,
1677 roam_req->RoamScanOffloadEnabled);
Varun Reddy Yeturu30bc42c2016-02-04 10:07:30 -08001678 wma_handle->interfaces[roam_req->sessionId].roaming_in_progress = false;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001679 switch (roam_req->Command) {
1680 case ROAM_SCAN_OFFLOAD_START:
1681 intr = &wma_handle->interfaces[roam_req->sessionId];
1682 intr->delay_before_vdev_stop = roam_req->delay_before_vdev_stop;
1683 /*
Jeff Johnsone6da4b02019-02-06 22:22:04 -08001684 * Scan/Roam threshold parameters are translated from
1685 * fields of struct roam_offload_scan_req to WMITLV
1686 * values sent to Rome firmware some of these
1687 * parameters are configurable in qcom_cfg.ini
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001688 */
1689
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001690 /* First param is positive rssi value to trigger rssi based scan
1691 * Opportunistic scan is started at 30dB > trigger rssi.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001692 */
1693 wma_handle->suitable_ap_hb_failure = false;
1694
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301695 qdf_status = wma_roam_scan_offload_rssi_thresh(wma_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001696 roam_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301697 if (qdf_status != QDF_STATUS_SUCCESS)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001698 break;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301699 qdf_status = wma_roam_scan_bmiss_cnt(wma_handle,
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001700 roam_req->RoamBmissFirstBcnt,
1701 roam_req->RoamBmissFinalBcnt,
1702 roam_req->sessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301703 if (qdf_status != QDF_STATUS_SUCCESS)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001704 break;
1705
1706 /* Opportunistic scan runs on a timer, value set by
1707 * EmptyRefreshScanPeriod. Age out the entries after 3 such
1708 * cycles.
1709 */
1710 if (roam_req->EmptyRefreshScanPeriod > 0) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301711 qdf_status =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001712 wma_roam_scan_offload_scan_period(wma_handle,
Pragaspathi Thilagaraj2b8ea352019-04-12 02:23:50 +05301713 roam_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301714 if (qdf_status != QDF_STATUS_SUCCESS)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001715 break;
1716
1717 mode = WMI_ROAM_SCAN_MODE_PERIODIC;
1718 /* Don't use rssi triggered roam scans if external app
1719 * is in control of channel list.
1720 */
Abhinav Kumaredd1d372018-05-11 15:33:35 +05301721 if (roam_req->ChannelCacheType != CHANNEL_LIST_STATIC ||
1722 roam_req->roam_force_rssi_trigger)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001723 mode |= WMI_ROAM_SCAN_MODE_RSSI_CHANGE;
1724
1725 } else {
1726 mode = WMI_ROAM_SCAN_MODE_RSSI_CHANGE;
1727 }
1728
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001729 /* Start new rssi triggered scan only if it changes by
1730 * RoamRssiDiff value. Beacon weight of 14 means average rssi
1731 * is taken over 14 previous samples + 2 times the current
1732 * beacon's rssi.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001733 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301734 qdf_status = wma_roam_scan_offload_rssi_change(wma_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001735 roam_req->sessionId,
1736 roam_req->RoamRescanRssiDiff,
1737 roam_req->RoamBeaconRssiWeight,
1738 roam_req->hi_rssi_scan_delay);
1739
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301740 if (qdf_status != QDF_STATUS_SUCCESS)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001741 break;
1742
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301743 qdf_status = wma_roam_scan_offload_ap_profile(wma_handle,
Himanshu Agarwal8bcec572017-09-28 11:54:37 +05301744 roam_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301745 if (qdf_status != QDF_STATUS_SUCCESS)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001746 break;
1747
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301748 qdf_status = wma_roam_scan_offload_chan_list(wma_handle,
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001749 roam_req->ConnectedNetwork.ChannelCount,
1750 &roam_req->ConnectedNetwork.ChannelCache[0],
1751 roam_req->ChannelCacheType,
1752 roam_req->sessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301753 if ((qdf_status != QDF_STATUS_SUCCESS) &&
1754 (qdf_status != QDF_STATUS_E_EMPTY))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001755 break;
1756
1757
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08001758 wma_roam_scan_fill_scan_params(wma_handle, mac, roam_req,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001759 &scan_params);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301760 qdf_status =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001761 wma_roam_scan_offload_mode(wma_handle, &scan_params,
1762 roam_req, mode,
1763 roam_req->sessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301764 if (qdf_status != QDF_STATUS_SUCCESS)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001765 break;
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05301766 if (wmi_service_enabled(wma_handle->wmi_handle,
1767 wmi_service_mawc_support)) {
Varun Reddy Yeturu62c32652017-10-26 15:32:35 -07001768 qdf_status =
1769 wma_roam_scan_mawc_params(wma_handle, roam_req);
1770 if (qdf_status != QDF_STATUS_SUCCESS) {
1771 WMA_LOGE("Sending roaming MAWC params failed");
1772 break;
1773 }
1774 } else {
1775 WMA_LOGD("MAWC roaming not supported by firmware");
Varun Reddy Yeturu061d4d62017-07-20 09:39:32 -07001776 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301777 qdf_status = wma_roam_scan_filter(wma_handle, roam_req);
1778 if (qdf_status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001779 WMA_LOGE("Sending start for roam scan filter failed");
1780 break;
1781 }
yeshwanth sriram guntuka41f936c2017-09-01 17:53:49 +05301782 qdf_status = wma_roam_scan_btm_offload(wma_handle, roam_req);
1783 if (qdf_status != QDF_STATUS_SUCCESS) {
1784 WMA_LOGE("Sending BTM config to fw failed");
1785 break;
1786 }
Vignesh Viswanathanfb9d0752018-02-06 16:19:00 +05301787
Vignesh Viswanathane25af782018-03-23 14:49:50 +05301788 /*
Pragaspathi Thilagaraj39d61602018-12-24 14:46:53 +05301789 * Send 11k offload enable and bss load trigger parameters
1790 * to FW as part of RSO Start
Vignesh Viswanathane25af782018-03-23 14:49:50 +05301791 */
Vignesh Viswanathanfb9d0752018-02-06 16:19:00 +05301792 if (roam_req->reason == REASON_CTX_INIT) {
1793 qdf_status = wma_send_offload_11k_params(wma_handle,
1794 &roam_req->offload_11k_params);
1795 if (qdf_status != QDF_STATUS_SUCCESS) {
Vignesh Viswanathane25af782018-03-23 14:49:50 +05301796 WMA_LOGE("11k offload enable not sent, status %d",
Vignesh Viswanathanfb9d0752018-02-06 16:19:00 +05301797 qdf_status);
1798 break;
1799 }
Pragaspathi Thilagaraj69f0b692018-12-16 22:23:04 +05301800
Pragaspathi Thilagaraj39d61602018-12-24 14:46:53 +05301801 if (roam_req->bss_load_trig_enabled) {
1802 bss_load_cfg = &roam_req->bss_load_config;
1803 wma_send_roam_bss_load_config(wma_handle,
1804 bss_load_cfg);
1805 }
Pragaspathi Thilagaraj69f0b692018-12-16 22:23:04 +05301806 }
Pragaspathi Thilagaraj4f529f22019-03-31 16:53:17 +05301807
1808 wma_send_disconnect_roam_params(wma_handle, roam_req);
1809 wma_send_idle_roam_params(wma_handle, roam_req);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001810 break;
1811
1812 case ROAM_SCAN_OFFLOAD_STOP:
Varun Reddy Yeturu06488012017-05-25 11:44:10 -07001813 /*
1814 * If roam synch propagation is in progress and an user space
1815 * disconnect is requested, then there is no need to send the
1816 * RSO STOP to firmware, since the roaming is already complete.
1817 * If the RSO STOP is sent to firmware, then an HO_FAIL will be
1818 * generated and the expectation from firmware would be to
1819 * clean up the peer context on the host and not send down any
1820 * WMI PEER DELETE commands to firmware. But, if the user space
1821 * disconnect gets processed first, then there is a chance to
1822 * send down the PEER DELETE commands. Hence, if we do not
1823 * receive the HO_FAIL, and we complete the roam sync
1824 * propagation, then the host and firmware will be in sync with
1825 * respect to the peer and then the user space disconnect can
1826 * be handled gracefully in a normal way.
1827 *
1828 * Ensure to check the reason code since the RSO Stop might
1829 * come when roam sync failed as well and at that point it
1830 * should go through to the firmware and receive HO_FAIL
1831 * and clean up.
1832 */
1833 if (wma_is_roam_synch_in_progress(wma_handle,
1834 roam_req->sessionId) &&
1835 roam_req->reason ==
1836 REASON_ROAM_STOP_ALL) {
1837 WMA_LOGD("Dont send RSO stop during roam sync");
1838 break;
1839 }
Vignesh Viswanathane25af782018-03-23 14:49:50 +05301840
1841 /*
1842 * Send 11k offload disable command to FW as part of RSO Stop
1843 */
Abhinav Kumarc4a6c302019-05-13 20:26:44 +05301844 qdf_status =
1845 wma_send_offload_11k_params(wma_handle,
Vignesh Viswanathane25af782018-03-23 14:49:50 +05301846 &roam_req->offload_11k_params);
Abhinav Kumarc4a6c302019-05-13 20:26:44 +05301847 if (QDF_IS_STATUS_ERROR(qdf_status)) {
1848 WMA_LOGE("11k offload disable not sent, status %d",
1849 qdf_status);
1850 break;
Vignesh Viswanathane25af782018-03-23 14:49:50 +05301851 }
1852
Vignesh Viswanathana3d5c272018-06-04 19:36:02 +05301853 /* Send BTM config as disabled during RSO Stop */
1854 qdf_status = wma_roam_scan_btm_offload(wma_handle, roam_req);
1855 if (qdf_status != QDF_STATUS_SUCCESS) {
1856 WMA_LOGE(FL("Sending BTM config to fw failed"));
1857 break;
1858 }
1859
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001860 wma_handle->suitable_ap_hb_failure = false;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001861
Wu Gao8cd29482018-12-14 15:11:50 +08001862 wma_roam_scan_fill_scan_params(wma_handle, mac,
1863 NULL, &scan_params);
Abhishek Singh533c9da2017-05-04 10:23:34 +05301864
Wu Gao8cd29482018-12-14 15:11:50 +08001865 if (roam_req->reason == REASON_ROAM_STOP_ALL ||
1866 roam_req->reason == REASON_DISCONNECTED ||
1867 roam_req->reason == REASON_ROAM_SYNCH_FAILED) {
1868 mode = WMI_ROAM_SCAN_MODE_NONE;
1869 } else {
1870 if (csr_is_roam_offload_enabled(mac))
1871 mode = WMI_ROAM_SCAN_MODE_NONE |
1872 WMI_ROAM_SCAN_MODE_ROAMOFFLOAD;
1873 else
Abhishek Singh533c9da2017-05-04 10:23:34 +05301874 mode = WMI_ROAM_SCAN_MODE_NONE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001875 }
Wu Gao8cd29482018-12-14 15:11:50 +08001876
1877 qdf_status = wma_roam_scan_offload_mode(
1878 wma_handle,
1879 &scan_params, NULL, mode,
1880 roam_req->sessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001881 /*
Varun Reddy Yeturu69d44b22017-08-15 14:29:32 -07001882 * After sending the roam scan mode because of a disconnect,
1883 * clear the scan bitmap client as well by sending
1884 * the following command
1885 */
1886 wma_roam_scan_offload_rssi_thresh(wma_handle, roam_req);
1887 /*
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001888 * If the STOP command is due to a disconnect, then
1889 * send the filter command to clear all the filter
1890 * entries. If it is roaming scenario, then do not
1891 * send the cleared entries.
1892 */
1893 if (!roam_req->middle_of_roaming) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301894 qdf_status = wma_roam_scan_filter(wma_handle, roam_req);
1895 if (qdf_status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001896 WMA_LOGE("clear for roam scan filter failed");
1897 break;
1898 }
1899 }
1900
Pragaspathi Thilagaraj4f529f22019-03-31 16:53:17 +05301901 wma_send_disconnect_roam_params(wma_handle, roam_req);
1902 wma_send_idle_roam_params(wma_handle, roam_req);
1903
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001904 if (roam_req->reason ==
1905 REASON_OS_REQUESTED_ROAMING_NOW) {
Rajeev Kumarcf7bd802017-04-18 11:11:42 -07001906 struct scheduler_msg cds_msg = {0};
Jeff Johnsond686ba72019-02-06 22:36:42 -08001907 struct roam_offload_scan_rsp *scan_offload_rsp;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001908
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001909 scan_offload_rsp =
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301910 qdf_mem_malloc(sizeof(*scan_offload_rsp));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001911 if (!scan_offload_rsp) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301912 qdf_mem_free(roam_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301913 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001914 }
1915 cds_msg.type = eWNI_SME_ROAM_SCAN_OFFLOAD_RSP;
1916 scan_offload_rsp->sessionId = roam_req->sessionId;
1917 scan_offload_rsp->reason = roam_req->reason;
1918 cds_msg.bodyptr = scan_offload_rsp;
1919 /*
1920 * Since REASSOC request is processed in
1921 * Roam_Scan_Offload_Rsp post a dummy rsp msg back to
1922 * SME with proper reason code.
1923 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301924 if (QDF_STATUS_SUCCESS !=
gaurank kathpalia00861f02018-08-28 19:16:12 +05301925 scheduler_post_message(QDF_MODULE_ID_WMA,
1926 QDF_MODULE_ID_SME,
1927 QDF_MODULE_ID_SME,
1928 &cds_msg)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301929 qdf_mem_free(scan_offload_rsp);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001930 }
1931 }
1932 break;
1933
1934 case ROAM_SCAN_OFFLOAD_ABORT_SCAN:
1935 /* If roam scan is running, stop that cycle.
1936 * It will continue automatically on next trigger.
1937 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301938 qdf_status = wma_roam_scan_offload_command(wma_handle,
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001939 WMI_ROAM_SCAN_STOP_CMD,
1940 roam_req->sessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001941 break;
1942
1943 case ROAM_SCAN_OFFLOAD_RESTART:
1944 /* Rome offload engine does not stop after any scan.
1945 * If this command is sent because all preauth attempts failed
1946 * and WMI_ROAM_REASON_SUITABLE_AP event was received earlier,
1947 * now it is time to call it heartbeat failure.
1948 */
1949 if ((roam_req->reason == REASON_PREAUTH_FAILED_FOR_ALL)
1950 && wma_handle->suitable_ap_hb_failure) {
1951 WMA_LOGE("%s: Sending heartbeat failure after preauth failures",
1952 __func__);
1953 wma_beacon_miss_handler(wma_handle,
Sreelakshmi Konamki58c72432016-11-09 17:06:44 +05301954 roam_req->sessionId,
1955 wma_handle->suitable_ap_hb_failure_rssi);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001956 wma_handle->suitable_ap_hb_failure = false;
1957 }
1958 break;
1959
1960 case ROAM_SCAN_OFFLOAD_UPDATE_CFG:
1961 wma_handle->suitable_ap_hb_failure = false;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001962
Liangwei Dongd108cf22018-08-30 03:41:57 -04001963 if (roam_req->RoamScanOffloadEnabled) {
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08001964 wma_roam_scan_fill_scan_params(wma_handle, mac,
Liangwei Dongd108cf22018-08-30 03:41:57 -04001965 roam_req, &scan_params);
1966 qdf_status =
1967 wma_roam_scan_offload_mode(
1968 wma_handle, &scan_params, roam_req,
1969 WMI_ROAM_SCAN_MODE_NONE,
1970 roam_req->sessionId);
1971 if (qdf_status != QDF_STATUS_SUCCESS)
1972 break;
1973 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001974
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301975 qdf_status = wma_roam_scan_bmiss_cnt(wma_handle,
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001976 roam_req->RoamBmissFirstBcnt,
1977 roam_req->RoamBmissFinalBcnt,
1978 roam_req->sessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301979 if (qdf_status != QDF_STATUS_SUCCESS)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001980 break;
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05301981
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301982 qdf_status = wma_roam_scan_filter(wma_handle, roam_req);
1983 if (qdf_status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001984 WMA_LOGE("Sending update for roam scan filter failed");
1985 break;
1986 }
1987
1988
1989 /*
1990 * Runtime (after association) changes to rssi thresholds and
1991 * other parameters.
1992 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301993 qdf_status = wma_roam_scan_offload_chan_list(wma_handle,
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001994 roam_req->ConnectedNetwork.ChannelCount,
1995 &roam_req->ConnectedNetwork.ChannelCache[0],
1996 roam_req->ChannelCacheType,
1997 roam_req->sessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001998 /*
1999 * Even though the channel list is empty, we can
2000 * still go ahead and start Roaming.
2001 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302002 if ((qdf_status != QDF_STATUS_SUCCESS) &&
2003 (qdf_status != QDF_STATUS_E_EMPTY))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002004 break;
2005
2006
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302007 qdf_status = wma_roam_scan_offload_rssi_thresh(wma_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002008 roam_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302009 if (qdf_status != QDF_STATUS_SUCCESS)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002010 break;
2011
2012 if (roam_req->EmptyRefreshScanPeriod > 0) {
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07002013 qdf_status = wma_roam_scan_offload_scan_period(
Pragaspathi Thilagaraj2b8ea352019-04-12 02:23:50 +05302014 wma_handle, roam_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302015 if (qdf_status != QDF_STATUS_SUCCESS)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002016 break;
2017
2018 mode = WMI_ROAM_SCAN_MODE_PERIODIC;
2019 /* Don't use rssi triggered roam scans if external app
2020 * is in control of channel list.
2021 */
Abhinav Kumaredd1d372018-05-11 15:33:35 +05302022 if (roam_req->ChannelCacheType != CHANNEL_LIST_STATIC ||
2023 roam_req->roam_force_rssi_trigger)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002024 mode |= WMI_ROAM_SCAN_MODE_RSSI_CHANGE;
2025
2026 } else {
2027 mode = WMI_ROAM_SCAN_MODE_RSSI_CHANGE;
2028 }
2029
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302030 qdf_status = wma_roam_scan_offload_rssi_change(wma_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002031 roam_req->sessionId,
2032 roam_req->RoamRescanRssiDiff,
2033 roam_req->RoamBeaconRssiWeight,
2034 roam_req->hi_rssi_scan_delay);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302035 if (qdf_status != QDF_STATUS_SUCCESS)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002036 break;
2037
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07002038 qdf_status = wma_roam_scan_offload_ap_profile(wma_handle,
Himanshu Agarwal8bcec572017-09-28 11:54:37 +05302039 roam_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302040 if (qdf_status != QDF_STATUS_SUCCESS)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002041 break;
2042
Liangwei Dongd108cf22018-08-30 03:41:57 -04002043 if (!roam_req->RoamScanOffloadEnabled)
2044 break;
2045
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08002046 wma_roam_scan_fill_scan_params(wma_handle, mac, roam_req,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002047 &scan_params);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302048 qdf_status =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002049 wma_roam_scan_offload_mode(wma_handle, &scan_params,
2050 roam_req, mode,
2051 roam_req->sessionId);
Pragaspathi Thilagaraj4f529f22019-03-31 16:53:17 +05302052
2053 wma_send_disconnect_roam_params(wma_handle, roam_req);
2054 wma_send_idle_roam_params(wma_handle, roam_req);
2055
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002056 break;
2057
2058 default:
2059 break;
2060 }
gaurank kathpalia6d25c972019-03-07 20:25:28 +05302061 qdf_mem_zero(roam_req, sizeof(*roam_req));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302062 qdf_mem_free(roam_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302063 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002064}
2065
Kapil Gupta5cda2252016-12-29 18:44:26 +05302066void wma_update_per_roam_config(WMA_HANDLE handle,
Dustin Brownfd578602019-02-22 13:52:24 -08002067 struct wmi_per_roam_config_req *req_buf)
Kapil Gupta5cda2252016-12-29 18:44:26 +05302068{
Dustin Brownfd578602019-02-22 13:52:24 -08002069 QDF_STATUS status;
Kapil Gupta5cda2252016-12-29 18:44:26 +05302070 tp_wma_handle wma_handle = (tp_wma_handle) handle;
2071
2072 if (!wma_handle || !wma_handle->wmi_handle) {
2073 WMA_LOGE("%s: WMA is closed, cannot send per roam config",
2074 __func__);
2075 return;
2076 }
2077
2078 status = wmi_unified_set_per_roam_config(wma_handle->wmi_handle,
Dustin Brownfd578602019-02-22 13:52:24 -08002079 req_buf);
2080 if (QDF_IS_STATUS_ERROR(status))
2081 wma_err("failed to set per roam config to FW");
Kapil Gupta5cda2252016-12-29 18:44:26 +05302082}
2083
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002084#ifdef WLAN_FEATURE_ROAM_OFFLOAD
2085
2086/**
2087 * wma_process_roam_invoke() - send roam invoke command to fw.
2088 * @handle: wma handle
2089 * @roaminvoke: roam invoke command
2090 *
2091 * Send roam invoke command to fw for fastreassoc.
2092 *
2093 * Return: none
2094 */
2095void wma_process_roam_invoke(WMA_HANDLE handle,
2096 struct wma_roam_invoke_cmd *roaminvoke)
2097{
2098 tp_wma_handle wma_handle = (tp_wma_handle) handle;
Govind Singh64b5e112016-03-08 11:53:50 +05302099 uint32_t ch_hz;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002100
2101 if (!wma_handle || !wma_handle->wmi_handle) {
2102 WMA_LOGE("%s: WMA is closed, can not send roam invoke",
2103 __func__);
Naveen Rawat664a7cb2017-01-19 17:58:14 -08002104 goto free_frame_buf;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002105 }
Pragaspathi Thilagarajecb60732018-11-02 12:26:24 +05302106
2107 if (!wma_is_vdev_valid(roaminvoke->vdev_id)) {
2108 WMA_LOGE("%s: Invalid vdev id:%d", __func__,
2109 roaminvoke->vdev_id);
2110 goto free_frame_buf;
2111 }
Govind Singh64b5e112016-03-08 11:53:50 +05302112 ch_hz = (A_UINT32)cds_chan_to_freq(roaminvoke->channel);
2113 wmi_unified_roam_invoke_cmd(wma_handle->wmi_handle,
2114 (struct wmi_roam_invoke_cmd *)roaminvoke,
2115 ch_hz);
Naveen Rawat664a7cb2017-01-19 17:58:14 -08002116free_frame_buf:
2117 if (roaminvoke->frame_len) {
2118 qdf_mem_free(roaminvoke->frame_buf);
2119 roaminvoke->frame_buf = NULL;
2120 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002121}
2122
2123/**
2124 * wma_process_roam_synch_fail() -roam synch failure handle
2125 * @handle: wma handle
2126 * @synch_fail: roam synch fail parameters
2127 *
2128 * Return: none
2129 */
2130void wma_process_roam_synch_fail(WMA_HANDLE handle,
2131 struct roam_offload_synch_fail *synch_fail)
2132{
2133 tp_wma_handle wma_handle = (tp_wma_handle) handle;
Srinivas Girigowda4d65ebe2017-10-13 21:41:42 -07002134
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002135 if (!wma_handle || !wma_handle->wmi_handle) {
2136 WMA_LOGE("%s: WMA is closed, can not clean-up roam synch",
2137 __func__);
2138 return;
2139 }
Deepak Dhamdheref918d422017-07-06 12:56:29 -07002140 wlan_roam_debug_log(synch_fail->session_id,
2141 DEBUG_ROAM_SYNCH_FAIL,
2142 DEBUG_INVALID_PEER_ID, NULL, NULL, 0, 0);
2143
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002144 /* Hand Off Failure could happen as an exception, when a roam synch
2145 * indication is posted to Host, but a roam synch complete is not
2146 * posted to the firmware.So, clear the roam synch in progress
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07002147 * flag before disconnecting the session through this event.
2148 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002149 wma_handle->interfaces[synch_fail->session_id].roam_synch_in_progress =
2150 false;
2151}
2152
2153/**
Pragaspathi Thilagarajea97fe92018-07-23 15:01:54 +05302154 * wma_free_roam_synch_frame_ind() - Free the bcn_probe_rsp, reassoc_req,
2155 * reassoc_rsp received as part of the ROAM_SYNC_FRAME event
2156 *
2157 * @iface - interaface corresponding to a vdev
2158 *
2159 * This API is used to free the buffer allocated during the ROAM_SYNC_FRAME
2160 * event
2161 *
2162 */
2163static void wma_free_roam_synch_frame_ind(struct wma_txrx_node *iface)
2164{
2165 if (iface->roam_synch_frame_ind.bcn_probe_rsp) {
2166 qdf_mem_free(iface->roam_synch_frame_ind.bcn_probe_rsp);
2167 iface->roam_synch_frame_ind.bcn_probe_rsp_len = 0;
2168 iface->roam_synch_frame_ind.bcn_probe_rsp = NULL;
2169 }
2170 if (iface->roam_synch_frame_ind.reassoc_req) {
2171 qdf_mem_free(iface->roam_synch_frame_ind.reassoc_req);
2172 iface->roam_synch_frame_ind.reassoc_req_len = 0;
2173 iface->roam_synch_frame_ind.reassoc_req = NULL;
2174 }
2175 if (iface->roam_synch_frame_ind.reassoc_rsp) {
2176 qdf_mem_free(iface->roam_synch_frame_ind.reassoc_rsp);
2177 iface->roam_synch_frame_ind.reassoc_rsp_len = 0;
2178 iface->roam_synch_frame_ind.reassoc_rsp = NULL;
2179 }
2180}
2181
2182/**
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302183 * wma_fill_data_synch_frame_event() - Fill the the roam sync data buffer using
2184 * synch frame event data
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002185 * @wma: Global WMA Handle
2186 * @roam_synch_ind_ptr: Buffer to be filled
2187 * @param_buf: Source buffer
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002188 *
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002189 * Firmware sends all the required information required for roam
2190 * synch propagation as TLV's and stored in param_buf. These
2191 * parameters are parsed and filled into the roam synch indication
2192 * buffer which will be used at different layers for propagation.
2193 *
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302194 * Return: None
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002195 */
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302196static void wma_fill_data_synch_frame_event(tp_wma_handle wma,
Jeff Johnsona7f41dd2019-02-06 22:54:55 -08002197 struct roam_offload_synch_ind *roam_synch_ind_ptr,
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302198 struct wma_txrx_node *iface)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002199{
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002200 uint8_t *bcn_probersp_ptr;
2201 uint8_t *reassoc_rsp_ptr;
2202 uint8_t *reassoc_req_ptr;
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302203
2204 /* Beacon/Probe Rsp data */
2205 roam_synch_ind_ptr->beaconProbeRespOffset =
Jeff Johnsona7f41dd2019-02-06 22:54:55 -08002206 sizeof(struct roam_offload_synch_ind);
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302207 bcn_probersp_ptr = (uint8_t *) roam_synch_ind_ptr +
2208 roam_synch_ind_ptr->beaconProbeRespOffset;
2209 roam_synch_ind_ptr->beaconProbeRespLength =
2210 iface->roam_synch_frame_ind.bcn_probe_rsp_len;
2211 qdf_mem_copy(bcn_probersp_ptr,
2212 iface->roam_synch_frame_ind.bcn_probe_rsp,
2213 roam_synch_ind_ptr->beaconProbeRespLength);
2214 qdf_mem_free(iface->roam_synch_frame_ind.bcn_probe_rsp);
2215 iface->roam_synch_frame_ind.bcn_probe_rsp = NULL;
2216
2217 /* ReAssoc Rsp data */
2218 roam_synch_ind_ptr->reassocRespOffset =
Jeff Johnsona7f41dd2019-02-06 22:54:55 -08002219 sizeof(struct roam_offload_synch_ind) +
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302220 roam_synch_ind_ptr->beaconProbeRespLength;
2221 roam_synch_ind_ptr->reassocRespLength =
2222 iface->roam_synch_frame_ind.reassoc_rsp_len;
2223 reassoc_rsp_ptr = (uint8_t *) roam_synch_ind_ptr +
2224 roam_synch_ind_ptr->reassocRespOffset;
2225 qdf_mem_copy(reassoc_rsp_ptr,
2226 iface->roam_synch_frame_ind.reassoc_rsp,
2227 roam_synch_ind_ptr->reassocRespLength);
2228 qdf_mem_free(iface->roam_synch_frame_ind.reassoc_rsp);
2229 iface->roam_synch_frame_ind.reassoc_rsp = NULL;
2230
2231 /* ReAssoc Req data */
2232 roam_synch_ind_ptr->reassoc_req_offset =
Jeff Johnsona7f41dd2019-02-06 22:54:55 -08002233 sizeof(struct roam_offload_synch_ind) +
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302234 roam_synch_ind_ptr->beaconProbeRespLength +
2235 roam_synch_ind_ptr->reassocRespLength;
2236 roam_synch_ind_ptr->reassoc_req_length =
2237 iface->roam_synch_frame_ind.reassoc_req_len;
2238 reassoc_req_ptr = (uint8_t *) roam_synch_ind_ptr +
2239 roam_synch_ind_ptr->reassoc_req_offset;
2240 qdf_mem_copy(reassoc_req_ptr,
2241 iface->roam_synch_frame_ind.reassoc_req,
2242 roam_synch_ind_ptr->reassoc_req_length);
2243 qdf_mem_free(iface->roam_synch_frame_ind.reassoc_req);
2244 iface->roam_synch_frame_ind.reassoc_req = NULL;
2245}
2246
2247/**
2248 * wma_fill_data_synch_event() - Fill the the roam sync data buffer using synch
2249 * event data
2250 * @wma: Global WMA Handle
2251 * @roam_synch_ind_ptr: Buffer to be filled
2252 * @param_buf: Source buffer
2253 *
2254 * Firmware sends all the required information required for roam
2255 * synch propagation as TLV's and stored in param_buf. These
2256 * parameters are parsed and filled into the roam synch indication
2257 * buffer which will be used at different layers for propagation.
2258 *
2259 * Return: None
2260 */
2261static void wma_fill_data_synch_event(tp_wma_handle wma,
Jeff Johnsona7f41dd2019-02-06 22:54:55 -08002262 struct roam_offload_synch_ind *roam_synch_ind_ptr,
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302263 WMI_ROAM_SYNCH_EVENTID_param_tlvs *param_buf)
2264{
2265 uint8_t *bcn_probersp_ptr;
2266 uint8_t *reassoc_rsp_ptr;
2267 uint8_t *reassoc_req_ptr;
2268 wmi_roam_synch_event_fixed_param *synch_event;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002269
2270 synch_event = param_buf->fixed_param;
Padma, Santhosh Kumarcd35f532016-12-27 12:07:39 +05302271
Naveen Rawat14298b92015-11-25 16:27:41 -08002272 /* Beacon/Probe Rsp data */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002273 roam_synch_ind_ptr->beaconProbeRespOffset =
Jeff Johnsona7f41dd2019-02-06 22:54:55 -08002274 sizeof(struct roam_offload_synch_ind);
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002275 bcn_probersp_ptr = (uint8_t *) roam_synch_ind_ptr +
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002276 roam_synch_ind_ptr->beaconProbeRespOffset;
2277 roam_synch_ind_ptr->beaconProbeRespLength =
2278 synch_event->bcn_probe_rsp_len;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302279 qdf_mem_copy(bcn_probersp_ptr, param_buf->bcn_probe_rsp_frame,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002280 roam_synch_ind_ptr->beaconProbeRespLength);
Naveen Rawat14298b92015-11-25 16:27:41 -08002281 /* ReAssoc Rsp data */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002282 roam_synch_ind_ptr->reassocRespOffset =
Jeff Johnsona7f41dd2019-02-06 22:54:55 -08002283 sizeof(struct roam_offload_synch_ind) +
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002284 roam_synch_ind_ptr->beaconProbeRespLength;
2285 roam_synch_ind_ptr->reassocRespLength = synch_event->reassoc_rsp_len;
2286 reassoc_rsp_ptr = (uint8_t *) roam_synch_ind_ptr +
2287 roam_synch_ind_ptr->reassocRespOffset;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302288 qdf_mem_copy(reassoc_rsp_ptr,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002289 param_buf->reassoc_rsp_frame,
2290 roam_synch_ind_ptr->reassocRespLength);
Naveen Rawat14298b92015-11-25 16:27:41 -08002291
2292 /* ReAssoc Req data */
2293 roam_synch_ind_ptr->reassoc_req_offset =
Jeff Johnsona7f41dd2019-02-06 22:54:55 -08002294 sizeof(struct roam_offload_synch_ind) +
Naveen Rawat14298b92015-11-25 16:27:41 -08002295 roam_synch_ind_ptr->beaconProbeRespLength +
2296 roam_synch_ind_ptr->reassocRespLength;
2297 roam_synch_ind_ptr->reassoc_req_length = synch_event->reassoc_req_len;
2298 reassoc_req_ptr = (uint8_t *) roam_synch_ind_ptr +
2299 roam_synch_ind_ptr->reassoc_req_offset;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302300 qdf_mem_copy(reassoc_req_ptr, param_buf->reassoc_req_frame,
Naveen Rawat14298b92015-11-25 16:27:41 -08002301 roam_synch_ind_ptr->reassoc_req_length);
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302302}
2303
2304/**
2305 * wma_fill_roam_synch_buffer() - Fill the the roam sync buffer
2306 * @wma: Global WMA Handle
2307 * @roam_synch_ind_ptr: Buffer to be filled
2308 * @param_buf: Source buffer
2309 *
2310 * Firmware sends all the required information required for roam
2311 * synch propagation as TLV's and stored in param_buf. These
2312 * parameters are parsed and filled into the roam synch indication
2313 * buffer which will be used at different layers for propagation.
2314 *
2315 * Return: Success or Failure
2316 */
2317static int wma_fill_roam_synch_buffer(tp_wma_handle wma,
Jeff Johnsona7f41dd2019-02-06 22:54:55 -08002318 struct roam_offload_synch_ind *roam_synch_ind_ptr,
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302319 WMI_ROAM_SYNCH_EVENTID_param_tlvs *param_buf)
2320{
2321 wmi_roam_synch_event_fixed_param *synch_event;
2322 wmi_channel *chan;
2323 wmi_key_material *key;
Pragaspathi Thilagarajeb367282019-02-19 00:42:28 +05302324 wmi_key_material_ext *key_ft;
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302325 struct wma_txrx_node *iface = NULL;
2326 wmi_roam_fils_synch_tlv_param *fils_info;
Pragaspathi Thilagarajea97fe92018-07-23 15:01:54 +05302327 int status = -EINVAL;
Pragaspathi Thilagarajeb367282019-02-19 00:42:28 +05302328 uint8_t kck_len;
2329 uint8_t kek_len;
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302330
2331 synch_event = param_buf->fixed_param;
Pragaspathi Thilagaraja9ecc632019-02-23 00:50:24 +05302332 roam_synch_ind_ptr->roamed_vdev_id = synch_event->vdev_id;
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302333 roam_synch_ind_ptr->authStatus = synch_event->auth_status;
2334 roam_synch_ind_ptr->roamReason = synch_event->roam_reason;
2335 roam_synch_ind_ptr->rssi = synch_event->rssi;
Pragaspathi Thilagarajea97fe92018-07-23 15:01:54 +05302336 iface = &wma->interfaces[synch_event->vdev_id];
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302337 WMI_MAC_ADDR_TO_CHAR_ARRAY(&synch_event->bssid,
2338 roam_synch_ind_ptr->bssid.bytes);
2339 WMA_LOGD("%s: roamedVdevId %d authStatus %d roamReason %d rssi %d isBeacon %d",
Pragaspathi Thilagaraja9ecc632019-02-23 00:50:24 +05302340 __func__, roam_synch_ind_ptr->roamed_vdev_id,
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302341 roam_synch_ind_ptr->authStatus, roam_synch_ind_ptr->roamReason,
2342 roam_synch_ind_ptr->rssi, roam_synch_ind_ptr->isBeacon);
2343
2344 if (!QDF_IS_STATUS_SUCCESS(
Jeff Johnson9f18aa72018-12-02 12:05:12 -08002345 wma->csr_roam_synch_cb((struct mac_context *)wma->mac_context,
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302346 roam_synch_ind_ptr, NULL, SIR_ROAMING_DEREGISTER_STA))) {
2347 WMA_LOGE("LFR3: CSR Roam synch cb failed");
Pragaspathi Thilagarajea97fe92018-07-23 15:01:54 +05302348 wma_free_roam_synch_frame_ind(iface);
2349 return status;
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302350 }
2351
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302352 /*
2353 * If lengths of bcn_probe_rsp, reassoc_req and reassoc_rsp are zero in
2354 * synch_event driver would have received bcn_probe_rsp, reassoc_req
2355 * and reassoc_rsp via the event WMI_ROAM_SYNCH_FRAME_EVENTID
2356 */
2357 if ((!synch_event->bcn_probe_rsp_len) &&
2358 (!synch_event->reassoc_req_len) &&
2359 (!synch_event->reassoc_rsp_len)) {
2360 if (!iface->roam_synch_frame_ind.bcn_probe_rsp) {
2361 WMA_LOGE("LFR3: bcn_probe_rsp is NULL");
2362 QDF_ASSERT(iface->roam_synch_frame_ind.
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07002363 bcn_probe_rsp);
Pragaspathi Thilagarajea97fe92018-07-23 15:01:54 +05302364 wma_free_roam_synch_frame_ind(iface);
2365 return status;
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302366 }
2367 if (!iface->roam_synch_frame_ind.reassoc_rsp) {
2368 WMA_LOGE("LFR3: reassoc_rsp is NULL");
2369 QDF_ASSERT(iface->roam_synch_frame_ind.
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07002370 reassoc_rsp);
Pragaspathi Thilagarajea97fe92018-07-23 15:01:54 +05302371 wma_free_roam_synch_frame_ind(iface);
2372 return status;
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302373 }
2374 if (!iface->roam_synch_frame_ind.reassoc_req) {
2375 WMA_LOGE("LFR3: reassoc_req is NULL");
2376 QDF_ASSERT(iface->roam_synch_frame_ind.
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07002377 reassoc_req);
Pragaspathi Thilagarajea97fe92018-07-23 15:01:54 +05302378 wma_free_roam_synch_frame_ind(iface);
2379 return status;
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302380 }
2381 wma_fill_data_synch_frame_event(wma, roam_synch_ind_ptr, iface);
2382 } else {
2383 wma_fill_data_synch_event(wma, roam_synch_ind_ptr, param_buf);
2384 }
Naveen Rawat14298b92015-11-25 16:27:41 -08002385
Harprit Chhabadaf4340b12019-02-07 17:09:00 -08002386 chan = param_buf->chan;
Harprit Chhabada6420b582019-01-30 15:36:20 -08002387 if (chan)
2388 roam_synch_ind_ptr->chan_freq = chan->mhz;
Pragaspathi Thilagarajeb367282019-02-19 00:42:28 +05302389
Harprit Chhabadaf4340b12019-02-07 17:09:00 -08002390 key = param_buf->key;
Pragaspathi Thilagarajeb367282019-02-19 00:42:28 +05302391 key_ft = param_buf->key_ext;
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07002392 if (key) {
Pragaspathi Thilagarajeb367282019-02-19 00:42:28 +05302393 roam_synch_ind_ptr->kck_len = SIR_KCK_KEY_LEN;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302394 qdf_mem_copy(roam_synch_ind_ptr->kck, key->kck,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002395 SIR_KCK_KEY_LEN);
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05302396 roam_synch_ind_ptr->kek_len = SIR_KEK_KEY_LEN;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302397 qdf_mem_copy(roam_synch_ind_ptr->kek, key->kek,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002398 SIR_KEK_KEY_LEN);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302399 qdf_mem_copy(roam_synch_ind_ptr->replay_ctr,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002400 key->replay_counter, SIR_REPLAY_CTR_LEN);
Pragaspathi Thilagarajeb367282019-02-19 00:42:28 +05302401 } else if (key_ft) {
2402 /*
2403 * For AKM 00:0F:AC (FT suite-B-SHA384)
2404 * KCK-bits:192 KEK-bits:256
2405 * Firmware sends wmi_key_material_ext tlv now only if
2406 * auth is FT Suite-B SHA-384 auth. If further new suites
2407 * are added, add logic to get kck, kek bits based on
2408 * akm protocol
2409 */
2410 kck_len = KCK_192BIT_KEY_LEN;
2411 kek_len = KEK_256BIT_KEY_LEN;
2412
2413 roam_synch_ind_ptr->kek_len = kek_len;
2414 qdf_mem_copy(roam_synch_ind_ptr->kek,
2415 key_ft->key_buffer, kek_len);
2416
2417 roam_synch_ind_ptr->kck_len = kck_len;
2418 qdf_mem_copy(roam_synch_ind_ptr->kck,
2419 (key_ft->key_buffer + kek_len),
2420 kck_len);
2421
2422 qdf_mem_copy(roam_synch_ind_ptr->replay_ctr,
2423 (key_ft->key_buffer + kek_len + kck_len),
2424 SIR_REPLAY_CTR_LEN);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002425 }
Pragaspathi Thilagarajeb367282019-02-19 00:42:28 +05302426
Naveen Rawat8cc23b02016-07-14 12:22:56 -07002427 if (param_buf->hw_mode_transition_fixed_param)
2428 wma_process_pdev_hw_mode_trans_ind(wma,
2429 param_buf->hw_mode_transition_fixed_param,
2430 param_buf->wmi_pdev_set_hw_mode_response_vdev_mac_mapping,
2431 &roam_synch_ind_ptr->hw_mode_trans_ind);
2432 else
2433 WMA_LOGD(FL("hw_mode transition fixed param is NULL"));
Varun Reddy Yeturu88f123c2017-03-14 18:24:32 -07002434
Harprit Chhabadaf4340b12019-02-07 17:09:00 -08002435 fils_info = param_buf->roam_fils_synch_info;
Vignesh Viswanathan686833a2018-04-20 12:51:24 +05302436 if (fils_info) {
2437 if ((fils_info->kek_len > SIR_KEK_KEY_LEN_FILS) ||
2438 (fils_info->pmk_len > SIR_PMK_LEN)) {
2439 WMA_LOGE("%s: Invalid kek_len %d or pmk_len %d",
2440 __func__,
2441 fils_info->kek_len,
2442 fils_info->pmk_len);
Pragaspathi Thilagarajea97fe92018-07-23 15:01:54 +05302443 wma_free_roam_synch_frame_ind(iface);
2444 return status;
Vignesh Viswanathan686833a2018-04-20 12:51:24 +05302445 }
2446
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05302447 roam_synch_ind_ptr->kek_len = fils_info->kek_len;
2448 qdf_mem_copy(roam_synch_ind_ptr->kek, fils_info->kek,
2449 fils_info->kek_len);
2450
2451 roam_synch_ind_ptr->pmk_len = fils_info->pmk_len;
2452 qdf_mem_copy(roam_synch_ind_ptr->pmk, fils_info->pmk,
2453 fils_info->pmk_len);
2454
2455 qdf_mem_copy(roam_synch_ind_ptr->pmkid, fils_info->pmkid,
Srinivas Girigowdaff8f5ef2019-03-26 17:20:55 -07002456 PMKID_LEN);
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05302457
2458 roam_synch_ind_ptr->update_erp_next_seq_num =
2459 fils_info->update_erp_next_seq_num;
2460 roam_synch_ind_ptr->next_erp_seq_num =
2461 fils_info->next_erp_seq_num;
2462
Vignesh Viswanathan8da68cf2017-09-07 14:00:04 +05302463 WMA_LOGD("Update ERP Seq Num %d, Next ERP Seq Num %d",
2464 roam_synch_ind_ptr->update_erp_next_seq_num,
2465 roam_synch_ind_ptr->next_erp_seq_num);
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05302466 }
Pragaspathi Thilagarajea97fe92018-07-23 15:01:54 +05302467 wma_free_roam_synch_frame_ind(iface);
Varun Reddy Yeturu1ce7aff2017-03-15 16:14:03 -07002468 return 0;
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002469}
2470
Abhishek Singhf880a7d2019-04-29 14:51:11 +05302471#ifdef CRYPTO_SET_KEY_CONVERGED
Abhishek Singh7c1c7432019-04-04 12:11:57 +05302472static void wma_update_roamed_peer_unicast_cipher(tp_wma_handle wma,
2473 uint32_t uc_cipher,
Abhishek Singhf880a7d2019-04-29 14:51:11 +05302474 uint32_t cipher_cap,
2475 uint8_t *peer_mac)
2476{
2477 struct wlan_objmgr_peer *peer;
2478
2479 if (!peer_mac) {
2480 wma_err("wma ctx or peer mac is NULL");
2481 return;
2482 }
2483
2484 peer = wlan_objmgr_get_peer(wma->psoc,
2485 wlan_objmgr_pdev_get_pdev_id(wma->pdev),
2486 peer_mac, WLAN_LEGACY_WMA_ID);
2487 if (!peer) {
2488 wma_err("Peer of peer_mac %pM not found", peer_mac);
2489 return;
2490 }
2491 wlan_crypto_set_peer_param(peer, WLAN_CRYPTO_PARAM_CIPHER_CAP,
2492 cipher_cap);
2493 wlan_crypto_set_peer_param(peer, WLAN_CRYPTO_PARAM_UCAST_CIPHER,
2494 uc_cipher);
2495
2496 wlan_objmgr_peer_release_ref(peer, WLAN_LEGACY_WMA_ID);
2497
2498 wma_debug("Set unicast cipher %x and cap %x for %pM", uc_cipher,
2499 cipher_cap, peer_mac);
2500}
2501
2502static void wma_get_peer_uc_cipher(tp_wma_handle wma, uint8_t *peer_mac,
2503 uint32_t *uc_cipher, uint32_t *cipher_cap)
2504{
2505 uint32_t cipher, cap;
2506 struct wlan_objmgr_peer *peer;
2507
2508 if (!peer_mac) {
2509 WMA_LOGE("wma ctx or peer_mac is NULL");
2510 return;
2511 }
2512 peer = wlan_objmgr_get_peer(wma->psoc,
2513 wlan_objmgr_pdev_get_pdev_id(wma->pdev),
2514 peer_mac, WLAN_LEGACY_WMA_ID);
2515 if (!peer) {
2516 WMA_LOGE("Peer of peer_mac %pM not found", peer_mac);
2517 return;
2518 }
2519
2520 cipher = wlan_crypto_get_peer_param(peer,
2521 WLAN_CRYPTO_PARAM_UCAST_CIPHER);
2522 cap = wlan_crypto_get_peer_param(peer, WLAN_CRYPTO_PARAM_CIPHER_CAP);
2523 wlan_objmgr_peer_release_ref(peer, WLAN_LEGACY_WMA_ID);
2524
2525 if (uc_cipher)
2526 *uc_cipher = cipher;
2527 if (cipher_cap)
2528 *cipher_cap = cap;
2529}
2530
2531#else
2532
2533static void wma_update_roamed_peer_unicast_cipher(tp_wma_handle wma,
2534 uint32_t uc_cipher,
2535 uint32_t cipher_cap,
Abhishek Singh7c1c7432019-04-04 12:11:57 +05302536 uint8_t *peer_mac)
2537{
2538 struct wlan_objmgr_peer *peer;
2539
2540 if (!peer_mac) {
2541 WMA_LOGE("peer_mac is NULL");
2542 return;
2543 }
2544
2545 peer = wlan_objmgr_get_peer(wma->psoc,
2546 wlan_objmgr_pdev_get_pdev_id(wma->pdev),
2547 peer_mac, WLAN_LEGACY_WMA_ID);
2548 if (!peer) {
2549 WMA_LOGE("Peer of peer_mac %pM not found", peer_mac);
2550 return;
2551 }
2552
2553 wlan_peer_set_unicast_cipher(peer, uc_cipher);
2554 wlan_objmgr_peer_release_ref(peer, WLAN_LEGACY_WMA_ID);
Abhishek Singhf880a7d2019-04-29 14:51:11 +05302555
2556 wma_debug("Set unicast cipher %d for %pM", uc_cipher, peer_mac);
Abhishek Singh7c1c7432019-04-04 12:11:57 +05302557}
2558
Abhishek Singhf880a7d2019-04-29 14:51:11 +05302559static void wma_get_peer_uc_cipher(tp_wma_handle wma, uint8_t *peer_mac,
2560 uint32_t *uc_cipher, uint32_t *cipher_cap)
Abhishek Singh7c1c7432019-04-04 12:11:57 +05302561{
Abhishek Singhf880a7d2019-04-29 14:51:11 +05302562 uint32_t cipher;
Abhishek Singh7c1c7432019-04-04 12:11:57 +05302563 struct wlan_objmgr_peer *peer;
2564
2565 if (!peer_mac) {
2566 WMA_LOGE("peer_mac is NULL");
Abhishek Singhf880a7d2019-04-29 14:51:11 +05302567 return;
Abhishek Singh7c1c7432019-04-04 12:11:57 +05302568 }
2569 peer = wlan_objmgr_get_peer(wma->psoc,
2570 wlan_objmgr_pdev_get_pdev_id(wma->pdev),
2571 peer_mac, WLAN_LEGACY_WMA_ID);
2572 if (!peer) {
2573 WMA_LOGE("Peer of peer_mac %pM not found", peer_mac);
Abhishek Singhf880a7d2019-04-29 14:51:11 +05302574 return;
Abhishek Singh7c1c7432019-04-04 12:11:57 +05302575 }
2576
Abhishek Singhf880a7d2019-04-29 14:51:11 +05302577 cipher = wlan_peer_get_unicast_cipher(peer);
Abhishek Singh7c1c7432019-04-04 12:11:57 +05302578 wlan_objmgr_peer_release_ref(peer, WLAN_LEGACY_WMA_ID);
2579
Abhishek Singhf880a7d2019-04-29 14:51:11 +05302580 if (uc_cipher)
2581 *uc_cipher = cipher;
Abhishek Singh7c1c7432019-04-04 12:11:57 +05302582}
Abhishek Singhf880a7d2019-04-29 14:51:11 +05302583#endif
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002584/**
2585 * wma_roam_update_vdev() - Update the STA and BSS
2586 * @wma: Global WMA Handle
2587 * @roam_synch_ind_ptr: Information needed for roam sync propagation
2588 *
2589 * This function will perform all the vdev related operations with
2590 * respect to the self sta and the peer after roaming and completes
2591 * the roam synch propagation with respect to WMA layer.
2592 *
2593 * Return: None
2594 */
Jeff Johnsonc4b47a92016-10-07 12:34:41 -07002595static void wma_roam_update_vdev(tp_wma_handle wma,
Jeff Johnsona7f41dd2019-02-06 22:54:55 -08002596 struct roam_offload_synch_ind *roam_synch_ind_ptr)
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002597{
2598 tDeleteBssParams *del_bss_params;
2599 tDeleteStaParams *del_sta_params;
2600 tLinkStateParams *set_link_params;
2601 tAddStaParams *add_sta_params;
Abhishek Singhf880a7d2019-04-29 14:51:11 +05302602 uint32_t uc_cipher = 0, cipher_cap = 0;
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002603 uint8_t vdev_id;
2604
Pragaspathi Thilagaraja9ecc632019-02-23 00:50:24 +05302605 vdev_id = roam_synch_ind_ptr->roamed_vdev_id;
Naveen Rawat746a90b2017-06-07 15:16:35 -07002606 wma->interfaces[vdev_id].nss = roam_synch_ind_ptr->nss;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302607 del_bss_params = qdf_mem_malloc(sizeof(*del_bss_params));
2608 del_sta_params = qdf_mem_malloc(sizeof(*del_sta_params));
2609 set_link_params = qdf_mem_malloc(sizeof(*set_link_params));
2610 add_sta_params = qdf_mem_malloc(sizeof(*add_sta_params));
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002611 if (!del_bss_params || !del_sta_params ||
Arif Hussain157263f2018-10-03 13:07:15 -07002612 !set_link_params || !add_sta_params)
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002613 return;
Arif Hussain157263f2018-10-03 13:07:15 -07002614
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302615 qdf_mem_zero(del_bss_params, sizeof(*del_bss_params));
2616 qdf_mem_zero(del_sta_params, sizeof(*del_sta_params));
2617 qdf_mem_zero(set_link_params, sizeof(*set_link_params));
2618 qdf_mem_zero(add_sta_params, sizeof(*add_sta_params));
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002619
2620 del_bss_params->smesessionId = vdev_id;
2621 del_sta_params->smesessionId = vdev_id;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302622 qdf_mem_copy(del_bss_params->bssid, wma->interfaces[vdev_id].bssid,
Srinivas Girigowdaa47b45f2019-02-27 12:29:02 -08002623 QDF_MAC_ADDR_SIZE);
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002624 set_link_params->state = eSIR_LINK_PREASSOC_STATE;
Varun Reddy Yeturu28925b42016-02-08 07:18:50 -08002625 qdf_mem_copy(set_link_params->selfMacAddr,
Srinivas Girigowdaa47b45f2019-02-27 12:29:02 -08002626 roam_synch_ind_ptr->self_mac.bytes, QDF_MAC_ADDR_SIZE);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302627 qdf_mem_copy(set_link_params->bssid, roam_synch_ind_ptr->bssid.bytes,
Srinivas Girigowdaa47b45f2019-02-27 12:29:02 -08002628 QDF_MAC_ADDR_SIZE);
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002629 add_sta_params->staType = STA_ENTRY_SELF;
2630 add_sta_params->smesessionId = vdev_id;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302631 qdf_mem_copy(&add_sta_params->bssId, &roam_synch_ind_ptr->bssid.bytes,
Srinivas Girigowdaa47b45f2019-02-27 12:29:02 -08002632 QDF_MAC_ADDR_SIZE);
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002633 add_sta_params->staIdx = STA_INVALID_IDX;
2634 add_sta_params->assocId = roam_synch_ind_ptr->aid;
2635
Abhishek Singh7c1c7432019-04-04 12:11:57 +05302636 /*
2637 * Get uc cipher of old peer to update new peer as it doesnt
2638 * change in roaming
2639 */
Abhishek Singhf880a7d2019-04-29 14:51:11 +05302640 wma_get_peer_uc_cipher(wma, del_bss_params->bssid, &uc_cipher,
2641 &cipher_cap);
Abhishek Singh7c1c7432019-04-04 12:11:57 +05302642
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002643 wma_delete_sta(wma, del_sta_params);
2644 wma_delete_bss(wma, del_bss_params);
2645 wma_set_linkstate(wma, set_link_params);
Abhishek Singh7c1c7432019-04-04 12:11:57 +05302646 /* Update new peer's uc cipher */
Abhishek Singhf880a7d2019-04-29 14:51:11 +05302647 wma_update_roamed_peer_unicast_cipher(wma, uc_cipher, cipher_cap,
Abhishek Singh7c1c7432019-04-04 12:11:57 +05302648 roam_synch_ind_ptr->bssid.bytes);
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002649 wma_add_bss(wma, (tpAddBssParams)roam_synch_ind_ptr->add_bss_params);
2650 wma_add_sta(wma, add_sta_params);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302651 qdf_mem_copy(wma->interfaces[vdev_id].bssid,
Srinivas Girigowdaa47b45f2019-02-27 12:29:02 -08002652 roam_synch_ind_ptr->bssid.bytes, QDF_MAC_ADDR_SIZE);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302653 qdf_mem_free(del_bss_params);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302654 qdf_mem_free(set_link_params);
2655 qdf_mem_free(add_sta_params);
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002656}
2657
Sandeep Puligilla3746d5d2018-10-23 16:01:11 -07002658int wma_mlme_roam_synch_event_handler_cb(void *handle, uint8_t *event,
2659 uint32_t len)
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002660{
2661 WMI_ROAM_SYNCH_EVENTID_param_tlvs *param_buf = NULL;
2662 wmi_roam_synch_event_fixed_param *synch_event = NULL;
2663 tp_wma_handle wma = (tp_wma_handle) handle;
Jeff Johnsona7f41dd2019-02-06 22:54:55 -08002664 struct roam_offload_synch_ind *roam_synch_ind_ptr = NULL;
Pragaspathi Thilagaraj1d8e2ab2019-03-04 23:59:21 +05302665 struct bss_description *bss_desc_ptr = NULL;
Pragaspathi Thilagaraj8b12fbe2019-01-22 15:59:28 +05302666 uint8_t channel;
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002667 uint16_t ie_len = 0;
2668 int status = -EINVAL;
Jeff Johnsone6da4b02019-02-06 22:22:04 -08002669 struct roam_offload_scan_req *roam_req;
Varun Reddy Yeturu5ab47462016-05-08 18:08:11 -07002670 qdf_time_t roam_synch_received = qdf_get_system_timestamp();
Vignesh Viswanathanf8800692017-09-28 14:49:00 +05302671 uint32_t roam_synch_data_len;
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302672 A_UINT32 bcn_probe_rsp_len;
2673 A_UINT32 reassoc_rsp_len;
2674 A_UINT32 reassoc_req_len;
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002675
2676 WMA_LOGD("LFR3:%s", __func__);
2677 if (!event) {
2678 WMA_LOGE("%s: event param null", __func__);
Varun Reddy Yeturu1ce7aff2017-03-15 16:14:03 -07002679 goto cleanup_label;
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002680 }
2681
2682 param_buf = (WMI_ROAM_SYNCH_EVENTID_param_tlvs *) event;
2683 if (!param_buf) {
2684 WMA_LOGE("%s: received null buf from target", __func__);
Varun Reddy Yeturu1ce7aff2017-03-15 16:14:03 -07002685 goto cleanup_label;
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002686 }
2687
2688 synch_event = param_buf->fixed_param;
2689 if (!synch_event) {
2690 WMA_LOGE("%s: received null event data from target", __func__);
Varun Reddy Yeturu1ce7aff2017-03-15 16:14:03 -07002691 goto cleanup_label;
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002692 }
2693
Pragaspathi Thilagaraj54ac69d2018-04-02 17:21:26 +05302694 if (synch_event->vdev_id >= wma->max_bssid) {
2695 WMA_LOGE("%s: received invalid vdev_id %d",
2696 __func__, synch_event->vdev_id);
2697 return status;
2698 }
2699
Tushnim Bhattacharyyaeb622b02018-05-07 13:50:51 -07002700 /*
2701 * This flag is set during ROAM_START and once this event is being
2702 * executed which is a run to completion, no other event can interrupt
2703 * this in MC thread context. So, it is OK to reset the flag here as
2704 * soon as we receive this event.
2705 */
2706 wma->interfaces[synch_event->vdev_id].roaming_in_progress = false;
2707
Abhinav Kumara03659c2017-12-28 15:18:07 +05302708 if (synch_event->bcn_probe_rsp_len >
2709 param_buf->num_bcn_probe_rsp_frame ||
2710 synch_event->reassoc_req_len >
2711 param_buf->num_reassoc_req_frame ||
2712 synch_event->reassoc_rsp_len >
2713 param_buf->num_reassoc_rsp_frame) {
2714 WMA_LOGD("Invalid synch payload: LEN bcn:%d, req:%d, rsp:%d",
2715 synch_event->bcn_probe_rsp_len,
2716 synch_event->reassoc_req_len,
2717 synch_event->reassoc_rsp_len);
2718 goto cleanup_label;
2719 }
Vignesh Viswanathanf8800692017-09-28 14:49:00 +05302720
Deepak Dhamdheref918d422017-07-06 12:56:29 -07002721 wlan_roam_debug_log(synch_event->vdev_id, DEBUG_ROAM_SYNCH_IND,
2722 DEBUG_INVALID_PEER_ID, NULL, NULL,
2723 synch_event->bssid.mac_addr31to0,
2724 synch_event->bssid.mac_addr47to32);
Himanshu Agarwal67a863b2016-09-20 15:09:09 +05302725 DPTRACE(qdf_dp_trace_record_event(QDF_DP_TRACE_EVENT_RECORD,
Venkata Sharath Chandra Manchala0b9fc632017-05-15 14:35:15 -07002726 synch_event->vdev_id, QDF_TRACE_DEFAULT_PDEV_ID,
2727 QDF_PROTO_TYPE_EVENT, QDF_ROAM_SYNCH));
Himanshu Agarwal67a863b2016-09-20 15:09:09 +05302728
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002729 if (wma_is_roam_synch_in_progress(wma, synch_event->vdev_id)) {
2730 WMA_LOGE("%s: Ignoring RSI since one is already in progress",
2731 __func__);
Varun Reddy Yeturu1ce7aff2017-03-15 16:14:03 -07002732 goto cleanup_label;
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002733 }
Abhinav Kumar50d4dc72018-06-15 16:35:50 +05302734 WMA_LOGD("LFR3: Received WMA_ROAM_OFFLOAD_SYNCH_IND");
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002735
Varun Reddy Yeturu46ba20c2017-08-17 15:03:27 -07002736 /*
2737 * All below length fields are unsigned and hence positive numbers.
2738 * Maximum number during the addition would be (3 * MAX_LIMIT(UINT32) +
2739 * few fixed fields).
2740 */
Vignesh Viswanathanf8800692017-09-28 14:49:00 +05302741 WMA_LOGD("synch payload: LEN bcn:%d, req:%d, rsp:%d",
2742 synch_event->bcn_probe_rsp_len,
2743 synch_event->reassoc_req_len,
2744 synch_event->reassoc_rsp_len);
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302745
Vignesh Viswanathanf8800692017-09-28 14:49:00 +05302746 /*
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302747 * If lengths of bcn_probe_rsp, reassoc_req and reassoc_rsp are zero in
2748 * synch_event driver would have received bcn_probe_rsp, reassoc_req
2749 * and reassoc_rsp via the event WMI_ROAM_SYNCH_FRAME_EVENTID
Vignesh Viswanathanf8800692017-09-28 14:49:00 +05302750 */
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302751 if ((!synch_event->bcn_probe_rsp_len) &&
2752 (!synch_event->reassoc_req_len) &&
2753 (!synch_event->reassoc_rsp_len)) {
2754 bcn_probe_rsp_len = wma->interfaces[synch_event->vdev_id].
2755 roam_synch_frame_ind.
2756 bcn_probe_rsp_len;
2757 reassoc_req_len = wma->interfaces[synch_event->vdev_id].
2758 roam_synch_frame_ind.reassoc_req_len;
2759 reassoc_rsp_len = wma->interfaces[synch_event->vdev_id].
2760 roam_synch_frame_ind.reassoc_rsp_len;
2761
2762 roam_synch_data_len = bcn_probe_rsp_len + reassoc_rsp_len +
Jeff Johnsona7f41dd2019-02-06 22:54:55 -08002763 reassoc_req_len + sizeof(struct roam_offload_synch_ind);
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302764
2765 WMA_LOGD("Updated synch payload: LEN bcn:%d, req:%d, rsp:%d",
2766 bcn_probe_rsp_len,
2767 reassoc_req_len,
2768 reassoc_rsp_len);
2769 } else {
2770 bcn_probe_rsp_len = synch_event->bcn_probe_rsp_len;
2771 reassoc_req_len = synch_event->reassoc_req_len;
2772 reassoc_rsp_len = synch_event->reassoc_rsp_len;
2773
2774 if (synch_event->bcn_probe_rsp_len > WMI_SVC_MSG_MAX_SIZE)
2775 goto cleanup_label;
2776 if (synch_event->reassoc_rsp_len >
2777 (WMI_SVC_MSG_MAX_SIZE - synch_event->bcn_probe_rsp_len))
2778 goto cleanup_label;
2779 if (synch_event->reassoc_req_len >
2780 WMI_SVC_MSG_MAX_SIZE - (synch_event->bcn_probe_rsp_len +
2781 synch_event->reassoc_rsp_len))
2782 goto cleanup_label;
2783
2784 roam_synch_data_len = bcn_probe_rsp_len +
2785 reassoc_rsp_len + reassoc_req_len;
2786
2787 /*
2788 * Below is the check for the entire size of the message
2789 * received from the firmware.
2790 */
2791 if (roam_synch_data_len > WMI_SVC_MSG_MAX_SIZE -
2792 (sizeof(*synch_event) + sizeof(wmi_channel) +
2793 sizeof(wmi_key_material) + sizeof(uint32_t)))
2794 goto cleanup_label;
2795
Jeff Johnsona7f41dd2019-02-06 22:54:55 -08002796 roam_synch_data_len += sizeof(struct roam_offload_synch_ind);
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302797 }
2798
Kiran Kumar Lokere1d411bb2017-11-29 15:24:05 -08002799 WMA_LOGD("synch payload: LEN bcn:%d, req:%d, rsp:%d",
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302800 bcn_probe_rsp_len,
2801 reassoc_req_len,
2802 reassoc_rsp_len);
Varun Reddy Yeturu46ba20c2017-08-17 15:03:27 -07002803
Mukul Sharmae44d0542017-05-23 21:50:56 +05302804 cds_host_diag_log_work(&wma->roam_ho_wl,
2805 WMA_ROAM_HO_WAKE_LOCK_DURATION,
2806 WIFI_POWER_EVENT_WAKELOCK_WOW);
2807 qdf_wake_lock_timeout_acquire(&wma->roam_ho_wl,
yeshwanth sriram guntuka37c09822017-01-24 18:30:15 +05302808 WMA_ROAM_HO_WAKE_LOCK_DURATION);
2809
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002810 wma->interfaces[synch_event->vdev_id].roam_synch_in_progress = true;
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302811
Arif Hussain157263f2018-10-03 13:07:15 -07002812 roam_synch_ind_ptr = qdf_mem_malloc(roam_synch_data_len);
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002813 if (!roam_synch_ind_ptr) {
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07002814 QDF_ASSERT(roam_synch_ind_ptr);
yeshwanth sriram guntuka37c09822017-01-24 18:30:15 +05302815 status = -ENOMEM;
2816 goto cleanup_label;
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002817 }
Vignesh Viswanathanf8800692017-09-28 14:49:00 +05302818 qdf_mem_zero(roam_synch_ind_ptr, roam_synch_data_len);
Varun Reddy Yeturu1ce7aff2017-03-15 16:14:03 -07002819 status = wma_fill_roam_synch_buffer(wma,
2820 roam_synch_ind_ptr, param_buf);
2821 if (status != 0)
Varun Reddy Yeturu88f123c2017-03-14 18:24:32 -07002822 goto cleanup_label;
Naveen Rawat8cc23b02016-07-14 12:22:56 -07002823 /* 24 byte MAC header and 12 byte to ssid IE */
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002824 if (roam_synch_ind_ptr->beaconProbeRespLength >
2825 (SIR_MAC_HDR_LEN_3A + SIR_MAC_B_PR_SSID_OFFSET)) {
2826 ie_len = roam_synch_ind_ptr->beaconProbeRespLength -
2827 (SIR_MAC_HDR_LEN_3A + SIR_MAC_B_PR_SSID_OFFSET);
2828 } else {
2829 WMA_LOGE("LFR3: Invalid Beacon Length");
2830 goto cleanup_label;
2831 }
Pragaspathi Thilagaraj1112c962019-05-23 23:45:38 +05302832 bss_desc_ptr = qdf_mem_malloc(sizeof(struct bss_description) + ie_len);
Arif Hussain157263f2018-10-03 13:07:15 -07002833 if (!bss_desc_ptr) {
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07002834 QDF_ASSERT(bss_desc_ptr);
yeshwanth sriram guntuka37c09822017-01-24 18:30:15 +05302835 status = -ENOMEM;
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002836 goto cleanup_label;
2837 }
Pragaspathi Thilagaraj1112c962019-05-23 23:45:38 +05302838 qdf_mem_zero(bss_desc_ptr, sizeof(struct bss_description) + ie_len);
Selvaraj, Sridhara6e3eba2017-03-14 19:52:39 +05302839 if (QDF_IS_STATUS_ERROR(wma->pe_roam_synch_cb(
Jeff Johnson9f18aa72018-12-02 12:05:12 -08002840 (struct mac_context *)wma->mac_context,
Varun Reddy Yeturub5d858e2017-12-15 16:08:13 -08002841 roam_synch_ind_ptr, bss_desc_ptr,
2842 SIR_ROAM_SYNCH_PROPAGATION))) {
Selvaraj, Sridhara6e3eba2017-03-14 19:52:39 +05302843 WMA_LOGE("LFR3: PE roam synch cb failed");
2844 status = -EBUSY;
2845 goto cleanup_label;
2846 }
Naveen Rawat746a90b2017-06-07 15:16:35 -07002847
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002848 wma_roam_update_vdev(wma, roam_synch_ind_ptr);
Jeff Johnson9f18aa72018-12-02 12:05:12 -08002849 wma->csr_roam_synch_cb((struct mac_context *)wma->mac_context,
Varun Reddy Yeturuf907f912016-03-21 15:06:22 -07002850 roam_synch_ind_ptr, bss_desc_ptr, SIR_ROAM_SYNCH_PROPAGATION);
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002851 wma_process_roam_synch_complete(wma, synch_event->vdev_id);
Naveen Rawat8cc23b02016-07-14 12:22:56 -07002852
2853 /* update freq and channel width */
2854 wma->interfaces[synch_event->vdev_id].mhz =
2855 roam_synch_ind_ptr->chan_freq;
2856 if (roam_synch_ind_ptr->join_rsp)
2857 wma->interfaces[synch_event->vdev_id].chan_width =
2858 roam_synch_ind_ptr->join_rsp->vht_channel_width;
Pragaspathi Thilagaraj8b12fbe2019-01-22 15:59:28 +05302859 /*
2860 * update phy_mode in wma to avoid mismatch in phymode between host and
2861 * firmware. The phymode stored in interface[vdev_id].chanmode is sent
2862 * to firmware as part of opmode update during either - vht opmode
2863 * action frame received or during opmode change detected while
2864 * processing beacon. Any mismatch of this value with firmware phymode
2865 * results in firmware assert.
2866 */
2867 channel = wlan_freq_to_chan(wma->interfaces[synch_event->vdev_id].mhz);
2868 wma_get_phy_mode_cb(channel,
2869 wma->interfaces[synch_event->vdev_id].chan_width,
2870 &wma->interfaces[synch_event->vdev_id].chanmode);
Naveen Rawat8cc23b02016-07-14 12:22:56 -07002871
Jeff Johnson9f18aa72018-12-02 12:05:12 -08002872 wma->csr_roam_synch_cb((struct mac_context *)wma->mac_context,
Naveen Rawat8cc23b02016-07-14 12:22:56 -07002873 roam_synch_ind_ptr, bss_desc_ptr, SIR_ROAM_SYNCH_COMPLETE);
Varun Reddy Yeturu5ab47462016-05-08 18:08:11 -07002874 wma->interfaces[synch_event->vdev_id].roam_synch_delay =
2875 qdf_get_system_timestamp() - roam_synch_received;
2876 WMA_LOGD("LFR3: roam_synch_delay:%d",
2877 wma->interfaces[synch_event->vdev_id].roam_synch_delay);
Jeff Johnson9f18aa72018-12-02 12:05:12 -08002878 wma->csr_roam_synch_cb((struct mac_context *)wma->mac_context,
Varun Reddy Yeturu04251862016-09-16 10:33:19 -07002879 roam_synch_ind_ptr, bss_desc_ptr, SIR_ROAM_SYNCH_NAPI_OFF);
yeshwanth sriram guntuka37c09822017-01-24 18:30:15 +05302880
2881 status = 0;
2882
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002883cleanup_label:
Varun Reddy Yeturu1ce7aff2017-03-15 16:14:03 -07002884 if (status != 0) {
2885 if (roam_synch_ind_ptr)
Jeff Johnson9f18aa72018-12-02 12:05:12 -08002886 wma->csr_roam_synch_cb((struct mac_context *)wma->mac_context,
Varun Reddy Yeturu1ce7aff2017-03-15 16:14:03 -07002887 roam_synch_ind_ptr, NULL, SIR_ROAMING_ABORT);
Jeff Johnsone6da4b02019-02-06 22:22:04 -08002888 roam_req = qdf_mem_malloc(sizeof(struct roam_offload_scan_req));
Varun Reddy Yeturu06488012017-05-25 11:44:10 -07002889 if (roam_req && synch_event) {
Krunal Sonifea06802017-04-13 14:44:48 -07002890 roam_req->Command = ROAM_SCAN_OFFLOAD_STOP;
Varun Reddy Yeturubc1bea02018-02-01 18:12:34 -08002891 roam_req->reason = REASON_ROAM_SYNCH_FAILED;
Varun Reddy Yeturu06488012017-05-25 11:44:10 -07002892 roam_req->sessionId = synch_event->vdev_id;
Krunal Sonifea06802017-04-13 14:44:48 -07002893 wma_process_roaming_config(wma, roam_req);
2894 }
Varun Reddy Yeturu1ce7aff2017-03-15 16:14:03 -07002895 }
yeshwanth sriram guntuka37c09822017-01-24 18:30:15 +05302896 if (roam_synch_ind_ptr && roam_synch_ind_ptr->join_rsp)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302897 qdf_mem_free(roam_synch_ind_ptr->join_rsp);
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002898 if (roam_synch_ind_ptr)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302899 qdf_mem_free(roam_synch_ind_ptr);
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002900 if (bss_desc_ptr)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302901 qdf_mem_free(bss_desc_ptr);
Krunal Sonifea06802017-04-13 14:44:48 -07002902 if (wma && synch_event)
2903 wma->interfaces[synch_event->vdev_id].roam_synch_in_progress =
2904 false;
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002905
yeshwanth sriram guntuka37c09822017-01-24 18:30:15 +05302906 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002907}
2908
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302909int wma_roam_synch_frame_event_handler(void *handle, uint8_t *event,
2910 uint32_t len)
2911{
2912 WMI_ROAM_SYNCH_FRAME_EVENTID_param_tlvs *param_buf = NULL;
2913 wmi_roam_synch_frame_event_fixed_param *synch_frame_event = NULL;
2914 tp_wma_handle wma = (tp_wma_handle) handle;
2915 A_UINT32 vdev_id;
2916 struct wma_txrx_node *iface = NULL;
2917 int status = -EINVAL;
2918
2919 WMA_LOGD("LFR3:Synch Frame event");
2920 if (!event) {
2921 WMA_LOGE("event param null");
Pragaspathi Thilagarajea97fe92018-07-23 15:01:54 +05302922 return status;
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302923 }
2924
2925 param_buf = (WMI_ROAM_SYNCH_FRAME_EVENTID_param_tlvs *) event;
2926 if (!param_buf) {
2927 WMA_LOGE("received null buf from target");
Pragaspathi Thilagarajea97fe92018-07-23 15:01:54 +05302928 return status;
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302929 }
2930
2931 synch_frame_event = param_buf->fixed_param;
2932 if (!synch_frame_event) {
2933 WMA_LOGE("received null event data from target");
Pragaspathi Thilagarajea97fe92018-07-23 15:01:54 +05302934 return status;
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302935 }
2936
2937 if (synch_frame_event->vdev_id >= wma->max_bssid) {
2938 WMA_LOGE("received invalid vdev_id %d",
2939 synch_frame_event->vdev_id);
Pragaspathi Thilagarajea97fe92018-07-23 15:01:54 +05302940 return status;
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302941 }
2942
Will Huang6ab242c2018-08-29 15:43:24 +08002943 if (synch_frame_event->bcn_probe_rsp_len >
2944 param_buf->num_bcn_probe_rsp_frame ||
2945 synch_frame_event->reassoc_req_len >
2946 param_buf->num_reassoc_req_frame ||
2947 synch_frame_event->reassoc_rsp_len >
2948 param_buf->num_reassoc_rsp_frame) {
2949 WMA_LOGE("fixed/actual len err: bcn:%d/%d req:%d/%d rsp:%d/%d",
2950 synch_frame_event->bcn_probe_rsp_len,
2951 param_buf->num_bcn_probe_rsp_frame,
2952 synch_frame_event->reassoc_req_len,
2953 param_buf->num_reassoc_req_frame,
2954 synch_frame_event->reassoc_rsp_len,
2955 param_buf->num_reassoc_rsp_frame);
2956 return status;
2957 }
2958
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302959 vdev_id = synch_frame_event->vdev_id;
2960 iface = &wma->interfaces[vdev_id];
2961
2962 if (wma_is_roam_synch_in_progress(wma, vdev_id)) {
2963 WMA_LOGE("Ignoring this event as it is unexpected");
Pragaspathi Thilagarajea97fe92018-07-23 15:01:54 +05302964 wma_free_roam_synch_frame_ind(iface);
2965 return status;
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302966 }
2967 WMA_LOGD("LFR3: Received ROAM_SYNCH_FRAME_EVENT");
2968
2969 WMA_LOGD("synch frame payload: LEN bcn:%d, req:%d, rsp:%d morefrag: %d",
2970 synch_frame_event->bcn_probe_rsp_len,
2971 synch_frame_event->reassoc_req_len,
2972 synch_frame_event->reassoc_rsp_len,
2973 synch_frame_event->more_frag);
2974
2975 if (synch_frame_event->bcn_probe_rsp_len) {
2976 iface->roam_synch_frame_ind.bcn_probe_rsp_len =
2977 synch_frame_event->bcn_probe_rsp_len;
2978 iface->roam_synch_frame_ind.is_beacon =
2979 synch_frame_event->is_beacon;
2980
Pragaspathi Thilagarajea97fe92018-07-23 15:01:54 +05302981 if (iface->roam_synch_frame_ind.bcn_probe_rsp)
2982 qdf_mem_free(iface->roam_synch_frame_ind.
2983 bcn_probe_rsp);
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302984 iface->roam_synch_frame_ind.bcn_probe_rsp =
2985 qdf_mem_malloc(iface->roam_synch_frame_ind.
2986 bcn_probe_rsp_len);
2987 if (!iface->roam_synch_frame_ind.bcn_probe_rsp) {
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302988 QDF_ASSERT(iface->roam_synch_frame_ind.
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07002989 bcn_probe_rsp);
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302990 status = -ENOMEM;
Pragaspathi Thilagarajea97fe92018-07-23 15:01:54 +05302991 wma_free_roam_synch_frame_ind(iface);
2992 return status;
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302993 }
2994 qdf_mem_copy(iface->roam_synch_frame_ind.
2995 bcn_probe_rsp,
2996 param_buf->bcn_probe_rsp_frame,
2997 iface->roam_synch_frame_ind.bcn_probe_rsp_len);
2998 }
2999
3000 if (synch_frame_event->reassoc_req_len) {
3001 iface->roam_synch_frame_ind.reassoc_req_len =
3002 synch_frame_event->reassoc_req_len;
3003
Pragaspathi Thilagarajea97fe92018-07-23 15:01:54 +05303004 if (iface->roam_synch_frame_ind.reassoc_req)
3005 qdf_mem_free(iface->roam_synch_frame_ind.reassoc_req);
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05303006 iface->roam_synch_frame_ind.reassoc_req =
3007 qdf_mem_malloc(iface->roam_synch_frame_ind.
3008 reassoc_req_len);
3009 if (!iface->roam_synch_frame_ind.reassoc_req) {
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05303010 QDF_ASSERT(iface->roam_synch_frame_ind.
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07003011 reassoc_req);
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05303012 status = -ENOMEM;
Pragaspathi Thilagarajea97fe92018-07-23 15:01:54 +05303013 wma_free_roam_synch_frame_ind(iface);
3014 return status;
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05303015 }
3016 qdf_mem_copy(iface->roam_synch_frame_ind.reassoc_req,
3017 param_buf->reassoc_req_frame,
3018 iface->roam_synch_frame_ind.reassoc_req_len);
3019 }
3020
3021 if (synch_frame_event->reassoc_rsp_len) {
3022 iface->roam_synch_frame_ind.reassoc_rsp_len =
3023 synch_frame_event->reassoc_rsp_len;
3024
Pragaspathi Thilagarajea97fe92018-07-23 15:01:54 +05303025 if (iface->roam_synch_frame_ind.reassoc_rsp)
3026 qdf_mem_free(iface->roam_synch_frame_ind.reassoc_rsp);
3027
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05303028 iface->roam_synch_frame_ind.reassoc_rsp =
3029 qdf_mem_malloc(iface->roam_synch_frame_ind.
3030 reassoc_rsp_len);
3031 if (!iface->roam_synch_frame_ind.reassoc_rsp) {
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05303032 QDF_ASSERT(iface->roam_synch_frame_ind.
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07003033 reassoc_rsp);
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05303034 status = -ENOMEM;
Pragaspathi Thilagarajea97fe92018-07-23 15:01:54 +05303035 wma_free_roam_synch_frame_ind(iface);
3036 return status;
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05303037 }
3038 qdf_mem_copy(iface->roam_synch_frame_ind.reassoc_rsp,
3039 param_buf->reassoc_rsp_frame,
3040 iface->roam_synch_frame_ind.reassoc_rsp_len);
3041 }
3042 return 0;
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05303043}
3044
Sandeep Puligilla3746d5d2018-10-23 16:01:11 -07003045/**
3046 * __wma_roam_synch_event_handler() - roam synch event handler
3047 * @handle: wma handle
3048 * @event: event data
3049 * @len: length of data
3050 *
3051 * This function is roam synch event handler.It sends roam
3052 * indication for upper layer.
3053 *
3054 * Return: Success or Failure status
3055 */
3056int wma_roam_synch_event_handler(void *handle, uint8_t *event,
3057 uint32_t len)
3058{
3059 QDF_STATUS qdf_status = QDF_STATUS_E_FAILURE;
3060 int status = -EINVAL;
3061 tp_wma_handle wma = (tp_wma_handle) handle;
3062 struct wma_txrx_node *iface = NULL;
3063 wmi_roam_synch_event_fixed_param *synch_event = NULL;
3064 WMI_ROAM_SYNCH_EVENTID_param_tlvs *param_buf = NULL;
3065
3066 if (!event) {
3067 wma_err_rl("event param null");
Harprit Chhabada3f530bf2019-04-23 14:11:00 -07003068 return status;
Sandeep Puligilla3746d5d2018-10-23 16:01:11 -07003069 }
3070
3071 param_buf = (WMI_ROAM_SYNCH_EVENTID_param_tlvs *)event;
3072 if (!param_buf) {
3073 wma_err_rl("received null buf from target");
Harprit Chhabada3f530bf2019-04-23 14:11:00 -07003074 return status;
Sandeep Puligilla3746d5d2018-10-23 16:01:11 -07003075 }
3076 synch_event = param_buf->fixed_param;
3077 if (!synch_event) {
3078 wma_err_rl("received null event data from target");
Harprit Chhabada3f530bf2019-04-23 14:11:00 -07003079 return status;
Sandeep Puligilla3746d5d2018-10-23 16:01:11 -07003080 }
3081
3082 if (synch_event->vdev_id >= wma->max_bssid) {
3083 wma_err_rl("received invalid vdev_id %d",
3084 synch_event->vdev_id);
Harprit Chhabada3f530bf2019-04-23 14:11:00 -07003085 return status;
Sandeep Puligilla3746d5d2018-10-23 16:01:11 -07003086 }
3087
3088 iface = &wma->interfaces[synch_event->vdev_id];
3089 qdf_status = wlan_vdev_mlme_sm_deliver_evt(iface->vdev,
3090 WLAN_VDEV_SM_EV_ROAM,
Abhinav Kumar9cfc2f52019-03-08 20:29:49 +05303091 len,
3092 event);
Sandeep Puligilla3746d5d2018-10-23 16:01:11 -07003093 if (QDF_IS_STATUS_ERROR(qdf_status)) {
3094 wma_err("Failed to send the EV_ROAM");
Harprit Chhabada3f530bf2019-04-23 14:11:00 -07003095 return status;
Sandeep Puligilla3746d5d2018-10-23 16:01:11 -07003096 }
Harprit Chhabada3f530bf2019-04-23 14:11:00 -07003097 wma_debug("Posted EV_ROAM to VDEV SM");
3098 return 0;
Sandeep Puligilla3746d5d2018-10-23 16:01:11 -07003099}
Sandeep Puligilla3746d5d2018-10-23 16:01:11 -07003100
gaurank kathpaliac63859d2018-05-03 18:48:41 +05303101#define RSN_CAPS_SHIFT 16
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003102/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003103 * wma_roam_scan_fill_self_caps() - fill capabilities
3104 * @wma_handle: wma handle
3105 * @roam_offload_params: offload parameters
3106 * @roam_req: roam request
3107 *
3108 * This function fills roam self capablities.
3109 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05303110 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003111 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303112QDF_STATUS wma_roam_scan_fill_self_caps(tp_wma_handle wma_handle,
Himanshu Agarwalb56ad2e2016-07-19 15:43:09 +05303113 roam_offload_param *
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003114 roam_offload_params,
Jeff Johnsone6da4b02019-02-06 22:22:04 -08003115 struct roam_offload_scan_req *roam_req)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003116{
Karthik Kantamnenie3bbd7f2018-09-19 20:27:32 +05303117 qdf_size_t val_len;
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08003118 struct mac_context *mac = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003119 tSirMacCapabilityInfo selfCaps;
3120 uint32_t val = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003121 uint16_t *pCfgValue16;
3122 uint8_t nCfgValue8, *pCfgValue8;
3123 tSirMacQosInfoStation macQosInfoSta;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003124
hangtian127c9532019-01-12 13:29:07 +08003125 qdf_mem_zero(&macQosInfoSta, sizeof(tSirMacQosInfoStation));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003126 /* Roaming is done only for INFRA STA type.
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003127 * So, ess will be one and ibss will be Zero
3128 */
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08003129 mac = cds_get_context(QDF_MODULE_ID_PE);
3130 if (!mac) {
3131 WMA_LOGE("%s:NULL mac ptr. Exiting", __func__);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303132 QDF_ASSERT(0);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303133 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003134 }
3135
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003136 selfCaps.ess = 1;
3137 selfCaps.ibss = 0;
Pragaspathi Thilagarajda3b5e22018-09-23 01:55:57 +05303138
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08003139 val = mac->mlme_cfg->wep_params.is_privacy_enabled;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003140 if (val)
3141 selfCaps.privacy = 1;
Vignesh Viswanathanddc89e52018-11-02 18:43:42 +05303142
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08003143 if (mac->mlme_cfg->ht_caps.short_preamble)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003144 selfCaps.shortPreamble = 1;
3145
3146 selfCaps.pbcc = 0;
3147 selfCaps.channelAgility = 0;
gaurank kathpaliae5a17e42018-09-10 10:05:25 +05303148
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08003149 if (mac->mlme_cfg->feature_flags.enable_short_slot_time_11g)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003150 selfCaps.shortSlotTime = 1;
Abhinav Kumard4d6eb72018-12-04 20:30:37 +05303151
3152 if (mac->mlme_cfg->gen.enabled_11h)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003153 selfCaps.spectrumMgt = 1;
Pragaspathi Thilagarajec7dc252018-09-06 15:38:49 +05303154
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08003155 if (mac->mlme_cfg->wmm_params.qos_enabled)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003156 selfCaps.qos = 1;
Pragaspathi Thilagarajec7dc252018-09-06 15:38:49 +05303157
Wu Gao5f764082019-01-04 15:54:38 +08003158 if (mac->mlme_cfg->scoring.apsd_enabled)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003159 selfCaps.apsd = 1;
Krishna Kumaar Natarajan4340c682015-11-03 12:09:00 -08003160
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08003161 selfCaps.rrm = mac->rrm.rrmSmeContext.rrmConfig.rrm_enabled;
Krishna Kumaar Natarajan4340c682015-11-03 12:09:00 -08003162
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08003163 val = mac->mlme_cfg->feature_flags.enable_block_ack;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003164 selfCaps.delayedBA =
3165 (uint16_t) ((val >> WNI_CFG_BLOCK_ACK_ENABLED_DELAYED) & 1);
3166 selfCaps.immediateBA =
3167 (uint16_t) ((val >> WNI_CFG_BLOCK_ACK_ENABLED_IMMEDIATE) & 1);
3168 pCfgValue16 = (uint16_t *) &selfCaps;
gaurank kathpaliac63859d2018-05-03 18:48:41 +05303169
3170 /*
3171 * RSN caps arent been sent to firmware, so in case of PMF required,
3172 * the firmware connects to a non PMF AP advertising PMF not required
3173 * in the re-assoc request which violates protocol.
3174 * So send this to firmware in the roam SCAN offload command to
3175 * let it configure the params in the re-assoc request too.
3176 * Instead of making another infra, send the RSN-CAPS in MSB of
3177 * beacon Caps.
3178 */
3179 roam_offload_params->capability = *((uint32_t *)(&roam_req->rsn_caps));
3180 roam_offload_params->capability <<= RSN_CAPS_SHIFT;
3181 roam_offload_params->capability |= ((*pCfgValue16) & 0xFFFF);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003182
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003183 roam_offload_params->ht_caps_info =
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08003184 *(uint32_t *)&mac->mlme_cfg->ht_caps.ht_cap_info;
Vignesh Viswanathanddc89e52018-11-02 18:43:42 +05303185
3186 roam_offload_params->ampdu_param =
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08003187 *(uint32_t *)&mac->mlme_cfg->ht_caps.ampdu_params;
Vignesh Viswanathanddc89e52018-11-02 18:43:42 +05303188
3189 roam_offload_params->ht_ext_cap =
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08003190 *(uint32_t *)&mac->mlme_cfg->ht_caps.ext_cap_info;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003191
Karthik Kantamnenie3bbd7f2018-09-19 20:27:32 +05303192 val_len = ROAM_OFFLOAD_NUM_MCS_SET;
3193 if (wlan_mlme_get_cfg_str((uint8_t *)roam_offload_params->mcsset,
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08003194 &mac->mlme_cfg->rates.supported_mcs_set,
Karthik Kantamnenie3bbd7f2018-09-19 20:27:32 +05303195 &val_len) != QDF_STATUS_SUCCESS) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303196 QDF_TRACE(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_ERROR,
Karthik Kantamnenie3bbd7f2018-09-19 20:27:32 +05303197 "Failed to get CFG_SUPPORTED_MCS_SET");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303198 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003199 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003200
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003201 /* tSirMacTxBFCapabilityInfo */
Abhinav Kumard4d6eb72018-12-04 20:30:37 +05303202 nCfgValue8 = (uint8_t)mac->mlme_cfg->vht_caps.vht_cap_info.tx_bf_cap;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003203 roam_offload_params->ht_txbf = nCfgValue8 & 0xFF;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003204 /* tSirMacASCapabilityInfo */
Abhinav Kumard4d6eb72018-12-04 20:30:37 +05303205 nCfgValue8 = (uint8_t)mac->mlme_cfg->vht_caps.vht_cap_info.as_cap;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003206 roam_offload_params->asel_cap = nCfgValue8 & 0xFF;
3207
3208 /* QOS Info */
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08003209 nCfgValue8 = mac->mlme_cfg->wmm_params.max_sp_length;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003210 macQosInfoSta.maxSpLen = nCfgValue8;
3211 macQosInfoSta.moreDataAck = 0;
3212 macQosInfoSta.qack = 0;
3213 macQosInfoSta.acbe_uapsd = roam_req->AcUapsd.acbe_uapsd;
3214 macQosInfoSta.acbk_uapsd = roam_req->AcUapsd.acbk_uapsd;
3215 macQosInfoSta.acvi_uapsd = roam_req->AcUapsd.acvi_uapsd;
3216 macQosInfoSta.acvo_uapsd = roam_req->AcUapsd.acvo_uapsd;
3217 pCfgValue8 = (uint8_t *) &macQosInfoSta;
3218 /* macQosInfoSta Only queue_request is set.Refer to
3219 * populate_dot11f_wmm_caps for more details
3220 */
3221 roam_offload_params->qos_caps = (*pCfgValue8) & 0xFF;
Naveen Rawat08340742016-11-17 14:54:39 -08003222 if (roam_offload_params->qos_caps)
3223 roam_offload_params->qos_enabled = true;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003224 roam_offload_params->wmm_caps = 0x4 & 0xFF;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303225 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003226}
3227
3228/**
3229 * wma_set_ric_req() - set ric request element
3230 * @wma: wma handle
3231 * @msg: message
3232 * @is_add_ts: is addts required
3233 *
3234 * This function sets ric request element for 11r roaming.
3235 *
3236 * Return: none
3237 */
3238void wma_set_ric_req(tp_wma_handle wma, void *msg, uint8_t is_add_ts)
3239{
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05303240 if (!wma) {
3241 WMA_LOGE("%s: wma handle is NULL", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003242 return;
3243 }
3244
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05303245 wmi_unified_set_ric_req_cmd(wma->wmi_handle, msg, is_add_ts);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003246}
3247#endif /* WLAN_FEATURE_ROAM_OFFLOAD */
3248
Qiwei Caie689a262018-07-26 15:50:22 +08003249#ifdef FEATURE_RSSI_MONITOR
Qiwei Caie689a262018-07-26 15:50:22 +08003250QDF_STATUS wma_set_rssi_monitoring(tp_wma_handle wma,
Jeff Johnson4c6d40f2019-02-22 20:49:56 -08003251 struct rssi_monitor_param *req)
Qiwei Caie689a262018-07-26 15:50:22 +08003252{
Qiwei Caie689a262018-07-26 15:50:22 +08003253 if (!wma) {
3254 WMA_LOGE("%s: wma handle is NULL", __func__);
3255 return QDF_STATUS_E_INVAL;
3256 }
3257
Jeff Johnson4c6d40f2019-02-22 20:49:56 -08003258 return wmi_unified_set_rssi_monitoring_cmd(wma->wmi_handle, req);
Qiwei Caie689a262018-07-26 15:50:22 +08003259}
3260
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003261/**
Varun Reddy Yeturubbbbe232016-02-29 14:01:57 -08003262 * wma_rssi_breached_event_handler() - rssi breached event handler
3263 * @handle: wma handle
3264 * @cmd_param_info: event handler data
3265 * @len: length of @cmd_param_info
3266 *
3267 * Return: 0 on success; error number otherwise
3268 */
3269int wma_rssi_breached_event_handler(void *handle,
3270 u_int8_t *cmd_param_info, u_int32_t len)
3271{
3272 WMI_RSSI_BREACH_EVENTID_param_tlvs *param_buf;
3273 wmi_rssi_breach_event_fixed_param *event;
3274 struct rssi_breach_event rssi;
Jeff Johnson9f18aa72018-12-02 12:05:12 -08003275 struct mac_context *mac = cds_get_context(QDF_MODULE_ID_PE);
Yeshwanth Sriram Guntuka14ab04c2018-09-21 15:06:49 +05303276 tp_wma_handle wma = cds_get_context(QDF_MODULE_ID_WMA);
Varun Reddy Yeturubbbbe232016-02-29 14:01:57 -08003277
Yeshwanth Sriram Guntuka14ab04c2018-09-21 15:06:49 +05303278 if (!mac || !wma) {
3279 WMA_LOGE("%s: Invalid mac/wma context", __func__);
Varun Reddy Yeturubbbbe232016-02-29 14:01:57 -08003280 return -EINVAL;
3281 }
3282 if (!mac->sme.rssi_threshold_breached_cb) {
3283 WMA_LOGE("%s: Callback not registered", __func__);
3284 return -EINVAL;
3285 }
3286 param_buf = (WMI_RSSI_BREACH_EVENTID_param_tlvs *)cmd_param_info;
3287 if (!param_buf) {
3288 WMA_LOGE("%s: Invalid rssi breached event", __func__);
3289 return -EINVAL;
3290 }
3291 event = param_buf->fixed_param;
3292
3293 rssi.request_id = event->request_id;
3294 rssi.session_id = event->vdev_id;
Yeshwanth Sriram Guntuka14ab04c2018-09-21 15:06:49 +05303295 if (wmi_service_enabled(wma->wmi_handle,
3296 wmi_service_hw_db2dbm_support))
3297 rssi.curr_rssi = event->rssi;
3298 else
3299 rssi.curr_rssi = event->rssi + WMA_TGT_NOISE_FLOOR_DBM;
Varun Reddy Yeturubbbbe232016-02-29 14:01:57 -08003300 WMI_MAC_ADDR_TO_CHAR_ARRAY(&event->bssid, rssi.curr_bssid.bytes);
3301
3302 WMA_LOGD("%s: req_id: %u vdev_id: %d curr_rssi: %d", __func__,
Qiwei Caie689a262018-07-26 15:50:22 +08003303 rssi.request_id, rssi.session_id, rssi.curr_rssi);
Varun Reddy Yeturubbbbe232016-02-29 14:01:57 -08003304 WMA_LOGI("%s: curr_bssid: %pM", __func__, rssi.curr_bssid.bytes);
3305
Jeff Johnson6aaaa992018-06-30 10:43:04 -07003306 mac->sme.rssi_threshold_breached_cb(mac->hdd_handle, &rssi);
Varun Reddy Yeturubbbbe232016-02-29 14:01:57 -08003307 WMA_LOGD("%s: Invoke HDD rssi breached callback", __func__);
3308 return 0;
3309}
Qiwei Caie689a262018-07-26 15:50:22 +08003310#endif /* FEATURE_RSSI_MONITOR */
Varun Reddy Yeturubbbbe232016-02-29 14:01:57 -08003311
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003312#ifdef WLAN_FEATURE_ROAM_OFFLOAD
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003313/**
3314 * wma_roam_ho_fail_handler() - LFR3.0 roam hand off failed handler
3315 * @wma: wma handle
3316 * @vdev_id: vdev id
3317 *
3318 * Return: none
3319 */
3320static void wma_roam_ho_fail_handler(tp_wma_handle wma, uint32_t vdev_id)
3321{
Jeff Johnson10cde692019-02-08 19:59:17 -08003322 struct handoff_failure_ind *ho_failure_ind;
Rajeev Kumarb60abe42017-01-21 15:39:31 -08003323 struct scheduler_msg sme_msg = { 0 };
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303324 QDF_STATUS qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003325
Jeff Johnson10cde692019-02-08 19:59:17 -08003326 ho_failure_ind = qdf_mem_malloc(sizeof(*ho_failure_ind));
Arif Hussain157263f2018-10-03 13:07:15 -07003327 if (!ho_failure_ind)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003328 return;
Arif Hussain157263f2018-10-03 13:07:15 -07003329
Jeff Johnson10cde692019-02-08 19:59:17 -08003330 ho_failure_ind->vdev_id = vdev_id;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003331 sme_msg.type = eWNI_SME_HO_FAIL_IND;
3332 sme_msg.bodyptr = ho_failure_ind;
3333 sme_msg.bodyval = 0;
3334
gaurank kathpalia00861f02018-08-28 19:16:12 +05303335 qdf_status = scheduler_post_message(QDF_MODULE_ID_WMA,
3336 QDF_MODULE_ID_SME,
3337 QDF_MODULE_ID_SME, &sme_msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303338 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003339 WMA_LOGE("Fail to post eWNI_SME_HO_FAIL_IND msg to SME");
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303340 qdf_mem_free(ho_failure_ind);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003341 return;
3342 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003343}
3344
3345/**
3346 * wma_process_roam_synch_complete() - roam synch complete command to fw.
3347 * @handle: wma handle
3348 * @synchcnf: offload synch confirmation params
3349 *
3350 * This function sends roam synch complete event to fw.
3351 *
3352 * Return: none
3353 */
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08003354void wma_process_roam_synch_complete(WMA_HANDLE handle, uint8_t vdev_id)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003355{
3356 tp_wma_handle wma_handle = (tp_wma_handle) handle;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003357
3358 if (!wma_handle || !wma_handle->wmi_handle) {
3359 WMA_LOGE("%s: WMA is closed, can not issue roam synch cnf",
3360 __func__);
3361 return;
3362 }
Govind Singh64b5e112016-03-08 11:53:50 +05303363
Pragaspathi Thilagarajecb60732018-11-02 12:26:24 +05303364 if (!wma_is_vdev_valid(vdev_id)) {
3365 WMA_LOGE("%s: Invalid vdev id:%d", __func__, vdev_id);
3366 return;
3367 }
3368
Govind Singh64b5e112016-03-08 11:53:50 +05303369 if (wmi_unified_roam_synch_complete_cmd(wma_handle->wmi_handle,
3370 vdev_id)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003371 return;
3372 }
Himanshu Agarwal67a863b2016-09-20 15:09:09 +05303373
3374 DPTRACE(qdf_dp_trace_record_event(QDF_DP_TRACE_EVENT_RECORD,
Venkata Sharath Chandra Manchala0b9fc632017-05-15 14:35:15 -07003375 vdev_id, QDF_TRACE_DEFAULT_PDEV_ID,
3376 QDF_PROTO_TYPE_EVENT, QDF_ROAM_COMPLETE));
Himanshu Agarwal67a863b2016-09-20 15:09:09 +05303377
Srinivas Girigowda6598eea2017-07-06 19:26:19 -07003378 WMA_LOGI("LFR3: Posting WMA_ROAM_OFFLOAD_SYNCH_CNF");
Deepak Dhamdheref918d422017-07-06 12:56:29 -07003379 wlan_roam_debug_log(vdev_id, DEBUG_ROAM_SYNCH_CNF,
3380 DEBUG_INVALID_PEER_ID, NULL, NULL, 0, 0);
3381
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003382}
3383#endif /* WLAN_FEATURE_ROAM_OFFLOAD */
3384
3385/**
3386 * wma_set_channel() - set channel
3387 * @wma: wma handle
3388 * @params: switch channel parameters
3389 *
3390 * Return: none
3391 */
3392void wma_set_channel(tp_wma_handle wma, tpSwitchChannelParams params)
3393{
3394 struct wma_vdev_start_req req;
3395 struct wma_target_req *msg;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303396 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003397 uint8_t vdev_id, peer_id;
Leo Chang96464902016-10-28 11:10:54 -07003398 void *peer;
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08003399 struct cdp_pdev *pdev;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003400 struct wma_txrx_node *intr = wma->interfaces;
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07003401 struct policy_mgr_hw_mode_params hw_mode = {0};
Leo Chang96464902016-10-28 11:10:54 -07003402 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
lifeng7c607dd2017-02-21 21:16:49 +08003403 uint16_t beacon_interval_ori;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003404
3405 WMA_LOGD("%s: Enter", __func__);
3406 if (!wma_find_vdev_by_addr(wma, params->selfStaMacAddr, &vdev_id)) {
3407 WMA_LOGP("%s: Failed to find vdev id for %pM",
3408 __func__, params->selfStaMacAddr);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303409 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003410 goto send_resp;
3411 }
Anurag Chouhan6d760662016-02-20 16:05:43 +05303412 pdev = cds_get_context(QDF_MODULE_ID_TXRX);
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07003413 if (!pdev) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003414 WMA_LOGE("%s: Failed to get pdev", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303415 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003416 goto send_resp;
3417 }
3418
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08003419 peer = cdp_peer_find_by_addr(soc,
3420 pdev,
3421 intr[vdev_id].bssid, &peer_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003422
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303423 qdf_mem_zero(&req, sizeof(req));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003424 req.vdev_id = vdev_id;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003425 req.chan = params->channelNumber;
3426 req.chan_width = params->ch_width;
Naveen Rawat64e477e2016-05-20 10:34:56 -07003427
3428 if (params->ch_width == CH_WIDTH_10MHZ)
3429 req.is_half_rate = 1;
3430 else if (params->ch_width == CH_WIDTH_5MHZ)
3431 req.is_quarter_rate = 1;
3432
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003433 req.vht_capable = params->vhtCapable;
3434 req.ch_center_freq_seg0 = params->ch_center_freq_seg0;
3435 req.ch_center_freq_seg1 = params->ch_center_freq_seg1;
3436 req.dot11_mode = params->dot11_mode;
Krishna Kumaar Natarajan0103ef82017-02-17 18:15:56 -08003437 wma_update_vdev_he_capable(&req, params);
Krishna Kumaar Natarajan4f1d7722017-03-03 21:12:51 -08003438
Krishna Kumaar Natarajan0103ef82017-02-17 18:15:56 -08003439 WMA_LOGI(FL("vht_capable: %d, dot11_mode: %d"),
3440 req.vht_capable, req.dot11_mode);
Krishna Kumaar Natarajan4f1d7722017-03-03 21:12:51 -08003441
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07003442 status = policy_mgr_get_current_hw_mode(wma->psoc, &hw_mode);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303443 if (!QDF_IS_STATUS_SUCCESS(status))
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07003444 WMA_LOGE("policy_mgr_get_current_hw_mode failed");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003445
Tushnim Bhattacharyya825b0f72017-07-14 15:21:04 -07003446 if (params->nss == 2) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003447 req.preferred_rx_streams = 2;
3448 req.preferred_tx_streams = 2;
3449 } else {
3450 req.preferred_rx_streams = 1;
3451 req.preferred_tx_streams = 1;
3452 }
3453
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003454 req.max_txpow = params->maxTxPower;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003455 req.beacon_intval = 100;
3456 req.dtim_period = 1;
3457 req.is_dfs = params->isDfsChannel;
Arif Hussain671a1902017-03-17 09:08:32 -07003458 req.cac_duration_ms = params->cac_duration_ms;
3459 req.dfs_regdomain = params->dfs_regdomain;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003460
3461 /* In case of AP mode, once radar is detected, we need to
3462 * issuse VDEV RESTART, so we making is_channel_switch as
3463 * true
3464 */
3465 if ((wma_is_vdev_in_ap_mode(wma, req.vdev_id) == true) ||
gaurank kathpalia1b42e8d2017-12-15 15:44:06 +05303466 (params->restart_on_chan_switch == true)) {
gaurank kathpalia1b42e8d2017-12-15 15:44:06 +05303467 req.hidden_ssid = intr[vdev_id].vdev_restart_params.ssidHidden;
Srinivas Girigowdaeff16d92018-09-12 14:56:29 -07003468 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003469
Kiran Kumar Lokeref9dc7912017-06-28 18:10:58 -07003470 if (params->restart_on_chan_switch == true &&
3471 wma->interfaces[req.vdev_id].beacon_filter_enabled)
3472 wma_remove_beacon_filter(wma,
3473 &wma->interfaces[req.vdev_id].beacon_filter);
3474
lifeng7c607dd2017-02-21 21:16:49 +08003475 if ((wma_is_vdev_in_ap_mode(wma, req.vdev_id) == true) &&
3476 (params->reduced_beacon_interval)) {
3477 /* Reduce the beacon interval just before the channel switch.
3478 * This would help in reducing the downtime on the STA side
3479 * (which is waiting for beacons from the AP to resume back
3480 * transmission). Switch back the beacon_interval to its
3481 * original value after the channel switch based on the
3482 * timeout. This would ensure there are atleast some beacons
3483 * sent with increased frequency.
3484 */
3485
3486 WMA_LOGD("%s: Changing beacon interval to %d",
3487 __func__, params->reduced_beacon_interval);
3488
3489 /* Add a timer to reset the beacon interval back*/
3490 beacon_interval_ori = req.beacon_intval;
3491 req.beacon_intval = params->reduced_beacon_interval;
3492 if (wma_fill_beacon_interval_reset_req(wma,
3493 req.vdev_id,
3494 beacon_interval_ori,
3495 RESET_BEACON_INTERVAL_TIMEOUT)) {
3496
3497 WMA_LOGD("%s: Failed to fill beacon interval reset req",
3498 __func__);
3499 }
3500 }
3501
Manjunathappa Prakash0e6e6b52016-04-21 11:48:48 -07003502 if (QDF_GLOBAL_MONITOR_MODE == cds_get_conparam() &&
3503 wma_is_vdev_up(vdev_id)) {
Krunal Sonia5388a22018-02-12 19:47:44 -08003504 WMA_LOGD("%s: setting channel switch to true for vdev_id:%d",
3505 __func__, req.vdev_id);
Manjunathappa Prakash0e6e6b52016-04-21 11:48:48 -07003506 }
Krunal Sonia5388a22018-02-12 19:47:44 -08003507
3508 msg = wma_fill_vdev_req(wma, req.vdev_id, WMA_CHNL_SWITCH_REQ,
3509 WMA_TARGET_REQ_TYPE_VDEV_START, params,
3510 WMA_VDEV_START_REQUEST_TIMEOUT);
3511 if (!msg) {
3512 WMA_LOGP("%s: Failed to fill channel switch request for vdev %d",
3513 __func__, req.vdev_id);
3514 status = QDF_STATUS_E_NOMEM;
3515 goto send_resp;
3516 }
Abhishek Singhfb5b4d32018-12-06 11:53:08 +05303517
3518 status = wma_vdev_start(wma, &req, wma_get_channel_switch_in_progress(
3519 &wma->interfaces[req.vdev_id]));
Krunal Sonia5388a22018-02-12 19:47:44 -08003520 if (status != QDF_STATUS_SUCCESS) {
3521 wma_remove_vdev_req(wma, req.vdev_id,
3522 WMA_TARGET_REQ_TYPE_VDEV_START);
3523 WMA_LOGP("%s: vdev start failed status = %d", __func__,
3524 status);
3525 goto send_resp;
3526 }
3527
3528 /* This is temporary, should be removed */
3529 if (QDF_GLOBAL_MONITOR_MODE == cds_get_conparam())
3530 ol_htt_mon_note_chan(pdev, req.chan);
3531
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003532 return;
3533send_resp:
3534 WMA_LOGD("%s: channel %d ch_width %d txpower %d status %d", __func__,
3535 params->channelNumber, params->ch_width,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003536 params->maxTxPower,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003537 status);
3538 params->status = status;
3539 WMA_LOGI("%s: sending WMA_SWITCH_CHANNEL_RSP, status = 0x%x",
3540 __func__, status);
Abhishek Singh2d775fd2017-08-18 10:51:33 +05303541 wma_send_msg_high_priority(wma, WMA_SWITCH_CHANNEL_RSP,
3542 (void *)params, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003543}
3544
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08003545#ifdef FEATURE_WLAN_ESE
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003546/**
3547 * wma_plm_start() - plm start request
3548 * @wma: wma handle
Jeff Johnson36583f02019-02-26 08:02:11 -08003549 * @params: plm request parameters
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003550 *
3551 * This function request FW to start PLM.
3552 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05303553 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003554 */
Jeff Johnson36583f02019-02-26 08:02:11 -08003555static QDF_STATUS wma_plm_start(tp_wma_handle wma,
3556 struct plm_req_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003557{
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05303558 uint32_t num_channels;
3559 uint32_t *channel_list = NULL;
3560 uint32_t i;
3561 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003562
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003563 WMA_LOGD("PLM Start");
3564
Jeff Johnson36583f02019-02-26 08:02:11 -08003565 num_channels = params->plm_num_ch;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003566
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05303567 if (num_channels) {
3568 channel_list = qdf_mem_malloc(sizeof(uint32_t) * num_channels);
3569 if (!channel_list)
3570 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003571
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05303572 for (i = 0; i < num_channels; i++) {
Jeff Johnson36583f02019-02-26 08:02:11 -08003573 channel_list[i] = params->plm_ch_list[i];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003574
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05303575 if (channel_list[i] < WMA_NLO_FREQ_THRESH)
3576 channel_list[i] =
3577 cds_chan_to_freq(channel_list[i]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003578 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003579 }
Jeff Johnson36583f02019-02-26 08:02:11 -08003580 status = wmi_unified_plm_start_cmd(wma->wmi_handle, params,
3581 channel_list);
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05303582 qdf_mem_free(channel_list);
Jeff Johnson36583f02019-02-26 08:02:11 -08003583 if (QDF_IS_STATUS_ERROR(status))
3584 return status;
3585
3586 wma->interfaces[params->vdev_id].plm_in_progress = true;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003587
3588 WMA_LOGD("Plm start request sent successfully for vdev %d",
Jeff Johnson36583f02019-02-26 08:02:11 -08003589 params->vdev_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003590
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05303591 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003592}
3593
3594/**
3595 * wma_plm_stop() - plm stop request
3596 * @wma: wma handle
Jeff Johnson36583f02019-02-26 08:02:11 -08003597 * @params: plm request parameters
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003598 *
3599 * This function request FW to stop PLM.
3600 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05303601 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003602 */
Jeff Johnson36583f02019-02-26 08:02:11 -08003603static QDF_STATUS wma_plm_stop(tp_wma_handle wma,
3604 struct plm_req_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003605{
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05303606 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003607
Jeff Johnson36583f02019-02-26 08:02:11 -08003608 if (!wma->interfaces[params->vdev_id].plm_in_progress) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003609 WMA_LOGE("No active plm req found, skip plm stop req");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303610 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003611 }
3612
3613 WMA_LOGD("PLM Stop");
3614
Jeff Johnson36583f02019-02-26 08:02:11 -08003615 status = wmi_unified_plm_stop_cmd(wma->wmi_handle, params);
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05303616 if (QDF_IS_STATUS_ERROR(status))
3617 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003618
Jeff Johnson36583f02019-02-26 08:02:11 -08003619 wma->interfaces[params->vdev_id].plm_in_progress = false;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003620
3621 WMA_LOGD("Plm stop request sent successfully for vdev %d",
Jeff Johnson36583f02019-02-26 08:02:11 -08003622 params->vdev_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003623
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05303624 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003625}
3626
3627/**
Jeff Johnsonb120a822019-02-02 22:15:55 -08003628 * wma_config_plm() - config PLM
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003629 * @wma: wma handle
Jeff Johnson36583f02019-02-26 08:02:11 -08003630 * @params: plm request parameters
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003631 *
3632 * Return: none
3633 */
Jeff Johnson36583f02019-02-26 08:02:11 -08003634void wma_config_plm(tp_wma_handle wma, struct plm_req_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003635{
Jeff Johnsonb120a822019-02-02 22:15:55 -08003636 QDF_STATUS ret;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003637
Jeff Johnson36583f02019-02-26 08:02:11 -08003638 if (!params || !wma)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003639 return;
3640
Jeff Johnson36583f02019-02-26 08:02:11 -08003641 if (params->enable)
3642 ret = wma_plm_start(wma, params);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003643 else
Jeff Johnson36583f02019-02-26 08:02:11 -08003644 ret = wma_plm_stop(wma, params);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003645
3646 if (ret)
3647 WMA_LOGE("%s: PLM %s failed %d", __func__,
Jeff Johnson36583f02019-02-26 08:02:11 -08003648 params->enable ? "start" : "stop", ret);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003649}
3650#endif
3651
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003652#ifdef FEATURE_WLAN_EXTSCAN
3653/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003654 * wma_extscan_wow_event_callback() - extscan wow event callback
3655 * @handle: WMA handle
3656 * @event: event buffer
3657 * @len: length of @event buffer
3658 *
3659 * In wow case, the wow event is followed by the payload of the event
3660 * which generated the wow event.
3661 * payload is 4 bytes of length followed by event buffer. the first 4 bytes
3662 * of event buffer is common tlv header, which is a combination
3663 * of tag (higher 2 bytes) and length (lower 2 bytes). The tag is used to
3664 * identify the event which triggered wow event.
Krishna Kumaar Natarajan36e5aa02016-07-02 17:44:25 -07003665 * Payload is extracted and converted into generic tlv structure before
3666 * being passed to this function.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003667 *
Dustin Browne2206fb2017-04-20 13:39:25 -07003668 * @Return: Errno
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003669 */
Dustin Browne2206fb2017-04-20 13:39:25 -07003670int wma_extscan_wow_event_callback(void *handle, void *event, uint32_t len)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003671{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003672 uint32_t tag = WMITLV_GET_TLVTAG(WMITLV_GET_HDR(event));
3673
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003674 switch (tag) {
3675 case WMITLV_TAG_STRUC_wmi_extscan_start_stop_event_fixed_param:
Dustin Browne2206fb2017-04-20 13:39:25 -07003676 return wma_extscan_start_stop_event_handler(handle, event, len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003677
3678 case WMITLV_TAG_STRUC_wmi_extscan_operation_event_fixed_param:
Dustin Browne2206fb2017-04-20 13:39:25 -07003679 return wma_extscan_operations_event_handler(handle, event, len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003680
3681 case WMITLV_TAG_STRUC_wmi_extscan_table_usage_event_fixed_param:
Dustin Browne2206fb2017-04-20 13:39:25 -07003682 return wma_extscan_table_usage_event_handler(handle, event,
3683 len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003684
3685 case WMITLV_TAG_STRUC_wmi_extscan_cached_results_event_fixed_param:
Dustin Browne2206fb2017-04-20 13:39:25 -07003686 return wma_extscan_cached_results_event_handler(handle, event,
3687 len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003688
3689 case WMITLV_TAG_STRUC_wmi_extscan_wlan_change_results_event_fixed_param:
Dustin Browne2206fb2017-04-20 13:39:25 -07003690 return wma_extscan_change_results_event_handler(handle, event,
3691 len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003692
3693 case WMITLV_TAG_STRUC_wmi_extscan_hotlist_match_event_fixed_param:
Dustin Browne2206fb2017-04-20 13:39:25 -07003694 return wma_extscan_hotlist_match_event_handler(handle, event,
3695 len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003696
3697 case WMITLV_TAG_STRUC_wmi_extscan_capabilities_event_fixed_param:
Dustin Browne2206fb2017-04-20 13:39:25 -07003698 return wma_extscan_capabilities_event_handler(handle, event,
3699 len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003700
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003701 default:
Krishna Kumaar Natarajan36e5aa02016-07-02 17:44:25 -07003702 WMA_LOGE(FL("Unknown tag: %d"), tag);
Dustin Browne2206fb2017-04-20 13:39:25 -07003703 return 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003704 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003705}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003706
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003707/**
3708 * wma_register_extscan_event_handler() - register extscan event handler
3709 * @wma_handle: wma handle
3710 *
3711 * This function register extscan related event handlers.
3712 *
3713 * Return: none
3714 */
3715void wma_register_extscan_event_handler(tp_wma_handle wma_handle)
3716{
3717 if (!wma_handle) {
3718 WMA_LOGE("%s: extscan wma_handle is NULL", __func__);
3719 return;
3720 }
3721 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303722 wmi_extscan_start_stop_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05303723 wma_extscan_start_stop_event_handler,
3724 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003725
3726 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303727 wmi_extscan_capabilities_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05303728 wma_extscan_capabilities_event_handler,
3729 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003730
3731 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303732 wmi_extscan_hotlist_match_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05303733 wma_extscan_hotlist_match_event_handler,
3734 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003735
3736 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303737 wmi_extscan_wlan_change_results_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05303738 wma_extscan_change_results_event_handler,
3739 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003740
3741 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303742 wmi_extscan_operation_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05303743 wma_extscan_operations_event_handler,
3744 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003745 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303746 wmi_extscan_table_usage_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05303747 wma_extscan_table_usage_event_handler,
3748 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003749
3750 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303751 wmi_extscan_cached_results_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05303752 wma_extscan_cached_results_event_handler,
3753 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003754
3755 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303756 wmi_passpoint_match_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05303757 wma_passpoint_match_event_handler,
3758 WMA_RX_SERIALIZER_CTX);
Pragaspathi Thilagaraj30251ec2018-12-18 17:22:57 +05303759
3760 /* Register BTM reject list event handler */
3761 wmi_unified_register_event_handler(wma_handle->wmi_handle,
3762 wmi_roam_blacklist_event_id,
3763 wma_handle_btm_blacklist_event,
3764 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003765}
3766
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003767/**
3768 * wma_extscan_start_stop_event_handler() - extscan start/stop event handler
3769 * @handle: wma handle
3770 * @cmd_param_info: event buffer
3771 * @len: data length
3772 *
3773 * This function handles different extscan related commands
3774 * like start/stop/get results etc and indicate to upper layers.
3775 *
3776 * Return: 0 for success or error code.
3777 */
3778int wma_extscan_start_stop_event_handler(void *handle,
3779 uint8_t *cmd_param_info,
3780 uint32_t len)
3781{
3782 WMI_EXTSCAN_START_STOP_EVENTID_param_tlvs *param_buf;
3783 wmi_extscan_start_stop_event_fixed_param *event;
3784 struct sir_extscan_generic_response *extscan_ind;
3785 uint16_t event_type;
Jeff Johnson9f18aa72018-12-02 12:05:12 -08003786 struct mac_context *mac = cds_get_context(QDF_MODULE_ID_PE);
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003787
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08003788 if (!mac) {
3789 WMA_LOGE("%s: Invalid mac", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003790 return -EINVAL;
3791 }
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08003792 if (!mac->sme.ext_scan_ind_cb) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003793 WMA_LOGE("%s: Callback not registered", __func__);
3794 return -EINVAL;
3795 }
3796 param_buf = (WMI_EXTSCAN_START_STOP_EVENTID_param_tlvs *)
3797 cmd_param_info;
3798 if (!param_buf) {
3799 WMA_LOGE("%s: Invalid extscan event", __func__);
3800 return -EINVAL;
3801 }
3802 event = param_buf->fixed_param;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303803 extscan_ind = qdf_mem_malloc(sizeof(*extscan_ind));
Arif Hussain157263f2018-10-03 13:07:15 -07003804 if (!extscan_ind)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003805 return -ENOMEM;
Arif Hussain157263f2018-10-03 13:07:15 -07003806
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003807 switch (event->command) {
3808 case WMI_EXTSCAN_START_CMDID:
3809 event_type = eSIR_EXTSCAN_START_RSP;
3810 extscan_ind->status = event->status;
3811 extscan_ind->request_id = event->request_id;
3812 break;
3813 case WMI_EXTSCAN_STOP_CMDID:
3814 event_type = eSIR_EXTSCAN_STOP_RSP;
3815 extscan_ind->status = event->status;
3816 extscan_ind->request_id = event->request_id;
3817 break;
3818 case WMI_EXTSCAN_CONFIGURE_WLAN_CHANGE_MONITOR_CMDID:
3819 extscan_ind->status = event->status;
3820 extscan_ind->request_id = event->request_id;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003821 if (event->mode == WMI_EXTSCAN_MODE_STOP)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003822 event_type =
3823 eSIR_EXTSCAN_RESET_SIGNIFICANT_WIFI_CHANGE_RSP;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003824 else
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003825 event_type =
3826 eSIR_EXTSCAN_SET_SIGNIFICANT_WIFI_CHANGE_RSP;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003827 break;
3828 case WMI_EXTSCAN_CONFIGURE_HOTLIST_MONITOR_CMDID:
3829 extscan_ind->status = event->status;
3830 extscan_ind->request_id = event->request_id;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003831 if (event->mode == WMI_EXTSCAN_MODE_STOP)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003832 event_type = eSIR_EXTSCAN_RESET_BSSID_HOTLIST_RSP;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003833 else
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003834 event_type = eSIR_EXTSCAN_SET_BSSID_HOTLIST_RSP;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003835 break;
3836 case WMI_EXTSCAN_GET_CACHED_RESULTS_CMDID:
3837 extscan_ind->status = event->status;
3838 extscan_ind->request_id = event->request_id;
3839 event_type = eSIR_EXTSCAN_CACHED_RESULTS_RSP;
3840 break;
3841 case WMI_EXTSCAN_CONFIGURE_HOTLIST_SSID_MONITOR_CMDID:
3842 extscan_ind->status = event->status;
3843 extscan_ind->request_id = event->request_id;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003844 if (event->mode == WMI_EXTSCAN_MODE_STOP)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003845 event_type =
3846 eSIR_EXTSCAN_RESET_SSID_HOTLIST_RSP;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003847 else
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003848 event_type =
3849 eSIR_EXTSCAN_SET_SSID_HOTLIST_RSP;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003850 break;
3851 default:
3852 WMA_LOGE("%s: Unknown event(%d) from target",
3853 __func__, event->status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303854 qdf_mem_free(extscan_ind);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003855 return -EINVAL;
3856 }
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08003857 mac->sme.ext_scan_ind_cb(mac->hdd_handle, event_type, extscan_ind);
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003858 WMA_LOGD("%s: sending event to umac for requestid %u with status %d",
3859 __func__, extscan_ind->request_id, extscan_ind->status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303860 qdf_mem_free(extscan_ind);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003861 return 0;
3862}
3863
3864/**
3865 * wma_extscan_operations_event_handler() - extscan operation event handler
3866 * @handle: wma handle
3867 * @cmd_param_info: event buffer
3868 * @len: length
3869 *
3870 * This function handles different operations related event and indicate
3871 * upper layers with appropriate callback.
3872 *
3873 * Return: 0 for success or error code.
3874 */
3875int wma_extscan_operations_event_handler(void *handle,
3876 uint8_t *cmd_param_info,
3877 uint32_t len)
3878{
3879 tp_wma_handle wma = (tp_wma_handle) handle;
3880 WMI_EXTSCAN_OPERATION_EVENTID_param_tlvs *param_buf;
3881 wmi_extscan_operation_event_fixed_param *oprn_event;
3882 tSirExtScanOnScanEventIndParams *oprn_ind;
Mukul Sharmafa937be2016-08-12 18:13:36 +05303883 uint32_t cnt;
Jeff Johnson9f18aa72018-12-02 12:05:12 -08003884 struct mac_context *mac = cds_get_context(QDF_MODULE_ID_PE);
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003885
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08003886 if (!mac) {
3887 WMA_LOGE("%s: Invalid mac", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003888 return -EINVAL;
3889 }
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08003890 if (!mac->sme.ext_scan_ind_cb) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003891 WMA_LOGE("%s: Callback not registered", __func__);
3892 return -EINVAL;
3893 }
3894 param_buf = (WMI_EXTSCAN_OPERATION_EVENTID_param_tlvs *)
3895 cmd_param_info;
3896 if (!param_buf) {
3897 WMA_LOGE("%s: Invalid scan operation event", __func__);
3898 return -EINVAL;
3899 }
3900 oprn_event = param_buf->fixed_param;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303901 oprn_ind = qdf_mem_malloc(sizeof(*oprn_ind));
Arif Hussain157263f2018-10-03 13:07:15 -07003902 if (!oprn_ind)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003903 return -ENOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003904
3905 oprn_ind->requestId = oprn_event->request_id;
3906
3907 switch (oprn_event->event) {
3908 case WMI_EXTSCAN_BUCKET_COMPLETED_EVENT:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003909 oprn_ind->status = 0;
Mukul Sharma45114d92016-08-12 19:34:14 +05303910 goto exit_handler;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003911 case WMI_EXTSCAN_CYCLE_STARTED_EVENT:
3912 WMA_LOGD("%s: received WMI_EXTSCAN_CYCLE_STARTED_EVENT",
3913 __func__);
Amar Singhal16c170d2017-10-03 13:32:21 -07003914
3915 if (oprn_event->num_buckets > param_buf->num_bucket_id) {
3916 WMA_LOGE("FW mesg num_buk %d more than TLV hdr %d",
3917 oprn_event->num_buckets,
3918 param_buf->num_bucket_id);
3919 return -EINVAL;
3920 }
3921
Anurag Chouhan01cfa4e2016-09-04 15:10:49 +05303922 cds_host_diag_log_work(&wma->extscan_wake_lock,
3923 WMA_EXTSCAN_CYCLE_WAKE_LOCK_DURATION,
3924 WIFI_POWER_EVENT_WAKELOCK_EXT_SCAN);
Anurag Chouhana37b5b72016-02-21 14:53:42 +05303925 qdf_wake_lock_timeout_acquire(&wma->extscan_wake_lock,
Anurag Chouhan01cfa4e2016-09-04 15:10:49 +05303926 WMA_EXTSCAN_CYCLE_WAKE_LOCK_DURATION);
Mukul Sharmafa937be2016-08-12 18:13:36 +05303927 oprn_ind->scanEventType = WIFI_EXTSCAN_CYCLE_STARTED_EVENT;
3928 oprn_ind->status = 0;
3929 oprn_ind->buckets_scanned = 0;
3930 for (cnt = 0; cnt < oprn_event->num_buckets; cnt++)
3931 oprn_ind->buckets_scanned |=
3932 (1 << param_buf->bucket_id[cnt]);
3933 WMA_LOGD(FL("num_buckets %u request_id %u buckets_scanned %u"),
3934 oprn_event->num_buckets, oprn_ind->requestId,
3935 oprn_ind->buckets_scanned);
3936 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003937 case WMI_EXTSCAN_CYCLE_COMPLETED_EVENT:
3938 WMA_LOGD("%s: received WMI_EXTSCAN_CYCLE_COMPLETED_EVENT",
3939 __func__);
Anurag Chouhana37b5b72016-02-21 14:53:42 +05303940 qdf_wake_lock_release(&wma->extscan_wake_lock,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003941 WIFI_POWER_EVENT_WAKELOCK_EXT_SCAN);
Mukul Sharmafa937be2016-08-12 18:13:36 +05303942 oprn_ind->scanEventType = WIFI_EXTSCAN_CYCLE_COMPLETED_EVENT;
3943 oprn_ind->status = 0;
3944 /* Set bucket scanned mask to zero on cycle complete */
3945 oprn_ind->buckets_scanned = 0;
3946 break;
3947 case WMI_EXTSCAN_BUCKET_STARTED_EVENT:
Mukul Sharma45114d92016-08-12 19:34:14 +05303948 WMA_LOGD("%s: received WMI_EXTSCAN_BUCKET_STARTED_EVENT",
Mukul Sharmafa937be2016-08-12 18:13:36 +05303949 __func__);
3950 oprn_ind->scanEventType = WIFI_EXTSCAN_BUCKET_STARTED_EVENT;
3951 oprn_ind->status = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003952 goto exit_handler;
Mukul Sharmafa937be2016-08-12 18:13:36 +05303953 case WMI_EXTSCAN_THRESHOLD_NUM_SCANS:
Mukul Sharma45114d92016-08-12 19:34:14 +05303954 WMA_LOGD("%s: received WMI_EXTSCAN_THRESHOLD_NUM_SCANS",
Mukul Sharmafa937be2016-08-12 18:13:36 +05303955 __func__);
3956 oprn_ind->scanEventType = WIFI_EXTSCAN_THRESHOLD_NUM_SCANS;
3957 oprn_ind->status = 0;
3958 break;
3959 case WMI_EXTSCAN_THRESHOLD_PERCENT:
Mukul Sharma45114d92016-08-12 19:34:14 +05303960 WMA_LOGD("%s: received WMI_EXTSCAN_THRESHOLD_PERCENT",
Mukul Sharmafa937be2016-08-12 18:13:36 +05303961 __func__);
3962 oprn_ind->scanEventType = WIFI_EXTSCAN_THRESHOLD_PERCENT;
3963 oprn_ind->status = 0;
3964 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003965 default:
3966 WMA_LOGE("%s: Unknown event(%d) from target",
3967 __func__, oprn_event->event);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303968 qdf_mem_free(oprn_ind);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003969 return -EINVAL;
3970 }
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08003971 mac->sme.ext_scan_ind_cb(mac->hdd_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003972 eSIR_EXTSCAN_SCAN_PROGRESS_EVENT_IND, oprn_ind);
3973 WMA_LOGI("%s: sending scan progress event to hdd", __func__);
3974exit_handler:
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303975 qdf_mem_free(oprn_ind);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003976 return 0;
3977}
3978
3979/**
3980 * wma_extscan_table_usage_event_handler() - extscan table usage event handler
3981 * @handle: wma handle
3982 * @cmd_param_info: event buffer
3983 * @len: length
3984 *
3985 * This function handles table usage related event and indicate
3986 * upper layers with appropriate callback.
3987 *
3988 * Return: 0 for success or error code.
3989 */
3990int wma_extscan_table_usage_event_handler(void *handle,
3991 uint8_t *cmd_param_info,
3992 uint32_t len)
3993{
3994 WMI_EXTSCAN_TABLE_USAGE_EVENTID_param_tlvs *param_buf;
3995 wmi_extscan_table_usage_event_fixed_param *event;
3996 tSirExtScanResultsAvailableIndParams *tbl_usg_ind;
Jeff Johnson9f18aa72018-12-02 12:05:12 -08003997 struct mac_context *mac = cds_get_context(QDF_MODULE_ID_PE);
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003998
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08003999 if (!mac) {
4000 WMA_LOGE("%s: Invalid mac", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004001 return -EINVAL;
4002 }
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08004003 if (!mac->sme.ext_scan_ind_cb) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004004 WMA_LOGE("%s: Callback not registered", __func__);
4005 return -EINVAL;
4006 }
4007 param_buf = (WMI_EXTSCAN_TABLE_USAGE_EVENTID_param_tlvs *)
4008 cmd_param_info;
4009 if (!param_buf) {
4010 WMA_LOGE("%s: Invalid table usage event", __func__);
4011 return -EINVAL;
4012 }
4013 event = param_buf->fixed_param;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304014 tbl_usg_ind = qdf_mem_malloc(sizeof(*tbl_usg_ind));
Arif Hussain157263f2018-10-03 13:07:15 -07004015 if (!tbl_usg_ind)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004016 return -ENOMEM;
Arif Hussain157263f2018-10-03 13:07:15 -07004017
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004018 tbl_usg_ind->requestId = event->request_id;
4019 tbl_usg_ind->numResultsAvailable = event->entries_in_use;
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08004020 mac->sme.ext_scan_ind_cb(mac->hdd_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004021 eSIR_EXTSCAN_SCAN_RES_AVAILABLE_IND,
4022 tbl_usg_ind);
4023 WMA_LOGI("%s: sending scan_res available event to hdd", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304024 qdf_mem_free(tbl_usg_ind);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004025 return 0;
4026}
4027
4028/**
4029 * wma_extscan_capabilities_event_handler() - extscan capabilities event handler
4030 * @handle: wma handle
4031 * @cmd_param_info: event buffer
4032 * @len: length
4033 *
4034 * This function handles capabilities event and indicate
4035 * upper layers with registered callback.
4036 *
4037 * Return: 0 for success or error code.
4038 */
4039int wma_extscan_capabilities_event_handler(void *handle,
4040 uint8_t *cmd_param_info,
4041 uint32_t len)
4042{
4043 WMI_EXTSCAN_CAPABILITIES_EVENTID_param_tlvs *param_buf;
4044 wmi_extscan_capabilities_event_fixed_param *event;
4045 wmi_extscan_cache_capabilities *src_cache;
4046 wmi_extscan_hotlist_monitor_capabilities *src_hotlist;
4047 wmi_extscan_wlan_change_monitor_capabilities *src_change;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004048 struct ext_scan_capabilities_response *dest_capab;
Jeff Johnson9f18aa72018-12-02 12:05:12 -08004049 struct mac_context *mac = cds_get_context(QDF_MODULE_ID_PE);
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004050
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08004051 if (!mac) {
4052 WMA_LOGE("%s: Invalid mac", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004053 return -EINVAL;
4054 }
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08004055 if (!mac->sme.ext_scan_ind_cb) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004056 WMA_LOGE("%s: Callback not registered", __func__);
4057 return -EINVAL;
4058 }
4059 param_buf = (WMI_EXTSCAN_CAPABILITIES_EVENTID_param_tlvs *)
4060 cmd_param_info;
4061 if (!param_buf) {
4062 WMA_LOGE("%s: Invalid capabilities event", __func__);
4063 return -EINVAL;
4064 }
4065 event = param_buf->fixed_param;
4066 src_cache = param_buf->extscan_cache_capabilities;
4067 src_hotlist = param_buf->hotlist_capabilities;
4068 src_change = param_buf->wlan_change_capabilities;
4069
4070 if (!src_cache || !src_hotlist || !src_change) {
4071 WMA_LOGE("%s: Invalid capabilities list", __func__);
4072 return -EINVAL;
4073 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304074 dest_capab = qdf_mem_malloc(sizeof(*dest_capab));
Arif Hussain157263f2018-10-03 13:07:15 -07004075 if (!dest_capab)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004076 return -ENOMEM;
Arif Hussain157263f2018-10-03 13:07:15 -07004077
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004078 dest_capab->requestId = event->request_id;
4079 dest_capab->max_scan_buckets = src_cache->max_buckets;
4080 dest_capab->max_scan_cache_size = src_cache->scan_cache_entry_size;
4081 dest_capab->max_ap_cache_per_scan = src_cache->max_bssid_per_scan;
4082 dest_capab->max_scan_reporting_threshold =
4083 src_cache->max_table_usage_threshold;
4084
4085 dest_capab->max_hotlist_bssids = src_hotlist->max_hotlist_entries;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004086 dest_capab->max_rssi_sample_size =
4087 src_change->max_rssi_averaging_samples;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004088 dest_capab->max_bssid_history_entries =
4089 src_change->max_rssi_history_entries;
4090 dest_capab->max_significant_wifi_change_aps =
4091 src_change->max_wlan_change_entries;
4092 dest_capab->max_hotlist_ssids =
4093 event->num_extscan_hotlist_ssid;
4094 dest_capab->max_number_epno_networks =
4095 event->num_epno_networks;
4096 dest_capab->max_number_epno_networks_by_ssid =
4097 event->num_epno_networks;
4098 dest_capab->max_number_of_white_listed_ssid =
4099 event->num_roam_ssid_whitelist;
Padma, Santhosh Kumar1ac02402016-11-02 18:04:14 +05304100 dest_capab->max_number_of_black_listed_bssid =
4101 event->num_roam_bssid_blacklist;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004102 dest_capab->status = 0;
4103
4104 WMA_LOGD("%s: request_id: %u status: %d",
4105 __func__, dest_capab->requestId, dest_capab->status);
4106
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004107 WMA_LOGD("%s: Capabilities: max_scan_buckets: %d, max_hotlist_bssids: %d, max_scan_cache_size: %d, max_ap_cache_per_scan: %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004108 __func__, dest_capab->max_scan_buckets,
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004109 dest_capab->max_hotlist_bssids, dest_capab->max_scan_cache_size,
4110 dest_capab->max_ap_cache_per_scan);
4111 WMA_LOGD("%s: max_scan_reporting_threshold: %d, max_rssi_sample_size: %d, max_bssid_history_entries: %d, max_significant_wifi_change_aps: %d",
4112 __func__, dest_capab->max_scan_reporting_threshold,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004113 dest_capab->max_rssi_sample_size,
4114 dest_capab->max_bssid_history_entries,
4115 dest_capab->max_significant_wifi_change_aps);
4116
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004117 WMA_LOGD("%s: Capabilities: max_hotlist_ssids: %d, max_number_epno_networks: %d, max_number_epno_networks_by_ssid: %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004118 __func__, dest_capab->max_hotlist_ssids,
4119 dest_capab->max_number_epno_networks,
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004120 dest_capab->max_number_epno_networks_by_ssid);
4121 WMA_LOGD("%s: max_number_of_white_listed_ssid: %d, max_number_of_black_listed_bssid: %d",
4122 __func__, dest_capab->max_number_of_white_listed_ssid,
Padma, Santhosh Kumar1ac02402016-11-02 18:04:14 +05304123 dest_capab->max_number_of_black_listed_bssid);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004124
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08004125 mac->sme.ext_scan_ind_cb(mac->hdd_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004126 eSIR_EXTSCAN_GET_CAPABILITIES_IND, dest_capab);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304127 qdf_mem_free(dest_capab);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004128 return 0;
4129}
4130
4131/**
4132 * wma_extscan_hotlist_match_event_handler() - hotlist match event handler
4133 * @handle: wma handle
4134 * @cmd_param_info: event buffer
4135 * @len: length
4136 *
4137 * This function handles hotlist match event and indicate
4138 * upper layers with registered callback.
4139 *
4140 * Return: 0 for success or error code.
4141 */
4142int wma_extscan_hotlist_match_event_handler(void *handle,
4143 uint8_t *cmd_param_info,
4144 uint32_t len)
4145{
4146 WMI_EXTSCAN_HOTLIST_MATCH_EVENTID_param_tlvs *param_buf;
4147 wmi_extscan_hotlist_match_event_fixed_param *event;
4148 struct extscan_hotlist_match *dest_hotlist;
4149 tSirWifiScanResult *dest_ap;
4150 wmi_extscan_wlan_descriptor *src_hotlist;
Sridhar Selvaraj22943572017-07-26 15:06:40 +05304151 uint32_t numap;
4152 int j, ap_found = 0;
Vignesh Viswanathanfc5bbed2017-11-23 14:14:01 +05304153 uint32_t buf_len;
Jeff Johnson9f18aa72018-12-02 12:05:12 -08004154 struct mac_context *mac = cds_get_context(QDF_MODULE_ID_PE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004155
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08004156 if (!mac) {
4157 WMA_LOGE("%s: Invalid mac", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004158 return -EINVAL;
4159 }
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08004160 if (!mac->sme.ext_scan_ind_cb) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004161 WMA_LOGE("%s: Callback not registered", __func__);
4162 return -EINVAL;
4163 }
4164 param_buf = (WMI_EXTSCAN_HOTLIST_MATCH_EVENTID_param_tlvs *)
4165 cmd_param_info;
4166 if (!param_buf) {
4167 WMA_LOGE("%s: Invalid hotlist match event", __func__);
4168 return -EINVAL;
4169 }
4170 event = param_buf->fixed_param;
4171 src_hotlist = param_buf->hotlist_match;
4172 numap = event->total_entries;
4173
4174 if (!src_hotlist || !numap) {
4175 WMA_LOGE("%s: Hotlist AP's list invalid", __func__);
4176 return -EINVAL;
4177 }
Abhinav Kumara03659c2017-12-28 15:18:07 +05304178 if (numap > param_buf->num_hotlist_match) {
4179 WMA_LOGE("Invalid no of total enteries %d", numap);
4180 return -EINVAL;
4181 }
Sridhar Selvaraj22943572017-07-26 15:06:40 +05304182 if (numap > WMA_EXTSCAN_MAX_HOTLIST_ENTRIES) {
4183 WMA_LOGE("%s: Total Entries %u greater than max",
4184 __func__, numap);
4185 numap = WMA_EXTSCAN_MAX_HOTLIST_ENTRIES;
4186 }
Vignesh Viswanathanfc5bbed2017-11-23 14:14:01 +05304187
4188 buf_len = sizeof(wmi_extscan_hotlist_match_event_fixed_param) +
Himanshu Agarwalff399e32017-12-26 17:21:28 +05304189 WMI_TLV_HDR_SIZE +
Vignesh Viswanathanfc5bbed2017-11-23 14:14:01 +05304190 (numap * sizeof(wmi_extscan_wlan_descriptor));
4191
4192 if (buf_len > len) {
4193 WMA_LOGE("Invalid buf len from FW %d numap %d", len, numap);
4194 return -EINVAL;
4195 }
4196
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304197 dest_hotlist = qdf_mem_malloc(sizeof(*dest_hotlist) +
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004198 sizeof(*dest_ap) * numap);
Arif Hussain157263f2018-10-03 13:07:15 -07004199 if (!dest_hotlist)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004200 return -ENOMEM;
Arif Hussain157263f2018-10-03 13:07:15 -07004201
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004202 dest_ap = &dest_hotlist->ap[0];
4203 dest_hotlist->numOfAps = event->total_entries;
4204 dest_hotlist->requestId = event->config_request_id;
4205
4206 if (event->first_entry_index +
4207 event->num_entries_in_page < event->total_entries)
4208 dest_hotlist->moreData = 1;
4209 else
4210 dest_hotlist->moreData = 0;
4211
4212 WMA_LOGD("%s: Hotlist match: requestId: %u,"
4213 "numOfAps: %d", __func__,
4214 dest_hotlist->requestId, dest_hotlist->numOfAps);
4215
4216 /*
4217 * Currently firmware sends only one bss information in-case
4218 * of both hotlist ap found and lost.
4219 */
4220 for (j = 0; j < numap; j++) {
4221 dest_ap->rssi = 0;
4222 dest_ap->channel = src_hotlist->channel;
4223 dest_ap->ts = src_hotlist->tstamp;
4224 ap_found = src_hotlist->flags & WMI_HOTLIST_FLAG_PRESENCE;
4225 dest_ap->rtt = src_hotlist->rtt;
4226 dest_ap->rtt_sd = src_hotlist->rtt_sd;
4227 dest_ap->beaconPeriod = src_hotlist->beacon_interval;
4228 dest_ap->capability = src_hotlist->capabilities;
4229 dest_ap->ieLength = src_hotlist->ie_length;
4230 WMI_MAC_ADDR_TO_CHAR_ARRAY(&src_hotlist->bssid,
4231 dest_ap->bssid.bytes);
Srinivas Girigowdab8fdc642019-03-19 15:33:03 -07004232 if (src_hotlist->ssid.ssid_len > WLAN_SSID_MAX_LEN) {
Vignesh Viswanathandf0571a2017-11-28 17:39:08 +05304233 WMA_LOGE("%s Invalid SSID len %d, truncating",
4234 __func__, src_hotlist->ssid.ssid_len);
Srinivas Girigowdab8fdc642019-03-19 15:33:03 -07004235 src_hotlist->ssid.ssid_len = WLAN_SSID_MAX_LEN;
Vignesh Viswanathandf0571a2017-11-28 17:39:08 +05304236 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304237 qdf_mem_copy(dest_ap->ssid, src_hotlist->ssid.ssid,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004238 src_hotlist->ssid.ssid_len);
4239 dest_ap->ssid[src_hotlist->ssid.ssid_len] = '\0';
4240 dest_ap++;
4241 src_hotlist++;
4242 }
4243 dest_hotlist->ap_found = ap_found;
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08004244 mac->sme.ext_scan_ind_cb(mac->hdd_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004245 eSIR_EXTSCAN_HOTLIST_MATCH_IND, dest_hotlist);
4246 WMA_LOGI("%s: sending hotlist match event to hdd", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304247 qdf_mem_free(dest_hotlist);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004248 return 0;
4249}
4250
4251/** wma_extscan_find_unique_scan_ids() - find unique scan ids
4252 * @cmd_param_info: event data.
4253 *
4254 * This utility function parses the input bss table of information
4255 * and find the unique number of scan ids
4256 *
4257 * Return: 0 on success; error number otherwise
4258 */
4259static int wma_extscan_find_unique_scan_ids(const u_int8_t *cmd_param_info)
4260{
4261 WMI_EXTSCAN_CACHED_RESULTS_EVENTID_param_tlvs *param_buf;
4262 wmi_extscan_cached_results_event_fixed_param *event;
4263 wmi_extscan_wlan_descriptor *src_hotlist;
4264 wmi_extscan_rssi_info *src_rssi;
4265 int prev_scan_id, scan_ids_cnt, i;
4266
4267 param_buf = (WMI_EXTSCAN_CACHED_RESULTS_EVENTID_param_tlvs *)
4268 cmd_param_info;
4269 event = param_buf->fixed_param;
4270 src_hotlist = param_buf->bssid_list;
4271 src_rssi = param_buf->rssi_list;
4272
4273 /* Find the unique number of scan_id's for grouping */
4274 prev_scan_id = src_rssi->scan_cycle_id;
4275 scan_ids_cnt = 1;
gaurank kathpaliae5f66902018-09-19 17:10:05 +05304276 for (i = 1; i < param_buf->num_rssi_list; i++) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004277 src_rssi++;
4278
4279 if (prev_scan_id != src_rssi->scan_cycle_id) {
4280 scan_ids_cnt++;
4281 prev_scan_id = src_rssi->scan_cycle_id;
4282 }
4283 }
4284
4285 return scan_ids_cnt;
4286}
4287
4288/** wma_fill_num_results_per_scan_id() - fill number of bss per scan id
4289 * @cmd_param_info: event data.
4290 * @scan_id_group: pointer to scan id group.
4291 *
4292 * This utility function parses the input bss table of information
4293 * and finds how many bss are there per unique scan id.
4294 *
4295 * Return: 0 on success; error number otherwise
4296 */
4297static int wma_fill_num_results_per_scan_id(const u_int8_t *cmd_param_info,
4298 struct extscan_cached_scan_result *scan_id_group)
4299{
4300 WMI_EXTSCAN_CACHED_RESULTS_EVENTID_param_tlvs *param_buf;
4301 wmi_extscan_cached_results_event_fixed_param *event;
4302 wmi_extscan_wlan_descriptor *src_hotlist;
4303 wmi_extscan_rssi_info *src_rssi;
4304 struct extscan_cached_scan_result *t_scan_id_grp;
4305 int i, prev_scan_id;
4306
4307 param_buf = (WMI_EXTSCAN_CACHED_RESULTS_EVENTID_param_tlvs *)
4308 cmd_param_info;
4309 event = param_buf->fixed_param;
4310 src_hotlist = param_buf->bssid_list;
4311 src_rssi = param_buf->rssi_list;
4312 t_scan_id_grp = scan_id_group;
4313
4314 prev_scan_id = src_rssi->scan_cycle_id;
4315
4316 t_scan_id_grp->scan_id = src_rssi->scan_cycle_id;
4317 t_scan_id_grp->flags = src_rssi->flags;
Mukul Sharmaf7cb3ab2016-08-12 19:53:52 +05304318 t_scan_id_grp->buckets_scanned = src_rssi->buckets_scanned;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004319 t_scan_id_grp->num_results = 1;
gaurank kathpaliae5f66902018-09-19 17:10:05 +05304320 for (i = 1; i < param_buf->num_rssi_list; i++) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004321 src_rssi++;
4322 if (prev_scan_id == src_rssi->scan_cycle_id) {
4323 t_scan_id_grp->num_results++;
4324 } else {
4325 t_scan_id_grp++;
4326 prev_scan_id = t_scan_id_grp->scan_id =
4327 src_rssi->scan_cycle_id;
4328 t_scan_id_grp->flags = src_rssi->flags;
Mukul Sharmaf7cb3ab2016-08-12 19:53:52 +05304329 t_scan_id_grp->buckets_scanned =
4330 src_rssi->buckets_scanned;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004331 t_scan_id_grp->num_results = 1;
4332 }
4333 }
4334 return 0;
4335}
4336
4337/** wma_group_num_bss_to_scan_id() - group bss to scan id table
4338 * @cmd_param_info: event data.
4339 * @cached_result: pointer to cached table.
4340 *
4341 * This function reads the bss information from the format
4342 * ------------------------------------------------------------------------
4343 * | bss info {rssi, channel, ssid, bssid, timestamp} | scan id_1 | flags |
4344 * | bss info {rssi, channel, ssid, bssid, timestamp} | scan id_2 | flags |
4345 * ........................................................................
4346 * | bss info {rssi, channel, ssid, bssid, timestamp} | scan id_N | flags |
4347 * ------------------------------------------------------------------------
4348 *
4349 * and converts it into the below format and store it
4350 *
4351 * ------------------------------------------------------------------------
4352 * | scan id_1 | -> bss info_1 -> bss info_2 -> .... bss info_M1
4353 * | scan id_2 | -> bss info_1 -> bss info_2 -> .... bss info_M2
4354 * ......................
4355 * | scan id_N | -> bss info_1 -> bss info_2 -> .... bss info_Mn
4356 * ------------------------------------------------------------------------
4357 *
4358 * Return: 0 on success; error number otherwise
4359 */
4360static int wma_group_num_bss_to_scan_id(const u_int8_t *cmd_param_info,
4361 struct extscan_cached_scan_results *cached_result)
4362{
4363 WMI_EXTSCAN_CACHED_RESULTS_EVENTID_param_tlvs *param_buf;
4364 wmi_extscan_cached_results_event_fixed_param *event;
4365 wmi_extscan_wlan_descriptor *src_hotlist;
4366 wmi_extscan_rssi_info *src_rssi;
4367 struct extscan_cached_scan_results *t_cached_result;
4368 struct extscan_cached_scan_result *t_scan_id_grp;
4369 int i, j;
4370 tSirWifiScanResult *ap;
4371
4372 param_buf = (WMI_EXTSCAN_CACHED_RESULTS_EVENTID_param_tlvs *)
4373 cmd_param_info;
4374 event = param_buf->fixed_param;
4375 src_hotlist = param_buf->bssid_list;
4376 src_rssi = param_buf->rssi_list;
4377 t_cached_result = cached_result;
4378 t_scan_id_grp = &t_cached_result->result[0];
4379
Sandeep Puligillad3201dd2019-02-04 13:10:58 -08004380 if ((t_cached_result->num_scan_ids *
4381 QDF_MIN(t_scan_id_grp->num_results,
4382 param_buf->num_bssid_list)) > param_buf->num_bssid_list) {
4383 WMA_LOGE("%s:num_scan_ids %d, num_results %d num_bssid_list %d",
4384 __func__,
4385 t_cached_result->num_scan_ids,
4386 t_scan_id_grp->num_results,
4387 param_buf->num_bssid_list);
4388 return -EINVAL;
4389 }
4390
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004391 WMA_LOGD("%s: num_scan_ids:%d", __func__,
4392 t_cached_result->num_scan_ids);
4393 for (i = 0; i < t_cached_result->num_scan_ids; i++) {
4394 WMA_LOGD("%s: num_results:%d", __func__,
4395 t_scan_id_grp->num_results);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304396 t_scan_id_grp->ap = qdf_mem_malloc(t_scan_id_grp->num_results *
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004397 sizeof(*ap));
Arif Hussain157263f2018-10-03 13:07:15 -07004398 if (!t_scan_id_grp->ap)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004399 return -ENOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004400
4401 ap = &t_scan_id_grp->ap[0];
gaurank kathpaliae5f66902018-09-19 17:10:05 +05304402 for (j = 0; j < QDF_MIN(t_scan_id_grp->num_results,
4403 param_buf->num_bssid_list); j++) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004404 ap->channel = src_hotlist->channel;
4405 ap->ts = WMA_MSEC_TO_USEC(src_rssi->tstamp);
4406 ap->rtt = src_hotlist->rtt;
4407 ap->rtt_sd = src_hotlist->rtt_sd;
4408 ap->beaconPeriod = src_hotlist->beacon_interval;
4409 ap->capability = src_hotlist->capabilities;
4410 ap->ieLength = src_hotlist->ie_length;
4411
4412 /* Firmware already applied noise floor adjustment and
4413 * due to WMI interface "UINT32 rssi", host driver
4414 * receives a positive value, hence convert to
4415 * signed char to get the absolute rssi.
4416 */
4417 ap->rssi = (signed char) src_rssi->rssi;
4418 WMI_MAC_ADDR_TO_CHAR_ARRAY(&src_hotlist->bssid,
4419 ap->bssid.bytes);
4420
Vignesh Viswanathandf0571a2017-11-28 17:39:08 +05304421 if (src_hotlist->ssid.ssid_len >
Srinivas Girigowdab8fdc642019-03-19 15:33:03 -07004422 WLAN_SSID_MAX_LEN) {
Vignesh Viswanathandf0571a2017-11-28 17:39:08 +05304423 WMA_LOGD("%s Invalid SSID len %d, truncating",
4424 __func__, src_hotlist->ssid.ssid_len);
4425 src_hotlist->ssid.ssid_len =
Srinivas Girigowdab8fdc642019-03-19 15:33:03 -07004426 WLAN_SSID_MAX_LEN;
Vignesh Viswanathandf0571a2017-11-28 17:39:08 +05304427 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304428 qdf_mem_copy(ap->ssid, src_hotlist->ssid.ssid,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004429 src_hotlist->ssid.ssid_len);
4430 ap->ssid[src_hotlist->ssid.ssid_len] = '\0';
4431 ap++;
4432 src_rssi++;
4433 src_hotlist++;
4434 }
4435 t_scan_id_grp++;
4436 }
4437 return 0;
4438}
4439
4440/**
4441 * wma_extscan_cached_results_event_handler() - cached results event handler
4442 * @handle: wma handle
4443 * @cmd_param_info: event buffer
4444 * @len: length of @cmd_param_info
4445 *
4446 * This function handles cached results event and indicate
4447 * cached results to upper layer.
4448 *
4449 * Return: 0 for success or error code.
4450 */
4451int wma_extscan_cached_results_event_handler(void *handle,
4452 uint8_t *cmd_param_info,
4453 uint32_t len)
4454{
4455 WMI_EXTSCAN_CACHED_RESULTS_EVENTID_param_tlvs *param_buf;
4456 wmi_extscan_cached_results_event_fixed_param *event;
4457 struct extscan_cached_scan_results *dest_cachelist;
4458 struct extscan_cached_scan_result *dest_result;
4459 struct extscan_cached_scan_results empty_cachelist;
4460 wmi_extscan_wlan_descriptor *src_hotlist;
4461 wmi_extscan_rssi_info *src_rssi;
Abhinav Kumarcc864962018-02-21 12:36:35 +05304462 int i, moredata, scan_ids_cnt, buf_len, status;
Jeff Johnson9f18aa72018-12-02 12:05:12 -08004463 struct mac_context *mac = cds_get_context(QDF_MODULE_ID_PE);
Varun Reddy Yeturu46ba20c2017-08-17 15:03:27 -07004464 uint32_t total_len;
4465 bool excess_data = false;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004466
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08004467 if (!mac) {
4468 WMA_LOGE("%s: Invalid mac", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004469 return -EINVAL;
4470 }
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08004471 if (!mac->sme.ext_scan_ind_cb) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004472 WMA_LOGE("%s: Callback not registered", __func__);
4473 return -EINVAL;
4474 }
4475 param_buf = (WMI_EXTSCAN_CACHED_RESULTS_EVENTID_param_tlvs *)
4476 cmd_param_info;
4477 if (!param_buf) {
4478 WMA_LOGE("%s: Invalid cached results event", __func__);
4479 return -EINVAL;
4480 }
4481 event = param_buf->fixed_param;
4482 src_hotlist = param_buf->bssid_list;
4483 src_rssi = param_buf->rssi_list;
Srinivas Girigowdadbfb2642016-08-28 21:32:38 -07004484 WMA_LOGI("Total_entries: %u first_entry_index: %u num_entries_in_page: %d",
4485 event->total_entries,
Vignesh Viswanathan4f75cf52017-11-29 14:19:13 +05304486 event->first_entry_index,
4487 event->num_entries_in_page);
4488
4489 if (!src_hotlist || !src_rssi || !event->num_entries_in_page) {
Srinivas Girigowdaf2599dd2015-11-16 18:20:46 -08004490 WMA_LOGW("%s: Cached results empty, send 0 results", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004491 goto noresults;
4492 }
Vignesh Viswanathan4f75cf52017-11-29 14:19:13 +05304493
4494 if (event->num_entries_in_page >
Abhinav Kumara03659c2017-12-28 15:18:07 +05304495 (WMI_SVC_MSG_MAX_SIZE - sizeof(*event))/sizeof(*src_hotlist) ||
4496 event->num_entries_in_page > param_buf->num_bssid_list) {
4497 WMA_LOGE("%s:excess num_entries_in_page %d in WMI event. num_bssid_list %d",
Vignesh Viswanathan4f75cf52017-11-29 14:19:13 +05304498 __func__,
Abhinav Kumara03659c2017-12-28 15:18:07 +05304499 event->num_entries_in_page, param_buf->num_bssid_list);
Vignesh Viswanathan4f75cf52017-11-29 14:19:13 +05304500 return -EINVAL;
4501 } else {
4502 total_len = sizeof(*event) +
4503 (event->num_entries_in_page * sizeof(*src_hotlist));
4504 }
4505 for (i = 0; i < event->num_entries_in_page; i++) {
4506 if (src_hotlist[i].ie_length >
4507 WMI_SVC_MSG_MAX_SIZE - total_len) {
4508 excess_data = true;
4509 break;
4510 } else {
4511 total_len += src_hotlist[i].ie_length;
4512 WMA_LOGD("total len IE: %d", total_len);
4513 }
4514
4515 if (src_hotlist[i].number_rssi_samples >
4516 (WMI_SVC_MSG_MAX_SIZE - total_len) / sizeof(*src_rssi)) {
4517 excess_data = true;
4518 break;
4519 } else {
4520 total_len += (src_hotlist[i].number_rssi_samples *
4521 sizeof(*src_rssi));
4522 WMA_LOGD("total len RSSI samples: %d", total_len);
4523 }
4524 }
4525 if (excess_data) {
4526 WMA_LOGE("%s:excess data in WMI event",
4527 __func__);
4528 return -EINVAL;
4529 }
4530
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004531 if (event->first_entry_index +
4532 event->num_entries_in_page < event->total_entries)
4533 moredata = 1;
4534 else
4535 moredata = 0;
4536
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304537 dest_cachelist = qdf_mem_malloc(sizeof(*dest_cachelist));
Arif Hussain157263f2018-10-03 13:07:15 -07004538 if (!dest_cachelist)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004539 return -ENOMEM;
Arif Hussain157263f2018-10-03 13:07:15 -07004540
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304541 qdf_mem_zero(dest_cachelist, sizeof(*dest_cachelist));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004542 dest_cachelist->request_id = event->request_id;
4543 dest_cachelist->more_data = moredata;
4544
4545 scan_ids_cnt = wma_extscan_find_unique_scan_ids(cmd_param_info);
Vignesh Viswanathan4f75cf52017-11-29 14:19:13 +05304546 WMA_LOGD("%s: scan_ids_cnt %d", __func__, scan_ids_cnt);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004547 dest_cachelist->num_scan_ids = scan_ids_cnt;
4548
4549 buf_len = sizeof(*dest_result) * scan_ids_cnt;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304550 dest_cachelist->result = qdf_mem_malloc(buf_len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004551 if (!dest_cachelist->result) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304552 qdf_mem_free(dest_cachelist);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004553 return -ENOMEM;
4554 }
4555
4556 dest_result = dest_cachelist->result;
4557 wma_fill_num_results_per_scan_id(cmd_param_info, dest_result);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004558
Abhinav Kumarcc864962018-02-21 12:36:35 +05304559 status = wma_group_num_bss_to_scan_id(cmd_param_info, dest_cachelist);
4560 if (!status)
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08004561 mac->sme.ext_scan_ind_cb(mac->hdd_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004562 eSIR_EXTSCAN_CACHED_RESULTS_IND,
4563 dest_cachelist);
Abhinav Kumarcc864962018-02-21 12:36:35 +05304564 else
4565 WMA_LOGD("wma_group_num_bss_to_scan_id failed, not calling callback");
4566
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004567 dest_result = dest_cachelist->result;
4568 for (i = 0; i < dest_cachelist->num_scan_ids; i++) {
Abhinav Kumarcc864962018-02-21 12:36:35 +05304569 if (dest_result->ap)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304570 qdf_mem_free(dest_result->ap);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004571 dest_result++;
4572 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304573 qdf_mem_free(dest_cachelist->result);
4574 qdf_mem_free(dest_cachelist);
Abhinav Kumarcc864962018-02-21 12:36:35 +05304575 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004576
4577noresults:
4578 empty_cachelist.request_id = event->request_id;
4579 empty_cachelist.more_data = 0;
4580 empty_cachelist.num_scan_ids = 0;
4581
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08004582 mac->sme.ext_scan_ind_cb(mac->hdd_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004583 eSIR_EXTSCAN_CACHED_RESULTS_IND,
4584 &empty_cachelist);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004585 return 0;
4586}
4587
4588/**
4589 * wma_extscan_change_results_event_handler() - change results event handler
4590 * @handle: wma handle
4591 * @cmd_param_info: event buffer
4592 * @len: length
4593 *
4594 * This function handles change results event and indicate
4595 * change results to upper layer.
4596 *
4597 * Return: 0 for success or error code.
4598 */
4599int wma_extscan_change_results_event_handler(void *handle,
4600 uint8_t *cmd_param_info,
4601 uint32_t len)
4602{
4603 WMI_EXTSCAN_WLAN_CHANGE_RESULTS_EVENTID_param_tlvs *param_buf;
4604 wmi_extscan_wlan_change_results_event_fixed_param *event;
4605 tSirWifiSignificantChangeEvent *dest_chglist;
4606 tSirWifiSignificantChange *dest_ap;
4607 wmi_extscan_wlan_change_result_bssid *src_chglist;
4608
Pragaspathi Thilagaraje8f5b1d2018-04-04 23:08:48 +05304609 uint32_t numap;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004610 int i, k;
4611 uint8_t *src_rssi;
4612 int count = 0;
4613 int moredata;
Pragaspathi Thilagaraje8f5b1d2018-04-04 23:08:48 +05304614 uint32_t rssi_num = 0;
Jeff Johnson9f18aa72018-12-02 12:05:12 -08004615 struct mac_context *mac = cds_get_context(QDF_MODULE_ID_PE);
Varun Reddy Yeturu46ba20c2017-08-17 15:03:27 -07004616 uint32_t buf_len;
4617 bool excess_data = false;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004618
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08004619 if (!mac) {
4620 WMA_LOGE("%s: Invalid mac", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004621 return -EINVAL;
4622 }
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08004623 if (!mac->sme.ext_scan_ind_cb) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004624 WMA_LOGE("%s: Callback not registered", __func__);
4625 return -EINVAL;
4626 }
4627 param_buf = (WMI_EXTSCAN_WLAN_CHANGE_RESULTS_EVENTID_param_tlvs *)
4628 cmd_param_info;
4629 if (!param_buf) {
4630 WMA_LOGE("%s: Invalid change monitor event", __func__);
4631 return -EINVAL;
4632 }
4633 event = param_buf->fixed_param;
4634 src_chglist = param_buf->bssid_signal_descriptor_list;
4635 src_rssi = param_buf->rssi_list;
4636 numap = event->num_entries_in_page;
4637
4638 if (!src_chglist || !numap) {
4639 WMA_LOGE("%s: Results invalid", __func__);
4640 return -EINVAL;
4641 }
Abhinav Kumara03659c2017-12-28 15:18:07 +05304642 if (numap > param_buf->num_bssid_signal_descriptor_list) {
4643 WMA_LOGE("%s: Invalid num of entries in page: %d", __func__, numap);
4644 return -EINVAL;
4645 }
Pragaspathi Thilagaraje8f5b1d2018-04-04 23:08:48 +05304646 for (i = 0; i < numap; i++) {
4647 if (src_chglist->num_rssi_samples > (UINT_MAX - rssi_num)) {
4648 WMA_LOGE("%s: Invalid num of rssi samples %d numap %d rssi_num %d",
4649 __func__, src_chglist->num_rssi_samples,
4650 numap, rssi_num);
4651 return -EINVAL;
4652 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004653 rssi_num += src_chglist->num_rssi_samples;
Pragaspathi Thilagaraje8f5b1d2018-04-04 23:08:48 +05304654 src_chglist++;
4655 }
4656 src_chglist = param_buf->bssid_signal_descriptor_list;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004657
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004658 if (event->first_entry_index +
4659 event->num_entries_in_page < event->total_entries) {
4660 moredata = 1;
4661 } else {
4662 moredata = 0;
4663 }
Varun Reddy Yeturu46ba20c2017-08-17 15:03:27 -07004664
4665 do {
4666 if (event->num_entries_in_page >
4667 (WMI_SVC_MSG_MAX_SIZE - sizeof(*event))/
4668 sizeof(*src_chglist)) {
4669 excess_data = true;
4670 break;
4671 } else {
4672 buf_len =
4673 sizeof(*event) + (event->num_entries_in_page *
4674 sizeof(*src_chglist));
4675 }
4676 if (rssi_num >
4677 (WMI_SVC_MSG_MAX_SIZE - buf_len)/sizeof(int32_t)) {
4678 excess_data = true;
4679 break;
4680 }
4681 } while (0);
4682
4683 if (excess_data) {
4684 WMA_LOGE("buffer len exceeds WMI payload,numap:%d, rssi_num:%d",
4685 numap, rssi_num);
4686 QDF_ASSERT(0);
4687 return -EINVAL;
4688 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304689 dest_chglist = qdf_mem_malloc(sizeof(*dest_chglist) +
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004690 sizeof(*dest_ap) * numap +
4691 sizeof(int32_t) * rssi_num);
Arif Hussain157263f2018-10-03 13:07:15 -07004692 if (!dest_chglist)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004693 return -ENOMEM;
Arif Hussain157263f2018-10-03 13:07:15 -07004694
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004695 dest_ap = &dest_chglist->ap[0];
4696 for (i = 0; i < numap; i++) {
4697 dest_ap->channel = src_chglist->channel;
4698 WMI_MAC_ADDR_TO_CHAR_ARRAY(&src_chglist->bssid,
4699 dest_ap->bssid.bytes);
4700 dest_ap->numOfRssi = src_chglist->num_rssi_samples;
4701 if (dest_ap->numOfRssi) {
Abhinav Kumara03659c2017-12-28 15:18:07 +05304702 if ((dest_ap->numOfRssi + count) >
4703 param_buf->num_rssi_list) {
4704 WMA_LOGE("%s: Invalid num in rssi list: %d",
4705 __func__, dest_ap->numOfRssi);
4706 qdf_mem_free(dest_chglist);
4707 return -EINVAL;
4708 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004709 for (k = 0; k < dest_ap->numOfRssi; k++) {
4710 dest_ap->rssi[k] = WMA_TGT_NOISE_FLOOR_DBM +
4711 src_rssi[count++];
4712 }
4713 }
Dundi Raviteja35668232018-06-26 13:05:20 +05304714 dest_ap = (tSirWifiSignificantChange *)((char *)dest_ap +
4715 dest_ap->numOfRssi * sizeof(int32_t) +
4716 sizeof(*dest_ap));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004717 src_chglist++;
4718 }
4719 dest_chglist->requestId = event->request_id;
4720 dest_chglist->moreData = moredata;
Dundi Raviteja35668232018-06-26 13:05:20 +05304721 dest_chglist->numResults = numap;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004722
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08004723 mac->sme.ext_scan_ind_cb(mac->hdd_handle,
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004724 eSIR_EXTSCAN_SIGNIFICANT_WIFI_CHANGE_RESULTS_IND,
4725 dest_chglist);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004726 WMA_LOGI("%s: sending change monitor results", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304727 qdf_mem_free(dest_chglist);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004728 return 0;
4729}
4730
4731/**
4732 * wma_passpoint_match_event_handler() - passpoint match found event handler
4733 * @handle: WMA handle
4734 * @cmd_param_info: event data
4735 * @len: event data length
4736 *
4737 * This is the passpoint match found event handler; it reads event data from
4738 * @cmd_param_info and fill in the destination buffer and sends indication
4739 * up layer.
4740 *
4741 * Return: 0 on success; error number otherwise
4742 */
4743int wma_passpoint_match_event_handler(void *handle,
4744 uint8_t *cmd_param_info,
4745 uint32_t len)
4746{
4747 WMI_PASSPOINT_MATCH_EVENTID_param_tlvs *param_buf;
4748 wmi_passpoint_event_hdr *event;
4749 struct wifi_passpoint_match *dest_match;
4750 tSirWifiScanResult *dest_ap;
4751 uint8_t *buf_ptr;
Pragaspathi Thilagarajfda1af62018-03-09 15:11:58 +05304752 uint32_t buf_len = 0;
4753 bool excess_data = false;
Jeff Johnson9f18aa72018-12-02 12:05:12 -08004754 struct mac_context *mac = cds_get_context(QDF_MODULE_ID_PE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004755
4756 if (!mac) {
4757 WMA_LOGE("%s: Invalid mac", __func__);
4758 return -EINVAL;
4759 }
Jeff Johnson17b12392018-07-03 22:21:15 -07004760 if (!mac->sme.ext_scan_ind_cb) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004761 WMA_LOGE("%s: Callback not registered", __func__);
4762 return -EINVAL;
4763 }
4764
4765 param_buf = (WMI_PASSPOINT_MATCH_EVENTID_param_tlvs *) cmd_param_info;
4766 if (!param_buf) {
4767 WMA_LOGE("%s: Invalid passpoint match event", __func__);
4768 return -EINVAL;
4769 }
4770 event = param_buf->fixed_param;
4771 buf_ptr = (uint8_t *)param_buf->fixed_param;
4772
Pragaspathi Thilagarajfda1af62018-03-09 15:11:58 +05304773 do {
4774 if (event->ie_length > (WMI_SVC_MSG_MAX_SIZE)) {
4775 excess_data = true;
4776 break;
4777 } else {
4778 buf_len = event->ie_length;
4779 }
4780
4781 if (event->anqp_length > (WMI_SVC_MSG_MAX_SIZE)) {
4782 excess_data = true;
4783 break;
4784 } else {
4785 buf_len += event->anqp_length;
4786 }
4787
4788 } while (0);
4789
4790 if (excess_data || buf_len > (WMI_SVC_MSG_MAX_SIZE - sizeof(*event)) ||
4791 buf_len > (WMI_SVC_MSG_MAX_SIZE - sizeof(*dest_match)) ||
4792 (event->ie_length + event->anqp_length) > param_buf->num_bufp) {
Abhinav Kumara03659c2017-12-28 15:18:07 +05304793 WMA_LOGE("IE Length: %u or ANQP Length: %u is huge, num_bufp: %u",
4794 event->ie_length, event->anqp_length,
4795 param_buf->num_bufp);
Varun Reddy Yeturu46ba20c2017-08-17 15:03:27 -07004796 return -EINVAL;
4797 }
4798
Srinivas Girigowdab8fdc642019-03-19 15:33:03 -07004799 if (event->ssid.ssid_len > WLAN_SSID_MAX_LEN) {
Vignesh Viswanathandf0571a2017-11-28 17:39:08 +05304800 WMA_LOGD("%s: Invalid ssid len %d, truncating",
4801 __func__, event->ssid.ssid_len);
Srinivas Girigowdab8fdc642019-03-19 15:33:03 -07004802 event->ssid.ssid_len = WLAN_SSID_MAX_LEN;
Vignesh Viswanathandf0571a2017-11-28 17:39:08 +05304803 }
4804
Pragaspathi Thilagarajfda1af62018-03-09 15:11:58 +05304805 dest_match = qdf_mem_malloc(sizeof(*dest_match) + buf_len);
4806
Arif Hussain157263f2018-10-03 13:07:15 -07004807 if (!dest_match)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004808 return -EINVAL;
Arif Hussain157263f2018-10-03 13:07:15 -07004809
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004810 dest_ap = &dest_match->ap;
4811 dest_match->request_id = 0;
4812 dest_match->id = event->id;
4813 dest_match->anqp_len = event->anqp_length;
4814 WMA_LOGI("%s: passpoint match: id: %u anqp length %u", __func__,
4815 dest_match->id, dest_match->anqp_len);
4816
4817 dest_ap->channel = event->channel_mhz;
4818 dest_ap->ts = event->timestamp;
4819 dest_ap->rtt = event->rtt;
4820 dest_ap->rssi = event->rssi;
4821 dest_ap->rtt_sd = event->rtt_sd;
4822 dest_ap->beaconPeriod = event->beacon_period;
4823 dest_ap->capability = event->capability;
4824 dest_ap->ieLength = event->ie_length;
4825 WMI_MAC_ADDR_TO_CHAR_ARRAY(&event->bssid, dest_ap->bssid.bytes);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304826 qdf_mem_copy(dest_ap->ssid, event->ssid.ssid,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004827 event->ssid.ssid_len);
4828 dest_ap->ssid[event->ssid.ssid_len] = '\0';
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304829 qdf_mem_copy(dest_ap->ieData, buf_ptr + sizeof(*event) +
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004830 WMI_TLV_HDR_SIZE, dest_ap->ieLength);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304831 qdf_mem_copy(dest_match->anqp, buf_ptr + sizeof(*event) +
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004832 WMI_TLV_HDR_SIZE + dest_ap->ieLength,
4833 dest_match->anqp_len);
4834
Jeff Johnson17b12392018-07-03 22:21:15 -07004835 mac->sme.ext_scan_ind_cb(mac->hdd_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004836 eSIR_PASSPOINT_NETWORK_FOUND_IND,
4837 dest_match);
4838 WMA_LOGI("%s: sending passpoint match event to hdd", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304839 qdf_mem_free(dest_match);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004840 return 0;
4841}
4842
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304843QDF_STATUS wma_start_extscan(tp_wma_handle wma,
Jeff Johnsondab58602018-07-14 15:30:24 -07004844 struct wifi_scan_cmd_req_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004845{
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05304846 QDF_STATUS status;
4847
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004848 if (!wma || !wma->wmi_handle) {
Jeff Johnsondab58602018-07-14 15:30:24 -07004849 wma_err("WMA is closed, can not issue cmd");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304850 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004851 }
Jeff Johnsondab58602018-07-14 15:30:24 -07004852 if (!wmi_service_enabled(wma->wmi_handle, wmi_service_extscan)) {
4853 wma_err("extscan not enabled");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304854 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004855 }
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05304856
Min Liuafd51822019-05-10 18:36:19 +08004857 if (!params) {
Jeff Johnsondab58602018-07-14 15:30:24 -07004858 wma_err("NULL param");
Naveen Rawat35804772016-06-27 15:40:28 -07004859 return QDF_STATUS_E_NOMEM;
Min Liuafd51822019-05-10 18:36:19 +08004860 }
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05304861
Jeff Johnsondab58602018-07-14 15:30:24 -07004862 status = wmi_unified_start_extscan_cmd(wma->wmi_handle, params);
4863 if (QDF_IS_STATUS_SUCCESS(status))
4864 wma->interfaces[params->vdev_id].extscan_in_progress = true;
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05304865
Jeff Johnsondab58602018-07-14 15:30:24 -07004866 wma_debug("Exit, vdev %d, status %d", params->vdev_id, status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004867
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05304868 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004869}
4870
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304871QDF_STATUS wma_stop_extscan(tp_wma_handle wma,
Jeff Johnson7272ea72018-07-15 17:22:27 -07004872 struct extscan_stop_req_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004873{
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05304874 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004875
4876 if (!wma || !wma->wmi_handle) {
4877 WMA_LOGE("%s: WMA is closed, cannot issue cmd", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304878 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004879 }
Jeff Johnson7272ea72018-07-15 17:22:27 -07004880 if (!wmi_service_enabled(wma->wmi_handle, wmi_service_extscan)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004881 WMA_LOGE("%s: extscan not enabled", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304882 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004883 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004884
Jeff Johnson7272ea72018-07-15 17:22:27 -07004885 status = wmi_unified_stop_extscan_cmd(wma->wmi_handle, params);
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05304886 if (QDF_IS_STATUS_ERROR(status))
4887 return status;
4888
Jeff Johnson7272ea72018-07-15 17:22:27 -07004889 wma->interfaces[params->vdev_id].extscan_in_progress = false;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004890 WMA_LOGD("Extscan stop request sent successfully for vdev %d",
Jeff Johnson7272ea72018-07-15 17:22:27 -07004891 params->vdev_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004892
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05304893 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004894}
4895
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304896QDF_STATUS wma_extscan_start_hotlist_monitor(tp_wma_handle wma,
Jeff Johnson1148cb02018-07-13 23:14:32 -07004897 struct extscan_bssid_hotlist_set_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004898{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004899 if (!wma || !wma->wmi_handle) {
4900 WMA_LOGE("%s: WMA is closed, can not issue hotlist cmd",
4901 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304902 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004903 }
Jeff Johnson1148cb02018-07-13 23:14:32 -07004904
4905 if (!params) {
4906 WMA_LOGE("%s: Invalid params", __func__);
4907 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004908 }
Jeff Johnson1148cb02018-07-13 23:14:32 -07004909
4910 return wmi_unified_extscan_start_hotlist_monitor_cmd(wma->wmi_handle,
4911 params);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004912}
4913
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304914QDF_STATUS wma_extscan_stop_hotlist_monitor(tp_wma_handle wma,
Jeff Johnson9743eb72018-07-14 10:30:04 -07004915 struct extscan_bssid_hotlist_reset_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004916{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004917 if (!wma || !wma->wmi_handle) {
Jeff Johnson9743eb72018-07-14 10:30:04 -07004918 WMA_LOGE("%s: WMA is closed, can not issue cmd", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304919 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004920 }
Jeff Johnson9743eb72018-07-14 10:30:04 -07004921
4922 if (!params) {
4923 WMA_LOGE("%s: Invalid params", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304924 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004925 }
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05304926 if (!wmi_service_enabled(wma->wmi_handle,
Jeff Johnson9743eb72018-07-14 10:30:04 -07004927 wmi_service_extscan)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004928 WMA_LOGE("%s: extscan not enabled", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304929 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004930 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004931
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05304932 return wmi_unified_extscan_stop_hotlist_monitor_cmd(wma->wmi_handle,
Jeff Johnson9743eb72018-07-14 10:30:04 -07004933 params);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004934}
4935
Jeff Johnsonb43ed032018-07-16 06:59:21 -07004936QDF_STATUS
4937wma_extscan_start_change_monitor(tp_wma_handle wma,
4938 struct extscan_set_sig_changereq_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004939{
Mohit Khanna0fe61672016-05-19 16:53:39 -07004940 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004941
4942 if (!wma || !wma->wmi_handle) {
Jeff Johnsonb43ed032018-07-16 06:59:21 -07004943 WMA_LOGE("%s: WMA is closed,can not issue cmd",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004944 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304945 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004946 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004947
Jeff Johnsonb43ed032018-07-16 06:59:21 -07004948 if (!params) {
4949 WMA_LOGE("%s: NULL params", __func__);
Mohit Khanna0fe61672016-05-19 16:53:39 -07004950 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004951 }
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05304952
Jeff Johnsonb43ed032018-07-16 06:59:21 -07004953 status = wmi_unified_extscan_start_change_monitor_cmd(wma->wmi_handle,
4954 params);
Mohit Khanna0fe61672016-05-19 16:53:39 -07004955 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004956}
4957
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304958QDF_STATUS wma_extscan_stop_change_monitor(tp_wma_handle wma,
Jeff Johnson0c8dbc32018-07-16 22:10:48 -07004959 struct extscan_capabilities_reset_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004960{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004961 if (!wma || !wma->wmi_handle) {
4962 WMA_LOGE("%s: WMA is closed, can not issue cmd", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304963 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004964 }
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05304965 if (!wmi_service_enabled(wma->wmi_handle,
4966 wmi_service_extscan)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004967 WMA_LOGE("%s: ext scan not enabled", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304968 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004969 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004970
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05304971 return wmi_unified_extscan_stop_change_monitor_cmd(wma->wmi_handle,
Jeff Johnson0c8dbc32018-07-16 22:10:48 -07004972 params);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004973}
4974
Jeff Johnson2ba60092018-07-17 08:19:37 -07004975QDF_STATUS
4976wma_extscan_get_cached_results(tp_wma_handle wma,
4977 struct extscan_cached_result_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004978{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004979 if (!wma || !wma->wmi_handle) {
4980 WMA_LOGE("%s: WMA is closed, cannot issue cmd", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304981 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004982 }
Jeff Johnson2ba60092018-07-17 08:19:37 -07004983 if (!wmi_service_enabled(wma->wmi_handle, wmi_service_extscan)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004984 WMA_LOGE("%s: extscan not enabled", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304985 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004986 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004987
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05304988 return wmi_unified_extscan_get_cached_results_cmd(wma->wmi_handle,
Jeff Johnson2ba60092018-07-17 08:19:37 -07004989 params);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004990}
4991
Jeff Johnsonfed9a732018-07-18 12:18:03 -07004992QDF_STATUS
4993wma_extscan_get_capabilities(tp_wma_handle wma,
4994 struct extscan_capabilities_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004995{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004996 if (!wma || !wma->wmi_handle) {
Jeff Johnsonfed9a732018-07-18 12:18:03 -07004997 WMA_LOGE("%s: WMA is closed, can not issue cmd", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304998 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004999 }
Jeff Johnsonfed9a732018-07-18 12:18:03 -07005000 if (!wmi_service_enabled(wma->wmi_handle, wmi_service_extscan)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005001 WMA_LOGE("%s: extscan not enabled", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305002 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005003 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005004
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05305005 return wmi_unified_extscan_get_capabilities_cmd(wma->wmi_handle,
Jeff Johnsonfed9a732018-07-18 12:18:03 -07005006 params);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005007}
5008
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305009QDF_STATUS wma_set_epno_network_list(tp_wma_handle wma,
Jeff Johnson360135b2018-07-18 20:51:47 -07005010 struct wifi_enhanced_pno_params *req)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005011{
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05305012 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005013
Jeff Johnson360135b2018-07-18 20:51:47 -07005014 wma_debug("Enter");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005015
5016 if (!wma || !wma->wmi_handle) {
Jeff Johnson360135b2018-07-18 20:51:47 -07005017 wma_err("WMA is closed, can not issue cmd");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305018 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005019 }
Jeff Johnson360135b2018-07-18 20:51:47 -07005020
5021 if (!wmi_service_enabled(wma->wmi_handle, wmi_service_extscan)) {
5022 wma_err("extscan not enabled");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305023 return QDF_STATUS_E_NOSUPPORT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005024 }
5025
Jeff Johnson360135b2018-07-18 20:51:47 -07005026 status = wmi_unified_set_epno_network_list_cmd(wma->wmi_handle, req);
5027 wma_debug("Exit, vdev %d, status %d", req->vdev_id, status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005028
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05305029 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005030}
5031
Jeff Johnson2a7f1012018-07-19 07:21:06 -07005032QDF_STATUS
5033wma_set_passpoint_network_list(tp_wma_handle wma,
5034 struct wifi_passpoint_req_param *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005035{
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05305036 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005037
Jeff Johnson2a7f1012018-07-19 07:21:06 -07005038 wma_debug("Enter");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005039
5040 if (!wma || !wma->wmi_handle) {
Jeff Johnson2a7f1012018-07-19 07:21:06 -07005041 wma_err("WMA is closed, can not issue cmd");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305042 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005043 }
Jeff Johnson2a7f1012018-07-19 07:21:06 -07005044 if (!wmi_service_enabled(wma->wmi_handle, wmi_service_extscan)) {
5045 wma_err("extscan not enabled");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305046 return QDF_STATUS_E_NOSUPPORT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005047 }
5048
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05305049 status = wmi_unified_set_passpoint_network_list_cmd(wma->wmi_handle,
Jeff Johnson2a7f1012018-07-19 07:21:06 -07005050 params);
5051 wma_debug("Exit, vdev %d, status %d", params->vdev_id, status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005052
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05305053 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005054}
5055
Jeff Johnson2a7f1012018-07-19 07:21:06 -07005056QDF_STATUS
5057wma_reset_passpoint_network_list(tp_wma_handle wma,
5058 struct wifi_passpoint_req_param *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005059{
Krishna Kumaar Natarajan1b909d72016-06-06 15:02:18 -07005060 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005061
Jeff Johnson2a7f1012018-07-19 07:21:06 -07005062 wma_debug("Enter");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005063
5064 if (!wma || !wma->wmi_handle) {
Jeff Johnson2a7f1012018-07-19 07:21:06 -07005065 wma_err("WMA is closed, can not issue cmd");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305066 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005067 }
Jeff Johnson2a7f1012018-07-19 07:21:06 -07005068 if (!wmi_service_enabled(wma->wmi_handle, wmi_service_extscan)) {
5069 wma_err("extscan not enabled");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305070 return QDF_STATUS_E_NOSUPPORT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005071 }
5072
Krishna Kumaar Natarajan1b909d72016-06-06 15:02:18 -07005073 status = wmi_unified_reset_passpoint_network_list_cmd(wma->wmi_handle,
Jeff Johnson2a7f1012018-07-19 07:21:06 -07005074 params);
5075 wma_debug("Exit, vdev %d, status %d", params->vdev_id, status);
Krishna Kumaar Natarajan1b909d72016-06-06 15:02:18 -07005076
5077 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005078}
5079
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005080#endif
5081
Jeff Johnson9d45f332019-01-29 08:42:00 -08005082QDF_STATUS wma_scan_probe_setoui(tp_wma_handle wma,
5083 struct scan_mac_oui *set_oui)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005084{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005085 if (!wma || !wma->wmi_handle) {
5086 WMA_LOGE("%s: WMA is closed, can not issue cmd", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305087 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005088 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005089
Pragaspathi Thilagarajd5cb9e82019-02-04 14:13:52 +05305090 if (!wma_is_vdev_valid(set_oui->vdev_id)) {
5091 WMA_LOGE("%s: vdev_id: %d is not active", __func__,
5092 set_oui->vdev_id);
5093 return QDF_STATUS_E_INVAL;
5094 }
5095
Jeff Johnson9d45f332019-01-29 08:42:00 -08005096 return wmi_unified_scan_probe_setoui_cmd(wma->wmi_handle, set_oui);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005097}
Jeff Johnson9d45f332019-01-29 08:42:00 -08005098
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005099/**
5100 * wma_roam_better_ap_handler() - better ap event handler
5101 * @wma: wma handle
5102 * @vdev_id: vdev id
5103 *
5104 * Handler for WMI_ROAM_REASON_BETTER_AP event from roam firmware in Rome.
5105 * This event means roam algorithm in Rome has found a better matching
5106 * candidate AP. The indication is sent to SME.
5107 *
5108 * Return: none
5109 */
5110void wma_roam_better_ap_handler(tp_wma_handle wma, uint32_t vdev_id)
5111{
Rajeev Kumarcf7bd802017-04-18 11:11:42 -07005112 struct scheduler_msg cds_msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005113 tSirSmeCandidateFoundInd *candidate_ind;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005114
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305115 candidate_ind = qdf_mem_malloc(sizeof(tSirSmeCandidateFoundInd));
Arif Hussain157263f2018-10-03 13:07:15 -07005116 if (!candidate_ind)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005117 return;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005118
Arif Hussain157263f2018-10-03 13:07:15 -07005119 wma->interfaces[vdev_id].roaming_in_progress = true;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005120 candidate_ind->messageType = eWNI_SME_CANDIDATE_FOUND_IND;
5121 candidate_ind->sessionId = vdev_id;
5122 candidate_ind->length = sizeof(tSirSmeCandidateFoundInd);
5123
5124 cds_msg.type = eWNI_SME_CANDIDATE_FOUND_IND;
5125 cds_msg.bodyptr = candidate_ind;
Vignesh Viswanathan067b9e62018-04-11 19:31:46 +05305126 cds_msg.callback = sme_mc_process_handler;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305127 QDF_TRACE(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_INFO,
Arif Hussain157263f2018-10-03 13:07:15 -07005128 FL("posting candidate ind to SME, vdev %d"), vdev_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005129
gaurank kathpalia00861f02018-08-28 19:16:12 +05305130 if (QDF_STATUS_SUCCESS != scheduler_post_message(QDF_MODULE_ID_WMA,
5131 QDF_MODULE_ID_SME,
5132 QDF_MODULE_ID_SCAN,
5133 &cds_msg)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305134 qdf_mem_free(candidate_ind);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005135 }
5136}
5137
5138/**
yeshwanth sriram guntuka41f936c2017-09-01 17:53:49 +05305139 * wma_handle_btm_disassoc_imminent_msg() - Send del sta msg to lim on receiving
5140 * BTM request from AP with disassoc imminent reason
5141 * @wma_handle: wma handle
5142 * @vdev_id: vdev id
5143 *
5144 * Return: None
5145 */
5146static void wma_handle_btm_disassoc_imminent_msg(tp_wma_handle wma_handle,
5147 uint32_t vdev_id)
5148{
5149 tpDeleteStaContext del_sta_ctx;
5150
Arif Hussain157263f2018-10-03 13:07:15 -07005151 del_sta_ctx = qdf_mem_malloc(sizeof(tDeleteStaContext));
5152 if (!del_sta_ctx)
yeshwanth sriram guntuka41f936c2017-09-01 17:53:49 +05305153 return;
Arif Hussain157263f2018-10-03 13:07:15 -07005154
yeshwanth sriram guntuka41f936c2017-09-01 17:53:49 +05305155 del_sta_ctx->vdev_id = vdev_id;
5156 del_sta_ctx->reasonCode = HAL_DEL_STA_REASON_CODE_BTM_DISASSOC_IMMINENT;
5157 wma_send_msg(wma_handle, SIR_LIM_DELETE_STA_CONTEXT_IND,
5158 (void *)del_sta_ctx, 0);
5159}
5160
5161/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005162 * wma_roam_event_callback() - roam event callback
5163 * @handle: wma handle
5164 * @event_buf: event buffer
5165 * @len: buffer length
5166 *
5167 * Handler for all events from roam engine in firmware
5168 *
5169 * Return: 0 for success or error code
5170 */
5171int wma_roam_event_callback(WMA_HANDLE handle, uint8_t *event_buf,
5172 uint32_t len)
5173{
5174 tp_wma_handle wma_handle = (tp_wma_handle) handle;
5175 WMI_ROAM_EVENTID_param_tlvs *param_buf;
5176 wmi_roam_event_fixed_param *wmi_event;
Jeff Johnsona7f41dd2019-02-06 22:54:55 -08005177 struct roam_offload_synch_ind *roam_synch_data;
Varun Reddy Yeturuf907f912016-03-21 15:06:22 -07005178 enum sir_roam_op_code op_code = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005179
5180 param_buf = (WMI_ROAM_EVENTID_param_tlvs *) event_buf;
5181 if (!param_buf) {
5182 WMA_LOGE("Invalid roam event buffer");
5183 return -EINVAL;
5184 }
5185
5186 wmi_event = param_buf->fixed_param;
Varun Reddy Yeturuf907f912016-03-21 15:06:22 -07005187 WMA_LOGD("%s: Reason %x, Notif %x for vdevid %x, rssi %d",
5188 __func__, wmi_event->reason, wmi_event->notif,
5189 wmi_event->vdev_id, wmi_event->rssi);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005190
Himanshu Agarwal847dd5d2017-10-04 14:15:04 +05305191 if (wmi_event->vdev_id >= wma_handle->max_bssid) {
5192 WMA_LOGE("Invalid vdev id from firmware");
5193 return -EINVAL;
5194 }
Deepak Dhamdheref918d422017-07-06 12:56:29 -07005195 wlan_roam_debug_log(wmi_event->vdev_id, DEBUG_ROAM_EVENT,
5196 DEBUG_INVALID_PEER_ID, NULL, NULL,
5197 wmi_event->reason,
5198 (wmi_event->reason == WMI_ROAM_REASON_INVALID) ?
5199 wmi_event->notif : wmi_event->rssi);
Himanshu Agarwal847dd5d2017-10-04 14:15:04 +05305200
Himanshu Agarwal67a863b2016-09-20 15:09:09 +05305201 DPTRACE(qdf_dp_trace_record_event(QDF_DP_TRACE_EVENT_RECORD,
Venkata Sharath Chandra Manchala0b9fc632017-05-15 14:35:15 -07005202 wmi_event->vdev_id, QDF_TRACE_DEFAULT_PDEV_ID,
5203 QDF_PROTO_TYPE_EVENT, QDF_ROAM_EVENTID));
Himanshu Agarwal67a863b2016-09-20 15:09:09 +05305204
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005205 switch (wmi_event->reason) {
yeshwanth sriram guntuka41f936c2017-09-01 17:53:49 +05305206 case WMI_ROAM_REASON_BTM:
5207 /*
5208 * This event is received from firmware if firmware is unable to
5209 * find candidate AP after roam scan and BTM request from AP
5210 * has disassoc imminent bit set.
5211 */
5212 WMA_LOGD("Kickout due to btm request");
5213 wma_sta_kickout_event(HOST_STA_KICKOUT_REASON_BTM,
5214 wmi_event->vdev_id, NULL);
5215 wma_handle_btm_disassoc_imminent_msg(wma_handle,
5216 wmi_event->vdev_id);
5217 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005218 case WMI_ROAM_REASON_BMISS:
5219 WMA_LOGD("Beacon Miss for vdevid %x", wmi_event->vdev_id);
Sreelakshmi Konamki58c72432016-11-09 17:06:44 +05305220 wma_beacon_miss_handler(wma_handle, wmi_event->vdev_id,
5221 wmi_event->rssi);
Sen, Devendra154b3c42017-02-13 20:44:15 +05305222 wma_sta_kickout_event(HOST_STA_KICKOUT_REASON_BMISS,
5223 wmi_event->vdev_id, NULL);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005224 break;
5225 case WMI_ROAM_REASON_BETTER_AP:
5226 WMA_LOGD("%s:Better AP found for vdevid %x, rssi %d", __func__,
5227 wmi_event->vdev_id, wmi_event->rssi);
5228 wma_handle->suitable_ap_hb_failure = false;
5229 wma_roam_better_ap_handler(wma_handle, wmi_event->vdev_id);
5230 break;
5231 case WMI_ROAM_REASON_SUITABLE_AP:
5232 wma_handle->suitable_ap_hb_failure = true;
Sreelakshmi Konamki58c72432016-11-09 17:06:44 +05305233 wma_handle->suitable_ap_hb_failure_rssi = wmi_event->rssi;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005234 WMA_LOGD("%s:Bmiss scan AP found for vdevid %x, rssi %d",
5235 __func__, wmi_event->vdev_id, wmi_event->rssi);
5236 wma_roam_better_ap_handler(wma_handle, wmi_event->vdev_id);
5237 break;
5238#ifdef WLAN_FEATURE_ROAM_OFFLOAD
5239 case WMI_ROAM_REASON_HO_FAILED:
5240 WMA_LOGE("LFR3:Hand-Off Failed for vdevid %x",
5241 wmi_event->vdev_id);
5242 wma_roam_ho_fail_handler(wma_handle, wmi_event->vdev_id);
Tushnim Bhattacharyyaeb622b02018-05-07 13:50:51 -07005243 wma_handle->interfaces[wmi_event->vdev_id].
5244 roaming_in_progress = false;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005245 break;
5246#endif
Varun Reddy Yeturuf907f912016-03-21 15:06:22 -07005247 case WMI_ROAM_REASON_INVALID:
5248 roam_synch_data = qdf_mem_malloc(sizeof(*roam_synch_data));
Arif Hussain157263f2018-10-03 13:07:15 -07005249 if (!roam_synch_data)
Varun Reddy Yeturuf907f912016-03-21 15:06:22 -07005250 return -ENOMEM;
Arif Hussain157263f2018-10-03 13:07:15 -07005251
Tushnim Bhattacharyyaeb622b02018-05-07 13:50:51 -07005252 if (wmi_event->notif == WMI_ROAM_NOTIF_ROAM_START) {
Naveen Rawat8cc23b02016-07-14 12:22:56 -07005253 op_code = SIR_ROAMING_START;
Tushnim Bhattacharyyaeb622b02018-05-07 13:50:51 -07005254 wma_handle->interfaces[wmi_event->vdev_id].
5255 roaming_in_progress = true;
5256 }
5257 if (wmi_event->notif == WMI_ROAM_NOTIF_ROAM_ABORT) {
Naveen Rawat8cc23b02016-07-14 12:22:56 -07005258 op_code = SIR_ROAMING_ABORT;
Tushnim Bhattacharyyaeb622b02018-05-07 13:50:51 -07005259 wma_handle->interfaces[wmi_event->vdev_id].
5260 roaming_in_progress = false;
5261 }
Pragaspathi Thilagaraja9ecc632019-02-23 00:50:24 +05305262 roam_synch_data->roamed_vdev_id = wmi_event->vdev_id;
Varun Reddy Yeturub5d858e2017-12-15 16:08:13 -08005263 wma_handle->pe_roam_synch_cb(
Jeff Johnson9f18aa72018-12-02 12:05:12 -08005264 (struct mac_context *)wma_handle->mac_context,
Varun Reddy Yeturub5d858e2017-12-15 16:08:13 -08005265 roam_synch_data, NULL, op_code);
Varun Reddy Yeturuf907f912016-03-21 15:06:22 -07005266 wma_handle->csr_roam_synch_cb(
Jeff Johnson9f18aa72018-12-02 12:05:12 -08005267 (struct mac_context *)wma_handle->mac_context,
Varun Reddy Yeturuf907f912016-03-21 15:06:22 -07005268 roam_synch_data, NULL, op_code);
5269 qdf_mem_free(roam_synch_data);
5270 break;
Sreelakshmi Konamki88a2a412017-04-14 15:11:55 +05305271 case WMI_ROAM_REASON_RSO_STATUS:
5272 wma_rso_cmd_status_event_handler(wmi_event);
5273 break;
Arif Hussain43354e62017-05-24 11:24:25 -07005274 case WMI_ROAM_REASON_INVOKE_ROAM_FAIL:
5275 roam_synch_data = qdf_mem_malloc(sizeof(*roam_synch_data));
Arif Hussain157263f2018-10-03 13:07:15 -07005276 if (!roam_synch_data)
Arif Hussain43354e62017-05-24 11:24:25 -07005277 return -ENOMEM;
Arif Hussain157263f2018-10-03 13:07:15 -07005278
Pragaspathi Thilagaraja9ecc632019-02-23 00:50:24 +05305279 roam_synch_data->roamed_vdev_id = wmi_event->vdev_id;
Arif Hussain43354e62017-05-24 11:24:25 -07005280 wma_handle->csr_roam_synch_cb(
Jeff Johnson9f18aa72018-12-02 12:05:12 -08005281 (struct mac_context *)wma_handle->mac_context,
Arif Hussain43354e62017-05-24 11:24:25 -07005282 roam_synch_data, NULL, SIR_ROAMING_INVOKE_FAIL);
5283 qdf_mem_free(roam_synch_data);
5284 break;
Pragaspathi Thilagarajb0176502019-04-26 02:33:13 +05305285 case WMI_ROAM_REASON_DEAUTH:
5286 WMA_LOGD("%s: Received disconnect roam event reason:%d",
5287 __func__, wmi_event->notif);
5288 wma_handle->pe_disconnect_cb(wma_handle->mac_context,
5289 wmi_event->vdev_id);
5290 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005291 default:
5292 WMA_LOGD("%s:Unhandled Roam Event %x for vdevid %x", __func__,
5293 wmi_event->reason, wmi_event->vdev_id);
5294 break;
5295 }
5296 return 0;
5297}
5298
Ravi Joshi9e891ba2015-11-09 19:03:46 -08005299#ifdef FEATURE_LFR_SUBNET_DETECTION
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305300QDF_STATUS wma_set_gateway_params(tp_wma_handle wma,
Jeff Johnson38d0ce62019-02-22 17:05:14 -08005301 struct gateway_update_req_param *req)
Ravi Joshi9e891ba2015-11-09 19:03:46 -08005302{
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05305303 if (!wma) {
5304 WMA_LOGE("%s: wma handle is NULL", __func__);
5305 return QDF_STATUS_E_INVAL;
Ravi Joshi9e891ba2015-11-09 19:03:46 -08005306 }
5307
Jeff Johnson38d0ce62019-02-22 17:05:14 -08005308 return wmi_unified_set_gateway_params_cmd(wma->wmi_handle, req);
Ravi Joshi9e891ba2015-11-09 19:03:46 -08005309}
5310#endif /* FEATURE_LFR_SUBNET_DETECTION */
5311
Sandeep Puligillae0875662016-02-12 16:09:21 -08005312/**
5313 * wma_ht40_stop_obss_scan() - ht40 obss stop scan
5314 * @wma: WMA handel
5315 * @vdev_id: vdev identifier
5316 *
5317 * Return: Return QDF_STATUS, otherwise appropriate failure code
5318 */
5319QDF_STATUS wma_ht40_stop_obss_scan(tp_wma_handle wma, int32_t vdev_id)
5320{
Dustin Brownfd578602019-02-22 13:52:24 -08005321 QDF_STATUS status;
Sandeep Puligillae0875662016-02-12 16:09:21 -08005322 wmi_buf_t buf;
5323 wmi_obss_scan_disable_cmd_fixed_param *cmd;
Sandeep Puligillae0875662016-02-12 16:09:21 -08005324 int len = sizeof(*cmd);
5325
5326 buf = wmi_buf_alloc(wma->wmi_handle, len);
Arif Hussain157263f2018-10-03 13:07:15 -07005327 if (!buf)
Sandeep Puligillae0875662016-02-12 16:09:21 -08005328 return QDF_STATUS_E_NOMEM;
Sandeep Puligillae0875662016-02-12 16:09:21 -08005329
5330 WMA_LOGD("cmd %x vdev_id %d", WMI_OBSS_SCAN_DISABLE_CMDID, vdev_id);
5331
5332 cmd = (wmi_obss_scan_disable_cmd_fixed_param *) wmi_buf_data(buf);
5333 WMITLV_SET_HDR(&cmd->tlv_header,
5334 WMITLV_TAG_STRUC_wmi_obss_scan_disable_cmd_fixed_param,
5335 WMITLV_GET_STRUCT_TLVLEN(
5336 wmi_obss_scan_disable_cmd_fixed_param));
5337
5338 cmd->vdev_id = vdev_id;
Dustin Brownfd578602019-02-22 13:52:24 -08005339 status = wmi_unified_cmd_send(wma->wmi_handle, buf, len,
5340 WMI_OBSS_SCAN_DISABLE_CMDID);
5341 if (QDF_IS_STATUS_ERROR(status))
Sandeep Puligillae0875662016-02-12 16:09:21 -08005342 wmi_buf_free(buf);
Sandeep Puligillae0875662016-02-12 16:09:21 -08005343
Dustin Brownfd578602019-02-22 13:52:24 -08005344 return status;
Sandeep Puligillae0875662016-02-12 16:09:21 -08005345}
5346
5347/**
5348 * wma_send_ht40_obss_scanind() - ht40 obss start scan indication
5349 * @wma: WMA handel
5350 * @req: start scan request
5351 *
5352 * Return: Return QDF_STATUS, otherwise appropriate failure code
5353 */
5354QDF_STATUS wma_send_ht40_obss_scanind(tp_wma_handle wma,
5355 struct obss_ht40_scanind *req)
5356{
Dustin Brownfd578602019-02-22 13:52:24 -08005357 QDF_STATUS status;
Sandeep Puligillae0875662016-02-12 16:09:21 -08005358 wmi_buf_t buf;
5359 wmi_obss_scan_enable_cmd_fixed_param *cmd;
Sandeep Puligillae0875662016-02-12 16:09:21 -08005360 int len = 0;
5361 uint8_t *buf_ptr, i;
5362 uint8_t *channel_list;
5363
5364 len += sizeof(wmi_obss_scan_enable_cmd_fixed_param);
5365
5366 len += WMI_TLV_HDR_SIZE;
5367 len += qdf_roundup(sizeof(uint8_t) * req->channel_count,
5368 sizeof(uint32_t));
5369
5370 len += WMI_TLV_HDR_SIZE;
5371 len += qdf_roundup(sizeof(uint8_t) * 1, sizeof(uint32_t));
5372
5373 WMA_LOGE("cmdlen %d vdev_id %d channel count %d iefield_len %d",
5374 len, req->bss_id, req->channel_count, req->iefield_len);
5375
5376 WMA_LOGE("scantype %d active_time %d passive %d Obss interval %d",
5377 req->scan_type, req->obss_active_dwelltime,
5378 req->obss_passive_dwelltime,
5379 req->obss_width_trigger_interval);
5380
5381 buf = wmi_buf_alloc(wma->wmi_handle, len);
Arif Hussain157263f2018-10-03 13:07:15 -07005382 if (!buf)
Sandeep Puligillae0875662016-02-12 16:09:21 -08005383 return QDF_STATUS_E_NOMEM;
Sandeep Puligillae0875662016-02-12 16:09:21 -08005384
5385 cmd = (wmi_obss_scan_enable_cmd_fixed_param *) wmi_buf_data(buf);
5386 WMITLV_SET_HDR(&cmd->tlv_header,
5387 WMITLV_TAG_STRUC_wmi_obss_scan_enable_cmd_fixed_param,
5388 WMITLV_GET_STRUCT_TLVLEN(wmi_obss_scan_enable_cmd_fixed_param));
5389
5390 buf_ptr = (uint8_t *) cmd;
5391
5392 cmd->vdev_id = req->bss_id;
5393 cmd->scan_type = req->scan_type;
5394 cmd->obss_scan_active_dwell =
5395 req->obss_active_dwelltime;
5396 cmd->obss_scan_passive_dwell =
5397 req->obss_passive_dwelltime;
5398 cmd->bss_channel_width_trigger_scan_interval =
5399 req->obss_width_trigger_interval;
5400 cmd->bss_width_channel_transition_delay_factor =
5401 req->bsswidth_ch_trans_delay;
5402 cmd->obss_scan_active_total_per_channel =
5403 req->obss_active_total_per_channel;
5404 cmd->obss_scan_passive_total_per_channel =
5405 req->obss_passive_total_per_channel;
5406 cmd->obss_scan_activity_threshold =
5407 req->obss_activity_threshold;
5408
5409 cmd->channel_len = req->channel_count;
5410 cmd->forty_mhz_intolerant = req->fortymhz_intolerent;
5411 cmd->current_operating_class = req->current_operatingclass;
5412 cmd->ie_len = req->iefield_len;
5413
5414 buf_ptr += sizeof(wmi_obss_scan_enable_cmd_fixed_param);
5415 WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_ARRAY_BYTE,
5416 qdf_roundup(req->channel_count, sizeof(uint32_t)));
5417
5418 buf_ptr += WMI_TLV_HDR_SIZE;
5419 channel_list = (uint8_t *) buf_ptr;
5420
5421 for (i = 0; i < req->channel_count; i++) {
5422 channel_list[i] = req->channels[i];
5423 WMA_LOGD("Ch[%d]: %d ", i, channel_list[i]);
5424 }
5425
5426 buf_ptr += qdf_roundup(sizeof(uint8_t) * req->channel_count,
5427 sizeof(uint32_t));
5428 WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_ARRAY_BYTE,
5429 qdf_roundup(1, sizeof(uint32_t)));
5430 buf_ptr += WMI_TLV_HDR_SIZE;
5431
Dustin Brownfd578602019-02-22 13:52:24 -08005432 status = wmi_unified_cmd_send(wma->wmi_handle, buf, len,
5433 WMI_OBSS_SCAN_ENABLE_CMDID);
5434 if (QDF_IS_STATUS_ERROR(status))
Sandeep Puligillae0875662016-02-12 16:09:21 -08005435 wmi_buf_free(buf);
Dustin Brownfd578602019-02-22 13:52:24 -08005436
5437 return status;
Sandeep Puligillae0875662016-02-12 16:09:21 -08005438}
Pragaspathi Thilagaraj30251ec2018-12-18 17:22:57 +05305439
5440int wma_handle_btm_blacklist_event(void *handle, uint8_t *cmd_param_info,
5441 uint32_t len)
5442{
5443 tp_wma_handle wma = (tp_wma_handle) handle;
5444 WMI_ROAM_BLACKLIST_EVENTID_param_tlvs *param_buf;
5445 wmi_roam_blacklist_event_fixed_param *resp_event;
5446 wmi_roam_blacklist_with_timeout_tlv_param *src_list;
5447 struct roam_blacklist_event *dst_list;
5448 struct roam_blacklist_timeout *roam_blacklist;
5449 uint32_t num_entries, i;
5450
5451 param_buf = (WMI_ROAM_BLACKLIST_EVENTID_param_tlvs *)cmd_param_info;
5452 if (!param_buf) {
5453 WMA_LOGE("Invalid event buffer");
5454 return -EINVAL;
5455 }
5456
5457 resp_event = param_buf->fixed_param;
5458 if (!resp_event) {
5459 WMA_LOGE("%s: received null event data from target", __func__);
5460 return -EINVAL;
5461 }
5462
5463 if (resp_event->vdev_id >= wma->max_bssid) {
5464 WMA_LOGE("%s: received invalid vdev_id %d",
5465 __func__, resp_event->vdev_id);
5466 return -EINVAL;
5467 }
5468
5469 num_entries = param_buf->num_blacklist_with_timeout;
5470 if (num_entries == 0) {
5471 /* no aps to blacklist just return*/
5472 WMA_LOGE("%s: No APs in blacklist received", __func__);
5473 return 0;
5474 }
5475
5476 if (num_entries > MAX_RSSI_AVOID_BSSID_LIST) {
5477 WMA_LOGE("%s: num blacklist entries:%d exceeds maximum value",
5478 __func__, num_entries);
5479 return -EINVAL;
5480 }
5481
5482 src_list = param_buf->blacklist_with_timeout;
5483 if (len < (sizeof(*resp_event) + (num_entries * sizeof(*src_list)))) {
5484 WMA_LOGE("%s: Invalid length:%d", __func__, len);
5485 return -EINVAL;
5486 }
5487
5488 dst_list = qdf_mem_malloc(sizeof(struct roam_blacklist_event) +
5489 (sizeof(struct roam_blacklist_timeout) *
5490 num_entries));
5491 if (!dst_list)
5492 return -ENOMEM;
5493
5494 roam_blacklist = &dst_list->roam_blacklist[0];
5495 for (i = 0; i < num_entries; i++) {
5496 WMI_MAC_ADDR_TO_CHAR_ARRAY(&src_list->bssid,
5497 roam_blacklist->bssid.bytes);
5498 roam_blacklist->timeout = src_list->timeout;
5499 roam_blacklist->received_time =
5500 qdf_do_div(qdf_get_monotonic_boottime(),
5501 QDF_MC_TIMER_TO_MS_UNIT);
5502 roam_blacklist++;
5503 src_list++;
5504 }
5505
5506 dst_list->num_entries = num_entries;
5507 wma_send_msg(wma, WMA_ROAM_BLACKLIST_MSG, (void *)dst_list, 0);
5508 return 0;
5509}