blob: 63da280ddd764980b3339abf7f2eee0f97fa5ce0 [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"
36#include "cfg_api.h"
Manjunathappa Prakash10d357a2016-03-31 19:20:49 -070037#include <cdp_txrx_peer_ops.h>
38#include <cdp_txrx_cfg.h>
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080039
Nirav Shahcbc6d722016-03-01 16:24:53 +053040#include "qdf_nbuf.h"
Anurag Chouhan6d760662016-02-20 16:05:43 +053041#include "qdf_types.h"
Anurag Chouhan600c3a02016-03-01 10:33:54 +053042#include "qdf_mem.h"
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080043
44#include "wma_types.h"
45#include "lim_api.h"
46#include "lim_session_utils.h"
47
48#include "cds_utils.h"
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -070049#include "wlan_policy_mgr_api.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"
Leo Chang96464902016-10-28 11:10:54 -070060#include "wlan_tgt_def_config.h"
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070061#include "wlan_reg_services_api.h"
Deepak Dhamdheref918d422017-07-06 12:56:29 -070062#include "wlan_roam_debug.h"
Vignesh Viswanathan21c58cb2018-05-24 15:53:58 +053063#include "wlan_mlme_public_struct.h"
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070064
Leo Chang96464902016-10-28 11:10:54 -070065/* This is temporary, should be removed */
66#include "ol_htt_api.h"
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -080067#include <cdp_txrx_handle.h>
Krishna Kumaar Natarajan0103ef82017-02-17 18:15:56 -080068#include "wma_he.h"
Sandeep Puligilla1fcdb772017-02-22 21:14:59 -080069#include <wlan_scan_public_structs.h>
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -070070#include <wlan_scan_ucfg_api.h>
Ravi Joshi3750de92017-06-01 13:26:09 -070071#include "wma_nan_datapath.h"
Karthik Kantamnenie3bbd7f2018-09-19 20:27:32 +053072#include "wlan_mlme_api.h"
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -070073
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080074#define WMA_MCC_MIRACAST_REST_TIME 400
75#define WMA_SCAN_ID_MASK 0x0fff
76
77#ifdef FEATURE_WLAN_EXTSCAN
78/**
79 * enum extscan_report_events_type - extscan report events type
80 * @EXTSCAN_REPORT_EVENTS_BUFFER_FULL: report only when scan history is % full
81 * @EXTSCAN_REPORT_EVENTS_EACH_SCAN: report a scan completion event after scan
82 * @EXTSCAN_REPORT_EVENTS_FULL_RESULTS: forward scan results
83 * (beacons/probe responses + IEs)
84 * in real time to HAL, in addition to completion events.
85 * Note: To keep backward compatibility,
86 * fire completion events regardless of REPORT_EVENTS_EACH_SCAN.
87 * @EXTSCAN_REPORT_EVENTS_NO_BATCH: controls batching,
88 * 0 => batching, 1 => no batching
Mukul Sharmafa937be2016-08-12 18:13:36 +053089 * @EXTSCAN_REPORT_EVENTS_CONTEXT_HUB: forward results to context hub
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -070090 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080091enum extscan_report_events_type {
92 EXTSCAN_REPORT_EVENTS_BUFFER_FULL = 0x00,
93 EXTSCAN_REPORT_EVENTS_EACH_SCAN = 0x01,
94 EXTSCAN_REPORT_EVENTS_FULL_RESULTS = 0x02,
95 EXTSCAN_REPORT_EVENTS_NO_BATCH = 0x04,
Mukul Sharmafa937be2016-08-12 18:13:36 +053096 EXTSCAN_REPORT_EVENTS_CONTEXT_HUB = 0x08,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080097};
98
Dustin Brownd0a76562017-10-13 14:48:37 -070099#define WMA_EXTSCAN_CYCLE_WAKE_LOCK_DURATION WAKELOCK_DURATION_RECOMMENDED
Sridhar Selvaraj22943572017-07-26 15:06:40 +0530100
101/*
102 * Maximum number of entires that could be present in the
103 * WMI_EXTSCAN_HOTLIST_MATCH_EVENT buffer from the firmware
104 */
105#define WMA_EXTSCAN_MAX_HOTLIST_ENTRIES 10
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800106#endif
107
108/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800109 * wma_update_channel_list() - update channel list
110 * @handle: wma handle
111 * @chan_list: channel list
112 *
113 * Function is used to update the support channel list in fw.
114 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +0530115 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800116 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530117QDF_STATUS wma_update_channel_list(WMA_HANDLE handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800118 tSirUpdateChanList *chan_list)
119{
120 tp_wma_handle wma_handle = (tp_wma_handle) handle;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530121 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Will Huange40a6cc2018-12-10 12:32:42 +0800122 int i, len;
123 struct scan_chan_list_params *scan_ch_param;
124 struct channel_param *chan_p;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800125
Will Huange40a6cc2018-12-10 12:32:42 +0800126 len = sizeof(struct channel_param) * chan_list->numChan +
127 offsetof(struct scan_chan_list_params, ch_param[0]);
128 scan_ch_param = qdf_mem_malloc(len);
129 if (!scan_ch_param)
Govind Singhbc64c9e2016-02-25 17:42:38 +0530130 return QDF_STATUS_E_NOMEM;
Arif Hussain157263f2018-10-03 13:07:15 -0700131
Will Huange40a6cc2018-12-10 12:32:42 +0800132 qdf_mem_zero(scan_ch_param, len);
Govind Singhbc64c9e2016-02-25 17:42:38 +0530133 WMA_LOGD("no of channels = %d", chan_list->numChan);
Will Huange40a6cc2018-12-10 12:32:42 +0800134 chan_p = &scan_ch_param->ch_param[0];
135 scan_ch_param->nallchans = chan_list->numChan;
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +0530136 wma_handle->saved_chan.num_channels = chan_list->numChan;
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -0700137 WMA_LOGD("ht %d, vht %d, vht_24 %d", chan_list->ht_en,
138 chan_list->vht_en, chan_list->vht_24_en);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800139
140 for (i = 0; i < chan_list->numChan; ++i) {
Will Huange40a6cc2018-12-10 12:32:42 +0800141 chan_p->mhz =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800142 cds_chan_to_freq(chan_list->chanParam[i].chanId);
Will Huange40a6cc2018-12-10 12:32:42 +0800143 chan_p->cfreq1 = chan_p->mhz;
144 chan_p->cfreq2 = 0;
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +0530145 wma_handle->saved_chan.channel_list[i] =
146 chan_list->chanParam[i].chanId;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800147
Amar Singhal4b7b78b2016-08-23 15:49:41 -0700148 WMA_LOGD("chan[%d] = freq:%u chan:%d DFS:%d tx power:%d",
Will Huange40a6cc2018-12-10 12:32:42 +0800149 i, chan_p->mhz,
Amar Singhal4b7b78b2016-08-23 15:49:41 -0700150 chan_list->chanParam[i].chanId,
151 chan_list->chanParam[i].dfsSet,
152 chan_list->chanParam[i].pwr);
153
Ganesh Kondabattinidadf1fb2017-09-13 11:15:06 +0530154 if (chan_list->chanParam[i].dfsSet) {
Will Huange40a6cc2018-12-10 12:32:42 +0800155 chan_p->is_chan_passive = 1;
156 chan_p->dfs_set = 1;
Ganesh Kondabattinidadf1fb2017-09-13 11:15:06 +0530157 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800158
Will Huange40a6cc2018-12-10 12:32:42 +0800159 if (chan_p->mhz < WMA_2_4_GHZ_MAX_FREQ) {
160 chan_p->phy_mode = MODE_11G;
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -0700161 if (chan_list->vht_en && chan_list->vht_24_en)
Will Huange40a6cc2018-12-10 12:32:42 +0800162 chan_p->allow_vht = 1;
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -0700163 } else {
Will Huange40a6cc2018-12-10 12:32:42 +0800164 chan_p->phy_mode = MODE_11A;
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -0700165 if (chan_list->vht_en)
Will Huange40a6cc2018-12-10 12:32:42 +0800166 chan_p->allow_vht = 1;
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -0700167 }
168
169 if (chan_list->ht_en)
Will Huange40a6cc2018-12-10 12:32:42 +0800170 chan_p->allow_ht = 1;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800171
172 if (chan_list->chanParam[i].half_rate)
Will Huange40a6cc2018-12-10 12:32:42 +0800173 chan_p->half_rate = 1;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800174 else if (chan_list->chanParam[i].quarter_rate)
Will Huange40a6cc2018-12-10 12:32:42 +0800175 chan_p->quarter_rate = 1;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800176
Will Huange40a6cc2018-12-10 12:32:42 +0800177 /*TODO: Set WMI_SET_CHANNEL_MIN_POWER */
178 /*TODO: Set WMI_SET_CHANNEL_ANTENNA_MAX */
179 /*TODO: WMI_SET_CHANNEL_REG_CLASSID */
180 chan_p->maxregpower = chan_list->chanParam[i].pwr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800181
Will Huange40a6cc2018-12-10 12:32:42 +0800182 chan_p++;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800183 }
184
Govind Singhbc64c9e2016-02-25 17:42:38 +0530185 qdf_status = wmi_unified_scan_chan_list_cmd_send(wma_handle->wmi_handle,
Will Huange40a6cc2018-12-10 12:32:42 +0800186 scan_ch_param);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800187
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700188 if (QDF_IS_STATUS_ERROR(qdf_status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800189 WMA_LOGE("Failed to send WMI_SCAN_CHAN_LIST_CMDID");
Govind Singhbc64c9e2016-02-25 17:42:38 +0530190
Will Huange40a6cc2018-12-10 12:32:42 +0800191 qdf_mem_free(scan_ch_param);
Govind Singhbc64c9e2016-02-25 17:42:38 +0530192
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530193 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800194}
195
Varun Reddy Yeturu061d4d62017-07-20 09:39:32 -0700196QDF_STATUS wma_roam_scan_mawc_params(tp_wma_handle wma_handle,
197 tSirRoamOffloadScanReq *roam_req)
198{
199 struct wmi_mawc_roam_params *params;
200 QDF_STATUS status;
201
202 if (!roam_req) {
203 WMA_LOGE("No MAWC parameters to send");
204 return QDF_STATUS_E_INVAL;
205 }
206 params = qdf_mem_malloc(sizeof(*params));
Arif Hussain157263f2018-10-03 13:07:15 -0700207 if (!params)
Varun Reddy Yeturu061d4d62017-07-20 09:39:32 -0700208 return QDF_STATUS_E_NOMEM;
Arif Hussain157263f2018-10-03 13:07:15 -0700209
Varun Reddy Yeturu061d4d62017-07-20 09:39:32 -0700210 params->vdev_id = roam_req->sessionId;
211 params->enable = roam_req->mawc_roam_params.mawc_enabled &&
212 roam_req->mawc_roam_params.mawc_roam_enabled;
213 params->traffic_load_threshold =
214 roam_req->mawc_roam_params.mawc_roam_traffic_threshold;
Yeshwanth Sriram Guntuka14ab04c2018-09-21 15:06:49 +0530215 if (wmi_service_enabled(wma_handle->wmi_handle,
216 wmi_service_hw_db2dbm_support))
217 params->best_ap_rssi_threshold =
218 roam_req->mawc_roam_params.mawc_roam_ap_rssi_threshold;
219 else
220 params->best_ap_rssi_threshold =
221 roam_req->mawc_roam_params.mawc_roam_ap_rssi_threshold -
222 WMA_NOISE_FLOOR_DBM_DEFAULT;
Varun Reddy Yeturu061d4d62017-07-20 09:39:32 -0700223 params->rssi_stationary_high_adjust =
224 roam_req->mawc_roam_params.mawc_roam_rssi_high_adjust;
225 params->rssi_stationary_low_adjust =
226 roam_req->mawc_roam_params.mawc_roam_rssi_low_adjust;
227 status = wmi_unified_roam_mawc_params_cmd(
228 wma_handle->wmi_handle, params);
229 qdf_mem_free(params);
230
231 return status;
232}
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +0530233#ifdef WLAN_FEATURE_FILS_SK
234/**
235 * wma_roam_scan_fill_fils_params() - API to fill FILS params in RSO command
236 * @wma_handle: WMA handle
237 * @params: Pointer to destination RSO params to be filled
238 * @roam_req: Pointer to RSO params from CSR
239 *
240 * Return: None
241 */
242static void wma_roam_scan_fill_fils_params(tp_wma_handle wma_handle,
243 struct roam_offload_scan_params
244 *params, tSirRoamOffloadScanReq
245 *roam_req)
246{
247 struct roam_fils_params *dst_fils_params, *src_fils_params;
248
249 if (!params || !roam_req || !roam_req->is_fils_connection) {
Srinivas Girigowda09625b02018-09-10 15:28:09 -0700250 wma_err("Invalid input");
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +0530251 return;
252 }
253
254 src_fils_params = &roam_req->roam_fils_params;
255 dst_fils_params = &params->roam_fils_params;
256
257 params->add_fils_tlv = true;
258
259 dst_fils_params->username_length = src_fils_params->username_length;
260 qdf_mem_copy(dst_fils_params->username, src_fils_params->username,
261 dst_fils_params->username_length);
262
263 dst_fils_params->next_erp_seq_num = src_fils_params->next_erp_seq_num;
264 dst_fils_params->rrk_length = src_fils_params->rrk_length;
265 qdf_mem_copy(dst_fils_params->rrk, src_fils_params->rrk,
266 dst_fils_params->rrk_length);
267
268 dst_fils_params->rik_length = src_fils_params->rik_length;
269 qdf_mem_copy(dst_fils_params->rik, src_fils_params->rik,
270 dst_fils_params->rik_length);
271
272 dst_fils_params->realm_len = src_fils_params->realm_len;
273 qdf_mem_copy(dst_fils_params->realm, src_fils_params->realm,
274 dst_fils_params->realm_len);
275}
276#else
277static inline void wma_roam_scan_fill_fils_params(
278 tp_wma_handle wma_handle,
279 struct roam_offload_scan_params *params,
280 tSirRoamOffloadScanReq *roam_req)
281
282{ }
283#endif
Varun Reddy Yeturu061d4d62017-07-20 09:39:32 -0700284
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800285/**
Jianmin Zhue932fb02018-12-17 22:25:44 +0800286 * wma_roam_scan_offload_set_params() - Set roam scan offload params
287 * @wma_handle: pointer to wma context
288 * @params: pointer to roam scan offload params
289 * @roam_req: roam request param
290 *
291 * Get roam scan offload parameters from roam req and prepare to fill
292 * WMI_ROAM_SCAN_MODE TLV
293 *
294 * Return: None
295 */
296#ifdef WLAN_FEATURE_ROAM_OFFLOAD
297static void wma_roam_scan_offload_set_params(
298 tp_wma_handle wma_handle,
299 struct roam_offload_scan_params *params,
300 tSirRoamOffloadScanReq *roam_req)
301{
302 params->auth_mode = WMI_AUTH_NONE;
303 if (!roam_req)
304 return;
305 params->auth_mode = e_csr_auth_type_to_rsn_authmode
306 (roam_req->ConnectedNetwork.authentication,
307 roam_req->ConnectedNetwork.encryption);
308 WMA_LOGD("%s : auth mode = %d", __func__, params->auth_mode);
309
Jianmin Zhubf845932018-12-17 11:52:50 +0800310 params->roam_offload_enabled = roam_req->roam_offload_enabled;
Jianmin Zhue932fb02018-12-17 22:25:44 +0800311 params->roam_offload_params.ho_delay_for_rx =
312 roam_req->ho_delay_for_rx;
313 params->roam_offload_params.roam_preauth_retry_count =
314 roam_req->roam_preauth_retry_count;
315 params->roam_offload_params.roam_preauth_no_ack_timeout =
316 roam_req->roam_preauth_no_ack_timeout;
317 params->prefer_5ghz = roam_req->Prefer5GHz;
318 params->roam_rssi_cat_gap = roam_req->RoamRssiCatGap;
319 params->select_5ghz_margin = roam_req->Select5GHzMargin;
320 params->reassoc_failure_timeout =
321 roam_req->ReassocFailureTimeout;
322 params->rokh_id_length = roam_req->R0KH_ID_Length;
323 qdf_mem_copy(params->rokh_id, roam_req->R0KH_ID,
324 WMI_ROAM_R0KH_ID_MAX_LEN);
325 qdf_mem_copy(params->krk, roam_req->KRK, WMI_KRK_KEY_LEN);
326 qdf_mem_copy(params->btk, roam_req->BTK, WMI_BTK_KEY_LEN);
327 qdf_mem_copy(params->psk_pmk, roam_req->PSK_PMK,
328 WMI_ROAM_SCAN_PSK_SIZE);
329 params->pmk_len = roam_req->pmk_len;
330 params->roam_key_mgmt_offload_enabled =
331 roam_req->RoamKeyMgmtOffloadEnabled;
332 wma_roam_scan_fill_self_caps(wma_handle,
333 &params->roam_offload_params, roam_req);
334 params->fw_okc = roam_req->pmkid_modes.fw_okc;
335 params->fw_pmksa_cache = roam_req->pmkid_modes.fw_pmksa_cache;
Pragaspathi Thilagarajae7dc762018-12-12 18:10:50 +0530336 params->rct_validity_timer = roam_req->rct_validity_timer;
Jianmin Zhue932fb02018-12-17 22:25:44 +0800337 WMA_LOGD(FL("qos_caps: %d, qos_enabled: %d, ho_delay_for_rx: %d, roam_scan_mode: %d"),
338 params->roam_offload_params.qos_caps,
339 params->roam_offload_params.qos_enabled,
340 params->roam_offload_params.ho_delay_for_rx, params->mode);
341 WMA_LOGD(FL("roam_preauth_retry_count: %d, roam_preauth_no_ack_timeout: %d"),
342 params->roam_offload_params.roam_preauth_retry_count,
343 params->roam_offload_params.roam_preauth_no_ack_timeout);
344}
345#else
346static void wma_roam_scan_offload_set_params(
347 tp_wma_handle wma_handle,
348 struct roam_offload_scan_params *params,
349 tSirRoamOffloadScanReq *roam_req)
350{}
351#endif
352
353/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800354 * wma_roam_scan_offload_mode() - send roam scan mode request to fw
Jianmin Zhue932fb02018-12-17 22:25:44 +0800355 * @wma_handle: pointer to wma context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800356 * @scan_cmd_fp: start scan command ptr
357 * @roam_req: roam request param
358 * @mode: mode
359 * @vdev_id: vdev id
360 *
361 * send WMI_ROAM_SCAN_MODE TLV to firmware. It has a piggyback
362 * of WMI_ROAM_SCAN_MODE.
363 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +0530364 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800365 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530366QDF_STATUS wma_roam_scan_offload_mode(tp_wma_handle wma_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800367 wmi_start_scan_cmd_fixed_param *
368 scan_cmd_fp,
369 tSirRoamOffloadScanReq *roam_req,
370 uint32_t mode, uint32_t vdev_id)
371{
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +0530372 QDF_STATUS status = QDF_STATUS_SUCCESS;
Selvaraj, Sridhara7fc7632016-09-04 13:13:38 +0530373 struct roam_offload_scan_params *params =
374 qdf_mem_malloc(sizeof(*params));
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +0530375
Arif Hussain157263f2018-10-03 13:07:15 -0700376 if (!params)
Arif Hussaincf6b9602016-10-25 14:46:53 -0700377 return QDF_STATUS_E_NOMEM;
Arif Hussain157263f2018-10-03 13:07:15 -0700378
Pragaspathi Thilagarajecb60732018-11-02 12:26:24 +0530379 if (!wma_is_vdev_valid(vdev_id)) {
380 WMA_LOGE("%s: Invalid vdev id:%d", __func__, vdev_id);
381 qdf_mem_free(params);
382 return QDF_STATUS_E_FAILURE;
383 }
384
Selvaraj, Sridhara7fc7632016-09-04 13:13:38 +0530385 params->is_roam_req_valid = 0;
386 params->mode = mode;
387 params->vdev_id = vdev_id;
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +0530388 if (roam_req) {
Selvaraj, Sridhara7fc7632016-09-04 13:13:38 +0530389 params->is_roam_req_valid = 1;
Abhinav Kumara95af7c2018-04-06 17:08:00 +0530390 params->min_delay_btw_roam_scans =
391 roam_req->min_delay_btw_roam_scans;
392 params->roam_trigger_reason_bitmask =
393 roam_req->roam_trigger_reason_bitmask;
Selvaraj, Sridhara7fc7632016-09-04 13:13:38 +0530394 params->is_ese_assoc = roam_req->IsESEAssoc;
Abhinav Kumar271f0632018-03-29 16:01:30 +0530395 params->is_11r_assoc = roam_req->is_11r_assoc;
Jeff Johnson9e760832018-12-15 12:41:36 -0800396 params->mdid = roam_req->mdid;
Selvaraj, Sridhara7fc7632016-09-04 13:13:38 +0530397 params->assoc_ie_length = roam_req->assoc_ie.length;
398 qdf_mem_copy(params->assoc_ie, roam_req->assoc_ie.addIEdata,
399 roam_req->assoc_ie.length);
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +0530400
401 wma_roam_scan_fill_fils_params(wma_handle, params, roam_req);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800402 }
Abhinav Kumaredd1d372018-05-11 15:33:35 +0530403 WMA_LOGD(FL("min_delay_btw_roam_scans:%d, roam_tri_reason_bitmask:%d"),
404 params->min_delay_btw_roam_scans,
405 params->roam_trigger_reason_bitmask);
406
Jianmin Zhue932fb02018-12-17 22:25:44 +0800407 wma_roam_scan_offload_set_params(
408 wma_handle,
409 params,
410 roam_req);
Sourav Mohapatra5ba8da32018-07-16 09:21:15 +0530411
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +0530412 status = wmi_unified_roam_scan_offload_mode_cmd(wma_handle->wmi_handle,
Selvaraj, Sridhara7fc7632016-09-04 13:13:38 +0530413 scan_cmd_fp, params);
Abhinav Kumar1138a912018-09-04 11:45:53 +0530414 qdf_mem_free(params);
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +0530415 if (QDF_IS_STATUS_ERROR(status))
416 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800417
Srinivas Girigowdaf1472122017-03-09 15:44:12 -0800418 WMA_LOGD("%s: WMA --> WMI_ROAM_SCAN_MODE", __func__);
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +0530419 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800420}
421
422/**
423 * wma_roam_scan_offload_rssi_threshold() - set scan offload rssi threashold
424 * @wma_handle: wma handle
425 * @roam_req: Roaming request buffer
426 *
427 * Send WMI_ROAM_SCAN_RSSI_THRESHOLD TLV to firmware
428 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +0530429 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800430 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530431QDF_STATUS wma_roam_scan_offload_rssi_thresh(tp_wma_handle wma_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800432 tSirRoamOffloadScanReq *roam_req)
433{
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +0530434 struct roam_offload_scan_rssi_params params = {0};
435 QDF_STATUS status = QDF_STATUS_SUCCESS;
436 int rssi_thresh, rssi_thresh_diff;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800437 struct roam_ext_params *roam_params;
438 int32_t good_rssi_threshold;
439 uint32_t hirssi_scan_max_count;
440 uint32_t hirssi_scan_delta;
441 int32_t hirssi_upper_bound;
Yeshwanth Sriram Guntuka14ab04c2018-09-21 15:06:49 +0530442 bool db2dbm_enabled;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800443
444 /* Send rssi threshold */
445 roam_params = &roam_req->roam_params;
Yeshwanth Sriram Guntuka14ab04c2018-09-21 15:06:49 +0530446 db2dbm_enabled = wmi_service_enabled(wma_handle->wmi_handle,
447 wmi_service_hw_db2dbm_support);
448 if (db2dbm_enabled) {
449 rssi_thresh = roam_req->LookupThreshold;
450 } else {
451 rssi_thresh = roam_req->LookupThreshold -
452 WMA_NOISE_FLOOR_DBM_DEFAULT;
453 rssi_thresh &= 0x000000ff;
454 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800455 rssi_thresh_diff = roam_req->OpportunisticScanThresholdDiff;
456 hirssi_scan_max_count = roam_req->hi_rssi_scan_max_count;
457 hirssi_scan_delta = roam_req->hi_rssi_scan_rssi_delta;
458 hirssi_upper_bound = roam_req->hi_rssi_scan_rssi_ub -
459 WMA_NOISE_FLOOR_DBM_DEFAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800460
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800461 /* fill in threshold values */
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +0530462 params.session_id = roam_req->sessionId;
Yeshwanth Sriram Guntuka14ab04c2018-09-21 15:06:49 +0530463 params.rssi_thresh = rssi_thresh;
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +0530464 params.rssi_thresh_diff = rssi_thresh_diff & 0x000000ff;
465 params.hi_rssi_scan_max_count = hirssi_scan_max_count;
466 params.hi_rssi_scan_rssi_delta = hirssi_scan_delta;
467 params.hi_rssi_scan_rssi_ub = hirssi_upper_bound & 0x00000ff;
468 params.raise_rssi_thresh_5g = roam_params->raise_rssi_thresh_5g;
Gupta, Kapilc68ad462016-02-01 19:17:23 +0530469 params.dense_rssi_thresh_offset =
470 roam_params->dense_rssi_thresh_offset;
471 params.dense_min_aps_cnt = roam_params->dense_min_aps_cnt;
472 params.traffic_threshold =
473 roam_params->traffic_threshold;
Kapil Gupta0a2477b2016-08-23 18:00:34 +0530474 params.initial_dense_status = roam_params->initial_dense_status;
Yeshwanth Sriram Guntuka14ab04c2018-09-21 15:06:49 +0530475 if (db2dbm_enabled)
476 params.bg_scan_bad_rssi_thresh =
477 roam_params->bg_scan_bad_rssi_thresh;
478 else
479 params.bg_scan_bad_rssi_thresh =
480 roam_params->bg_scan_bad_rssi_thresh -
481 WMA_NOISE_FLOOR_DBM_DEFAULT;
482
Varun Reddy Yeturufaad37e2017-07-26 10:54:13 -0700483 params.bg_scan_client_bitmap = roam_params->bg_scan_client_bitmap;
Vignesh Viswanathanc018e982017-09-07 18:49:19 +0530484 params.roam_bad_rssi_thresh_offset_2g =
485 roam_params->roam_bad_rssi_thresh_offset_2g;
486 if (params.roam_bad_rssi_thresh_offset_2g)
487 params.flags |= WMI_ROAM_BG_SCAN_FLAGS_2G_TO_5G_ONLY;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800488
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800489 /*
490 * The current Noise floor in firmware is -96dBm. Penalty/Boost
491 * threshold is applied on a weaker signal to make it even more weaker.
492 * So, there is a chance that the user may configure a very low
493 * Penalty/Boost threshold beyond the noise floor. If that is the case,
494 * then suppress the penalty/boost threshold to the noise floor.
495 */
Yeshwanth Sriram Guntuka14ab04c2018-09-21 15:06:49 +0530496 if (roam_params->raise_rssi_thresh_5g < WMA_NOISE_FLOOR_DBM_DEFAULT) {
497 if (db2dbm_enabled) {
498 params.penalty_threshold_5g = WMA_RSSI_MIN_VALUE;
499 params.boost_threshold_5g = WMA_RSSI_MAX_VALUE;
500 } else {
501 params.penalty_threshold_5g = 0;
502 }
503 } else {
504 if (db2dbm_enabled)
505 params.boost_threshold_5g =
506 roam_params->raise_rssi_thresh_5g;
507 else
508 params.boost_threshold_5g =
509 (roam_params->raise_rssi_thresh_5g -
510 WMA_NOISE_FLOOR_DBM_DEFAULT) & 0x000000ff;
511 }
512 if (roam_params->drop_rssi_thresh_5g < WMA_NOISE_FLOOR_DBM_DEFAULT) {
513 if (db2dbm_enabled)
514 params.penalty_threshold_5g = WMA_RSSI_MIN_VALUE;
515 else
516 params.penalty_threshold_5g = 0;
517
518 } else {
519 if (db2dbm_enabled)
520 params.penalty_threshold_5g =
521 roam_params->drop_rssi_thresh_5g;
522 else
523 params.penalty_threshold_5g =
524 (roam_params->drop_rssi_thresh_5g -
525 WMA_NOISE_FLOOR_DBM_DEFAULT) & 0x000000ff;
526 }
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +0530527 params.raise_factor_5g = roam_params->raise_factor_5g;
528 params.drop_factor_5g = roam_params->drop_factor_5g;
529 params.max_raise_rssi_5g = roam_params->max_raise_rssi_5g;
530 params.max_drop_rssi_5g = roam_params->max_drop_rssi_5g;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800531
532 if (roam_params->good_rssi_roam)
533 good_rssi_threshold = WMA_NOISE_FLOOR_DBM_DEFAULT;
534 else
535 good_rssi_threshold = 0;
Yeshwanth Sriram Guntuka14ab04c2018-09-21 15:06:49 +0530536
537 if (db2dbm_enabled)
538 params.good_rssi_threshold = good_rssi_threshold;
539 else
540 params.good_rssi_threshold = (good_rssi_threshold -
541 WMA_NOISE_FLOOR_DBM_DEFAULT) &
542 0x000000ff;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800543
544 WMA_LOGD("WMA --> good_rssi_threshold=%d",
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +0530545 params.good_rssi_threshold);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800546
Varun Reddy Yeturu21953a22016-05-17 15:16:44 -0700547 if (roam_req->early_stop_scan_enable) {
Yeshwanth Sriram Guntuka14ab04c2018-09-21 15:06:49 +0530548 if (db2dbm_enabled) {
549 params.roam_earlystop_thres_min =
550 roam_req->early_stop_scan_min_threshold;
551 params.roam_earlystop_thres_max =
552 roam_req->early_stop_scan_max_threshold;
553 } else {
554 params.roam_earlystop_thres_min =
555 roam_req->early_stop_scan_min_threshold -
556 WMA_NOISE_FLOOR_DBM_DEFAULT;
557 params.roam_earlystop_thres_max =
558 roam_req->early_stop_scan_max_threshold -
559 WMA_NOISE_FLOOR_DBM_DEFAULT;
560 }
Varun Reddy Yeturu21953a22016-05-17 15:16:44 -0700561 } else {
Yeshwanth Sriram Guntuka14ab04c2018-09-21 15:06:49 +0530562 if (db2dbm_enabled) {
563 params.roam_earlystop_thres_min =
564 WMA_RSSI_MIN_VALUE;
565 params.roam_earlystop_thres_max =
566 WMA_RSSI_MIN_VALUE;
567 } else {
568 params.roam_earlystop_thres_min = 0;
569 params.roam_earlystop_thres_max = 0;
570 }
Varun Reddy Yeturu21953a22016-05-17 15:16:44 -0700571 }
Varun Reddy Yeturu168134f2017-06-26 13:46:05 -0700572 params.rssi_thresh_offset_5g =
573 roam_req->rssi_thresh_offset_5g;
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +0530574
Varun Reddy Yeturu05186292015-09-28 17:12:33 -0700575 WMA_LOGD("early_stop_thresholds en=%d, min=%d, max=%d",
576 roam_req->early_stop_scan_enable,
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +0530577 params.roam_earlystop_thres_min,
578 params.roam_earlystop_thres_max);
Varun Reddy Yeturu168134f2017-06-26 13:46:05 -0700579 WMA_LOGD("rssi_thresh_offset_5g = %d", params.rssi_thresh_offset_5g);
Varun Reddy Yeturu05186292015-09-28 17:12:33 -0700580
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +0530581 status = wmi_unified_roam_scan_offload_rssi_thresh_cmd(
582 wma_handle->wmi_handle, &params);
Varun Reddy Yeturufaad37e2017-07-26 10:54:13 -0700583 if (QDF_IS_STATUS_ERROR(status)) {
584 WMA_LOGE("roam_scan_offload_rssi_thresh_cmd failed %d", status);
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +0530585 return status;
Varun Reddy Yeturufaad37e2017-07-26 10:54:13 -0700586 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800587
Srinivas Girigowdaf1472122017-03-09 15:44:12 -0800588 WMA_LOGD(FL("roam_scan_rssi_thresh=%d, roam_rssi_thresh_diff=%d"),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800589 rssi_thresh, rssi_thresh_diff);
Srinivas Girigowdaf1472122017-03-09 15:44:12 -0800590 WMA_LOGD(
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800591 FL("hirssi_scan max_count=%d, delta=%d, hirssi_upper_bound=%d"),
592 hirssi_scan_max_count, hirssi_scan_delta, hirssi_upper_bound);
Srinivas Girigowdaf1472122017-03-09 15:44:12 -0800593 WMA_LOGD(
Kapil Gupta0a2477b2016-08-23 18:00:34 +0530594 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 +0530595 roam_params->dense_rssi_thresh_offset,
596 roam_params->dense_min_aps_cnt,
Kapil Gupta0a2477b2016-08-23 18:00:34 +0530597 roam_params->traffic_threshold,
598 roam_params->initial_dense_status);
Vignesh Viswanathanc018e982017-09-07 18:49:19 +0530599 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 -0700600 roam_params->bg_scan_bad_rssi_thresh,
Vignesh Viswanathanc018e982017-09-07 18:49:19 +0530601 roam_params->bg_scan_client_bitmap,
602 roam_params->roam_bad_rssi_thresh_offset_2g);
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +0530603 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800604}
605
606/**
607 * wma_roam_scan_offload_scan_period() - set roam offload scan period
608 * @wma_handle: wma handle
609 * @scan_period: scan period
610 * @scan_age: scan age
611 * @vdev_id: vdev id
612 *
613 * Send WMI_ROAM_SCAN_PERIOD parameters to fw.
614 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +0530615 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800616 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530617QDF_STATUS wma_roam_scan_offload_scan_period(tp_wma_handle wma_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800618 uint32_t scan_period,
619 uint32_t scan_age,
620 uint32_t vdev_id)
621{
Pragaspathi Thilagarajecb60732018-11-02 12:26:24 +0530622 if (!wma_is_vdev_valid(vdev_id)) {
623 WMA_LOGE("%s: Invalid vdev id:%d", __func__, vdev_id);
624 return QDF_STATUS_E_FAILURE;
625 }
626
Govind Singh64b5e112016-03-08 11:53:50 +0530627 return wmi_unified_roam_scan_offload_scan_period(wma_handle->wmi_handle,
Pragaspathi Thilagarajecb60732018-11-02 12:26:24 +0530628 scan_period, scan_age,
629 vdev_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800630}
631
632/**
633 * wma_roam_scan_offload_rssi_change() - set roam offload RSSI change threshold
634 * @wma_handle: wma handle
635 * @rssi_change_thresh: RSSI Change threshold
636 * @bcn_rssi_weight: beacon RSSI weight
637 * @vdev_id: vdev id
638 *
639 * Send WMI_ROAM_SCAN_RSSI_CHANGE_THRESHOLD parameters to fw.
640 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +0530641 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800642 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530643QDF_STATUS wma_roam_scan_offload_rssi_change(tp_wma_handle wma_handle,
Pragaspathi Thilagarajecb60732018-11-02 12:26:24 +0530644 uint32_t vdev_id,
645 int32_t rssi_change_thresh,
646 uint32_t bcn_rssi_weight,
647 uint32_t hirssi_delay_btw_scans)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800648{
Govind Singh64b5e112016-03-08 11:53:50 +0530649 int status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800650
Pragaspathi Thilagarajecb60732018-11-02 12:26:24 +0530651 if (!wma_is_vdev_valid(vdev_id)) {
652 WMA_LOGE("%s: Invalid vdev id:%d", __func__, vdev_id);
653 return QDF_STATUS_E_FAILURE;
654 }
655
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700656 status = wmi_unified_roam_scan_offload_rssi_change_cmd(
657 wma_handle->wmi_handle,
658 vdev_id, rssi_change_thresh,
659 bcn_rssi_weight, hirssi_delay_btw_scans);
Govind Singh64b5e112016-03-08 11:53:50 +0530660 if (status != EOK)
661 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800662
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800663
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530664 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800665}
666
667/**
668 * wma_roam_scan_offload_chan_list() - set roam offload channel list
669 * @wma_handle: wma handle
670 * @chan_count: channel count
671 * @chan_list: channel list
672 * @list_type: list type
673 * @vdev_id: vdev id
674 *
675 * Set roam offload channel list.
676 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +0530677 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800678 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530679QDF_STATUS wma_roam_scan_offload_chan_list(tp_wma_handle wma_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800680 uint8_t chan_count,
681 uint8_t *chan_list,
682 uint8_t list_type, uint32_t vdev_id)
683{
Govind Singh64b5e112016-03-08 11:53:50 +0530684 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800685 int i;
Varun Reddy Yeturu823e9c22016-07-07 17:38:44 -0700686 uint32_t *chan_list_mhz;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800687
688 if (chan_count == 0) {
689 WMA_LOGD("%s : invalid number of channels %d", __func__,
690 chan_count);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530691 return QDF_STATUS_E_EMPTY;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800692 }
Pragaspathi Thilagarajecb60732018-11-02 12:26:24 +0530693
694 if (!wma_is_vdev_valid(vdev_id)) {
695 WMA_LOGE("%s: Invalid vdev id:%d", __func__, vdev_id);
696 return QDF_STATUS_E_FAILURE;
697 }
698
Varun Reddy Yeturu823e9c22016-07-07 17:38:44 -0700699 chan_list_mhz = qdf_mem_malloc(chan_count * sizeof(*chan_list_mhz));
Arif Hussain157263f2018-10-03 13:07:15 -0700700 if (!chan_list_mhz)
Naveen Rawat35804772016-06-27 15:40:28 -0700701 return QDF_STATUS_E_NOMEM;
Naveen Rawat35804772016-06-27 15:40:28 -0700702
Govind Singh64b5e112016-03-08 11:53:50 +0530703 for (i = 0; ((i < chan_count) &&
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800704 (i < SIR_ROAM_MAX_CHANNELS)); i++) {
Varun Reddy Yeturu823e9c22016-07-07 17:38:44 -0700705 chan_list_mhz[i] = cds_chan_to_freq(chan_list[i]);
Srinivas Girigowdaf1472122017-03-09 15:44:12 -0800706 WMA_LOGD("%d,", chan_list_mhz[i]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800707 }
708
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700709 status = wmi_unified_roam_scan_offload_chan_list_cmd(
710 wma_handle->wmi_handle,
711 chan_count, chan_list_mhz,
712 list_type, vdev_id);
Varun Reddy Yeturu823e9c22016-07-07 17:38:44 -0700713 qdf_mem_free(chan_list_mhz);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800714
Govind Singh64b5e112016-03-08 11:53:50 +0530715 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800716}
717
718/**
719 * e_csr_auth_type_to_rsn_authmode() - map csr auth type to rsn authmode
720 * @authtype: CSR authtype
721 * @encr: CSR Encryption
722 *
723 * Map CSR's authentication type into RSN auth mode used by firmware
724 *
725 * Return: WMI RSN auth mode
726 */
727A_UINT32 e_csr_auth_type_to_rsn_authmode(eCsrAuthType authtype,
728 eCsrEncryptionType encr)
729{
730 switch (authtype) {
731 case eCSR_AUTH_TYPE_OPEN_SYSTEM:
732 return WMI_AUTH_OPEN;
733 case eCSR_AUTH_TYPE_WPA:
734 return WMI_AUTH_WPA;
735 case eCSR_AUTH_TYPE_WPA_PSK:
736 return WMI_AUTH_WPA_PSK;
737 case eCSR_AUTH_TYPE_RSN:
738 return WMI_AUTH_RSNA;
739 case eCSR_AUTH_TYPE_RSN_PSK:
740 return WMI_AUTH_RSNA_PSK;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800741 case eCSR_AUTH_TYPE_FT_RSN:
742 return WMI_AUTH_FT_RSNA;
743 case eCSR_AUTH_TYPE_FT_RSN_PSK:
744 return WMI_AUTH_FT_RSNA_PSK;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800745#ifdef FEATURE_WLAN_WAPI
746 case eCSR_AUTH_TYPE_WAPI_WAI_CERTIFICATE:
747 return WMI_AUTH_WAPI;
748 case eCSR_AUTH_TYPE_WAPI_WAI_PSK:
749 return WMI_AUTH_WAPI_PSK;
750#endif /* FEATURE_WLAN_WAPI */
751#ifdef FEATURE_WLAN_ESE
752 case eCSR_AUTH_TYPE_CCKM_WPA:
Varun Reddy Yeturu101f9542016-05-24 10:07:52 -0700753 return WMI_AUTH_CCKM_WPA;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800754 case eCSR_AUTH_TYPE_CCKM_RSN:
Varun Reddy Yeturu101f9542016-05-24 10:07:52 -0700755 return WMI_AUTH_CCKM_RSNA;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800756#endif /* FEATURE_WLAN_ESE */
757#ifdef WLAN_FEATURE_11W
758 case eCSR_AUTH_TYPE_RSN_PSK_SHA256:
759 return WMI_AUTH_RSNA_PSK_SHA256;
760 case eCSR_AUTH_TYPE_RSN_8021X_SHA256:
761 return WMI_AUTH_RSNA_8021X_SHA256;
762#endif /* WLAN_FEATURE_11W */
763 case eCSR_AUTH_TYPE_NONE:
764 case eCSR_AUTH_TYPE_AUTOSWITCH:
765 /* In case of WEP and other keys, NONE means OPEN auth */
766 if (encr == eCSR_ENCRYPT_TYPE_WEP40_STATICKEY ||
767 encr == eCSR_ENCRYPT_TYPE_WEP104_STATICKEY ||
768 encr == eCSR_ENCRYPT_TYPE_WEP40 ||
769 encr == eCSR_ENCRYPT_TYPE_WEP104 ||
770 encr == eCSR_ENCRYPT_TYPE_TKIP ||
Mukul Sharma05504ac2017-06-08 12:35:53 +0530771 encr == eCSR_ENCRYPT_TYPE_AES ||
772 encr == eCSR_ENCRYPT_TYPE_AES_GCMP ||
773 encr == eCSR_ENCRYPT_TYPE_AES_GCMP_256) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800774 return WMI_AUTH_OPEN;
775 }
776 return WMI_AUTH_NONE;
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +0530777 case eCSR_AUTH_TYPE_FILS_SHA256:
778 return WMI_AUTH_RSNA_FILS_SHA256;
779 case eCSR_AUTH_TYPE_FILS_SHA384:
780 return WMI_AUTH_RSNA_FILS_SHA384;
Padma, Santhosh Kumar96682402018-02-02 18:16:27 +0530781 case eCSR_AUTH_TYPE_SUITEB_EAP_SHA256:
782 return WMI_AUTH_RSNA_SUITE_B_8021X_SHA256;
783 case eCSR_AUTH_TYPE_SUITEB_EAP_SHA384:
784 return WMI_AUTH_RSNA_SUITE_B_8021X_SHA384;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800785 default:
786 return WMI_AUTH_NONE;
787 }
788}
789
790/**
791 * e_csr_encryption_type_to_rsn_cipherset() - map csr enc type to ESN cipher
792 * @encr: CSR Encryption
793 *
794 * Map CSR's encryption type into RSN cipher types used by firmware
795 *
796 * Return: WMI RSN cipher
797 */
798A_UINT32 e_csr_encryption_type_to_rsn_cipherset(eCsrEncryptionType encr)
799{
800
801 switch (encr) {
802 case eCSR_ENCRYPT_TYPE_WEP40_STATICKEY:
803 case eCSR_ENCRYPT_TYPE_WEP104_STATICKEY:
804 case eCSR_ENCRYPT_TYPE_WEP40:
805 case eCSR_ENCRYPT_TYPE_WEP104:
806 return WMI_CIPHER_WEP;
807 case eCSR_ENCRYPT_TYPE_TKIP:
808 return WMI_CIPHER_TKIP;
809 case eCSR_ENCRYPT_TYPE_AES:
810 return WMI_CIPHER_AES_CCM;
Mukul Sharma05504ac2017-06-08 12:35:53 +0530811 /* FWR will use key length to distinguish GCMP 128 or 256 */
812 case eCSR_ENCRYPT_TYPE_AES_GCMP:
813 case eCSR_ENCRYPT_TYPE_AES_GCMP_256:
814 return WMI_CIPHER_AES_GCM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800815#ifdef FEATURE_WLAN_WAPI
816 case eCSR_ENCRYPT_TYPE_WPI:
817 return WMI_CIPHER_WAPI;
818#endif /* FEATURE_WLAN_WAPI */
819 case eCSR_ENCRYPT_TYPE_ANY:
820 return WMI_CIPHER_ANY;
821 case eCSR_ENCRYPT_TYPE_NONE:
822 default:
823 return WMI_CIPHER_NONE;
824 }
825}
826
Varun Reddy Yeturu101f9542016-05-24 10:07:52 -0700827#ifdef WLAN_FEATURE_ROAM_OFFLOAD
828/**
829 * wma_roam_scan_get_cckm_mode() - Get the CCKM auth mode
830 * @roam_req: Roaming request buffer
831 * @auth_mode: Auth mode to be converted
832 *
833 * Based on LFR2.0 or LFR3.0, return the proper auth type
834 *
835 * Return: if LFR2.0, then return WMI_AUTH_CCKM for backward compatibility
836 * if LFR3.0 then return the appropriate auth type
837 */
838static uint32_t wma_roam_scan_get_cckm_mode(tSirRoamOffloadScanReq *roam_req,
839 uint32_t auth_mode)
840{
Jianmin Zhubf845932018-12-17 11:52:50 +0800841 if (roam_req->roam_offload_enabled)
Varun Reddy Yeturu101f9542016-05-24 10:07:52 -0700842 return auth_mode;
843 else
844 return WMI_AUTH_CCKM;
845
846}
847#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800848/**
849 * wma_roam_scan_fill_ap_profile() - fill ap_profile
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800850 * @roam_req: roam offload scan request
Himanshu Agarwal8bcec572017-09-28 11:54:37 +0530851 * @profile: ap profile
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800852 *
853 * Fill ap_profile structure from configured parameters
854 *
855 * Return: none
856 */
Himanshu Agarwal8bcec572017-09-28 11:54:37 +0530857static void wma_roam_scan_fill_ap_profile(tSirRoamOffloadScanReq *roam_req,
858 struct ap_profile *profile)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800859{
Varun Reddy Yeturu101f9542016-05-24 10:07:52 -0700860 uint32_t rsn_authmode;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700861
Himanshu Agarwal8bcec572017-09-28 11:54:37 +0530862 qdf_mem_zero(profile, sizeof(*profile));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800863 if (roam_req == NULL) {
Himanshu Agarwal8bcec572017-09-28 11:54:37 +0530864 profile->ssid.length = 0;
865 profile->ssid.mac_ssid[0] = 0;
866 profile->rsn_authmode = WMI_AUTH_NONE;
867 profile->rsn_ucastcipherset = WMI_CIPHER_NONE;
868 profile->rsn_mcastcipherset = WMI_CIPHER_NONE;
869 profile->rsn_mcastmgmtcipherset = WMI_CIPHER_NONE;
870 profile->rssi_threshold = WMA_ROAM_RSSI_DIFF_DEFAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800871 } else {
Himanshu Agarwal8bcec572017-09-28 11:54:37 +0530872 profile->ssid.length =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800873 roam_req->ConnectedNetwork.ssId.length;
Himanshu Agarwal8bcec572017-09-28 11:54:37 +0530874 qdf_mem_copy(profile->ssid.mac_ssid,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800875 roam_req->ConnectedNetwork.ssId.ssId,
Himanshu Agarwal8bcec572017-09-28 11:54:37 +0530876 profile->ssid.length);
877 profile->rsn_authmode =
Varun Reddy Yeturu101f9542016-05-24 10:07:52 -0700878 e_csr_auth_type_to_rsn_authmode(
879 roam_req->ConnectedNetwork.authentication,
880 roam_req->ConnectedNetwork.encryption);
Himanshu Agarwal8bcec572017-09-28 11:54:37 +0530881 rsn_authmode = profile->rsn_authmode;
Varun Reddy Yeturu101f9542016-05-24 10:07:52 -0700882
883 if ((rsn_authmode == WMI_AUTH_CCKM_WPA) ||
884 (rsn_authmode == WMI_AUTH_CCKM_RSNA))
Himanshu Agarwal8bcec572017-09-28 11:54:37 +0530885 profile->rsn_authmode =
Varun Reddy Yeturu101f9542016-05-24 10:07:52 -0700886 wma_roam_scan_get_cckm_mode(
887 roam_req, rsn_authmode);
Himanshu Agarwal8bcec572017-09-28 11:54:37 +0530888 profile->rsn_ucastcipherset =
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700889 e_csr_encryption_type_to_rsn_cipherset(
890 roam_req->ConnectedNetwork.encryption);
Himanshu Agarwal8bcec572017-09-28 11:54:37 +0530891 profile->rsn_mcastcipherset =
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700892 e_csr_encryption_type_to_rsn_cipherset(
893 roam_req->ConnectedNetwork.mcencryption);
Himanshu Agarwal8bcec572017-09-28 11:54:37 +0530894 profile->rsn_mcastmgmtcipherset =
895 profile->rsn_mcastcipherset;
896 profile->rssi_threshold = roam_req->RoamRssiDiff;
Abhishek Singh34c0e632017-09-28 14:39:29 +0530897 if (roam_req->rssi_abs_thresh)
Yeshwanth Sriram Guntuka14ab04c2018-09-21 15:06:49 +0530898 profile->rssi_abs_thresh = roam_req->rssi_abs_thresh;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800899#ifdef WLAN_FEATURE_11W
900 if (roam_req->ConnectedNetwork.mfp_enabled)
Himanshu Agarwal8bcec572017-09-28 11:54:37 +0530901 profile->flags |= WMI_AP_PROFILE_FLAG_PMF;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800902#endif
903 }
904}
905
906/**
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -0700907 * wma_process_set_pdev_ie_req() - process the pdev set IE req
908 * @wma: Pointer to wma handle
909 * @ie_params: Pointer to IE data.
910 *
911 * Sends the WMI req to set the IE to FW.
912 *
913 * Return: None
914 */
915void wma_process_set_pdev_ie_req(tp_wma_handle wma,
916 struct set_ie_param *ie_params)
917{
918 if (ie_params->ie_type == DOT11_HT_IE)
919 wma_process_set_pdev_ht_ie_req(wma, ie_params);
920 if (ie_params->ie_type == DOT11_VHT_IE)
921 wma_process_set_pdev_vht_ie_req(wma, ie_params);
922
923 qdf_mem_free(ie_params->ie_ptr);
924}
925
926/**
927 * wma_process_set_pdev_ht_ie_req() - sends HT IE data to FW
928 * @wma: Pointer to wma handle
929 * @ie_params: Pointer to IE data.
930 * @nss: Nss values to prepare the HT IE.
931 *
932 * Sends the WMI req to set the HT IE to FW.
933 *
934 * Return: None
935 */
936void wma_process_set_pdev_ht_ie_req(tp_wma_handle wma,
937 struct set_ie_param *ie_params)
938{
939 int ret;
940 wmi_pdev_set_ht_ie_cmd_fixed_param *cmd;
941 wmi_buf_t buf;
942 uint16_t len;
943 uint16_t ie_len_pad;
944 uint8_t *buf_ptr;
945
946 len = sizeof(*cmd) + WMI_TLV_HDR_SIZE;
947 ie_len_pad = roundup(ie_params->ie_len, sizeof(uint32_t));
948 len += ie_len_pad;
949
950 buf = wmi_buf_alloc(wma->wmi_handle, len);
Arif Hussain157263f2018-10-03 13:07:15 -0700951 if (!buf)
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -0700952 return;
Arif Hussain157263f2018-10-03 13:07:15 -0700953
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -0700954 cmd = (wmi_pdev_set_ht_ie_cmd_fixed_param *) wmi_buf_data(buf);
955 WMITLV_SET_HDR(&cmd->tlv_header,
956 WMITLV_TAG_STRUC_wmi_pdev_set_ht_ie_cmd_fixed_param,
957 WMITLV_GET_STRUCT_TLVLEN(
958 wmi_pdev_set_ht_ie_cmd_fixed_param));
959 cmd->reserved0 = 0;
960 cmd->ie_len = ie_params->ie_len;
961 cmd->tx_streams = ie_params->nss;
962 cmd->rx_streams = ie_params->nss;
963 WMA_LOGD("Setting pdev HT ie with Nss = %u",
964 ie_params->nss);
965 buf_ptr = (uint8_t *)cmd + sizeof(*cmd);
966 WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_ARRAY_BYTE, ie_len_pad);
967 if (ie_params->ie_len) {
968 qdf_mem_copy(buf_ptr + WMI_TLV_HDR_SIZE,
969 (uint8_t *)ie_params->ie_ptr,
970 ie_params->ie_len);
971 }
972 ret = wmi_unified_cmd_send(wma->wmi_handle, buf, len,
973 WMI_PDEV_SET_HT_CAP_IE_CMDID);
Arif Hussain157263f2018-10-03 13:07:15 -0700974 if (ret != EOK)
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -0700975 wmi_buf_free(buf);
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -0700976}
977
978/**
979 * wma_process_set_pdev_vht_ie_req() - sends VHT IE data to FW
980 * @wma: Pointer to wma handle
981 * @ie_params: Pointer to IE data.
982 * @nss: Nss values to prepare the VHT IE.
983 *
984 * Sends the WMI req to set the VHT IE to FW.
985 *
986 * Return: None
987 */
988void wma_process_set_pdev_vht_ie_req(tp_wma_handle wma,
989 struct set_ie_param *ie_params)
990{
991 int ret;
992 wmi_pdev_set_vht_ie_cmd_fixed_param *cmd;
993 wmi_buf_t buf;
994 uint16_t len;
995 uint16_t ie_len_pad;
996 uint8_t *buf_ptr;
997
998 len = sizeof(*cmd) + WMI_TLV_HDR_SIZE;
999 ie_len_pad = roundup(ie_params->ie_len, sizeof(uint32_t));
1000 len += ie_len_pad;
1001
1002 buf = wmi_buf_alloc(wma->wmi_handle, len);
Arif Hussain157263f2018-10-03 13:07:15 -07001003 if (!buf)
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -07001004 return;
Arif Hussain157263f2018-10-03 13:07:15 -07001005
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -07001006 cmd = (wmi_pdev_set_vht_ie_cmd_fixed_param *) wmi_buf_data(buf);
1007 WMITLV_SET_HDR(&cmd->tlv_header,
1008 WMITLV_TAG_STRUC_wmi_pdev_set_vht_ie_cmd_fixed_param,
1009 WMITLV_GET_STRUCT_TLVLEN(
1010 wmi_pdev_set_vht_ie_cmd_fixed_param));
1011 cmd->reserved0 = 0;
1012 cmd->ie_len = ie_params->ie_len;
1013 cmd->tx_streams = ie_params->nss;
1014 cmd->rx_streams = ie_params->nss;
1015 WMA_LOGD("Setting pdev VHT ie with Nss = %u",
1016 ie_params->nss);
1017 buf_ptr = (uint8_t *)cmd + sizeof(*cmd);
1018 WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_ARRAY_BYTE, ie_len_pad);
1019 if (ie_params->ie_len) {
1020 qdf_mem_copy(buf_ptr + WMI_TLV_HDR_SIZE,
1021 (uint8_t *)ie_params->ie_ptr,
1022 ie_params->ie_len);
1023 }
1024 ret = wmi_unified_cmd_send(wma->wmi_handle, buf, len,
1025 WMI_PDEV_SET_VHT_CAP_IE_CMDID);
Arif Hussain157263f2018-10-03 13:07:15 -07001026 if (ret != EOK)
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -07001027 wmi_buf_free(buf);
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -07001028}
1029
1030/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001031 * wma_roam_scan_scan_params() - fill roam scan params
1032 * @wma_handle: wma handle
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08001033 * @mac: Mac ptr
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001034 * @scan_params: scan parameters
1035 * @roam_req: NULL if this routine is called before connect
1036 * It will be non-NULL if called after assoc.
1037 *
1038 * Fill scan_params structure from configured parameters
1039 *
1040 * Return: none
1041 */
1042void wma_roam_scan_fill_scan_params(tp_wma_handle wma_handle,
Jeff Johnson9f18aa72018-12-02 12:05:12 -08001043 struct mac_context *mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001044 tSirRoamOffloadScanReq *roam_req,
1045 wmi_start_scan_cmd_fixed_param *
1046 scan_params)
1047{
1048 uint8_t channels_per_burst = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001049
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08001050 if (NULL == mac) {
1051 WMA_LOGE("%s: mac is NULL", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001052 return;
1053 }
1054
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301055 qdf_mem_zero(scan_params, sizeof(wmi_start_scan_cmd_fixed_param));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001056 scan_params->scan_ctrl_flags = WMI_SCAN_ADD_CCK_RATES |
Sreelakshmi Konamki75deb332015-09-14 10:58:03 +05301057 WMI_SCAN_ADD_OFDM_RATES |
1058 WMI_SCAN_ADD_DS_IE_IN_PROBE_REQ;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001059 if (roam_req != NULL) {
1060 /* Parameters updated after association is complete */
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001061 WMA_LOGD("%s: NeighborScanChannelMinTime: %d NeighborScanChannelMaxTime: %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001062 __func__,
1063 roam_req->NeighborScanChannelMinTime,
1064 roam_req->NeighborScanChannelMaxTime);
Sridhar Selvaraj1b2330c2017-07-21 15:16:42 +05301065 WMA_LOGD("%s: NeighborScanTimerPeriod: %d "
1066 "neighbor_scan_min_timer_period %d "
1067 "HomeAwayTime: %d nProbes: %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001068 __func__,
1069 roam_req->NeighborScanTimerPeriod,
Sridhar Selvaraj1b2330c2017-07-21 15:16:42 +05301070 roam_req->neighbor_scan_min_timer_period,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001071 roam_req->HomeAwayTime, roam_req->nProbes);
1072
Abhishek Singh8ebda9db2018-12-18 15:15:01 +05301073 wlan_scan_cfg_get_passive_dwelltime(wma_handle->psoc,
1074 &scan_params->dwell_time_passive);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001075 /*
1076 * Here is the formula,
1077 * T(HomeAway) = N * T(dwell) + (N+1) * T(cs)
1078 * where N is number of channels scanned in single burst
1079 */
1080 scan_params->dwell_time_active =
1081 roam_req->NeighborScanChannelMaxTime;
1082 if (roam_req->HomeAwayTime <
1083 2 * WMA_ROAM_SCAN_CHANNEL_SWITCH_TIME) {
1084 /* clearly we can't follow home away time.
1085 * Make it a split scan.
1086 */
1087 scan_params->burst_duration = 0;
1088 } else {
1089 channels_per_burst =
1090 (roam_req->HomeAwayTime -
1091 WMA_ROAM_SCAN_CHANNEL_SWITCH_TIME)
1092 / (scan_params->dwell_time_active +
1093 WMA_ROAM_SCAN_CHANNEL_SWITCH_TIME);
1094
1095 if (channels_per_burst < 1) {
1096 /* dwell time and home away time conflicts */
1097 /* we will override dwell time */
1098 scan_params->dwell_time_active =
1099 roam_req->HomeAwayTime -
1100 2 * WMA_ROAM_SCAN_CHANNEL_SWITCH_TIME;
1101 scan_params->burst_duration =
1102 scan_params->dwell_time_active;
1103 } else {
1104 scan_params->burst_duration =
1105 channels_per_burst *
1106 scan_params->dwell_time_active;
1107 }
1108 }
1109 if (roam_req->allowDFSChannelRoam ==
1110 SIR_ROAMING_DFS_CHANNEL_ENABLED_NORMAL
1111 && roam_req->HomeAwayTime > 0
1112 && roam_req->ChannelCacheType != CHANNEL_LIST_STATIC) {
1113 /* Roaming on DFS channels is supported and it is not
1114 * app channel list. It is ok to override homeAwayTime
Jeff Johnsonc97816c2018-05-12 17:13:23 -07001115 * to accommodate DFS dwell time in burst
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001116 * duration.
1117 */
1118 scan_params->burst_duration =
Anurag Chouhan6d760662016-02-20 16:05:43 +05301119 QDF_MAX(scan_params->burst_duration,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001120 scan_params->dwell_time_passive);
1121 }
Sridhar Selvaraj1b2330c2017-07-21 15:16:42 +05301122 scan_params->min_rest_time =
1123 roam_req->neighbor_scan_min_timer_period;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001124 scan_params->max_rest_time = roam_req->NeighborScanTimerPeriod;
1125 scan_params->repeat_probe_time = (roam_req->nProbes > 0) ?
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001126 QDF_MAX(scan_params->dwell_time_active /
1127 roam_req->nProbes, 1) : 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001128 scan_params->probe_spacing_time = 0;
1129 scan_params->probe_delay = 0;
1130 /* 30 seconds for full scan cycle */
1131 scan_params->max_scan_time = WMA_HW_DEF_SCAN_MAX_DURATION;
1132 scan_params->idle_time = scan_params->min_rest_time;
1133 scan_params->n_probes = roam_req->nProbes;
1134 if (roam_req->allowDFSChannelRoam ==
1135 SIR_ROAMING_DFS_CHANNEL_DISABLED) {
1136 scan_params->scan_ctrl_flags |= WMI_SCAN_BYPASS_DFS_CHN;
1137 } else {
1138 /* Roaming scan on DFS channel is allowed.
1139 * No need to change any flags for default
1140 * allowDFSChannelRoam = 1.
1141 * Special case where static channel list is given by\
1142 * application that contains DFS channels.
1143 * Assume that the application has knowledge of matching
1144 * APs being active and that probe request transmission
1145 * is permitted on those channel.
1146 * Force active scans on those channels.
1147 */
1148
1149 if (roam_req->allowDFSChannelRoam ==
1150 SIR_ROAMING_DFS_CHANNEL_ENABLED_ACTIVE &&
1151 roam_req->ChannelCacheType == CHANNEL_LIST_STATIC &&
1152 roam_req->ConnectedNetwork.ChannelCount > 0) {
1153 scan_params->scan_ctrl_flags |=
1154 WMI_SCAN_FLAG_FORCE_ACTIVE_ON_DFS;
1155 }
1156 }
Gupta, Kapil96c7f2f2016-04-25 19:13:41 +05301157 WMI_SCAN_SET_DWELL_MODE(scan_params->scan_ctrl_flags,
1158 roam_req->roamscan_adaptive_dwell_mode);
1159
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001160 } else {
1161 /* roam_req = NULL during initial or pre-assoc invocation */
1162 scan_params->dwell_time_active =
1163 WMA_ROAM_DWELL_TIME_ACTIVE_DEFAULT;
1164 scan_params->dwell_time_passive =
1165 WMA_ROAM_DWELL_TIME_PASSIVE_DEFAULT;
1166 scan_params->min_rest_time = WMA_ROAM_MIN_REST_TIME_DEFAULT;
1167 scan_params->max_rest_time = WMA_ROAM_MAX_REST_TIME_DEFAULT;
1168 scan_params->repeat_probe_time = 0;
1169 scan_params->probe_spacing_time = 0;
1170 scan_params->probe_delay = 0;
1171 scan_params->max_scan_time = WMA_HW_DEF_SCAN_MAX_DURATION;
1172 scan_params->idle_time = scan_params->min_rest_time;
1173 scan_params->burst_duration = 0;
1174 scan_params->n_probes = 0;
1175 }
1176
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001177 WMA_LOGD("%s: Rome roam scan parameters: dwell_time_active = %d, dwell_time_passive = %d",
1178 __func__, scan_params->dwell_time_active,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001179 scan_params->dwell_time_passive);
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001180 WMA_LOGD("%s: min_rest_time = %d, max_rest_time = %d, repeat_probe_time = %d n_probes = %d",
1181 __func__, scan_params->min_rest_time,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001182 scan_params->max_rest_time,
1183 scan_params->repeat_probe_time, scan_params->n_probes);
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001184 WMA_LOGD("%s: max_scan_time = %d, idle_time = %d, burst_duration = %d, scan_ctrl_flags = 0x%x",
1185 __func__, scan_params->max_scan_time, scan_params->idle_time,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001186 scan_params->burst_duration, scan_params->scan_ctrl_flags);
1187}
1188
1189/**
1190 * wma_roam_scan_offload_ap_profile() - set roam ap profile in fw
1191 * @wma_handle: wma handle
Himanshu Agarwal8bcec572017-09-28 11:54:37 +05301192 * @mac_ctx: Mac ptr
1193 * @roam_req: Request which contains the ap profile
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001194 *
1195 * Send WMI_ROAM_AP_PROFILE to firmware
1196 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05301197 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001198 */
Himanshu Agarwal8bcec572017-09-28 11:54:37 +05301199static QDF_STATUS wma_roam_scan_offload_ap_profile(tp_wma_handle wma_handle,
1200 tSirRoamOffloadScanReq *roam_req)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001201{
Himanshu Agarwal8bcec572017-09-28 11:54:37 +05301202 struct ap_profile_params ap_profile;
Yeshwanth Sriram Guntukaadfeade2018-12-28 15:39:16 +05301203 bool db2dbm_enabled;
Himanshu Agarwal8bcec572017-09-28 11:54:37 +05301204
Pragaspathi Thilagarajecb60732018-11-02 12:26:24 +05301205 if (!wma_is_vdev_valid(roam_req->sessionId)) {
1206 WMA_LOGE("%s: Invalid vdev id:%d", __func__,
1207 roam_req->sessionId);
1208 return QDF_STATUS_E_FAILURE;
1209 }
Himanshu Agarwal8bcec572017-09-28 11:54:37 +05301210 ap_profile.vdev_id = roam_req->sessionId;
1211 wma_roam_scan_fill_ap_profile(roam_req, &ap_profile.profile);
Yeshwanth Sriram Guntukaadfeade2018-12-28 15:39:16 +05301212
1213 db2dbm_enabled = wmi_service_enabled(wma_handle->wmi_handle,
1214 wmi_service_hw_db2dbm_support);
1215 if (!ap_profile.profile.rssi_abs_thresh) {
1216 if (db2dbm_enabled)
1217 ap_profile.profile.rssi_abs_thresh = WMA_RSSI_MIN_VALUE;
1218 } else {
1219 if (!db2dbm_enabled)
1220 ap_profile.profile.rssi_abs_thresh -=
Yeshwanth Sriram Guntuka14ab04c2018-09-21 15:06:49 +05301221 WMA_NOISE_FLOOR_DBM_DEFAULT;
Yeshwanth Sriram Guntukaadfeade2018-12-28 15:39:16 +05301222 }
Himanshu Agarwal8bcec572017-09-28 11:54:37 +05301223 ap_profile.param = roam_req->score_params;
Govind Singh64b5e112016-03-08 11:53:50 +05301224 return wmi_unified_send_roam_scan_offload_ap_cmd(wma_handle->wmi_handle,
Himanshu Agarwal8bcec572017-09-28 11:54:37 +05301225 &ap_profile);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001226}
1227
1228/**
1229 * wma_roam_scan_filter() - Filter to be applied while roaming
1230 * @wma_handle: Global WMA Handle
1231 * @roam_req: Request which contains the filters
1232 *
1233 * There are filters such as whitelist, blacklist and preferred
1234 * list that need to be applied to the scan results to form the
1235 * probable candidates for roaming.
1236 *
Jeff Johnson3370f3a2018-05-11 09:54:12 -07001237 * Return: Return success upon successfully passing the
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001238 * parameters to the firmware, otherwise failure.
1239 */
Jeff Johnsonc4b47a92016-10-07 12:34:41 -07001240static QDF_STATUS wma_roam_scan_filter(tp_wma_handle wma_handle,
1241 tSirRoamOffloadScanReq *roam_req)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001242{
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05301243 int i;
1244 QDF_STATUS status = QDF_STATUS_SUCCESS;
Abhishek Singh2e1a11a2017-07-06 11:24:11 +05301245 uint32_t num_bssid_black_list = 0, num_ssid_white_list = 0,
Abhishek Singh4db8c152017-07-18 10:40:08 +05301246 num_bssid_preferred_list = 0, num_rssi_rejection_ap = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001247 uint32_t op_bitmap = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001248 struct roam_ext_params *roam_params;
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05301249 struct roam_scan_filter_params *params;
Selvaraj, Sridhar57ce4df2017-05-29 18:30:49 +05301250 struct lca_disallow_config_params *lca_config_params;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001251
Pragaspathi Thilagarajecb60732018-11-02 12:26:24 +05301252 if (!wma_is_vdev_valid(roam_req->sessionId)) {
1253 WMA_LOGE("%s: Invalid vdev id:%d", __func__,
1254 roam_req->sessionId);
1255 return QDF_STATUS_E_FAILURE;
1256 }
1257
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05301258 params = qdf_mem_malloc(sizeof(struct roam_scan_filter_params));
Arif Hussain157263f2018-10-03 13:07:15 -07001259 if (!params)
Naveen Rawat35804772016-06-27 15:40:28 -07001260 return QDF_STATUS_E_NOMEM;
Naveen Rawat35804772016-06-27 15:40:28 -07001261
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001262 roam_params = &roam_req->roam_params;
Selvaraj, Sridhar57ce4df2017-05-29 18:30:49 +05301263 lca_config_params = &roam_req->lca_config_params;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001264 if (roam_req->Command != ROAM_SCAN_OFFLOAD_STOP) {
1265 switch (roam_req->reason) {
1266 case REASON_ROAM_SET_BLACKLIST_BSSID:
1267 op_bitmap |= 0x1;
1268 num_bssid_black_list =
1269 roam_params->num_bssid_avoid_list;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001270 break;
1271 case REASON_ROAM_SET_SSID_ALLOWED:
1272 op_bitmap |= 0x2;
1273 num_ssid_white_list =
1274 roam_params->num_ssid_allowed_list;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001275 break;
1276 case REASON_ROAM_SET_FAVORED_BSSID:
1277 op_bitmap |= 0x4;
1278 num_bssid_preferred_list =
1279 roam_params->num_bssid_favored;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001280 break;
Selvaraj, Sridhar57ce4df2017-05-29 18:30:49 +05301281 case REASON_CTX_INIT:
1282 if (roam_req->Command == ROAM_SCAN_OFFLOAD_START) {
1283 params->lca_disallow_config_present = true;
Abhishek Singh4db8c152017-07-18 10:40:08 +05301284 op_bitmap |=
1285 ROAM_FILTER_OP_BITMAP_LCA_DISALLOW |
1286 ROAM_FILTER_OP_BITMAP_RSSI_REJECTION_OCE;
1287 num_rssi_rejection_ap =
1288 roam_params->num_rssi_rejection_ap;
Selvaraj, Sridhar57ce4df2017-05-29 18:30:49 +05301289 } else {
1290 WMA_LOGD("%s : Roam Filter need not be sent", __func__);
1291 qdf_mem_free(params);
1292 return QDF_STATUS_SUCCESS;
1293 }
1294 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001295 default:
1296 WMA_LOGD("%s : Roam Filter need not be sent", __func__);
Arif Hussaina915f492016-07-29 15:29:42 -07001297 qdf_mem_free(params);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301298 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001299 }
1300 } else {
1301 /* In case of STOP command, reset all the variables
1302 * except for blacklist BSSID which should be retained
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001303 * across connections.
1304 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001305 op_bitmap = 0x2 | 0x4;
1306 num_ssid_white_list = roam_params->num_ssid_allowed_list;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001307 num_bssid_preferred_list = roam_params->num_bssid_favored;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001308 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001309
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001310 /* fill in fixed values */
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05301311 params->session_id = roam_req->sessionId;
1312 params->op_bitmap = op_bitmap;
1313 params->num_bssid_black_list = num_bssid_black_list;
1314 params->num_ssid_white_list = num_ssid_white_list;
1315 params->num_bssid_preferred_list = num_bssid_preferred_list;
Abhishek Singh4db8c152017-07-18 10:40:08 +05301316 params->num_rssi_rejection_ap = num_rssi_rejection_ap;
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05301317 qdf_mem_copy(params->bssid_avoid_list, roam_params->bssid_avoid_list,
1318 MAX_BSSID_AVOID_LIST * sizeof(struct qdf_mac_addr));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001319
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001320 for (i = 0; i < num_ssid_white_list; i++) {
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05301321 qdf_mem_copy(params->ssid_allowed_list[i].mac_ssid,
1322 roam_params->ssid_allowed_list[i].ssId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001323 roam_params->ssid_allowed_list[i].length);
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05301324 params->ssid_allowed_list[i].length =
1325 roam_params->ssid_allowed_list[i].length;
1326 WMA_LOGD("%s: SSID length=%d", __func__,
1327 params->ssid_allowed_list[i].length);
1328 qdf_trace_hex_dump(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_DEBUG,
1329 (uint8_t *)params->ssid_allowed_list[i].mac_ssid,
1330 params->ssid_allowed_list[i].length);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001331 }
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05301332 qdf_mem_copy(params->bssid_favored, roam_params->bssid_favored,
1333 MAX_BSSID_FAVORED * sizeof(struct qdf_mac_addr));
1334 qdf_mem_copy(params->bssid_favored_factor,
1335 roam_params->bssid_favored_factor, MAX_BSSID_FAVORED);
Abhishek Singh4db8c152017-07-18 10:40:08 +05301336 qdf_mem_copy(params->rssi_rejection_ap,
1337 roam_params->rssi_rejection_ap,
1338 MAX_RSSI_AVOID_BSSID_LIST *
1339 sizeof(struct rssi_disallow_bssid));
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05301340
Selvaraj, Sridhar57ce4df2017-05-29 18:30:49 +05301341 if (params->lca_disallow_config_present) {
1342 params->disallow_duration
1343 = lca_config_params->disallow_duration;
1344 params->rssi_channel_penalization
1345 = lca_config_params->rssi_channel_penalization;
1346 params->num_disallowed_aps
1347 = lca_config_params->num_disallowed_aps;
1348 }
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05301349 status = wmi_unified_roam_scan_filter_cmd(wma_handle->wmi_handle,
1350 params);
1351
1352 qdf_mem_free(params);
1353 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001354}
1355
1356/**
1357 * wma_roam_scan_bmiss_cnt() - set bmiss count to fw
1358 * @wma_handle: wma handle
1359 * @first_bcnt: first bmiss count
1360 * @final_bcnt: final bmiss count
1361 * @vdev_id: vdev id
1362 *
1363 * set first & final biss count to fw.
1364 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05301365 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001366 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301367QDF_STATUS wma_roam_scan_bmiss_cnt(tp_wma_handle wma_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001368 A_INT32 first_bcnt,
1369 A_UINT32 final_bcnt, uint32_t vdev_id)
1370{
Govind Singhd76a5b02016-03-08 15:12:14 +05301371 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001372
Srinivas Girigowdaf1472122017-03-09 15:44:12 -08001373 WMA_LOGD("%s: first_bcnt: %d, final_bcnt: %d", __func__, first_bcnt,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001374 final_bcnt);
1375
Govind Singhd76a5b02016-03-08 15:12:14 +05301376 status = wma_vdev_set_param(wma_handle->wmi_handle,
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001377 vdev_id, WMI_VDEV_PARAM_BMISS_FIRST_BCNT,
1378 first_bcnt);
Govind Singhd76a5b02016-03-08 15:12:14 +05301379 if (QDF_IS_STATUS_ERROR(status)) {
1380 WMA_LOGE("wma_vdev_set_param WMI_VDEV_PARAM_BMISS_FIRST_BCNT returned Error %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001381 status);
Govind Singhd76a5b02016-03-08 15:12:14 +05301382 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001383 }
1384
Govind Singhd76a5b02016-03-08 15:12:14 +05301385 status = wma_vdev_set_param(wma_handle->wmi_handle,
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001386 vdev_id, WMI_VDEV_PARAM_BMISS_FINAL_BCNT,
1387 final_bcnt);
Govind Singhd76a5b02016-03-08 15:12:14 +05301388 if (QDF_IS_STATUS_ERROR(status)) {
1389 WMA_LOGE("wma_vdev_set_param WMI_VDEV_PARAM_BMISS_FINAL_BCNT returned Error %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001390 status);
Govind Singhd76a5b02016-03-08 15:12:14 +05301391 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001392 }
1393
Govind Singhd76a5b02016-03-08 15:12:14 +05301394 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001395}
1396
1397/**
1398 * wma_roam_scan_offload_command() - set roam offload command
1399 * @wma_handle: wma handle
1400 * @command: command
1401 * @vdev_id: vdev id
1402 *
1403 * This function set roam offload command to fw.
1404 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05301405 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001406 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301407QDF_STATUS wma_roam_scan_offload_command(tp_wma_handle wma_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001408 uint32_t command, uint32_t vdev_id)
1409{
Pragaspathi Thilagarajecb60732018-11-02 12:26:24 +05301410 if (!wma_is_vdev_valid(vdev_id)) {
1411 WMA_LOGE("%s: Invalid vdev id:%d", __func__, vdev_id);
1412 return QDF_STATUS_E_FAILURE;
1413 }
1414
Govind Singh64b5e112016-03-08 11:53:50 +05301415 return wmi_unified_roam_scan_offload_cmd(wma_handle->wmi_handle,
Pragaspathi Thilagarajecb60732018-11-02 12:26:24 +05301416 command, vdev_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001417}
1418
1419/**
yeshwanth sriram guntuka41f936c2017-09-01 17:53:49 +05301420 * wma_roam_scan_btm_offload() - Send BTM offload config
1421 * @wma_handle: wma handle
1422 * @roam_req: roam request parameters
1423 *
1424 * This function is used to send BTM offload config to fw
1425 *
1426 * Return: QDF status
1427 */
1428static QDF_STATUS wma_roam_scan_btm_offload(tp_wma_handle wma_handle,
1429 tSirRoamOffloadScanReq *roam_req)
1430{
1431 struct wmi_btm_config *params;
1432 QDF_STATUS status;
1433
1434 params = qdf_mem_malloc(sizeof(struct wmi_btm_config));
Arif Hussain157263f2018-10-03 13:07:15 -07001435 if (!params)
yeshwanth sriram guntuka41f936c2017-09-01 17:53:49 +05301436 return QDF_STATUS_E_FAILURE;
yeshwanth sriram guntuka41f936c2017-09-01 17:53:49 +05301437
1438 params->vdev_id = roam_req->sessionId;
1439 params->btm_offload_config = roam_req->btm_offload_config;
Jiachao Wu84bb2ea2018-01-08 16:17:33 +08001440 params->btm_solicited_timeout = roam_req->btm_solicited_timeout;
1441 params->btm_max_attempt_cnt = roam_req->btm_max_attempt_cnt;
1442 params->btm_sticky_time = roam_req->btm_sticky_time;
Pragaspathi Thilagarajae7dc762018-12-12 18:10:50 +05301443 params->disassoc_timer_threshold = roam_req->disassoc_timer_threshold;
Vignesh Viswanathana3d5c272018-06-04 19:36:02 +05301444
1445 WMA_LOGD("%s: Sending BTM offload to FW for vdev %u btm_offload_config %u",
1446 __func__, params->vdev_id, params->btm_offload_config);
1447
yeshwanth sriram guntuka41f936c2017-09-01 17:53:49 +05301448 status = wmi_unified_send_btm_config(wma_handle->wmi_handle, params);
1449 qdf_mem_free(params);
1450
Vignesh Viswanathana3d5c272018-06-04 19:36:02 +05301451
yeshwanth sriram guntuka41f936c2017-09-01 17:53:49 +05301452 return status;
1453}
1454
1455/**
Pragaspathi Thilagaraj69f0b692018-12-16 22:23:04 +05301456 * wma_send_roam_bss_load_config() - API to send load bss trigger
1457 * related parameters to fw
Pragaspathi Thilagaraj69f0b692018-12-16 22:23:04 +05301458 * @handle: WMA handle
1459 * @roam_req: bss load config parameters from csr to be sent to fw
1460 *
1461 * Return: None
1462 */
1463static
1464void wma_send_roam_bss_load_config(WMA_HANDLE handle,
1465 struct wmi_bss_load_config *params)
1466{
1467 QDF_STATUS status;
1468 tp_wma_handle wma_handle = (tp_wma_handle) handle;
1469
1470 if (!wma_handle || !wma_handle->wmi_handle) {
1471 WMA_LOGE("WMA is closed, cannot send bss load config");
1472 return;
1473 }
1474
Pragaspathi Thilagaraj39d61602018-12-24 14:46:53 +05301475 WMA_LOGD("%s: Sending bss load trig params vdev %u bss_load_threshold %u bss_load_sample_time: %u",
1476 __func__, params->vdev_id, params->bss_load_threshold,
1477 params->bss_load_sample_time);
Pragaspathi Thilagaraj69f0b692018-12-16 22:23:04 +05301478
1479 status = wmi_unified_send_bss_load_config(wma_handle->wmi_handle,
1480 params);
1481 if (QDF_IS_STATUS_ERROR(status))
1482 WMA_LOGE("failed to send bss load trigger config command");
1483}
1484
1485/**
Vignesh Viswanathanfb9d0752018-02-06 16:19:00 +05301486 * wma_send_offload_11k_params() - API to send 11k offload params to FW
1487 * @handle: WMA handle
1488 * @params: Pointer to 11k offload params
1489 *
1490 * Return: None
1491 */
1492static
1493QDF_STATUS wma_send_offload_11k_params(WMA_HANDLE handle,
1494 struct wmi_11k_offload_params *params)
1495{
1496 QDF_STATUS status;
1497 tp_wma_handle wma_handle = (tp_wma_handle) handle;
1498
1499 if (!wma_handle || !wma_handle->wmi_handle) {
1500 WMA_LOGE("%s: WMA is closed, cannot send 11k offload cmd",
1501 __func__);
1502 return QDF_STATUS_E_FAILURE;
1503 }
1504
Vignesh Viswanathanb58161c2018-06-07 16:39:46 +05301505 if (!wmi_service_enabled(wma_handle->wmi_handle,
1506 wmi_service_11k_neighbour_report_support)) {
1507 WMA_LOGE(FL("FW doesn't support 11k offload"));
Vignesh Viswanathanfb9d0752018-02-06 16:19:00 +05301508 return QDF_STATUS_E_NOSUPPORT;
1509 }
1510
Vignesh Viswanathane25af782018-03-23 14:49:50 +05301511 /*
1512 * If 11k enable command and ssid length is 0, drop it
1513 */
1514 if (params->offload_11k_bitmask &&
1515 !params->neighbor_report_params.ssid.length) {
Vignesh Viswanathanfb9d0752018-02-06 16:19:00 +05301516 WMA_LOGD("%s: SSID Len 0", __func__);
1517 return QDF_STATUS_E_INVAL;
1518 }
1519
1520 status = wmi_unified_offload_11k_cmd(wma_handle->wmi_handle, params);
1521
1522 if (status != QDF_STATUS_SUCCESS)
1523 WMA_LOGE("failed to send 11k offload command");
1524
1525 return status;
1526}
1527
1528/**
Varun Reddy Yeturu30bc42c2016-02-04 10:07:30 -08001529 * wma_process_roaming_config() - process roam request
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001530 * @wma_handle: wma handle
1531 * @roam_req: roam request parameters
1532 *
1533 * Main routine to handle ROAM commands coming from CSR module.
1534 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05301535 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001536 */
Varun Reddy Yeturu30bc42c2016-02-04 10:07:30 -08001537QDF_STATUS wma_process_roaming_config(tp_wma_handle wma_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001538 tSirRoamOffloadScanReq *roam_req)
1539{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301540 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001541 wmi_start_scan_cmd_fixed_param scan_params;
Jeff Johnson9f18aa72018-12-02 12:05:12 -08001542 struct mac_context *mac = cds_get_context(QDF_MODULE_ID_PE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001543 uint32_t mode = 0;
1544 struct wma_txrx_node *intr = NULL;
Pragaspathi Thilagaraj69f0b692018-12-16 22:23:04 +05301545 struct wmi_bss_load_config *bss_load_cfg;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001546
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08001547 if (NULL == mac) {
1548 WMA_LOGE("%s: mac is NULL", __func__);
Selvaraj, Sridhar8fe6c672017-01-10 11:37:29 +05301549 qdf_mem_free(roam_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301550 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001551 }
1552
Wu Gao8cd29482018-12-14 15:11:50 +08001553 if (!wma_handle->interfaces[roam_req->sessionId].roam_offload_enabled) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001554 /* roam scan offload is not enabled in firmware.
1555 * Cannot initialize it in the middle of connection.
1556 */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301557 qdf_mem_free(roam_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301558 return QDF_STATUS_E_PERM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001559 }
Liangwei Dongd108cf22018-08-30 03:41:57 -04001560 WMA_LOGD("%s: RSO Command:%d, reason:%d session ID %d en %d", __func__,
1561 roam_req->Command, roam_req->reason, roam_req->sessionId,
1562 roam_req->RoamScanOffloadEnabled);
Varun Reddy Yeturu30bc42c2016-02-04 10:07:30 -08001563 wma_handle->interfaces[roam_req->sessionId].roaming_in_progress = false;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001564 switch (roam_req->Command) {
1565 case ROAM_SCAN_OFFLOAD_START:
1566 intr = &wma_handle->interfaces[roam_req->sessionId];
1567 intr->delay_before_vdev_stop = roam_req->delay_before_vdev_stop;
1568 /*
1569 * Scan/Roam threshold parameters are translated from fields of
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001570 * tSirRoamOffloadScanReq to WMITLV values sent to Rome firmware
1571 * some of these parameters are configurable in qcom_cfg.ini
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001572 */
1573
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001574 /* First param is positive rssi value to trigger rssi based scan
1575 * Opportunistic scan is started at 30dB > trigger rssi.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001576 */
1577 wma_handle->suitable_ap_hb_failure = false;
1578
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301579 qdf_status = wma_roam_scan_offload_rssi_thresh(wma_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001580 roam_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301581 if (qdf_status != QDF_STATUS_SUCCESS)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001582 break;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301583 qdf_status = wma_roam_scan_bmiss_cnt(wma_handle,
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001584 roam_req->RoamBmissFirstBcnt,
1585 roam_req->RoamBmissFinalBcnt,
1586 roam_req->sessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301587 if (qdf_status != QDF_STATUS_SUCCESS)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001588 break;
1589
1590 /* Opportunistic scan runs on a timer, value set by
1591 * EmptyRefreshScanPeriod. Age out the entries after 3 such
1592 * cycles.
1593 */
1594 if (roam_req->EmptyRefreshScanPeriod > 0) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301595 qdf_status =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001596 wma_roam_scan_offload_scan_period(wma_handle,
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001597 roam_req->EmptyRefreshScanPeriod,
1598 roam_req->EmptyRefreshScanPeriod * 3,
1599 roam_req->sessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301600 if (qdf_status != QDF_STATUS_SUCCESS)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001601 break;
1602
1603 mode = WMI_ROAM_SCAN_MODE_PERIODIC;
1604 /* Don't use rssi triggered roam scans if external app
1605 * is in control of channel list.
1606 */
Abhinav Kumaredd1d372018-05-11 15:33:35 +05301607 if (roam_req->ChannelCacheType != CHANNEL_LIST_STATIC ||
1608 roam_req->roam_force_rssi_trigger)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001609 mode |= WMI_ROAM_SCAN_MODE_RSSI_CHANGE;
1610
1611 } else {
1612 mode = WMI_ROAM_SCAN_MODE_RSSI_CHANGE;
1613 }
1614
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001615 /* Start new rssi triggered scan only if it changes by
1616 * RoamRssiDiff value. Beacon weight of 14 means average rssi
1617 * is taken over 14 previous samples + 2 times the current
1618 * beacon's rssi.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001619 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301620 qdf_status = wma_roam_scan_offload_rssi_change(wma_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001621 roam_req->sessionId,
1622 roam_req->RoamRescanRssiDiff,
1623 roam_req->RoamBeaconRssiWeight,
1624 roam_req->hi_rssi_scan_delay);
1625
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301626 if (qdf_status != QDF_STATUS_SUCCESS)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001627 break;
1628
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301629 qdf_status = wma_roam_scan_offload_ap_profile(wma_handle,
Himanshu Agarwal8bcec572017-09-28 11:54:37 +05301630 roam_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301631 if (qdf_status != QDF_STATUS_SUCCESS)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001632 break;
1633
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301634 qdf_status = wma_roam_scan_offload_chan_list(wma_handle,
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001635 roam_req->ConnectedNetwork.ChannelCount,
1636 &roam_req->ConnectedNetwork.ChannelCache[0],
1637 roam_req->ChannelCacheType,
1638 roam_req->sessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301639 if ((qdf_status != QDF_STATUS_SUCCESS) &&
1640 (qdf_status != QDF_STATUS_E_EMPTY))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001641 break;
1642
1643
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08001644 wma_roam_scan_fill_scan_params(wma_handle, mac, roam_req,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001645 &scan_params);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301646 qdf_status =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001647 wma_roam_scan_offload_mode(wma_handle, &scan_params,
1648 roam_req, mode,
1649 roam_req->sessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301650 if (qdf_status != QDF_STATUS_SUCCESS)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001651 break;
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05301652 if (wmi_service_enabled(wma_handle->wmi_handle,
1653 wmi_service_mawc_support)) {
Varun Reddy Yeturu62c32652017-10-26 15:32:35 -07001654 qdf_status =
1655 wma_roam_scan_mawc_params(wma_handle, roam_req);
1656 if (qdf_status != QDF_STATUS_SUCCESS) {
1657 WMA_LOGE("Sending roaming MAWC params failed");
1658 break;
1659 }
1660 } else {
1661 WMA_LOGD("MAWC roaming not supported by firmware");
Varun Reddy Yeturu061d4d62017-07-20 09:39:32 -07001662 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301663 qdf_status = wma_roam_scan_filter(wma_handle, roam_req);
1664 if (qdf_status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001665 WMA_LOGE("Sending start for roam scan filter failed");
1666 break;
1667 }
yeshwanth sriram guntuka41f936c2017-09-01 17:53:49 +05301668 qdf_status = wma_roam_scan_btm_offload(wma_handle, roam_req);
1669 if (qdf_status != QDF_STATUS_SUCCESS) {
1670 WMA_LOGE("Sending BTM config to fw failed");
1671 break;
1672 }
Vignesh Viswanathanfb9d0752018-02-06 16:19:00 +05301673
Vignesh Viswanathane25af782018-03-23 14:49:50 +05301674 /*
Pragaspathi Thilagaraj39d61602018-12-24 14:46:53 +05301675 * Send 11k offload enable and bss load trigger parameters
1676 * to FW as part of RSO Start
Vignesh Viswanathane25af782018-03-23 14:49:50 +05301677 */
Vignesh Viswanathanfb9d0752018-02-06 16:19:00 +05301678 if (roam_req->reason == REASON_CTX_INIT) {
1679 qdf_status = wma_send_offload_11k_params(wma_handle,
1680 &roam_req->offload_11k_params);
1681 if (qdf_status != QDF_STATUS_SUCCESS) {
Vignesh Viswanathane25af782018-03-23 14:49:50 +05301682 WMA_LOGE("11k offload enable not sent, status %d",
Vignesh Viswanathanfb9d0752018-02-06 16:19:00 +05301683 qdf_status);
1684 break;
1685 }
Pragaspathi Thilagaraj69f0b692018-12-16 22:23:04 +05301686
Pragaspathi Thilagaraj39d61602018-12-24 14:46:53 +05301687 if (roam_req->bss_load_trig_enabled) {
1688 bss_load_cfg = &roam_req->bss_load_config;
1689 wma_send_roam_bss_load_config(wma_handle,
1690 bss_load_cfg);
1691 }
Pragaspathi Thilagaraj69f0b692018-12-16 22:23:04 +05301692 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001693 break;
1694
1695 case ROAM_SCAN_OFFLOAD_STOP:
Varun Reddy Yeturu06488012017-05-25 11:44:10 -07001696 /*
1697 * If roam synch propagation is in progress and an user space
1698 * disconnect is requested, then there is no need to send the
1699 * RSO STOP to firmware, since the roaming is already complete.
1700 * If the RSO STOP is sent to firmware, then an HO_FAIL will be
1701 * generated and the expectation from firmware would be to
1702 * clean up the peer context on the host and not send down any
1703 * WMI PEER DELETE commands to firmware. But, if the user space
1704 * disconnect gets processed first, then there is a chance to
1705 * send down the PEER DELETE commands. Hence, if we do not
1706 * receive the HO_FAIL, and we complete the roam sync
1707 * propagation, then the host and firmware will be in sync with
1708 * respect to the peer and then the user space disconnect can
1709 * be handled gracefully in a normal way.
1710 *
1711 * Ensure to check the reason code since the RSO Stop might
1712 * come when roam sync failed as well and at that point it
1713 * should go through to the firmware and receive HO_FAIL
1714 * and clean up.
1715 */
1716 if (wma_is_roam_synch_in_progress(wma_handle,
1717 roam_req->sessionId) &&
1718 roam_req->reason ==
1719 REASON_ROAM_STOP_ALL) {
1720 WMA_LOGD("Dont send RSO stop during roam sync");
1721 break;
1722 }
Vignesh Viswanathane25af782018-03-23 14:49:50 +05301723
1724 /*
1725 * Send 11k offload disable command to FW as part of RSO Stop
1726 */
1727 if (roam_req->reason == REASON_DISCONNECTED) {
1728 qdf_status = wma_send_offload_11k_params(wma_handle,
1729 &roam_req->offload_11k_params);
1730 if (qdf_status != QDF_STATUS_SUCCESS) {
1731 WMA_LOGE("11k offload disable not sent, status %d",
1732 qdf_status);
1733 break;
1734 }
1735 }
1736
Vignesh Viswanathana3d5c272018-06-04 19:36:02 +05301737 /* Send BTM config as disabled during RSO Stop */
1738 qdf_status = wma_roam_scan_btm_offload(wma_handle, roam_req);
1739 if (qdf_status != QDF_STATUS_SUCCESS) {
1740 WMA_LOGE(FL("Sending BTM config to fw failed"));
1741 break;
1742 }
1743
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001744 wma_handle->suitable_ap_hb_failure = false;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001745
Wu Gao8cd29482018-12-14 15:11:50 +08001746 wma_roam_scan_fill_scan_params(wma_handle, mac,
1747 NULL, &scan_params);
Abhishek Singh533c9da2017-05-04 10:23:34 +05301748
Wu Gao8cd29482018-12-14 15:11:50 +08001749 if (roam_req->reason == REASON_ROAM_STOP_ALL ||
1750 roam_req->reason == REASON_DISCONNECTED ||
1751 roam_req->reason == REASON_ROAM_SYNCH_FAILED) {
1752 mode = WMI_ROAM_SCAN_MODE_NONE;
1753 } else {
1754 if (csr_is_roam_offload_enabled(mac))
1755 mode = WMI_ROAM_SCAN_MODE_NONE |
1756 WMI_ROAM_SCAN_MODE_ROAMOFFLOAD;
1757 else
Abhishek Singh533c9da2017-05-04 10:23:34 +05301758 mode = WMI_ROAM_SCAN_MODE_NONE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001759 }
Wu Gao8cd29482018-12-14 15:11:50 +08001760
1761 qdf_status = wma_roam_scan_offload_mode(
1762 wma_handle,
1763 &scan_params, NULL, mode,
1764 roam_req->sessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001765 /*
Varun Reddy Yeturu69d44b22017-08-15 14:29:32 -07001766 * After sending the roam scan mode because of a disconnect,
1767 * clear the scan bitmap client as well by sending
1768 * the following command
1769 */
1770 wma_roam_scan_offload_rssi_thresh(wma_handle, roam_req);
1771 /*
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001772 * If the STOP command is due to a disconnect, then
1773 * send the filter command to clear all the filter
1774 * entries. If it is roaming scenario, then do not
1775 * send the cleared entries.
1776 */
1777 if (!roam_req->middle_of_roaming) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301778 qdf_status = wma_roam_scan_filter(wma_handle, roam_req);
1779 if (qdf_status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001780 WMA_LOGE("clear for roam scan filter failed");
1781 break;
1782 }
1783 }
1784
1785 if (roam_req->reason ==
1786 REASON_OS_REQUESTED_ROAMING_NOW) {
Rajeev Kumarcf7bd802017-04-18 11:11:42 -07001787 struct scheduler_msg cds_msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001788 tSirRoamOffloadScanRsp *scan_offload_rsp;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001789
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001790 scan_offload_rsp =
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301791 qdf_mem_malloc(sizeof(*scan_offload_rsp));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001792 if (!scan_offload_rsp) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301793 qdf_mem_free(roam_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301794 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001795 }
1796 cds_msg.type = eWNI_SME_ROAM_SCAN_OFFLOAD_RSP;
1797 scan_offload_rsp->sessionId = roam_req->sessionId;
1798 scan_offload_rsp->reason = roam_req->reason;
1799 cds_msg.bodyptr = scan_offload_rsp;
1800 /*
1801 * Since REASSOC request is processed in
1802 * Roam_Scan_Offload_Rsp post a dummy rsp msg back to
1803 * SME with proper reason code.
1804 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301805 if (QDF_STATUS_SUCCESS !=
gaurank kathpalia00861f02018-08-28 19:16:12 +05301806 scheduler_post_message(QDF_MODULE_ID_WMA,
1807 QDF_MODULE_ID_SME,
1808 QDF_MODULE_ID_SME,
1809 &cds_msg)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301810 qdf_mem_free(scan_offload_rsp);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301811 QDF_TRACE(QDF_MODULE_ID_WMA,
1812 QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001813 "%s: Failed to post Scan Offload Rsp to UMAC",
1814 __func__);
1815 }
1816 }
1817 break;
1818
1819 case ROAM_SCAN_OFFLOAD_ABORT_SCAN:
1820 /* If roam scan is running, stop that cycle.
1821 * It will continue automatically on next trigger.
1822 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301823 qdf_status = wma_roam_scan_offload_command(wma_handle,
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001824 WMI_ROAM_SCAN_STOP_CMD,
1825 roam_req->sessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001826 break;
1827
1828 case ROAM_SCAN_OFFLOAD_RESTART:
1829 /* Rome offload engine does not stop after any scan.
1830 * If this command is sent because all preauth attempts failed
1831 * and WMI_ROAM_REASON_SUITABLE_AP event was received earlier,
1832 * now it is time to call it heartbeat failure.
1833 */
1834 if ((roam_req->reason == REASON_PREAUTH_FAILED_FOR_ALL)
1835 && wma_handle->suitable_ap_hb_failure) {
1836 WMA_LOGE("%s: Sending heartbeat failure after preauth failures",
1837 __func__);
1838 wma_beacon_miss_handler(wma_handle,
Sreelakshmi Konamki58c72432016-11-09 17:06:44 +05301839 roam_req->sessionId,
1840 wma_handle->suitable_ap_hb_failure_rssi);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001841 wma_handle->suitable_ap_hb_failure = false;
1842 }
1843 break;
1844
1845 case ROAM_SCAN_OFFLOAD_UPDATE_CFG:
1846 wma_handle->suitable_ap_hb_failure = false;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001847
Liangwei Dongd108cf22018-08-30 03:41:57 -04001848 if (roam_req->RoamScanOffloadEnabled) {
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08001849 wma_roam_scan_fill_scan_params(wma_handle, mac,
Liangwei Dongd108cf22018-08-30 03:41:57 -04001850 roam_req, &scan_params);
1851 qdf_status =
1852 wma_roam_scan_offload_mode(
1853 wma_handle, &scan_params, roam_req,
1854 WMI_ROAM_SCAN_MODE_NONE,
1855 roam_req->sessionId);
1856 if (qdf_status != QDF_STATUS_SUCCESS)
1857 break;
1858 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001859
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301860 qdf_status = wma_roam_scan_bmiss_cnt(wma_handle,
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001861 roam_req->RoamBmissFirstBcnt,
1862 roam_req->RoamBmissFinalBcnt,
1863 roam_req->sessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301864 if (qdf_status != QDF_STATUS_SUCCESS)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001865 break;
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05301866
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301867 qdf_status = wma_roam_scan_filter(wma_handle, roam_req);
1868 if (qdf_status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001869 WMA_LOGE("Sending update for roam scan filter failed");
1870 break;
1871 }
1872
1873
1874 /*
1875 * Runtime (after association) changes to rssi thresholds and
1876 * other parameters.
1877 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301878 qdf_status = wma_roam_scan_offload_chan_list(wma_handle,
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001879 roam_req->ConnectedNetwork.ChannelCount,
1880 &roam_req->ConnectedNetwork.ChannelCache[0],
1881 roam_req->ChannelCacheType,
1882 roam_req->sessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001883 /*
1884 * Even though the channel list is empty, we can
1885 * still go ahead and start Roaming.
1886 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301887 if ((qdf_status != QDF_STATUS_SUCCESS) &&
1888 (qdf_status != QDF_STATUS_E_EMPTY))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001889 break;
1890
1891
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301892 qdf_status = wma_roam_scan_offload_rssi_thresh(wma_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001893 roam_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301894 if (qdf_status != QDF_STATUS_SUCCESS)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001895 break;
1896
1897 if (roam_req->EmptyRefreshScanPeriod > 0) {
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001898 qdf_status = wma_roam_scan_offload_scan_period(
1899 wma_handle,
1900 roam_req->EmptyRefreshScanPeriod,
1901 roam_req->EmptyRefreshScanPeriod * 3,
1902 roam_req->sessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301903 if (qdf_status != QDF_STATUS_SUCCESS)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001904 break;
1905
1906 mode = WMI_ROAM_SCAN_MODE_PERIODIC;
1907 /* Don't use rssi triggered roam scans if external app
1908 * is in control of channel list.
1909 */
Abhinav Kumaredd1d372018-05-11 15:33:35 +05301910 if (roam_req->ChannelCacheType != CHANNEL_LIST_STATIC ||
1911 roam_req->roam_force_rssi_trigger)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001912 mode |= WMI_ROAM_SCAN_MODE_RSSI_CHANGE;
1913
1914 } else {
1915 mode = WMI_ROAM_SCAN_MODE_RSSI_CHANGE;
1916 }
1917
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301918 qdf_status = wma_roam_scan_offload_rssi_change(wma_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001919 roam_req->sessionId,
1920 roam_req->RoamRescanRssiDiff,
1921 roam_req->RoamBeaconRssiWeight,
1922 roam_req->hi_rssi_scan_delay);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301923 if (qdf_status != QDF_STATUS_SUCCESS)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001924 break;
1925
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001926 qdf_status = wma_roam_scan_offload_ap_profile(wma_handle,
Himanshu Agarwal8bcec572017-09-28 11:54:37 +05301927 roam_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301928 if (qdf_status != QDF_STATUS_SUCCESS)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001929 break;
1930
Liangwei Dongd108cf22018-08-30 03:41:57 -04001931 if (!roam_req->RoamScanOffloadEnabled)
1932 break;
1933
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08001934 wma_roam_scan_fill_scan_params(wma_handle, mac, roam_req,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001935 &scan_params);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301936 qdf_status =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001937 wma_roam_scan_offload_mode(wma_handle, &scan_params,
1938 roam_req, mode,
1939 roam_req->sessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001940 break;
1941
1942 default:
1943 break;
1944 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301945 qdf_mem_free(roam_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301946 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001947}
1948
Kapil Gupta5cda2252016-12-29 18:44:26 +05301949void wma_update_per_roam_config(WMA_HANDLE handle,
1950 struct wmi_per_roam_config_req *req_buf)
1951{
1952 int status;
1953 tp_wma_handle wma_handle = (tp_wma_handle) handle;
1954
1955 if (!wma_handle || !wma_handle->wmi_handle) {
1956 WMA_LOGE("%s: WMA is closed, cannot send per roam config",
1957 __func__);
1958 return;
1959 }
1960
1961 status = wmi_unified_set_per_roam_config(wma_handle->wmi_handle,
1962 req_buf);
1963 if (status != EOK)
1964 WMA_LOGE("%s: failed to set per roam config to FW",
1965 __func__);
1966}
1967
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001968#ifdef WLAN_FEATURE_ROAM_OFFLOAD
1969
1970/**
1971 * wma_process_roam_invoke() - send roam invoke command to fw.
1972 * @handle: wma handle
1973 * @roaminvoke: roam invoke command
1974 *
1975 * Send roam invoke command to fw for fastreassoc.
1976 *
1977 * Return: none
1978 */
1979void wma_process_roam_invoke(WMA_HANDLE handle,
1980 struct wma_roam_invoke_cmd *roaminvoke)
1981{
1982 tp_wma_handle wma_handle = (tp_wma_handle) handle;
Govind Singh64b5e112016-03-08 11:53:50 +05301983 uint32_t ch_hz;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001984
1985 if (!wma_handle || !wma_handle->wmi_handle) {
1986 WMA_LOGE("%s: WMA is closed, can not send roam invoke",
1987 __func__);
Naveen Rawat664a7cb2017-01-19 17:58:14 -08001988 goto free_frame_buf;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001989 }
Pragaspathi Thilagarajecb60732018-11-02 12:26:24 +05301990
1991 if (!wma_is_vdev_valid(roaminvoke->vdev_id)) {
1992 WMA_LOGE("%s: Invalid vdev id:%d", __func__,
1993 roaminvoke->vdev_id);
1994 goto free_frame_buf;
1995 }
Govind Singh64b5e112016-03-08 11:53:50 +05301996 ch_hz = (A_UINT32)cds_chan_to_freq(roaminvoke->channel);
1997 wmi_unified_roam_invoke_cmd(wma_handle->wmi_handle,
1998 (struct wmi_roam_invoke_cmd *)roaminvoke,
1999 ch_hz);
Naveen Rawat664a7cb2017-01-19 17:58:14 -08002000free_frame_buf:
2001 if (roaminvoke->frame_len) {
2002 qdf_mem_free(roaminvoke->frame_buf);
2003 roaminvoke->frame_buf = NULL;
2004 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002005}
2006
2007/**
2008 * wma_process_roam_synch_fail() -roam synch failure handle
2009 * @handle: wma handle
2010 * @synch_fail: roam synch fail parameters
2011 *
2012 * Return: none
2013 */
2014void wma_process_roam_synch_fail(WMA_HANDLE handle,
2015 struct roam_offload_synch_fail *synch_fail)
2016{
2017 tp_wma_handle wma_handle = (tp_wma_handle) handle;
Srinivas Girigowda4d65ebe2017-10-13 21:41:42 -07002018
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002019 if (!wma_handle || !wma_handle->wmi_handle) {
2020 WMA_LOGE("%s: WMA is closed, can not clean-up roam synch",
2021 __func__);
2022 return;
2023 }
Deepak Dhamdheref918d422017-07-06 12:56:29 -07002024 wlan_roam_debug_log(synch_fail->session_id,
2025 DEBUG_ROAM_SYNCH_FAIL,
2026 DEBUG_INVALID_PEER_ID, NULL, NULL, 0, 0);
2027
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002028 /* Hand Off Failure could happen as an exception, when a roam synch
2029 * indication is posted to Host, but a roam synch complete is not
2030 * posted to the firmware.So, clear the roam synch in progress
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07002031 * flag before disconnecting the session through this event.
2032 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002033 wma_handle->interfaces[synch_fail->session_id].roam_synch_in_progress =
2034 false;
2035}
2036
2037/**
Pragaspathi Thilagarajea97fe92018-07-23 15:01:54 +05302038 * wma_free_roam_synch_frame_ind() - Free the bcn_probe_rsp, reassoc_req,
2039 * reassoc_rsp received as part of the ROAM_SYNC_FRAME event
2040 *
2041 * @iface - interaface corresponding to a vdev
2042 *
2043 * This API is used to free the buffer allocated during the ROAM_SYNC_FRAME
2044 * event
2045 *
2046 */
2047static void wma_free_roam_synch_frame_ind(struct wma_txrx_node *iface)
2048{
2049 if (iface->roam_synch_frame_ind.bcn_probe_rsp) {
2050 qdf_mem_free(iface->roam_synch_frame_ind.bcn_probe_rsp);
2051 iface->roam_synch_frame_ind.bcn_probe_rsp_len = 0;
2052 iface->roam_synch_frame_ind.bcn_probe_rsp = NULL;
2053 }
2054 if (iface->roam_synch_frame_ind.reassoc_req) {
2055 qdf_mem_free(iface->roam_synch_frame_ind.reassoc_req);
2056 iface->roam_synch_frame_ind.reassoc_req_len = 0;
2057 iface->roam_synch_frame_ind.reassoc_req = NULL;
2058 }
2059 if (iface->roam_synch_frame_ind.reassoc_rsp) {
2060 qdf_mem_free(iface->roam_synch_frame_ind.reassoc_rsp);
2061 iface->roam_synch_frame_ind.reassoc_rsp_len = 0;
2062 iface->roam_synch_frame_ind.reassoc_rsp = NULL;
2063 }
2064}
2065
2066/**
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302067 * wma_fill_data_synch_frame_event() - Fill the the roam sync data buffer using
2068 * synch frame event data
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002069 * @wma: Global WMA Handle
2070 * @roam_synch_ind_ptr: Buffer to be filled
2071 * @param_buf: Source buffer
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002072 *
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002073 * Firmware sends all the required information required for roam
2074 * synch propagation as TLV's and stored in param_buf. These
2075 * parameters are parsed and filled into the roam synch indication
2076 * buffer which will be used at different layers for propagation.
2077 *
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302078 * Return: None
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002079 */
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302080static void wma_fill_data_synch_frame_event(tp_wma_handle wma,
Jeff Johnsonc4b47a92016-10-07 12:34:41 -07002081 roam_offload_synch_ind *roam_synch_ind_ptr,
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302082 struct wma_txrx_node *iface)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002083{
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002084 uint8_t *bcn_probersp_ptr;
2085 uint8_t *reassoc_rsp_ptr;
2086 uint8_t *reassoc_req_ptr;
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302087
2088 /* Beacon/Probe Rsp data */
2089 roam_synch_ind_ptr->beaconProbeRespOffset =
2090 sizeof(roam_offload_synch_ind);
2091 bcn_probersp_ptr = (uint8_t *) roam_synch_ind_ptr +
2092 roam_synch_ind_ptr->beaconProbeRespOffset;
2093 roam_synch_ind_ptr->beaconProbeRespLength =
2094 iface->roam_synch_frame_ind.bcn_probe_rsp_len;
2095 qdf_mem_copy(bcn_probersp_ptr,
2096 iface->roam_synch_frame_ind.bcn_probe_rsp,
2097 roam_synch_ind_ptr->beaconProbeRespLength);
2098 qdf_mem_free(iface->roam_synch_frame_ind.bcn_probe_rsp);
2099 iface->roam_synch_frame_ind.bcn_probe_rsp = NULL;
2100
2101 /* ReAssoc Rsp data */
2102 roam_synch_ind_ptr->reassocRespOffset =
2103 sizeof(roam_offload_synch_ind) +
2104 roam_synch_ind_ptr->beaconProbeRespLength;
2105 roam_synch_ind_ptr->reassocRespLength =
2106 iface->roam_synch_frame_ind.reassoc_rsp_len;
2107 reassoc_rsp_ptr = (uint8_t *) roam_synch_ind_ptr +
2108 roam_synch_ind_ptr->reassocRespOffset;
2109 qdf_mem_copy(reassoc_rsp_ptr,
2110 iface->roam_synch_frame_ind.reassoc_rsp,
2111 roam_synch_ind_ptr->reassocRespLength);
2112 qdf_mem_free(iface->roam_synch_frame_ind.reassoc_rsp);
2113 iface->roam_synch_frame_ind.reassoc_rsp = NULL;
2114
2115 /* ReAssoc Req data */
2116 roam_synch_ind_ptr->reassoc_req_offset =
2117 sizeof(roam_offload_synch_ind) +
2118 roam_synch_ind_ptr->beaconProbeRespLength +
2119 roam_synch_ind_ptr->reassocRespLength;
2120 roam_synch_ind_ptr->reassoc_req_length =
2121 iface->roam_synch_frame_ind.reassoc_req_len;
2122 reassoc_req_ptr = (uint8_t *) roam_synch_ind_ptr +
2123 roam_synch_ind_ptr->reassoc_req_offset;
2124 qdf_mem_copy(reassoc_req_ptr,
2125 iface->roam_synch_frame_ind.reassoc_req,
2126 roam_synch_ind_ptr->reassoc_req_length);
2127 qdf_mem_free(iface->roam_synch_frame_ind.reassoc_req);
2128 iface->roam_synch_frame_ind.reassoc_req = NULL;
2129}
2130
2131/**
2132 * wma_fill_data_synch_event() - Fill the the roam sync data buffer using synch
2133 * event data
2134 * @wma: Global WMA Handle
2135 * @roam_synch_ind_ptr: Buffer to be filled
2136 * @param_buf: Source buffer
2137 *
2138 * Firmware sends all the required information required for roam
2139 * synch propagation as TLV's and stored in param_buf. These
2140 * parameters are parsed and filled into the roam synch indication
2141 * buffer which will be used at different layers for propagation.
2142 *
2143 * Return: None
2144 */
2145static void wma_fill_data_synch_event(tp_wma_handle wma,
2146 roam_offload_synch_ind *roam_synch_ind_ptr,
2147 WMI_ROAM_SYNCH_EVENTID_param_tlvs *param_buf)
2148{
2149 uint8_t *bcn_probersp_ptr;
2150 uint8_t *reassoc_rsp_ptr;
2151 uint8_t *reassoc_req_ptr;
2152 wmi_roam_synch_event_fixed_param *synch_event;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002153
2154 synch_event = param_buf->fixed_param;
Padma, Santhosh Kumarcd35f532016-12-27 12:07:39 +05302155
Naveen Rawat14298b92015-11-25 16:27:41 -08002156 /* Beacon/Probe Rsp data */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002157 roam_synch_ind_ptr->beaconProbeRespOffset =
2158 sizeof(roam_offload_synch_ind);
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002159 bcn_probersp_ptr = (uint8_t *) roam_synch_ind_ptr +
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002160 roam_synch_ind_ptr->beaconProbeRespOffset;
2161 roam_synch_ind_ptr->beaconProbeRespLength =
2162 synch_event->bcn_probe_rsp_len;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302163 qdf_mem_copy(bcn_probersp_ptr, param_buf->bcn_probe_rsp_frame,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002164 roam_synch_ind_ptr->beaconProbeRespLength);
Naveen Rawat14298b92015-11-25 16:27:41 -08002165 /* ReAssoc Rsp data */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002166 roam_synch_ind_ptr->reassocRespOffset =
2167 sizeof(roam_offload_synch_ind) +
2168 roam_synch_ind_ptr->beaconProbeRespLength;
2169 roam_synch_ind_ptr->reassocRespLength = synch_event->reassoc_rsp_len;
2170 reassoc_rsp_ptr = (uint8_t *) roam_synch_ind_ptr +
2171 roam_synch_ind_ptr->reassocRespOffset;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302172 qdf_mem_copy(reassoc_rsp_ptr,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002173 param_buf->reassoc_rsp_frame,
2174 roam_synch_ind_ptr->reassocRespLength);
Naveen Rawat14298b92015-11-25 16:27:41 -08002175
2176 /* ReAssoc Req data */
2177 roam_synch_ind_ptr->reassoc_req_offset =
2178 sizeof(roam_offload_synch_ind) +
2179 roam_synch_ind_ptr->beaconProbeRespLength +
2180 roam_synch_ind_ptr->reassocRespLength;
2181 roam_synch_ind_ptr->reassoc_req_length = synch_event->reassoc_req_len;
2182 reassoc_req_ptr = (uint8_t *) roam_synch_ind_ptr +
2183 roam_synch_ind_ptr->reassoc_req_offset;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302184 qdf_mem_copy(reassoc_req_ptr, param_buf->reassoc_req_frame,
Naveen Rawat14298b92015-11-25 16:27:41 -08002185 roam_synch_ind_ptr->reassoc_req_length);
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302186}
2187
2188/**
2189 * wma_fill_roam_synch_buffer() - Fill the the roam sync buffer
2190 * @wma: Global WMA Handle
2191 * @roam_synch_ind_ptr: Buffer to be filled
2192 * @param_buf: Source buffer
2193 *
2194 * Firmware sends all the required information required for roam
2195 * synch propagation as TLV's and stored in param_buf. These
2196 * parameters are parsed and filled into the roam synch indication
2197 * buffer which will be used at different layers for propagation.
2198 *
2199 * Return: Success or Failure
2200 */
2201static int wma_fill_roam_synch_buffer(tp_wma_handle wma,
2202 roam_offload_synch_ind *roam_synch_ind_ptr,
2203 WMI_ROAM_SYNCH_EVENTID_param_tlvs *param_buf)
2204{
2205 wmi_roam_synch_event_fixed_param *synch_event;
2206 wmi_channel *chan;
2207 wmi_key_material *key;
2208 struct wma_txrx_node *iface = NULL;
2209 wmi_roam_fils_synch_tlv_param *fils_info;
Pragaspathi Thilagarajea97fe92018-07-23 15:01:54 +05302210 int status = -EINVAL;
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302211
2212 synch_event = param_buf->fixed_param;
2213 roam_synch_ind_ptr->roamedVdevId = synch_event->vdev_id;
2214 roam_synch_ind_ptr->authStatus = synch_event->auth_status;
2215 roam_synch_ind_ptr->roamReason = synch_event->roam_reason;
2216 roam_synch_ind_ptr->rssi = synch_event->rssi;
Pragaspathi Thilagarajea97fe92018-07-23 15:01:54 +05302217 iface = &wma->interfaces[synch_event->vdev_id];
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302218 WMI_MAC_ADDR_TO_CHAR_ARRAY(&synch_event->bssid,
2219 roam_synch_ind_ptr->bssid.bytes);
2220 WMA_LOGD("%s: roamedVdevId %d authStatus %d roamReason %d rssi %d isBeacon %d",
2221 __func__, roam_synch_ind_ptr->roamedVdevId,
2222 roam_synch_ind_ptr->authStatus, roam_synch_ind_ptr->roamReason,
2223 roam_synch_ind_ptr->rssi, roam_synch_ind_ptr->isBeacon);
2224
2225 if (!QDF_IS_STATUS_SUCCESS(
Jeff Johnson9f18aa72018-12-02 12:05:12 -08002226 wma->csr_roam_synch_cb((struct mac_context *)wma->mac_context,
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302227 roam_synch_ind_ptr, NULL, SIR_ROAMING_DEREGISTER_STA))) {
2228 WMA_LOGE("LFR3: CSR Roam synch cb failed");
Pragaspathi Thilagarajea97fe92018-07-23 15:01:54 +05302229 wma_free_roam_synch_frame_ind(iface);
2230 return status;
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302231 }
2232
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302233 /*
2234 * If lengths of bcn_probe_rsp, reassoc_req and reassoc_rsp are zero in
2235 * synch_event driver would have received bcn_probe_rsp, reassoc_req
2236 * and reassoc_rsp via the event WMI_ROAM_SYNCH_FRAME_EVENTID
2237 */
2238 if ((!synch_event->bcn_probe_rsp_len) &&
2239 (!synch_event->reassoc_req_len) &&
2240 (!synch_event->reassoc_rsp_len)) {
2241 if (!iface->roam_synch_frame_ind.bcn_probe_rsp) {
2242 WMA_LOGE("LFR3: bcn_probe_rsp is NULL");
2243 QDF_ASSERT(iface->roam_synch_frame_ind.
2244 bcn_probe_rsp != NULL);
Pragaspathi Thilagarajea97fe92018-07-23 15:01:54 +05302245 wma_free_roam_synch_frame_ind(iface);
2246 return status;
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302247 }
2248 if (!iface->roam_synch_frame_ind.reassoc_rsp) {
2249 WMA_LOGE("LFR3: reassoc_rsp is NULL");
2250 QDF_ASSERT(iface->roam_synch_frame_ind.
2251 reassoc_rsp != NULL);
Pragaspathi Thilagarajea97fe92018-07-23 15:01:54 +05302252 wma_free_roam_synch_frame_ind(iface);
2253 return status;
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302254 }
2255 if (!iface->roam_synch_frame_ind.reassoc_req) {
2256 WMA_LOGE("LFR3: reassoc_req is NULL");
2257 QDF_ASSERT(iface->roam_synch_frame_ind.
2258 reassoc_req != NULL);
Pragaspathi Thilagarajea97fe92018-07-23 15:01:54 +05302259 wma_free_roam_synch_frame_ind(iface);
2260 return status;
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302261 }
2262 wma_fill_data_synch_frame_event(wma, roam_synch_ind_ptr, iface);
2263 } else {
2264 wma_fill_data_synch_event(wma, roam_synch_ind_ptr, param_buf);
2265 }
Naveen Rawat14298b92015-11-25 16:27:41 -08002266
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002267 chan = (wmi_channel *) param_buf->chan;
2268 roam_synch_ind_ptr->chan_freq = chan->mhz;
2269 key = (wmi_key_material *) param_buf->key;
2270 if (key != NULL) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302271 qdf_mem_copy(roam_synch_ind_ptr->kck, key->kck,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002272 SIR_KCK_KEY_LEN);
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05302273 roam_synch_ind_ptr->kek_len = SIR_KEK_KEY_LEN;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302274 qdf_mem_copy(roam_synch_ind_ptr->kek, key->kek,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002275 SIR_KEK_KEY_LEN);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302276 qdf_mem_copy(roam_synch_ind_ptr->replay_ctr,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002277 key->replay_counter, SIR_REPLAY_CTR_LEN);
2278 }
Naveen Rawat8cc23b02016-07-14 12:22:56 -07002279 if (param_buf->hw_mode_transition_fixed_param)
2280 wma_process_pdev_hw_mode_trans_ind(wma,
2281 param_buf->hw_mode_transition_fixed_param,
2282 param_buf->wmi_pdev_set_hw_mode_response_vdev_mac_mapping,
2283 &roam_synch_ind_ptr->hw_mode_trans_ind);
2284 else
2285 WMA_LOGD(FL("hw_mode transition fixed param is NULL"));
Varun Reddy Yeturu88f123c2017-03-14 18:24:32 -07002286
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05302287 fils_info = (wmi_roam_fils_synch_tlv_param *)
2288 (param_buf->roam_fils_synch_info);
Vignesh Viswanathan686833a2018-04-20 12:51:24 +05302289 if (fils_info) {
2290 if ((fils_info->kek_len > SIR_KEK_KEY_LEN_FILS) ||
2291 (fils_info->pmk_len > SIR_PMK_LEN)) {
2292 WMA_LOGE("%s: Invalid kek_len %d or pmk_len %d",
2293 __func__,
2294 fils_info->kek_len,
2295 fils_info->pmk_len);
Pragaspathi Thilagarajea97fe92018-07-23 15:01:54 +05302296 wma_free_roam_synch_frame_ind(iface);
2297 return status;
Vignesh Viswanathan686833a2018-04-20 12:51:24 +05302298 }
2299
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05302300 roam_synch_ind_ptr->kek_len = fils_info->kek_len;
2301 qdf_mem_copy(roam_synch_ind_ptr->kek, fils_info->kek,
2302 fils_info->kek_len);
2303
2304 roam_synch_ind_ptr->pmk_len = fils_info->pmk_len;
2305 qdf_mem_copy(roam_synch_ind_ptr->pmk, fils_info->pmk,
2306 fils_info->pmk_len);
2307
2308 qdf_mem_copy(roam_synch_ind_ptr->pmkid, fils_info->pmkid,
2309 SIR_PMKID_LEN);
2310
2311 roam_synch_ind_ptr->update_erp_next_seq_num =
2312 fils_info->update_erp_next_seq_num;
2313 roam_synch_ind_ptr->next_erp_seq_num =
2314 fils_info->next_erp_seq_num;
2315
Vignesh Viswanathan8da68cf2017-09-07 14:00:04 +05302316 WMA_LOGD("Update ERP Seq Num %d, Next ERP Seq Num %d",
2317 roam_synch_ind_ptr->update_erp_next_seq_num,
2318 roam_synch_ind_ptr->next_erp_seq_num);
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05302319 }
Pragaspathi Thilagarajea97fe92018-07-23 15:01:54 +05302320 wma_free_roam_synch_frame_ind(iface);
Varun Reddy Yeturu1ce7aff2017-03-15 16:14:03 -07002321 return 0;
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002322}
2323
2324/**
2325 * wma_roam_update_vdev() - Update the STA and BSS
2326 * @wma: Global WMA Handle
2327 * @roam_synch_ind_ptr: Information needed for roam sync propagation
2328 *
2329 * This function will perform all the vdev related operations with
2330 * respect to the self sta and the peer after roaming and completes
2331 * the roam synch propagation with respect to WMA layer.
2332 *
2333 * Return: None
2334 */
Jeff Johnsonc4b47a92016-10-07 12:34:41 -07002335static void wma_roam_update_vdev(tp_wma_handle wma,
2336 roam_offload_synch_ind *roam_synch_ind_ptr)
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002337{
2338 tDeleteBssParams *del_bss_params;
2339 tDeleteStaParams *del_sta_params;
2340 tLinkStateParams *set_link_params;
2341 tAddStaParams *add_sta_params;
2342 uint8_t vdev_id;
2343
Naveen Rawat746a90b2017-06-07 15:16:35 -07002344 vdev_id = roam_synch_ind_ptr->roamedVdevId;
2345 wma->interfaces[vdev_id].nss = roam_synch_ind_ptr->nss;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302346 del_bss_params = qdf_mem_malloc(sizeof(*del_bss_params));
2347 del_sta_params = qdf_mem_malloc(sizeof(*del_sta_params));
2348 set_link_params = qdf_mem_malloc(sizeof(*set_link_params));
2349 add_sta_params = qdf_mem_malloc(sizeof(*add_sta_params));
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002350 if (!del_bss_params || !del_sta_params ||
Arif Hussain157263f2018-10-03 13:07:15 -07002351 !set_link_params || !add_sta_params)
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002352 return;
Arif Hussain157263f2018-10-03 13:07:15 -07002353
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302354 qdf_mem_zero(del_bss_params, sizeof(*del_bss_params));
2355 qdf_mem_zero(del_sta_params, sizeof(*del_sta_params));
2356 qdf_mem_zero(set_link_params, sizeof(*set_link_params));
2357 qdf_mem_zero(add_sta_params, sizeof(*add_sta_params));
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002358
2359 del_bss_params->smesessionId = vdev_id;
2360 del_sta_params->smesessionId = vdev_id;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302361 qdf_mem_copy(del_bss_params->bssid, wma->interfaces[vdev_id].bssid,
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002362 IEEE80211_ADDR_LEN);
2363 set_link_params->state = eSIR_LINK_PREASSOC_STATE;
Varun Reddy Yeturu28925b42016-02-08 07:18:50 -08002364 qdf_mem_copy(set_link_params->selfMacAddr,
2365 roam_synch_ind_ptr->self_mac.bytes, IEEE80211_ADDR_LEN);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302366 qdf_mem_copy(set_link_params->bssid, roam_synch_ind_ptr->bssid.bytes,
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002367 IEEE80211_ADDR_LEN);
2368 add_sta_params->staType = STA_ENTRY_SELF;
2369 add_sta_params->smesessionId = vdev_id;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302370 qdf_mem_copy(&add_sta_params->bssId, &roam_synch_ind_ptr->bssid.bytes,
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002371 IEEE80211_ADDR_LEN);
2372 add_sta_params->staIdx = STA_INVALID_IDX;
2373 add_sta_params->assocId = roam_synch_ind_ptr->aid;
2374
2375 wma_delete_sta(wma, del_sta_params);
2376 wma_delete_bss(wma, del_bss_params);
2377 wma_set_linkstate(wma, set_link_params);
2378 wma_add_bss(wma, (tpAddBssParams)roam_synch_ind_ptr->add_bss_params);
2379 wma_add_sta(wma, add_sta_params);
Abhishek Singhfb5b4d32018-12-06 11:53:08 +05302380 wma_vdev_set_mlme_state_run(wma, vdev_id);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302381 qdf_mem_copy(wma->interfaces[vdev_id].bssid,
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002382 roam_synch_ind_ptr->bssid.bytes, IEEE80211_ADDR_LEN);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302383 qdf_mem_free(del_bss_params);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302384 qdf_mem_free(set_link_params);
2385 qdf_mem_free(add_sta_params);
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002386}
2387
2388/**
2389 * wma_roam_synch_event_handler() - roam synch event handler
2390 * @handle: wma handle
2391 * @event: event data
2392 * @len: length of data
2393 *
2394 * This function is roam synch event handler. It sends roam
2395 * indication for upper layer.
2396 *
2397 * Return: Success or Failure status
2398 */
2399int wma_roam_synch_event_handler(void *handle, uint8_t *event,
2400 uint32_t len)
2401{
2402 WMI_ROAM_SYNCH_EVENTID_param_tlvs *param_buf = NULL;
2403 wmi_roam_synch_event_fixed_param *synch_event = NULL;
2404 tp_wma_handle wma = (tp_wma_handle) handle;
Varun Reddy Yeturu1ce7aff2017-03-15 16:14:03 -07002405 roam_offload_synch_ind *roam_synch_ind_ptr = NULL;
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002406 tpSirBssDescription bss_desc_ptr = NULL;
2407 uint16_t ie_len = 0;
2408 int status = -EINVAL;
Varun Reddy Yeturu1ce7aff2017-03-15 16:14:03 -07002409 tSirRoamOffloadScanReq *roam_req;
Varun Reddy Yeturu5ab47462016-05-08 18:08:11 -07002410 qdf_time_t roam_synch_received = qdf_get_system_timestamp();
Vignesh Viswanathanf8800692017-09-28 14:49:00 +05302411 uint32_t roam_synch_data_len;
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302412 A_UINT32 bcn_probe_rsp_len;
2413 A_UINT32 reassoc_rsp_len;
2414 A_UINT32 reassoc_req_len;
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002415
2416 WMA_LOGD("LFR3:%s", __func__);
2417 if (!event) {
2418 WMA_LOGE("%s: event param null", __func__);
Varun Reddy Yeturu1ce7aff2017-03-15 16:14:03 -07002419 goto cleanup_label;
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002420 }
2421
2422 param_buf = (WMI_ROAM_SYNCH_EVENTID_param_tlvs *) event;
2423 if (!param_buf) {
2424 WMA_LOGE("%s: received null buf from target", __func__);
Varun Reddy Yeturu1ce7aff2017-03-15 16:14:03 -07002425 goto cleanup_label;
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002426 }
2427
2428 synch_event = param_buf->fixed_param;
2429 if (!synch_event) {
2430 WMA_LOGE("%s: received null event data from target", __func__);
Varun Reddy Yeturu1ce7aff2017-03-15 16:14:03 -07002431 goto cleanup_label;
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002432 }
2433
Pragaspathi Thilagaraj54ac69d2018-04-02 17:21:26 +05302434 if (synch_event->vdev_id >= wma->max_bssid) {
2435 WMA_LOGE("%s: received invalid vdev_id %d",
2436 __func__, synch_event->vdev_id);
2437 return status;
2438 }
2439
Tushnim Bhattacharyyaeb622b02018-05-07 13:50:51 -07002440 /*
2441 * This flag is set during ROAM_START and once this event is being
2442 * executed which is a run to completion, no other event can interrupt
2443 * this in MC thread context. So, it is OK to reset the flag here as
2444 * soon as we receive this event.
2445 */
2446 wma->interfaces[synch_event->vdev_id].roaming_in_progress = false;
2447
Abhinav Kumara03659c2017-12-28 15:18:07 +05302448 if (synch_event->bcn_probe_rsp_len >
2449 param_buf->num_bcn_probe_rsp_frame ||
2450 synch_event->reassoc_req_len >
2451 param_buf->num_reassoc_req_frame ||
2452 synch_event->reassoc_rsp_len >
2453 param_buf->num_reassoc_rsp_frame) {
2454 WMA_LOGD("Invalid synch payload: LEN bcn:%d, req:%d, rsp:%d",
2455 synch_event->bcn_probe_rsp_len,
2456 synch_event->reassoc_req_len,
2457 synch_event->reassoc_rsp_len);
2458 goto cleanup_label;
2459 }
Vignesh Viswanathanf8800692017-09-28 14:49:00 +05302460
Deepak Dhamdheref918d422017-07-06 12:56:29 -07002461 wlan_roam_debug_log(synch_event->vdev_id, DEBUG_ROAM_SYNCH_IND,
2462 DEBUG_INVALID_PEER_ID, NULL, NULL,
2463 synch_event->bssid.mac_addr31to0,
2464 synch_event->bssid.mac_addr47to32);
Himanshu Agarwal67a863b2016-09-20 15:09:09 +05302465 DPTRACE(qdf_dp_trace_record_event(QDF_DP_TRACE_EVENT_RECORD,
Venkata Sharath Chandra Manchala0b9fc632017-05-15 14:35:15 -07002466 synch_event->vdev_id, QDF_TRACE_DEFAULT_PDEV_ID,
2467 QDF_PROTO_TYPE_EVENT, QDF_ROAM_SYNCH));
Himanshu Agarwal67a863b2016-09-20 15:09:09 +05302468
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002469 if (wma_is_roam_synch_in_progress(wma, synch_event->vdev_id)) {
2470 WMA_LOGE("%s: Ignoring RSI since one is already in progress",
2471 __func__);
Varun Reddy Yeturu1ce7aff2017-03-15 16:14:03 -07002472 goto cleanup_label;
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002473 }
Abhinav Kumar50d4dc72018-06-15 16:35:50 +05302474 WMA_LOGD("LFR3: Received WMA_ROAM_OFFLOAD_SYNCH_IND");
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002475
Varun Reddy Yeturu46ba20c2017-08-17 15:03:27 -07002476 /*
2477 * All below length fields are unsigned and hence positive numbers.
2478 * Maximum number during the addition would be (3 * MAX_LIMIT(UINT32) +
2479 * few fixed fields).
2480 */
Vignesh Viswanathanf8800692017-09-28 14:49:00 +05302481 WMA_LOGD("synch payload: LEN bcn:%d, req:%d, rsp:%d",
2482 synch_event->bcn_probe_rsp_len,
2483 synch_event->reassoc_req_len,
2484 synch_event->reassoc_rsp_len);
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302485
Vignesh Viswanathanf8800692017-09-28 14:49:00 +05302486 /*
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302487 * If lengths of bcn_probe_rsp, reassoc_req and reassoc_rsp are zero in
2488 * synch_event driver would have received bcn_probe_rsp, reassoc_req
2489 * and reassoc_rsp via the event WMI_ROAM_SYNCH_FRAME_EVENTID
Vignesh Viswanathanf8800692017-09-28 14:49:00 +05302490 */
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302491 if ((!synch_event->bcn_probe_rsp_len) &&
2492 (!synch_event->reassoc_req_len) &&
2493 (!synch_event->reassoc_rsp_len)) {
2494 bcn_probe_rsp_len = wma->interfaces[synch_event->vdev_id].
2495 roam_synch_frame_ind.
2496 bcn_probe_rsp_len;
2497 reassoc_req_len = wma->interfaces[synch_event->vdev_id].
2498 roam_synch_frame_ind.reassoc_req_len;
2499 reassoc_rsp_len = wma->interfaces[synch_event->vdev_id].
2500 roam_synch_frame_ind.reassoc_rsp_len;
2501
2502 roam_synch_data_len = bcn_probe_rsp_len + reassoc_rsp_len +
2503 reassoc_req_len + sizeof(roam_offload_synch_ind);
2504
2505 WMA_LOGD("Updated synch payload: LEN bcn:%d, req:%d, rsp:%d",
2506 bcn_probe_rsp_len,
2507 reassoc_req_len,
2508 reassoc_rsp_len);
2509 } else {
2510 bcn_probe_rsp_len = synch_event->bcn_probe_rsp_len;
2511 reassoc_req_len = synch_event->reassoc_req_len;
2512 reassoc_rsp_len = synch_event->reassoc_rsp_len;
2513
2514 if (synch_event->bcn_probe_rsp_len > WMI_SVC_MSG_MAX_SIZE)
2515 goto cleanup_label;
2516 if (synch_event->reassoc_rsp_len >
2517 (WMI_SVC_MSG_MAX_SIZE - synch_event->bcn_probe_rsp_len))
2518 goto cleanup_label;
2519 if (synch_event->reassoc_req_len >
2520 WMI_SVC_MSG_MAX_SIZE - (synch_event->bcn_probe_rsp_len +
2521 synch_event->reassoc_rsp_len))
2522 goto cleanup_label;
2523
2524 roam_synch_data_len = bcn_probe_rsp_len +
2525 reassoc_rsp_len + reassoc_req_len;
2526
2527 /*
2528 * Below is the check for the entire size of the message
2529 * received from the firmware.
2530 */
2531 if (roam_synch_data_len > WMI_SVC_MSG_MAX_SIZE -
2532 (sizeof(*synch_event) + sizeof(wmi_channel) +
2533 sizeof(wmi_key_material) + sizeof(uint32_t)))
2534 goto cleanup_label;
2535
2536 roam_synch_data_len += sizeof(roam_offload_synch_ind);
2537 }
2538
Kiran Kumar Lokere1d411bb2017-11-29 15:24:05 -08002539 WMA_LOGD("synch payload: LEN bcn:%d, req:%d, rsp:%d",
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302540 bcn_probe_rsp_len,
2541 reassoc_req_len,
2542 reassoc_rsp_len);
Varun Reddy Yeturu46ba20c2017-08-17 15:03:27 -07002543
Mukul Sharmae44d0542017-05-23 21:50:56 +05302544 cds_host_diag_log_work(&wma->roam_ho_wl,
2545 WMA_ROAM_HO_WAKE_LOCK_DURATION,
2546 WIFI_POWER_EVENT_WAKELOCK_WOW);
2547 qdf_wake_lock_timeout_acquire(&wma->roam_ho_wl,
yeshwanth sriram guntuka37c09822017-01-24 18:30:15 +05302548 WMA_ROAM_HO_WAKE_LOCK_DURATION);
2549
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002550 wma->interfaces[synch_event->vdev_id].roam_synch_in_progress = true;
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302551
Arif Hussain157263f2018-10-03 13:07:15 -07002552 roam_synch_ind_ptr = qdf_mem_malloc(roam_synch_data_len);
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002553 if (!roam_synch_ind_ptr) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302554 QDF_ASSERT(roam_synch_ind_ptr != NULL);
yeshwanth sriram guntuka37c09822017-01-24 18:30:15 +05302555 status = -ENOMEM;
2556 goto cleanup_label;
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002557 }
Vignesh Viswanathanf8800692017-09-28 14:49:00 +05302558 qdf_mem_zero(roam_synch_ind_ptr, roam_synch_data_len);
Varun Reddy Yeturu1ce7aff2017-03-15 16:14:03 -07002559 status = wma_fill_roam_synch_buffer(wma,
2560 roam_synch_ind_ptr, param_buf);
2561 if (status != 0)
Varun Reddy Yeturu88f123c2017-03-14 18:24:32 -07002562 goto cleanup_label;
Naveen Rawat8cc23b02016-07-14 12:22:56 -07002563 /* 24 byte MAC header and 12 byte to ssid IE */
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002564 if (roam_synch_ind_ptr->beaconProbeRespLength >
2565 (SIR_MAC_HDR_LEN_3A + SIR_MAC_B_PR_SSID_OFFSET)) {
2566 ie_len = roam_synch_ind_ptr->beaconProbeRespLength -
2567 (SIR_MAC_HDR_LEN_3A + SIR_MAC_B_PR_SSID_OFFSET);
2568 } else {
2569 WMA_LOGE("LFR3: Invalid Beacon Length");
2570 goto cleanup_label;
2571 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302572 bss_desc_ptr = qdf_mem_malloc(sizeof(tSirBssDescription) + ie_len);
Arif Hussain157263f2018-10-03 13:07:15 -07002573 if (!bss_desc_ptr) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302574 QDF_ASSERT(bss_desc_ptr != NULL);
yeshwanth sriram guntuka37c09822017-01-24 18:30:15 +05302575 status = -ENOMEM;
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002576 goto cleanup_label;
2577 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302578 qdf_mem_zero(bss_desc_ptr, sizeof(tSirBssDescription) + ie_len);
Selvaraj, Sridhara6e3eba2017-03-14 19:52:39 +05302579 if (QDF_IS_STATUS_ERROR(wma->pe_roam_synch_cb(
Jeff Johnson9f18aa72018-12-02 12:05:12 -08002580 (struct mac_context *)wma->mac_context,
Varun Reddy Yeturub5d858e2017-12-15 16:08:13 -08002581 roam_synch_ind_ptr, bss_desc_ptr,
2582 SIR_ROAM_SYNCH_PROPAGATION))) {
Selvaraj, Sridhara6e3eba2017-03-14 19:52:39 +05302583 WMA_LOGE("LFR3: PE roam synch cb failed");
2584 status = -EBUSY;
2585 goto cleanup_label;
2586 }
Naveen Rawat746a90b2017-06-07 15:16:35 -07002587
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002588 wma_roam_update_vdev(wma, roam_synch_ind_ptr);
Jeff Johnson9f18aa72018-12-02 12:05:12 -08002589 wma->csr_roam_synch_cb((struct mac_context *)wma->mac_context,
Varun Reddy Yeturuf907f912016-03-21 15:06:22 -07002590 roam_synch_ind_ptr, bss_desc_ptr, SIR_ROAM_SYNCH_PROPAGATION);
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002591 wma_process_roam_synch_complete(wma, synch_event->vdev_id);
Naveen Rawat8cc23b02016-07-14 12:22:56 -07002592
2593 /* update freq and channel width */
2594 wma->interfaces[synch_event->vdev_id].mhz =
2595 roam_synch_ind_ptr->chan_freq;
2596 if (roam_synch_ind_ptr->join_rsp)
2597 wma->interfaces[synch_event->vdev_id].chan_width =
2598 roam_synch_ind_ptr->join_rsp->vht_channel_width;
2599
Jeff Johnson9f18aa72018-12-02 12:05:12 -08002600 wma->csr_roam_synch_cb((struct mac_context *)wma->mac_context,
Naveen Rawat8cc23b02016-07-14 12:22:56 -07002601 roam_synch_ind_ptr, bss_desc_ptr, SIR_ROAM_SYNCH_COMPLETE);
Varun Reddy Yeturu5ab47462016-05-08 18:08:11 -07002602 wma->interfaces[synch_event->vdev_id].roam_synch_delay =
2603 qdf_get_system_timestamp() - roam_synch_received;
2604 WMA_LOGD("LFR3: roam_synch_delay:%d",
2605 wma->interfaces[synch_event->vdev_id].roam_synch_delay);
Jeff Johnson9f18aa72018-12-02 12:05:12 -08002606 wma->csr_roam_synch_cb((struct mac_context *)wma->mac_context,
Varun Reddy Yeturu04251862016-09-16 10:33:19 -07002607 roam_synch_ind_ptr, bss_desc_ptr, SIR_ROAM_SYNCH_NAPI_OFF);
yeshwanth sriram guntuka37c09822017-01-24 18:30:15 +05302608
2609 status = 0;
2610
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002611cleanup_label:
Varun Reddy Yeturu1ce7aff2017-03-15 16:14:03 -07002612 if (status != 0) {
2613 if (roam_synch_ind_ptr)
Jeff Johnson9f18aa72018-12-02 12:05:12 -08002614 wma->csr_roam_synch_cb((struct mac_context *)wma->mac_context,
Varun Reddy Yeturu1ce7aff2017-03-15 16:14:03 -07002615 roam_synch_ind_ptr, NULL, SIR_ROAMING_ABORT);
2616 roam_req = qdf_mem_malloc(sizeof(tSirRoamOffloadScanReq));
Varun Reddy Yeturu06488012017-05-25 11:44:10 -07002617 if (roam_req && synch_event) {
Krunal Sonifea06802017-04-13 14:44:48 -07002618 roam_req->Command = ROAM_SCAN_OFFLOAD_STOP;
Varun Reddy Yeturubc1bea02018-02-01 18:12:34 -08002619 roam_req->reason = REASON_ROAM_SYNCH_FAILED;
Varun Reddy Yeturu06488012017-05-25 11:44:10 -07002620 roam_req->sessionId = synch_event->vdev_id;
Krunal Sonifea06802017-04-13 14:44:48 -07002621 wma_process_roaming_config(wma, roam_req);
2622 }
Varun Reddy Yeturu1ce7aff2017-03-15 16:14:03 -07002623 }
yeshwanth sriram guntuka37c09822017-01-24 18:30:15 +05302624 if (roam_synch_ind_ptr && roam_synch_ind_ptr->join_rsp)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302625 qdf_mem_free(roam_synch_ind_ptr->join_rsp);
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002626 if (roam_synch_ind_ptr)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302627 qdf_mem_free(roam_synch_ind_ptr);
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002628 if (bss_desc_ptr)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302629 qdf_mem_free(bss_desc_ptr);
Krunal Sonifea06802017-04-13 14:44:48 -07002630 if (wma && synch_event)
2631 wma->interfaces[synch_event->vdev_id].roam_synch_in_progress =
2632 false;
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002633
yeshwanth sriram guntuka37c09822017-01-24 18:30:15 +05302634 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002635}
2636
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302637int wma_roam_synch_frame_event_handler(void *handle, uint8_t *event,
2638 uint32_t len)
2639{
2640 WMI_ROAM_SYNCH_FRAME_EVENTID_param_tlvs *param_buf = NULL;
2641 wmi_roam_synch_frame_event_fixed_param *synch_frame_event = NULL;
2642 tp_wma_handle wma = (tp_wma_handle) handle;
2643 A_UINT32 vdev_id;
2644 struct wma_txrx_node *iface = NULL;
2645 int status = -EINVAL;
2646
2647 WMA_LOGD("LFR3:Synch Frame event");
2648 if (!event) {
2649 WMA_LOGE("event param null");
Pragaspathi Thilagarajea97fe92018-07-23 15:01:54 +05302650 return status;
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302651 }
2652
2653 param_buf = (WMI_ROAM_SYNCH_FRAME_EVENTID_param_tlvs *) event;
2654 if (!param_buf) {
2655 WMA_LOGE("received null buf from target");
Pragaspathi Thilagarajea97fe92018-07-23 15:01:54 +05302656 return status;
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302657 }
2658
2659 synch_frame_event = param_buf->fixed_param;
2660 if (!synch_frame_event) {
2661 WMA_LOGE("received null event data from target");
Pragaspathi Thilagarajea97fe92018-07-23 15:01:54 +05302662 return status;
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302663 }
2664
2665 if (synch_frame_event->vdev_id >= wma->max_bssid) {
2666 WMA_LOGE("received invalid vdev_id %d",
2667 synch_frame_event->vdev_id);
Pragaspathi Thilagarajea97fe92018-07-23 15:01:54 +05302668 return status;
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302669 }
2670
Will Huang6ab242c2018-08-29 15:43:24 +08002671 if (synch_frame_event->bcn_probe_rsp_len >
2672 param_buf->num_bcn_probe_rsp_frame ||
2673 synch_frame_event->reassoc_req_len >
2674 param_buf->num_reassoc_req_frame ||
2675 synch_frame_event->reassoc_rsp_len >
2676 param_buf->num_reassoc_rsp_frame) {
2677 WMA_LOGE("fixed/actual len err: bcn:%d/%d req:%d/%d rsp:%d/%d",
2678 synch_frame_event->bcn_probe_rsp_len,
2679 param_buf->num_bcn_probe_rsp_frame,
2680 synch_frame_event->reassoc_req_len,
2681 param_buf->num_reassoc_req_frame,
2682 synch_frame_event->reassoc_rsp_len,
2683 param_buf->num_reassoc_rsp_frame);
2684 return status;
2685 }
2686
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302687 vdev_id = synch_frame_event->vdev_id;
2688 iface = &wma->interfaces[vdev_id];
2689
2690 if (wma_is_roam_synch_in_progress(wma, vdev_id)) {
2691 WMA_LOGE("Ignoring this event as it is unexpected");
Pragaspathi Thilagarajea97fe92018-07-23 15:01:54 +05302692 wma_free_roam_synch_frame_ind(iface);
2693 return status;
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302694 }
2695 WMA_LOGD("LFR3: Received ROAM_SYNCH_FRAME_EVENT");
2696
2697 WMA_LOGD("synch frame payload: LEN bcn:%d, req:%d, rsp:%d morefrag: %d",
2698 synch_frame_event->bcn_probe_rsp_len,
2699 synch_frame_event->reassoc_req_len,
2700 synch_frame_event->reassoc_rsp_len,
2701 synch_frame_event->more_frag);
2702
2703 if (synch_frame_event->bcn_probe_rsp_len) {
2704 iface->roam_synch_frame_ind.bcn_probe_rsp_len =
2705 synch_frame_event->bcn_probe_rsp_len;
2706 iface->roam_synch_frame_ind.is_beacon =
2707 synch_frame_event->is_beacon;
2708
Pragaspathi Thilagarajea97fe92018-07-23 15:01:54 +05302709 if (iface->roam_synch_frame_ind.bcn_probe_rsp)
2710 qdf_mem_free(iface->roam_synch_frame_ind.
2711 bcn_probe_rsp);
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302712 iface->roam_synch_frame_ind.bcn_probe_rsp =
2713 qdf_mem_malloc(iface->roam_synch_frame_ind.
2714 bcn_probe_rsp_len);
2715 if (!iface->roam_synch_frame_ind.bcn_probe_rsp) {
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302716 QDF_ASSERT(iface->roam_synch_frame_ind.
2717 bcn_probe_rsp != NULL);
2718 status = -ENOMEM;
Pragaspathi Thilagarajea97fe92018-07-23 15:01:54 +05302719 wma_free_roam_synch_frame_ind(iface);
2720 return status;
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302721 }
2722 qdf_mem_copy(iface->roam_synch_frame_ind.
2723 bcn_probe_rsp,
2724 param_buf->bcn_probe_rsp_frame,
2725 iface->roam_synch_frame_ind.bcn_probe_rsp_len);
2726 }
2727
2728 if (synch_frame_event->reassoc_req_len) {
2729 iface->roam_synch_frame_ind.reassoc_req_len =
2730 synch_frame_event->reassoc_req_len;
2731
Pragaspathi Thilagarajea97fe92018-07-23 15:01:54 +05302732 if (iface->roam_synch_frame_ind.reassoc_req)
2733 qdf_mem_free(iface->roam_synch_frame_ind.reassoc_req);
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302734 iface->roam_synch_frame_ind.reassoc_req =
2735 qdf_mem_malloc(iface->roam_synch_frame_ind.
2736 reassoc_req_len);
2737 if (!iface->roam_synch_frame_ind.reassoc_req) {
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302738 QDF_ASSERT(iface->roam_synch_frame_ind.
2739 reassoc_req != NULL);
2740 status = -ENOMEM;
Pragaspathi Thilagarajea97fe92018-07-23 15:01:54 +05302741 wma_free_roam_synch_frame_ind(iface);
2742 return status;
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302743 }
2744 qdf_mem_copy(iface->roam_synch_frame_ind.reassoc_req,
2745 param_buf->reassoc_req_frame,
2746 iface->roam_synch_frame_ind.reassoc_req_len);
2747 }
2748
2749 if (synch_frame_event->reassoc_rsp_len) {
2750 iface->roam_synch_frame_ind.reassoc_rsp_len =
2751 synch_frame_event->reassoc_rsp_len;
2752
Pragaspathi Thilagarajea97fe92018-07-23 15:01:54 +05302753 if (iface->roam_synch_frame_ind.reassoc_rsp)
2754 qdf_mem_free(iface->roam_synch_frame_ind.reassoc_rsp);
2755
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302756 iface->roam_synch_frame_ind.reassoc_rsp =
2757 qdf_mem_malloc(iface->roam_synch_frame_ind.
2758 reassoc_rsp_len);
2759 if (!iface->roam_synch_frame_ind.reassoc_rsp) {
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302760 QDF_ASSERT(iface->roam_synch_frame_ind.
2761 reassoc_rsp != NULL);
2762 status = -ENOMEM;
Pragaspathi Thilagarajea97fe92018-07-23 15:01:54 +05302763 wma_free_roam_synch_frame_ind(iface);
2764 return status;
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302765 }
2766 qdf_mem_copy(iface->roam_synch_frame_ind.reassoc_rsp,
2767 param_buf->reassoc_rsp_frame,
2768 iface->roam_synch_frame_ind.reassoc_rsp_len);
2769 }
2770 return 0;
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302771}
2772
gaurank kathpaliac63859d2018-05-03 18:48:41 +05302773#define RSN_CAPS_SHIFT 16
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002774/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002775 * wma_roam_scan_fill_self_caps() - fill capabilities
2776 * @wma_handle: wma handle
2777 * @roam_offload_params: offload parameters
2778 * @roam_req: roam request
2779 *
2780 * This function fills roam self capablities.
2781 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05302782 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002783 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302784QDF_STATUS wma_roam_scan_fill_self_caps(tp_wma_handle wma_handle,
Himanshu Agarwalb56ad2e2016-07-19 15:43:09 +05302785 roam_offload_param *
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002786 roam_offload_params,
2787 tSirRoamOffloadScanReq *roam_req)
2788{
Karthik Kantamnenie3bbd7f2018-09-19 20:27:32 +05302789 qdf_size_t val_len;
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08002790 struct mac_context *mac = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002791 tSirMacCapabilityInfo selfCaps;
2792 uint32_t val = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002793 uint16_t *pCfgValue16;
2794 uint8_t nCfgValue8, *pCfgValue8;
2795 tSirMacQosInfoStation macQosInfoSta;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002796
hangtian127c9532019-01-12 13:29:07 +08002797 qdf_mem_zero(&macQosInfoSta, sizeof(tSirMacQosInfoStation));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002798 /* Roaming is done only for INFRA STA type.
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07002799 * So, ess will be one and ibss will be Zero
2800 */
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08002801 mac = cds_get_context(QDF_MODULE_ID_PE);
2802 if (!mac) {
2803 WMA_LOGE("%s:NULL mac ptr. Exiting", __func__);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302804 QDF_ASSERT(0);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302805 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002806 }
2807
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002808 selfCaps.ess = 1;
2809 selfCaps.ibss = 0;
Pragaspathi Thilagarajda3b5e22018-09-23 01:55:57 +05302810
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08002811 val = mac->mlme_cfg->wep_params.is_privacy_enabled;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002812 if (val)
2813 selfCaps.privacy = 1;
Vignesh Viswanathanddc89e52018-11-02 18:43:42 +05302814
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08002815 if (mac->mlme_cfg->ht_caps.short_preamble)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002816 selfCaps.shortPreamble = 1;
2817
2818 selfCaps.pbcc = 0;
2819 selfCaps.channelAgility = 0;
gaurank kathpaliae5a17e42018-09-10 10:05:25 +05302820
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08002821 if (mac->mlme_cfg->feature_flags.enable_short_slot_time_11g)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002822 selfCaps.shortSlotTime = 1;
Abhinav Kumard4d6eb72018-12-04 20:30:37 +05302823
2824 if (mac->mlme_cfg->gen.enabled_11h)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002825 selfCaps.spectrumMgt = 1;
Pragaspathi Thilagarajec7dc252018-09-06 15:38:49 +05302826
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08002827 if (mac->mlme_cfg->wmm_params.qos_enabled)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002828 selfCaps.qos = 1;
Pragaspathi Thilagarajec7dc252018-09-06 15:38:49 +05302829
Wu Gao5f764082019-01-04 15:54:38 +08002830 if (mac->mlme_cfg->scoring.apsd_enabled)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002831 selfCaps.apsd = 1;
Krishna Kumaar Natarajan4340c682015-11-03 12:09:00 -08002832
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08002833 selfCaps.rrm = mac->rrm.rrmSmeContext.rrmConfig.rrm_enabled;
Krishna Kumaar Natarajan4340c682015-11-03 12:09:00 -08002834
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08002835 val = mac->mlme_cfg->feature_flags.enable_block_ack;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002836 selfCaps.delayedBA =
2837 (uint16_t) ((val >> WNI_CFG_BLOCK_ACK_ENABLED_DELAYED) & 1);
2838 selfCaps.immediateBA =
2839 (uint16_t) ((val >> WNI_CFG_BLOCK_ACK_ENABLED_IMMEDIATE) & 1);
2840 pCfgValue16 = (uint16_t *) &selfCaps;
gaurank kathpaliac63859d2018-05-03 18:48:41 +05302841
2842 /*
2843 * RSN caps arent been sent to firmware, so in case of PMF required,
2844 * the firmware connects to a non PMF AP advertising PMF not required
2845 * in the re-assoc request which violates protocol.
2846 * So send this to firmware in the roam SCAN offload command to
2847 * let it configure the params in the re-assoc request too.
2848 * Instead of making another infra, send the RSN-CAPS in MSB of
2849 * beacon Caps.
2850 */
2851 roam_offload_params->capability = *((uint32_t *)(&roam_req->rsn_caps));
2852 roam_offload_params->capability <<= RSN_CAPS_SHIFT;
2853 roam_offload_params->capability |= ((*pCfgValue16) & 0xFFFF);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002854
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002855 roam_offload_params->ht_caps_info =
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08002856 *(uint32_t *)&mac->mlme_cfg->ht_caps.ht_cap_info;
Vignesh Viswanathanddc89e52018-11-02 18:43:42 +05302857
2858 roam_offload_params->ampdu_param =
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08002859 *(uint32_t *)&mac->mlme_cfg->ht_caps.ampdu_params;
Vignesh Viswanathanddc89e52018-11-02 18:43:42 +05302860
2861 roam_offload_params->ht_ext_cap =
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08002862 *(uint32_t *)&mac->mlme_cfg->ht_caps.ext_cap_info;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002863
Karthik Kantamnenie3bbd7f2018-09-19 20:27:32 +05302864 val_len = ROAM_OFFLOAD_NUM_MCS_SET;
2865 if (wlan_mlme_get_cfg_str((uint8_t *)roam_offload_params->mcsset,
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08002866 &mac->mlme_cfg->rates.supported_mcs_set,
Karthik Kantamnenie3bbd7f2018-09-19 20:27:32 +05302867 &val_len) != QDF_STATUS_SUCCESS) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302868 QDF_TRACE(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_ERROR,
Karthik Kantamnenie3bbd7f2018-09-19 20:27:32 +05302869 "Failed to get CFG_SUPPORTED_MCS_SET");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302870 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002871 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002872
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002873 /* tSirMacTxBFCapabilityInfo */
Abhinav Kumard4d6eb72018-12-04 20:30:37 +05302874 nCfgValue8 = (uint8_t)mac->mlme_cfg->vht_caps.vht_cap_info.tx_bf_cap;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002875 roam_offload_params->ht_txbf = nCfgValue8 & 0xFF;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002876 /* tSirMacASCapabilityInfo */
Abhinav Kumard4d6eb72018-12-04 20:30:37 +05302877 nCfgValue8 = (uint8_t)mac->mlme_cfg->vht_caps.vht_cap_info.as_cap;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002878 roam_offload_params->asel_cap = nCfgValue8 & 0xFF;
2879
2880 /* QOS Info */
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08002881 nCfgValue8 = mac->mlme_cfg->wmm_params.max_sp_length;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002882 macQosInfoSta.maxSpLen = nCfgValue8;
2883 macQosInfoSta.moreDataAck = 0;
2884 macQosInfoSta.qack = 0;
2885 macQosInfoSta.acbe_uapsd = roam_req->AcUapsd.acbe_uapsd;
2886 macQosInfoSta.acbk_uapsd = roam_req->AcUapsd.acbk_uapsd;
2887 macQosInfoSta.acvi_uapsd = roam_req->AcUapsd.acvi_uapsd;
2888 macQosInfoSta.acvo_uapsd = roam_req->AcUapsd.acvo_uapsd;
2889 pCfgValue8 = (uint8_t *) &macQosInfoSta;
2890 /* macQosInfoSta Only queue_request is set.Refer to
2891 * populate_dot11f_wmm_caps for more details
2892 */
2893 roam_offload_params->qos_caps = (*pCfgValue8) & 0xFF;
Naveen Rawat08340742016-11-17 14:54:39 -08002894 if (roam_offload_params->qos_caps)
2895 roam_offload_params->qos_enabled = true;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002896 roam_offload_params->wmm_caps = 0x4 & 0xFF;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302897 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002898}
2899
2900/**
2901 * wma_set_ric_req() - set ric request element
2902 * @wma: wma handle
2903 * @msg: message
2904 * @is_add_ts: is addts required
2905 *
2906 * This function sets ric request element for 11r roaming.
2907 *
2908 * Return: none
2909 */
2910void wma_set_ric_req(tp_wma_handle wma, void *msg, uint8_t is_add_ts)
2911{
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05302912 if (!wma) {
2913 WMA_LOGE("%s: wma handle is NULL", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002914 return;
2915 }
2916
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05302917 wmi_unified_set_ric_req_cmd(wma->wmi_handle, msg, is_add_ts);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002918}
2919#endif /* WLAN_FEATURE_ROAM_OFFLOAD */
2920
Qiwei Caie689a262018-07-26 15:50:22 +08002921#ifdef FEATURE_RSSI_MONITOR
2922/**
2923 * wma_set_rssi_monitoring() - set rssi monitoring
2924 * @handle: WMA handle
2925 * @req: rssi monitoring request structure
2926 *
2927 * This function reads the incoming @req and fill in the destination
2928 * WMI structure and send down the rssi monitoring configs down to the firmware
2929 *
2930 * Return: 0 on success; error number otherwise
2931 */
2932QDF_STATUS wma_set_rssi_monitoring(tp_wma_handle wma,
2933 struct rssi_monitor_req *req)
2934{
2935 struct rssi_monitor_param params = {0};
2936
2937 if (!wma) {
2938 WMA_LOGE("%s: wma handle is NULL", __func__);
2939 return QDF_STATUS_E_INVAL;
2940 }
2941
2942 params.request_id = req->request_id;
2943 params.session_id = req->session_id;
2944 params.min_rssi = req->min_rssi;
2945 params.max_rssi = req->max_rssi;
2946 params.control = req->control;
2947
2948 return wmi_unified_set_rssi_monitoring_cmd(wma->wmi_handle,
2949 &params);
2950}
2951
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002952/**
Varun Reddy Yeturubbbbe232016-02-29 14:01:57 -08002953 * wma_rssi_breached_event_handler() - rssi breached event handler
2954 * @handle: wma handle
2955 * @cmd_param_info: event handler data
2956 * @len: length of @cmd_param_info
2957 *
2958 * Return: 0 on success; error number otherwise
2959 */
2960int wma_rssi_breached_event_handler(void *handle,
2961 u_int8_t *cmd_param_info, u_int32_t len)
2962{
2963 WMI_RSSI_BREACH_EVENTID_param_tlvs *param_buf;
2964 wmi_rssi_breach_event_fixed_param *event;
2965 struct rssi_breach_event rssi;
Jeff Johnson9f18aa72018-12-02 12:05:12 -08002966 struct mac_context *mac = cds_get_context(QDF_MODULE_ID_PE);
Yeshwanth Sriram Guntuka14ab04c2018-09-21 15:06:49 +05302967 tp_wma_handle wma = cds_get_context(QDF_MODULE_ID_WMA);
Varun Reddy Yeturubbbbe232016-02-29 14:01:57 -08002968
Yeshwanth Sriram Guntuka14ab04c2018-09-21 15:06:49 +05302969 if (!mac || !wma) {
2970 WMA_LOGE("%s: Invalid mac/wma context", __func__);
Varun Reddy Yeturubbbbe232016-02-29 14:01:57 -08002971 return -EINVAL;
2972 }
2973 if (!mac->sme.rssi_threshold_breached_cb) {
2974 WMA_LOGE("%s: Callback not registered", __func__);
2975 return -EINVAL;
2976 }
2977 param_buf = (WMI_RSSI_BREACH_EVENTID_param_tlvs *)cmd_param_info;
2978 if (!param_buf) {
2979 WMA_LOGE("%s: Invalid rssi breached event", __func__);
2980 return -EINVAL;
2981 }
2982 event = param_buf->fixed_param;
2983
2984 rssi.request_id = event->request_id;
2985 rssi.session_id = event->vdev_id;
Yeshwanth Sriram Guntuka14ab04c2018-09-21 15:06:49 +05302986 if (wmi_service_enabled(wma->wmi_handle,
2987 wmi_service_hw_db2dbm_support))
2988 rssi.curr_rssi = event->rssi;
2989 else
2990 rssi.curr_rssi = event->rssi + WMA_TGT_NOISE_FLOOR_DBM;
Varun Reddy Yeturubbbbe232016-02-29 14:01:57 -08002991 WMI_MAC_ADDR_TO_CHAR_ARRAY(&event->bssid, rssi.curr_bssid.bytes);
2992
2993 WMA_LOGD("%s: req_id: %u vdev_id: %d curr_rssi: %d", __func__,
Qiwei Caie689a262018-07-26 15:50:22 +08002994 rssi.request_id, rssi.session_id, rssi.curr_rssi);
Varun Reddy Yeturubbbbe232016-02-29 14:01:57 -08002995 WMA_LOGI("%s: curr_bssid: %pM", __func__, rssi.curr_bssid.bytes);
2996
Jeff Johnson6aaaa992018-06-30 10:43:04 -07002997 mac->sme.rssi_threshold_breached_cb(mac->hdd_handle, &rssi);
Varun Reddy Yeturubbbbe232016-02-29 14:01:57 -08002998 WMA_LOGD("%s: Invoke HDD rssi breached callback", __func__);
2999 return 0;
3000}
Qiwei Caie689a262018-07-26 15:50:22 +08003001#endif /* FEATURE_RSSI_MONITOR */
Varun Reddy Yeturubbbbe232016-02-29 14:01:57 -08003002
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003003#ifdef WLAN_FEATURE_ROAM_OFFLOAD
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003004/**
3005 * wma_roam_ho_fail_handler() - LFR3.0 roam hand off failed handler
3006 * @wma: wma handle
3007 * @vdev_id: vdev id
3008 *
3009 * Return: none
3010 */
3011static void wma_roam_ho_fail_handler(tp_wma_handle wma, uint32_t vdev_id)
3012{
3013 tSirSmeHOFailureInd *ho_failure_ind;
Rajeev Kumarb60abe42017-01-21 15:39:31 -08003014 struct scheduler_msg sme_msg = { 0 };
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303015 QDF_STATUS qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003016
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303017 ho_failure_ind = qdf_mem_malloc(sizeof(tSirSmeHOFailureInd));
Arif Hussain157263f2018-10-03 13:07:15 -07003018 if (!ho_failure_ind)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003019 return;
Arif Hussain157263f2018-10-03 13:07:15 -07003020
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003021 ho_failure_ind->sessionId = vdev_id;
3022 sme_msg.type = eWNI_SME_HO_FAIL_IND;
3023 sme_msg.bodyptr = ho_failure_ind;
3024 sme_msg.bodyval = 0;
3025
gaurank kathpalia00861f02018-08-28 19:16:12 +05303026 qdf_status = scheduler_post_message(QDF_MODULE_ID_WMA,
3027 QDF_MODULE_ID_SME,
3028 QDF_MODULE_ID_SME, &sme_msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303029 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003030 WMA_LOGE("Fail to post eWNI_SME_HO_FAIL_IND msg to SME");
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303031 qdf_mem_free(ho_failure_ind);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003032 return;
3033 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003034}
3035
3036/**
3037 * wma_process_roam_synch_complete() - roam synch complete command to fw.
3038 * @handle: wma handle
3039 * @synchcnf: offload synch confirmation params
3040 *
3041 * This function sends roam synch complete event to fw.
3042 *
3043 * Return: none
3044 */
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08003045void wma_process_roam_synch_complete(WMA_HANDLE handle, uint8_t vdev_id)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003046{
3047 tp_wma_handle wma_handle = (tp_wma_handle) handle;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003048
3049 if (!wma_handle || !wma_handle->wmi_handle) {
3050 WMA_LOGE("%s: WMA is closed, can not issue roam synch cnf",
3051 __func__);
3052 return;
3053 }
Govind Singh64b5e112016-03-08 11:53:50 +05303054
Pragaspathi Thilagarajecb60732018-11-02 12:26:24 +05303055 if (!wma_is_vdev_valid(vdev_id)) {
3056 WMA_LOGE("%s: Invalid vdev id:%d", __func__, vdev_id);
3057 return;
3058 }
3059
Govind Singh64b5e112016-03-08 11:53:50 +05303060 if (wmi_unified_roam_synch_complete_cmd(wma_handle->wmi_handle,
3061 vdev_id)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003062 return;
3063 }
Himanshu Agarwal67a863b2016-09-20 15:09:09 +05303064
3065 DPTRACE(qdf_dp_trace_record_event(QDF_DP_TRACE_EVENT_RECORD,
Venkata Sharath Chandra Manchala0b9fc632017-05-15 14:35:15 -07003066 vdev_id, QDF_TRACE_DEFAULT_PDEV_ID,
3067 QDF_PROTO_TYPE_EVENT, QDF_ROAM_COMPLETE));
Himanshu Agarwal67a863b2016-09-20 15:09:09 +05303068
Srinivas Girigowda6598eea2017-07-06 19:26:19 -07003069 WMA_LOGI("LFR3: Posting WMA_ROAM_OFFLOAD_SYNCH_CNF");
Deepak Dhamdheref918d422017-07-06 12:56:29 -07003070 wlan_roam_debug_log(vdev_id, DEBUG_ROAM_SYNCH_CNF,
3071 DEBUG_INVALID_PEER_ID, NULL, NULL, 0, 0);
3072
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003073}
3074#endif /* WLAN_FEATURE_ROAM_OFFLOAD */
3075
3076/**
3077 * wma_set_channel() - set channel
3078 * @wma: wma handle
3079 * @params: switch channel parameters
3080 *
3081 * Return: none
3082 */
3083void wma_set_channel(tp_wma_handle wma, tpSwitchChannelParams params)
3084{
3085 struct wma_vdev_start_req req;
3086 struct wma_target_req *msg;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303087 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003088 uint8_t vdev_id, peer_id;
Leo Chang96464902016-10-28 11:10:54 -07003089 void *peer;
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08003090 struct cdp_pdev *pdev;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003091 struct wma_txrx_node *intr = wma->interfaces;
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07003092 struct policy_mgr_hw_mode_params hw_mode = {0};
Leo Chang96464902016-10-28 11:10:54 -07003093 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
lifeng7c607dd2017-02-21 21:16:49 +08003094 uint16_t beacon_interval_ori;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003095
3096 WMA_LOGD("%s: Enter", __func__);
3097 if (!wma_find_vdev_by_addr(wma, params->selfStaMacAddr, &vdev_id)) {
3098 WMA_LOGP("%s: Failed to find vdev id for %pM",
3099 __func__, params->selfStaMacAddr);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303100 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003101 goto send_resp;
3102 }
Anurag Chouhan6d760662016-02-20 16:05:43 +05303103 pdev = cds_get_context(QDF_MODULE_ID_TXRX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003104 if (NULL == pdev) {
3105 WMA_LOGE("%s: Failed to get pdev", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303106 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003107 goto send_resp;
3108 }
3109
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08003110 peer = cdp_peer_find_by_addr(soc,
3111 pdev,
3112 intr[vdev_id].bssid, &peer_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003113
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303114 qdf_mem_zero(&req, sizeof(req));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003115 req.vdev_id = vdev_id;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003116 req.chan = params->channelNumber;
3117 req.chan_width = params->ch_width;
Naveen Rawat64e477e2016-05-20 10:34:56 -07003118
3119 if (params->ch_width == CH_WIDTH_10MHZ)
3120 req.is_half_rate = 1;
3121 else if (params->ch_width == CH_WIDTH_5MHZ)
3122 req.is_quarter_rate = 1;
3123
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003124 req.vht_capable = params->vhtCapable;
3125 req.ch_center_freq_seg0 = params->ch_center_freq_seg0;
3126 req.ch_center_freq_seg1 = params->ch_center_freq_seg1;
3127 req.dot11_mode = params->dot11_mode;
Krishna Kumaar Natarajan0103ef82017-02-17 18:15:56 -08003128 wma_update_vdev_he_capable(&req, params);
Krishna Kumaar Natarajan4f1d7722017-03-03 21:12:51 -08003129
Krishna Kumaar Natarajan0103ef82017-02-17 18:15:56 -08003130 WMA_LOGI(FL("vht_capable: %d, dot11_mode: %d"),
3131 req.vht_capable, req.dot11_mode);
Krishna Kumaar Natarajan4f1d7722017-03-03 21:12:51 -08003132
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07003133 status = policy_mgr_get_current_hw_mode(wma->psoc, &hw_mode);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303134 if (!QDF_IS_STATUS_SUCCESS(status))
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07003135 WMA_LOGE("policy_mgr_get_current_hw_mode failed");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003136
Tushnim Bhattacharyya825b0f72017-07-14 15:21:04 -07003137 if (params->nss == 2) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003138 req.preferred_rx_streams = 2;
3139 req.preferred_tx_streams = 2;
3140 } else {
3141 req.preferred_rx_streams = 1;
3142 req.preferred_tx_streams = 1;
3143 }
3144
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003145 req.max_txpow = params->maxTxPower;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003146 req.beacon_intval = 100;
3147 req.dtim_period = 1;
3148 req.is_dfs = params->isDfsChannel;
Arif Hussain671a1902017-03-17 09:08:32 -07003149 req.cac_duration_ms = params->cac_duration_ms;
3150 req.dfs_regdomain = params->dfs_regdomain;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003151
3152 /* In case of AP mode, once radar is detected, we need to
3153 * issuse VDEV RESTART, so we making is_channel_switch as
3154 * true
3155 */
3156 if ((wma_is_vdev_in_ap_mode(wma, req.vdev_id) == true) ||
gaurank kathpalia1b42e8d2017-12-15 15:44:06 +05303157 (params->restart_on_chan_switch == true)) {
Abhishek Singhfb5b4d32018-12-06 11:53:08 +05303158 wma_set_channel_switch_in_progress(
3159 &wma->interfaces[req.vdev_id]);
gaurank kathpalia1b42e8d2017-12-15 15:44:06 +05303160 req.hidden_ssid = intr[vdev_id].vdev_restart_params.ssidHidden;
Srinivas Girigowdaeff16d92018-09-12 14:56:29 -07003161 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003162
Kiran Kumar Lokeref9dc7912017-06-28 18:10:58 -07003163 if (params->restart_on_chan_switch == true &&
3164 wma->interfaces[req.vdev_id].beacon_filter_enabled)
3165 wma_remove_beacon_filter(wma,
3166 &wma->interfaces[req.vdev_id].beacon_filter);
3167
lifeng7c607dd2017-02-21 21:16:49 +08003168 if ((wma_is_vdev_in_ap_mode(wma, req.vdev_id) == true) &&
3169 (params->reduced_beacon_interval)) {
3170 /* Reduce the beacon interval just before the channel switch.
3171 * This would help in reducing the downtime on the STA side
3172 * (which is waiting for beacons from the AP to resume back
3173 * transmission). Switch back the beacon_interval to its
3174 * original value after the channel switch based on the
3175 * timeout. This would ensure there are atleast some beacons
3176 * sent with increased frequency.
3177 */
3178
3179 WMA_LOGD("%s: Changing beacon interval to %d",
3180 __func__, params->reduced_beacon_interval);
3181
3182 /* Add a timer to reset the beacon interval back*/
3183 beacon_interval_ori = req.beacon_intval;
3184 req.beacon_intval = params->reduced_beacon_interval;
3185 if (wma_fill_beacon_interval_reset_req(wma,
3186 req.vdev_id,
3187 beacon_interval_ori,
3188 RESET_BEACON_INTERVAL_TIMEOUT)) {
3189
3190 WMA_LOGD("%s: Failed to fill beacon interval reset req",
3191 __func__);
3192 }
3193 }
3194
Manjunathappa Prakash0e6e6b52016-04-21 11:48:48 -07003195 if (QDF_GLOBAL_MONITOR_MODE == cds_get_conparam() &&
3196 wma_is_vdev_up(vdev_id)) {
Krunal Sonia5388a22018-02-12 19:47:44 -08003197 WMA_LOGD("%s: setting channel switch to true for vdev_id:%d",
3198 __func__, req.vdev_id);
Abhishek Singhfb5b4d32018-12-06 11:53:08 +05303199 wma_set_channel_switch_in_progress(
3200 &wma->interfaces[req.vdev_id]);
Manjunathappa Prakash0e6e6b52016-04-21 11:48:48 -07003201 }
Krunal Sonia5388a22018-02-12 19:47:44 -08003202
3203 msg = wma_fill_vdev_req(wma, req.vdev_id, WMA_CHNL_SWITCH_REQ,
3204 WMA_TARGET_REQ_TYPE_VDEV_START, params,
3205 WMA_VDEV_START_REQUEST_TIMEOUT);
3206 if (!msg) {
3207 WMA_LOGP("%s: Failed to fill channel switch request for vdev %d",
3208 __func__, req.vdev_id);
3209 status = QDF_STATUS_E_NOMEM;
3210 goto send_resp;
3211 }
Abhishek Singhfb5b4d32018-12-06 11:53:08 +05303212
3213 status = wma_vdev_start(wma, &req, wma_get_channel_switch_in_progress(
3214 &wma->interfaces[req.vdev_id]));
Krunal Sonia5388a22018-02-12 19:47:44 -08003215 if (status != QDF_STATUS_SUCCESS) {
3216 wma_remove_vdev_req(wma, req.vdev_id,
3217 WMA_TARGET_REQ_TYPE_VDEV_START);
3218 WMA_LOGP("%s: vdev start failed status = %d", __func__,
3219 status);
3220 goto send_resp;
3221 }
3222
3223 /* This is temporary, should be removed */
3224 if (QDF_GLOBAL_MONITOR_MODE == cds_get_conparam())
3225 ol_htt_mon_note_chan(pdev, req.chan);
3226
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003227 return;
3228send_resp:
3229 WMA_LOGD("%s: channel %d ch_width %d txpower %d status %d", __func__,
3230 params->channelNumber, params->ch_width,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003231 params->maxTxPower,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003232 status);
3233 params->status = status;
3234 WMA_LOGI("%s: sending WMA_SWITCH_CHANNEL_RSP, status = 0x%x",
3235 __func__, status);
Abhishek Singh2d775fd2017-08-18 10:51:33 +05303236 wma_send_msg_high_priority(wma, WMA_SWITCH_CHANNEL_RSP,
3237 (void *)params, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003238}
3239
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08003240#ifdef FEATURE_WLAN_ESE
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003241/**
3242 * wma_plm_start() - plm start request
3243 * @wma: wma handle
3244 * @plm: plm request parameters
3245 *
3246 * This function request FW to start PLM.
3247 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05303248 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003249 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303250QDF_STATUS wma_plm_start(tp_wma_handle wma, const tpSirPlmReq plm)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003251{
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05303252 struct plm_req_params params = {0};
3253 uint32_t num_channels;
3254 uint32_t *channel_list = NULL;
3255 uint32_t i;
3256 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003257
3258 if (NULL == plm || NULL == wma) {
3259 WMA_LOGE("%s: input pointer is NULL ", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303260 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003261 }
3262 WMA_LOGD("PLM Start");
3263
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05303264 num_channels = plm->plmNumCh;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003265
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05303266 if (num_channels) {
3267 channel_list = qdf_mem_malloc(sizeof(uint32_t) * num_channels);
3268 if (!channel_list)
3269 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003270
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05303271 for (i = 0; i < num_channels; i++) {
3272 channel_list[i] = plm->plmChList[i];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003273
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05303274 if (channel_list[i] < WMA_NLO_FREQ_THRESH)
3275 channel_list[i] =
3276 cds_chan_to_freq(channel_list[i]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003277 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003278 }
3279
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05303280 params.diag_token = plm->diag_token;
3281 params.meas_token = plm->meas_token;
3282 params.num_bursts = plm->numBursts;
3283 params.burst_int = plm->burstInt;
3284 params.meas_duration = plm->measDuration;
3285 params.burst_len = plm->burstLen;
3286 params.desired_tx_pwr = plm->desiredTxPwr;
3287 params.plm_num_ch = plm->plmNumCh;
3288 params.session_id = plm->sessionId;
3289 params.enable = plm->enable;
3290 qdf_mem_copy(&params.mac_addr, &plm->mac_addr,
3291 sizeof(struct qdf_mac_addr));
3292 qdf_mem_copy(params.plm_ch_list, plm->plmChList,
3293 WMI_CFG_VALID_CHANNEL_LIST_LEN);
3294
3295 status = wmi_unified_plm_start_cmd(wma->wmi_handle,
3296 &params, channel_list);
3297 if (QDF_IS_STATUS_ERROR(status)) {
3298 qdf_mem_free(channel_list);
3299 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003300 }
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05303301
3302 qdf_mem_free(channel_list);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003303 wma->interfaces[plm->sessionId].plm_in_progress = true;
3304
3305 WMA_LOGD("Plm start request sent successfully for vdev %d",
3306 plm->sessionId);
3307
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05303308 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003309}
3310
3311/**
3312 * wma_plm_stop() - plm stop request
3313 * @wma: wma handle
3314 * @plm: plm request parameters
3315 *
3316 * This function request FW to stop PLM.
3317 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05303318 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003319 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303320QDF_STATUS wma_plm_stop(tp_wma_handle wma, const tpSirPlmReq plm)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003321{
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05303322 struct plm_req_params params = {0};
3323 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003324
3325 if (NULL == plm || NULL == wma) {
3326 WMA_LOGE("%s: input pointer is NULL ", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303327 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003328 }
3329
3330 if (false == wma->interfaces[plm->sessionId].plm_in_progress) {
3331 WMA_LOGE("No active plm req found, skip plm stop req");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303332 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003333 }
3334
3335 WMA_LOGD("PLM Stop");
3336
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05303337 params.diag_token = plm->diag_token;
3338 params.meas_token = plm->meas_token;
3339 params.num_bursts = plm->numBursts;
3340 params.burst_int = plm->burstInt;
3341 params.meas_duration = plm->measDuration;
3342 params.burst_len = plm->burstLen;
3343 params.desired_tx_pwr = plm->desiredTxPwr;
3344 params.plm_num_ch = plm->plmNumCh;
3345 params.session_id = plm->sessionId;
3346 params.enable = plm->enable;
3347 qdf_mem_copy(&params.mac_addr, &plm->mac_addr,
3348 sizeof(struct qdf_mac_addr));
3349 qdf_mem_copy(params.plm_ch_list, plm->plmChList,
3350 WMI_CFG_VALID_CHANNEL_LIST_LEN);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003351
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05303352 status = wmi_unified_plm_stop_cmd(wma->wmi_handle,
3353 &params);
3354 if (QDF_IS_STATUS_ERROR(status))
3355 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003356
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003357 wma->interfaces[plm->sessionId].plm_in_progress = false;
3358
3359 WMA_LOGD("Plm stop request sent successfully for vdev %d",
3360 plm->sessionId);
3361
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05303362 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003363}
3364
3365/**
3366 * wma_config_plm()- config PLM
3367 * @wma: wma handle
3368 * @plm: plm request parameters
3369 *
3370 * Return: none
3371 */
3372void wma_config_plm(tp_wma_handle wma, tpSirPlmReq plm)
3373{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303374 QDF_STATUS ret = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003375
3376 if (NULL == plm || NULL == wma)
3377 return;
3378
3379 if (plm->enable)
3380 ret = wma_plm_start(wma, plm);
3381 else
3382 ret = wma_plm_stop(wma, plm);
3383
3384 if (ret)
3385 WMA_LOGE("%s: PLM %s failed %d", __func__,
3386 plm->enable ? "start" : "stop", ret);
3387
3388 /* SME expects WMA to free tpSirPlmReq memory after
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003389 * processing PLM request.
3390 */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303391 qdf_mem_free(plm);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003392 plm = NULL;
3393}
3394#endif
3395
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003396#ifdef FEATURE_WLAN_EXTSCAN
3397/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003398 * wma_extscan_wow_event_callback() - extscan wow event callback
3399 * @handle: WMA handle
3400 * @event: event buffer
3401 * @len: length of @event buffer
3402 *
3403 * In wow case, the wow event is followed by the payload of the event
3404 * which generated the wow event.
3405 * payload is 4 bytes of length followed by event buffer. the first 4 bytes
3406 * of event buffer is common tlv header, which is a combination
3407 * of tag (higher 2 bytes) and length (lower 2 bytes). The tag is used to
3408 * identify the event which triggered wow event.
Krishna Kumaar Natarajan36e5aa02016-07-02 17:44:25 -07003409 * Payload is extracted and converted into generic tlv structure before
3410 * being passed to this function.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003411 *
Dustin Browne2206fb2017-04-20 13:39:25 -07003412 * @Return: Errno
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003413 */
Dustin Browne2206fb2017-04-20 13:39:25 -07003414int wma_extscan_wow_event_callback(void *handle, void *event, uint32_t len)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003415{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003416 uint32_t tag = WMITLV_GET_TLVTAG(WMITLV_GET_HDR(event));
3417
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003418 switch (tag) {
3419 case WMITLV_TAG_STRUC_wmi_extscan_start_stop_event_fixed_param:
Dustin Browne2206fb2017-04-20 13:39:25 -07003420 return wma_extscan_start_stop_event_handler(handle, event, len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003421
3422 case WMITLV_TAG_STRUC_wmi_extscan_operation_event_fixed_param:
Dustin Browne2206fb2017-04-20 13:39:25 -07003423 return wma_extscan_operations_event_handler(handle, event, len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003424
3425 case WMITLV_TAG_STRUC_wmi_extscan_table_usage_event_fixed_param:
Dustin Browne2206fb2017-04-20 13:39:25 -07003426 return wma_extscan_table_usage_event_handler(handle, event,
3427 len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003428
3429 case WMITLV_TAG_STRUC_wmi_extscan_cached_results_event_fixed_param:
Dustin Browne2206fb2017-04-20 13:39:25 -07003430 return wma_extscan_cached_results_event_handler(handle, event,
3431 len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003432
3433 case WMITLV_TAG_STRUC_wmi_extscan_wlan_change_results_event_fixed_param:
Dustin Browne2206fb2017-04-20 13:39:25 -07003434 return wma_extscan_change_results_event_handler(handle, event,
3435 len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003436
3437 case WMITLV_TAG_STRUC_wmi_extscan_hotlist_match_event_fixed_param:
Dustin Browne2206fb2017-04-20 13:39:25 -07003438 return wma_extscan_hotlist_match_event_handler(handle, event,
3439 len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003440
3441 case WMITLV_TAG_STRUC_wmi_extscan_capabilities_event_fixed_param:
Dustin Browne2206fb2017-04-20 13:39:25 -07003442 return wma_extscan_capabilities_event_handler(handle, event,
3443 len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003444
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003445 default:
Krishna Kumaar Natarajan36e5aa02016-07-02 17:44:25 -07003446 WMA_LOGE(FL("Unknown tag: %d"), tag);
Dustin Browne2206fb2017-04-20 13:39:25 -07003447 return 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003448 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003449}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003450
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003451/**
3452 * wma_register_extscan_event_handler() - register extscan event handler
3453 * @wma_handle: wma handle
3454 *
3455 * This function register extscan related event handlers.
3456 *
3457 * Return: none
3458 */
3459void wma_register_extscan_event_handler(tp_wma_handle wma_handle)
3460{
3461 if (!wma_handle) {
3462 WMA_LOGE("%s: extscan wma_handle is NULL", __func__);
3463 return;
3464 }
3465 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303466 wmi_extscan_start_stop_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05303467 wma_extscan_start_stop_event_handler,
3468 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003469
3470 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303471 wmi_extscan_capabilities_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05303472 wma_extscan_capabilities_event_handler,
3473 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003474
3475 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303476 wmi_extscan_hotlist_match_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05303477 wma_extscan_hotlist_match_event_handler,
3478 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003479
3480 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303481 wmi_extscan_wlan_change_results_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05303482 wma_extscan_change_results_event_handler,
3483 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003484
3485 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303486 wmi_extscan_operation_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05303487 wma_extscan_operations_event_handler,
3488 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003489 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303490 wmi_extscan_table_usage_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05303491 wma_extscan_table_usage_event_handler,
3492 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003493
3494 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303495 wmi_extscan_cached_results_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05303496 wma_extscan_cached_results_event_handler,
3497 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003498
3499 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303500 wmi_passpoint_match_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05303501 wma_passpoint_match_event_handler,
3502 WMA_RX_SERIALIZER_CTX);
Pragaspathi Thilagaraj30251ec2018-12-18 17:22:57 +05303503
3504 /* Register BTM reject list event handler */
3505 wmi_unified_register_event_handler(wma_handle->wmi_handle,
3506 wmi_roam_blacklist_event_id,
3507 wma_handle_btm_blacklist_event,
3508 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003509}
3510
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003511/**
3512 * wma_extscan_start_stop_event_handler() - extscan start/stop event handler
3513 * @handle: wma handle
3514 * @cmd_param_info: event buffer
3515 * @len: data length
3516 *
3517 * This function handles different extscan related commands
3518 * like start/stop/get results etc and indicate to upper layers.
3519 *
3520 * Return: 0 for success or error code.
3521 */
3522int wma_extscan_start_stop_event_handler(void *handle,
3523 uint8_t *cmd_param_info,
3524 uint32_t len)
3525{
3526 WMI_EXTSCAN_START_STOP_EVENTID_param_tlvs *param_buf;
3527 wmi_extscan_start_stop_event_fixed_param *event;
3528 struct sir_extscan_generic_response *extscan_ind;
3529 uint16_t event_type;
Jeff Johnson9f18aa72018-12-02 12:05:12 -08003530 struct mac_context *mac = cds_get_context(QDF_MODULE_ID_PE);
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003531
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08003532 if (!mac) {
3533 WMA_LOGE("%s: Invalid mac", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003534 return -EINVAL;
3535 }
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08003536 if (!mac->sme.ext_scan_ind_cb) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003537 WMA_LOGE("%s: Callback not registered", __func__);
3538 return -EINVAL;
3539 }
3540 param_buf = (WMI_EXTSCAN_START_STOP_EVENTID_param_tlvs *)
3541 cmd_param_info;
3542 if (!param_buf) {
3543 WMA_LOGE("%s: Invalid extscan event", __func__);
3544 return -EINVAL;
3545 }
3546 event = param_buf->fixed_param;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303547 extscan_ind = qdf_mem_malloc(sizeof(*extscan_ind));
Arif Hussain157263f2018-10-03 13:07:15 -07003548 if (!extscan_ind)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003549 return -ENOMEM;
Arif Hussain157263f2018-10-03 13:07:15 -07003550
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003551 switch (event->command) {
3552 case WMI_EXTSCAN_START_CMDID:
3553 event_type = eSIR_EXTSCAN_START_RSP;
3554 extscan_ind->status = event->status;
3555 extscan_ind->request_id = event->request_id;
3556 break;
3557 case WMI_EXTSCAN_STOP_CMDID:
3558 event_type = eSIR_EXTSCAN_STOP_RSP;
3559 extscan_ind->status = event->status;
3560 extscan_ind->request_id = event->request_id;
3561 break;
3562 case WMI_EXTSCAN_CONFIGURE_WLAN_CHANGE_MONITOR_CMDID:
3563 extscan_ind->status = event->status;
3564 extscan_ind->request_id = event->request_id;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003565 if (event->mode == WMI_EXTSCAN_MODE_STOP)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003566 event_type =
3567 eSIR_EXTSCAN_RESET_SIGNIFICANT_WIFI_CHANGE_RSP;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003568 else
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003569 event_type =
3570 eSIR_EXTSCAN_SET_SIGNIFICANT_WIFI_CHANGE_RSP;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003571 break;
3572 case WMI_EXTSCAN_CONFIGURE_HOTLIST_MONITOR_CMDID:
3573 extscan_ind->status = event->status;
3574 extscan_ind->request_id = event->request_id;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003575 if (event->mode == WMI_EXTSCAN_MODE_STOP)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003576 event_type = eSIR_EXTSCAN_RESET_BSSID_HOTLIST_RSP;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003577 else
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003578 event_type = eSIR_EXTSCAN_SET_BSSID_HOTLIST_RSP;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003579 break;
3580 case WMI_EXTSCAN_GET_CACHED_RESULTS_CMDID:
3581 extscan_ind->status = event->status;
3582 extscan_ind->request_id = event->request_id;
3583 event_type = eSIR_EXTSCAN_CACHED_RESULTS_RSP;
3584 break;
3585 case WMI_EXTSCAN_CONFIGURE_HOTLIST_SSID_MONITOR_CMDID:
3586 extscan_ind->status = event->status;
3587 extscan_ind->request_id = event->request_id;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003588 if (event->mode == WMI_EXTSCAN_MODE_STOP)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003589 event_type =
3590 eSIR_EXTSCAN_RESET_SSID_HOTLIST_RSP;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003591 else
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003592 event_type =
3593 eSIR_EXTSCAN_SET_SSID_HOTLIST_RSP;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003594 break;
3595 default:
3596 WMA_LOGE("%s: Unknown event(%d) from target",
3597 __func__, event->status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303598 qdf_mem_free(extscan_ind);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003599 return -EINVAL;
3600 }
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08003601 mac->sme.ext_scan_ind_cb(mac->hdd_handle, event_type, extscan_ind);
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003602 WMA_LOGD("%s: sending event to umac for requestid %u with status %d",
3603 __func__, extscan_ind->request_id, extscan_ind->status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303604 qdf_mem_free(extscan_ind);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003605 return 0;
3606}
3607
3608/**
3609 * wma_extscan_operations_event_handler() - extscan operation event handler
3610 * @handle: wma handle
3611 * @cmd_param_info: event buffer
3612 * @len: length
3613 *
3614 * This function handles different operations related event and indicate
3615 * upper layers with appropriate callback.
3616 *
3617 * Return: 0 for success or error code.
3618 */
3619int wma_extscan_operations_event_handler(void *handle,
3620 uint8_t *cmd_param_info,
3621 uint32_t len)
3622{
3623 tp_wma_handle wma = (tp_wma_handle) handle;
3624 WMI_EXTSCAN_OPERATION_EVENTID_param_tlvs *param_buf;
3625 wmi_extscan_operation_event_fixed_param *oprn_event;
3626 tSirExtScanOnScanEventIndParams *oprn_ind;
Mukul Sharmafa937be2016-08-12 18:13:36 +05303627 uint32_t cnt;
Jeff Johnson9f18aa72018-12-02 12:05:12 -08003628 struct mac_context *mac = cds_get_context(QDF_MODULE_ID_PE);
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003629
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08003630 if (!mac) {
3631 WMA_LOGE("%s: Invalid mac", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003632 return -EINVAL;
3633 }
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08003634 if (!mac->sme.ext_scan_ind_cb) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003635 WMA_LOGE("%s: Callback not registered", __func__);
3636 return -EINVAL;
3637 }
3638 param_buf = (WMI_EXTSCAN_OPERATION_EVENTID_param_tlvs *)
3639 cmd_param_info;
3640 if (!param_buf) {
3641 WMA_LOGE("%s: Invalid scan operation event", __func__);
3642 return -EINVAL;
3643 }
3644 oprn_event = param_buf->fixed_param;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303645 oprn_ind = qdf_mem_malloc(sizeof(*oprn_ind));
Arif Hussain157263f2018-10-03 13:07:15 -07003646 if (!oprn_ind)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003647 return -ENOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003648
3649 oprn_ind->requestId = oprn_event->request_id;
3650
3651 switch (oprn_event->event) {
3652 case WMI_EXTSCAN_BUCKET_COMPLETED_EVENT:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003653 oprn_ind->status = 0;
Mukul Sharma45114d92016-08-12 19:34:14 +05303654 goto exit_handler;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003655 case WMI_EXTSCAN_CYCLE_STARTED_EVENT:
3656 WMA_LOGD("%s: received WMI_EXTSCAN_CYCLE_STARTED_EVENT",
3657 __func__);
Amar Singhal16c170d2017-10-03 13:32:21 -07003658
3659 if (oprn_event->num_buckets > param_buf->num_bucket_id) {
3660 WMA_LOGE("FW mesg num_buk %d more than TLV hdr %d",
3661 oprn_event->num_buckets,
3662 param_buf->num_bucket_id);
3663 return -EINVAL;
3664 }
3665
Anurag Chouhan01cfa4e2016-09-04 15:10:49 +05303666 cds_host_diag_log_work(&wma->extscan_wake_lock,
3667 WMA_EXTSCAN_CYCLE_WAKE_LOCK_DURATION,
3668 WIFI_POWER_EVENT_WAKELOCK_EXT_SCAN);
Anurag Chouhana37b5b72016-02-21 14:53:42 +05303669 qdf_wake_lock_timeout_acquire(&wma->extscan_wake_lock,
Anurag Chouhan01cfa4e2016-09-04 15:10:49 +05303670 WMA_EXTSCAN_CYCLE_WAKE_LOCK_DURATION);
Mukul Sharmafa937be2016-08-12 18:13:36 +05303671 oprn_ind->scanEventType = WIFI_EXTSCAN_CYCLE_STARTED_EVENT;
3672 oprn_ind->status = 0;
3673 oprn_ind->buckets_scanned = 0;
3674 for (cnt = 0; cnt < oprn_event->num_buckets; cnt++)
3675 oprn_ind->buckets_scanned |=
3676 (1 << param_buf->bucket_id[cnt]);
3677 WMA_LOGD(FL("num_buckets %u request_id %u buckets_scanned %u"),
3678 oprn_event->num_buckets, oprn_ind->requestId,
3679 oprn_ind->buckets_scanned);
3680 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003681 case WMI_EXTSCAN_CYCLE_COMPLETED_EVENT:
3682 WMA_LOGD("%s: received WMI_EXTSCAN_CYCLE_COMPLETED_EVENT",
3683 __func__);
Anurag Chouhana37b5b72016-02-21 14:53:42 +05303684 qdf_wake_lock_release(&wma->extscan_wake_lock,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003685 WIFI_POWER_EVENT_WAKELOCK_EXT_SCAN);
Mukul Sharmafa937be2016-08-12 18:13:36 +05303686 oprn_ind->scanEventType = WIFI_EXTSCAN_CYCLE_COMPLETED_EVENT;
3687 oprn_ind->status = 0;
3688 /* Set bucket scanned mask to zero on cycle complete */
3689 oprn_ind->buckets_scanned = 0;
3690 break;
3691 case WMI_EXTSCAN_BUCKET_STARTED_EVENT:
Mukul Sharma45114d92016-08-12 19:34:14 +05303692 WMA_LOGD("%s: received WMI_EXTSCAN_BUCKET_STARTED_EVENT",
Mukul Sharmafa937be2016-08-12 18:13:36 +05303693 __func__);
3694 oprn_ind->scanEventType = WIFI_EXTSCAN_BUCKET_STARTED_EVENT;
3695 oprn_ind->status = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003696 goto exit_handler;
Mukul Sharmafa937be2016-08-12 18:13:36 +05303697 case WMI_EXTSCAN_THRESHOLD_NUM_SCANS:
Mukul Sharma45114d92016-08-12 19:34:14 +05303698 WMA_LOGD("%s: received WMI_EXTSCAN_THRESHOLD_NUM_SCANS",
Mukul Sharmafa937be2016-08-12 18:13:36 +05303699 __func__);
3700 oprn_ind->scanEventType = WIFI_EXTSCAN_THRESHOLD_NUM_SCANS;
3701 oprn_ind->status = 0;
3702 break;
3703 case WMI_EXTSCAN_THRESHOLD_PERCENT:
Mukul Sharma45114d92016-08-12 19:34:14 +05303704 WMA_LOGD("%s: received WMI_EXTSCAN_THRESHOLD_PERCENT",
Mukul Sharmafa937be2016-08-12 18:13:36 +05303705 __func__);
3706 oprn_ind->scanEventType = WIFI_EXTSCAN_THRESHOLD_PERCENT;
3707 oprn_ind->status = 0;
3708 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003709 default:
3710 WMA_LOGE("%s: Unknown event(%d) from target",
3711 __func__, oprn_event->event);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303712 qdf_mem_free(oprn_ind);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003713 return -EINVAL;
3714 }
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08003715 mac->sme.ext_scan_ind_cb(mac->hdd_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003716 eSIR_EXTSCAN_SCAN_PROGRESS_EVENT_IND, oprn_ind);
3717 WMA_LOGI("%s: sending scan progress event to hdd", __func__);
3718exit_handler:
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303719 qdf_mem_free(oprn_ind);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003720 return 0;
3721}
3722
3723/**
3724 * wma_extscan_table_usage_event_handler() - extscan table usage event handler
3725 * @handle: wma handle
3726 * @cmd_param_info: event buffer
3727 * @len: length
3728 *
3729 * This function handles table usage related event and indicate
3730 * upper layers with appropriate callback.
3731 *
3732 * Return: 0 for success or error code.
3733 */
3734int wma_extscan_table_usage_event_handler(void *handle,
3735 uint8_t *cmd_param_info,
3736 uint32_t len)
3737{
3738 WMI_EXTSCAN_TABLE_USAGE_EVENTID_param_tlvs *param_buf;
3739 wmi_extscan_table_usage_event_fixed_param *event;
3740 tSirExtScanResultsAvailableIndParams *tbl_usg_ind;
Jeff Johnson9f18aa72018-12-02 12:05:12 -08003741 struct mac_context *mac = cds_get_context(QDF_MODULE_ID_PE);
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003742
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08003743 if (!mac) {
3744 WMA_LOGE("%s: Invalid mac", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003745 return -EINVAL;
3746 }
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08003747 if (!mac->sme.ext_scan_ind_cb) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003748 WMA_LOGE("%s: Callback not registered", __func__);
3749 return -EINVAL;
3750 }
3751 param_buf = (WMI_EXTSCAN_TABLE_USAGE_EVENTID_param_tlvs *)
3752 cmd_param_info;
3753 if (!param_buf) {
3754 WMA_LOGE("%s: Invalid table usage event", __func__);
3755 return -EINVAL;
3756 }
3757 event = param_buf->fixed_param;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303758 tbl_usg_ind = qdf_mem_malloc(sizeof(*tbl_usg_ind));
Arif Hussain157263f2018-10-03 13:07:15 -07003759 if (!tbl_usg_ind)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003760 return -ENOMEM;
Arif Hussain157263f2018-10-03 13:07:15 -07003761
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003762 tbl_usg_ind->requestId = event->request_id;
3763 tbl_usg_ind->numResultsAvailable = event->entries_in_use;
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08003764 mac->sme.ext_scan_ind_cb(mac->hdd_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003765 eSIR_EXTSCAN_SCAN_RES_AVAILABLE_IND,
3766 tbl_usg_ind);
3767 WMA_LOGI("%s: sending scan_res available event to hdd", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303768 qdf_mem_free(tbl_usg_ind);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003769 return 0;
3770}
3771
3772/**
3773 * wma_extscan_capabilities_event_handler() - extscan capabilities event handler
3774 * @handle: wma handle
3775 * @cmd_param_info: event buffer
3776 * @len: length
3777 *
3778 * This function handles capabilities event and indicate
3779 * upper layers with registered callback.
3780 *
3781 * Return: 0 for success or error code.
3782 */
3783int wma_extscan_capabilities_event_handler(void *handle,
3784 uint8_t *cmd_param_info,
3785 uint32_t len)
3786{
3787 WMI_EXTSCAN_CAPABILITIES_EVENTID_param_tlvs *param_buf;
3788 wmi_extscan_capabilities_event_fixed_param *event;
3789 wmi_extscan_cache_capabilities *src_cache;
3790 wmi_extscan_hotlist_monitor_capabilities *src_hotlist;
3791 wmi_extscan_wlan_change_monitor_capabilities *src_change;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003792 struct ext_scan_capabilities_response *dest_capab;
Jeff Johnson9f18aa72018-12-02 12:05:12 -08003793 struct mac_context *mac = cds_get_context(QDF_MODULE_ID_PE);
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003794
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08003795 if (!mac) {
3796 WMA_LOGE("%s: Invalid mac", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003797 return -EINVAL;
3798 }
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08003799 if (!mac->sme.ext_scan_ind_cb) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003800 WMA_LOGE("%s: Callback not registered", __func__);
3801 return -EINVAL;
3802 }
3803 param_buf = (WMI_EXTSCAN_CAPABILITIES_EVENTID_param_tlvs *)
3804 cmd_param_info;
3805 if (!param_buf) {
3806 WMA_LOGE("%s: Invalid capabilities event", __func__);
3807 return -EINVAL;
3808 }
3809 event = param_buf->fixed_param;
3810 src_cache = param_buf->extscan_cache_capabilities;
3811 src_hotlist = param_buf->hotlist_capabilities;
3812 src_change = param_buf->wlan_change_capabilities;
3813
3814 if (!src_cache || !src_hotlist || !src_change) {
3815 WMA_LOGE("%s: Invalid capabilities list", __func__);
3816 return -EINVAL;
3817 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303818 dest_capab = qdf_mem_malloc(sizeof(*dest_capab));
Arif Hussain157263f2018-10-03 13:07:15 -07003819 if (!dest_capab)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003820 return -ENOMEM;
Arif Hussain157263f2018-10-03 13:07:15 -07003821
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003822 dest_capab->requestId = event->request_id;
3823 dest_capab->max_scan_buckets = src_cache->max_buckets;
3824 dest_capab->max_scan_cache_size = src_cache->scan_cache_entry_size;
3825 dest_capab->max_ap_cache_per_scan = src_cache->max_bssid_per_scan;
3826 dest_capab->max_scan_reporting_threshold =
3827 src_cache->max_table_usage_threshold;
3828
3829 dest_capab->max_hotlist_bssids = src_hotlist->max_hotlist_entries;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003830 dest_capab->max_rssi_sample_size =
3831 src_change->max_rssi_averaging_samples;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003832 dest_capab->max_bssid_history_entries =
3833 src_change->max_rssi_history_entries;
3834 dest_capab->max_significant_wifi_change_aps =
3835 src_change->max_wlan_change_entries;
3836 dest_capab->max_hotlist_ssids =
3837 event->num_extscan_hotlist_ssid;
3838 dest_capab->max_number_epno_networks =
3839 event->num_epno_networks;
3840 dest_capab->max_number_epno_networks_by_ssid =
3841 event->num_epno_networks;
3842 dest_capab->max_number_of_white_listed_ssid =
3843 event->num_roam_ssid_whitelist;
Padma, Santhosh Kumar1ac02402016-11-02 18:04:14 +05303844 dest_capab->max_number_of_black_listed_bssid =
3845 event->num_roam_bssid_blacklist;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003846 dest_capab->status = 0;
3847
3848 WMA_LOGD("%s: request_id: %u status: %d",
3849 __func__, dest_capab->requestId, dest_capab->status);
3850
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003851 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 -08003852 __func__, dest_capab->max_scan_buckets,
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003853 dest_capab->max_hotlist_bssids, dest_capab->max_scan_cache_size,
3854 dest_capab->max_ap_cache_per_scan);
3855 WMA_LOGD("%s: max_scan_reporting_threshold: %d, max_rssi_sample_size: %d, max_bssid_history_entries: %d, max_significant_wifi_change_aps: %d",
3856 __func__, dest_capab->max_scan_reporting_threshold,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003857 dest_capab->max_rssi_sample_size,
3858 dest_capab->max_bssid_history_entries,
3859 dest_capab->max_significant_wifi_change_aps);
3860
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003861 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 -08003862 __func__, dest_capab->max_hotlist_ssids,
3863 dest_capab->max_number_epno_networks,
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003864 dest_capab->max_number_epno_networks_by_ssid);
3865 WMA_LOGD("%s: max_number_of_white_listed_ssid: %d, max_number_of_black_listed_bssid: %d",
3866 __func__, dest_capab->max_number_of_white_listed_ssid,
Padma, Santhosh Kumar1ac02402016-11-02 18:04:14 +05303867 dest_capab->max_number_of_black_listed_bssid);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003868
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08003869 mac->sme.ext_scan_ind_cb(mac->hdd_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003870 eSIR_EXTSCAN_GET_CAPABILITIES_IND, dest_capab);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303871 qdf_mem_free(dest_capab);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003872 return 0;
3873}
3874
3875/**
3876 * wma_extscan_hotlist_match_event_handler() - hotlist match event handler
3877 * @handle: wma handle
3878 * @cmd_param_info: event buffer
3879 * @len: length
3880 *
3881 * This function handles hotlist match event and indicate
3882 * upper layers with registered callback.
3883 *
3884 * Return: 0 for success or error code.
3885 */
3886int wma_extscan_hotlist_match_event_handler(void *handle,
3887 uint8_t *cmd_param_info,
3888 uint32_t len)
3889{
3890 WMI_EXTSCAN_HOTLIST_MATCH_EVENTID_param_tlvs *param_buf;
3891 wmi_extscan_hotlist_match_event_fixed_param *event;
3892 struct extscan_hotlist_match *dest_hotlist;
3893 tSirWifiScanResult *dest_ap;
3894 wmi_extscan_wlan_descriptor *src_hotlist;
Sridhar Selvaraj22943572017-07-26 15:06:40 +05303895 uint32_t numap;
3896 int j, ap_found = 0;
Vignesh Viswanathanfc5bbed2017-11-23 14:14:01 +05303897 uint32_t buf_len;
Jeff Johnson9f18aa72018-12-02 12:05:12 -08003898 struct mac_context *mac = cds_get_context(QDF_MODULE_ID_PE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003899
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08003900 if (!mac) {
3901 WMA_LOGE("%s: Invalid mac", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003902 return -EINVAL;
3903 }
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08003904 if (!mac->sme.ext_scan_ind_cb) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003905 WMA_LOGE("%s: Callback not registered", __func__);
3906 return -EINVAL;
3907 }
3908 param_buf = (WMI_EXTSCAN_HOTLIST_MATCH_EVENTID_param_tlvs *)
3909 cmd_param_info;
3910 if (!param_buf) {
3911 WMA_LOGE("%s: Invalid hotlist match event", __func__);
3912 return -EINVAL;
3913 }
3914 event = param_buf->fixed_param;
3915 src_hotlist = param_buf->hotlist_match;
3916 numap = event->total_entries;
3917
3918 if (!src_hotlist || !numap) {
3919 WMA_LOGE("%s: Hotlist AP's list invalid", __func__);
3920 return -EINVAL;
3921 }
Abhinav Kumara03659c2017-12-28 15:18:07 +05303922 if (numap > param_buf->num_hotlist_match) {
3923 WMA_LOGE("Invalid no of total enteries %d", numap);
3924 return -EINVAL;
3925 }
Sridhar Selvaraj22943572017-07-26 15:06:40 +05303926 if (numap > WMA_EXTSCAN_MAX_HOTLIST_ENTRIES) {
3927 WMA_LOGE("%s: Total Entries %u greater than max",
3928 __func__, numap);
3929 numap = WMA_EXTSCAN_MAX_HOTLIST_ENTRIES;
3930 }
Vignesh Viswanathanfc5bbed2017-11-23 14:14:01 +05303931
3932 buf_len = sizeof(wmi_extscan_hotlist_match_event_fixed_param) +
Himanshu Agarwalff399e32017-12-26 17:21:28 +05303933 WMI_TLV_HDR_SIZE +
Vignesh Viswanathanfc5bbed2017-11-23 14:14:01 +05303934 (numap * sizeof(wmi_extscan_wlan_descriptor));
3935
3936 if (buf_len > len) {
3937 WMA_LOGE("Invalid buf len from FW %d numap %d", len, numap);
3938 return -EINVAL;
3939 }
3940
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303941 dest_hotlist = qdf_mem_malloc(sizeof(*dest_hotlist) +
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003942 sizeof(*dest_ap) * numap);
Arif Hussain157263f2018-10-03 13:07:15 -07003943 if (!dest_hotlist)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003944 return -ENOMEM;
Arif Hussain157263f2018-10-03 13:07:15 -07003945
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003946 dest_ap = &dest_hotlist->ap[0];
3947 dest_hotlist->numOfAps = event->total_entries;
3948 dest_hotlist->requestId = event->config_request_id;
3949
3950 if (event->first_entry_index +
3951 event->num_entries_in_page < event->total_entries)
3952 dest_hotlist->moreData = 1;
3953 else
3954 dest_hotlist->moreData = 0;
3955
3956 WMA_LOGD("%s: Hotlist match: requestId: %u,"
3957 "numOfAps: %d", __func__,
3958 dest_hotlist->requestId, dest_hotlist->numOfAps);
3959
3960 /*
3961 * Currently firmware sends only one bss information in-case
3962 * of both hotlist ap found and lost.
3963 */
3964 for (j = 0; j < numap; j++) {
3965 dest_ap->rssi = 0;
3966 dest_ap->channel = src_hotlist->channel;
3967 dest_ap->ts = src_hotlist->tstamp;
3968 ap_found = src_hotlist->flags & WMI_HOTLIST_FLAG_PRESENCE;
3969 dest_ap->rtt = src_hotlist->rtt;
3970 dest_ap->rtt_sd = src_hotlist->rtt_sd;
3971 dest_ap->beaconPeriod = src_hotlist->beacon_interval;
3972 dest_ap->capability = src_hotlist->capabilities;
3973 dest_ap->ieLength = src_hotlist->ie_length;
3974 WMI_MAC_ADDR_TO_CHAR_ARRAY(&src_hotlist->bssid,
3975 dest_ap->bssid.bytes);
Vignesh Viswanathandf0571a2017-11-28 17:39:08 +05303976 if (src_hotlist->ssid.ssid_len > SIR_MAC_MAX_SSID_LENGTH) {
3977 WMA_LOGE("%s Invalid SSID len %d, truncating",
3978 __func__, src_hotlist->ssid.ssid_len);
3979 src_hotlist->ssid.ssid_len = SIR_MAC_MAX_SSID_LENGTH;
3980 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303981 qdf_mem_copy(dest_ap->ssid, src_hotlist->ssid.ssid,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003982 src_hotlist->ssid.ssid_len);
3983 dest_ap->ssid[src_hotlist->ssid.ssid_len] = '\0';
3984 dest_ap++;
3985 src_hotlist++;
3986 }
3987 dest_hotlist->ap_found = ap_found;
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08003988 mac->sme.ext_scan_ind_cb(mac->hdd_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003989 eSIR_EXTSCAN_HOTLIST_MATCH_IND, dest_hotlist);
3990 WMA_LOGI("%s: sending hotlist match event to hdd", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303991 qdf_mem_free(dest_hotlist);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003992 return 0;
3993}
3994
3995/** wma_extscan_find_unique_scan_ids() - find unique scan ids
3996 * @cmd_param_info: event data.
3997 *
3998 * This utility function parses the input bss table of information
3999 * and find the unique number of scan ids
4000 *
4001 * Return: 0 on success; error number otherwise
4002 */
4003static int wma_extscan_find_unique_scan_ids(const u_int8_t *cmd_param_info)
4004{
4005 WMI_EXTSCAN_CACHED_RESULTS_EVENTID_param_tlvs *param_buf;
4006 wmi_extscan_cached_results_event_fixed_param *event;
4007 wmi_extscan_wlan_descriptor *src_hotlist;
4008 wmi_extscan_rssi_info *src_rssi;
4009 int prev_scan_id, scan_ids_cnt, i;
4010
4011 param_buf = (WMI_EXTSCAN_CACHED_RESULTS_EVENTID_param_tlvs *)
4012 cmd_param_info;
4013 event = param_buf->fixed_param;
4014 src_hotlist = param_buf->bssid_list;
4015 src_rssi = param_buf->rssi_list;
4016
4017 /* Find the unique number of scan_id's for grouping */
4018 prev_scan_id = src_rssi->scan_cycle_id;
4019 scan_ids_cnt = 1;
gaurank kathpaliae5f66902018-09-19 17:10:05 +05304020 for (i = 1; i < param_buf->num_rssi_list; i++) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004021 src_rssi++;
4022
4023 if (prev_scan_id != src_rssi->scan_cycle_id) {
4024 scan_ids_cnt++;
4025 prev_scan_id = src_rssi->scan_cycle_id;
4026 }
4027 }
4028
4029 return scan_ids_cnt;
4030}
4031
4032/** wma_fill_num_results_per_scan_id() - fill number of bss per scan id
4033 * @cmd_param_info: event data.
4034 * @scan_id_group: pointer to scan id group.
4035 *
4036 * This utility function parses the input bss table of information
4037 * and finds how many bss are there per unique scan id.
4038 *
4039 * Return: 0 on success; error number otherwise
4040 */
4041static int wma_fill_num_results_per_scan_id(const u_int8_t *cmd_param_info,
4042 struct extscan_cached_scan_result *scan_id_group)
4043{
4044 WMI_EXTSCAN_CACHED_RESULTS_EVENTID_param_tlvs *param_buf;
4045 wmi_extscan_cached_results_event_fixed_param *event;
4046 wmi_extscan_wlan_descriptor *src_hotlist;
4047 wmi_extscan_rssi_info *src_rssi;
4048 struct extscan_cached_scan_result *t_scan_id_grp;
4049 int i, prev_scan_id;
4050
4051 param_buf = (WMI_EXTSCAN_CACHED_RESULTS_EVENTID_param_tlvs *)
4052 cmd_param_info;
4053 event = param_buf->fixed_param;
4054 src_hotlist = param_buf->bssid_list;
4055 src_rssi = param_buf->rssi_list;
4056 t_scan_id_grp = scan_id_group;
4057
4058 prev_scan_id = src_rssi->scan_cycle_id;
4059
4060 t_scan_id_grp->scan_id = src_rssi->scan_cycle_id;
4061 t_scan_id_grp->flags = src_rssi->flags;
Mukul Sharmaf7cb3ab2016-08-12 19:53:52 +05304062 t_scan_id_grp->buckets_scanned = src_rssi->buckets_scanned;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004063 t_scan_id_grp->num_results = 1;
gaurank kathpaliae5f66902018-09-19 17:10:05 +05304064 for (i = 1; i < param_buf->num_rssi_list; i++) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004065 src_rssi++;
4066 if (prev_scan_id == src_rssi->scan_cycle_id) {
4067 t_scan_id_grp->num_results++;
4068 } else {
4069 t_scan_id_grp++;
4070 prev_scan_id = t_scan_id_grp->scan_id =
4071 src_rssi->scan_cycle_id;
4072 t_scan_id_grp->flags = src_rssi->flags;
Mukul Sharmaf7cb3ab2016-08-12 19:53:52 +05304073 t_scan_id_grp->buckets_scanned =
4074 src_rssi->buckets_scanned;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004075 t_scan_id_grp->num_results = 1;
4076 }
4077 }
4078 return 0;
4079}
4080
4081/** wma_group_num_bss_to_scan_id() - group bss to scan id table
4082 * @cmd_param_info: event data.
4083 * @cached_result: pointer to cached table.
4084 *
4085 * This function reads the bss information from the format
4086 * ------------------------------------------------------------------------
4087 * | bss info {rssi, channel, ssid, bssid, timestamp} | scan id_1 | flags |
4088 * | bss info {rssi, channel, ssid, bssid, timestamp} | scan id_2 | flags |
4089 * ........................................................................
4090 * | bss info {rssi, channel, ssid, bssid, timestamp} | scan id_N | flags |
4091 * ------------------------------------------------------------------------
4092 *
4093 * and converts it into the below format and store it
4094 *
4095 * ------------------------------------------------------------------------
4096 * | scan id_1 | -> bss info_1 -> bss info_2 -> .... bss info_M1
4097 * | scan id_2 | -> bss info_1 -> bss info_2 -> .... bss info_M2
4098 * ......................
4099 * | scan id_N | -> bss info_1 -> bss info_2 -> .... bss info_Mn
4100 * ------------------------------------------------------------------------
4101 *
4102 * Return: 0 on success; error number otherwise
4103 */
4104static int wma_group_num_bss_to_scan_id(const u_int8_t *cmd_param_info,
4105 struct extscan_cached_scan_results *cached_result)
4106{
4107 WMI_EXTSCAN_CACHED_RESULTS_EVENTID_param_tlvs *param_buf;
4108 wmi_extscan_cached_results_event_fixed_param *event;
4109 wmi_extscan_wlan_descriptor *src_hotlist;
4110 wmi_extscan_rssi_info *src_rssi;
4111 struct extscan_cached_scan_results *t_cached_result;
4112 struct extscan_cached_scan_result *t_scan_id_grp;
4113 int i, j;
4114 tSirWifiScanResult *ap;
4115
4116 param_buf = (WMI_EXTSCAN_CACHED_RESULTS_EVENTID_param_tlvs *)
4117 cmd_param_info;
4118 event = param_buf->fixed_param;
4119 src_hotlist = param_buf->bssid_list;
4120 src_rssi = param_buf->rssi_list;
4121 t_cached_result = cached_result;
4122 t_scan_id_grp = &t_cached_result->result[0];
4123
4124 WMA_LOGD("%s: num_scan_ids:%d", __func__,
4125 t_cached_result->num_scan_ids);
4126 for (i = 0; i < t_cached_result->num_scan_ids; i++) {
4127 WMA_LOGD("%s: num_results:%d", __func__,
4128 t_scan_id_grp->num_results);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304129 t_scan_id_grp->ap = qdf_mem_malloc(t_scan_id_grp->num_results *
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004130 sizeof(*ap));
Arif Hussain157263f2018-10-03 13:07:15 -07004131 if (!t_scan_id_grp->ap)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004132 return -ENOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004133
4134 ap = &t_scan_id_grp->ap[0];
gaurank kathpaliae5f66902018-09-19 17:10:05 +05304135 for (j = 0; j < QDF_MIN(t_scan_id_grp->num_results,
4136 param_buf->num_bssid_list); j++) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004137 ap->channel = src_hotlist->channel;
4138 ap->ts = WMA_MSEC_TO_USEC(src_rssi->tstamp);
4139 ap->rtt = src_hotlist->rtt;
4140 ap->rtt_sd = src_hotlist->rtt_sd;
4141 ap->beaconPeriod = src_hotlist->beacon_interval;
4142 ap->capability = src_hotlist->capabilities;
4143 ap->ieLength = src_hotlist->ie_length;
4144
4145 /* Firmware already applied noise floor adjustment and
4146 * due to WMI interface "UINT32 rssi", host driver
4147 * receives a positive value, hence convert to
4148 * signed char to get the absolute rssi.
4149 */
4150 ap->rssi = (signed char) src_rssi->rssi;
4151 WMI_MAC_ADDR_TO_CHAR_ARRAY(&src_hotlist->bssid,
4152 ap->bssid.bytes);
4153
Vignesh Viswanathandf0571a2017-11-28 17:39:08 +05304154 if (src_hotlist->ssid.ssid_len >
4155 SIR_MAC_MAX_SSID_LENGTH) {
4156 WMA_LOGD("%s Invalid SSID len %d, truncating",
4157 __func__, src_hotlist->ssid.ssid_len);
4158 src_hotlist->ssid.ssid_len =
4159 SIR_MAC_MAX_SSID_LENGTH;
4160 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304161 qdf_mem_copy(ap->ssid, src_hotlist->ssid.ssid,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004162 src_hotlist->ssid.ssid_len);
4163 ap->ssid[src_hotlist->ssid.ssid_len] = '\0';
4164 ap++;
4165 src_rssi++;
4166 src_hotlist++;
4167 }
4168 t_scan_id_grp++;
4169 }
4170 return 0;
4171}
4172
4173/**
4174 * wma_extscan_cached_results_event_handler() - cached results event handler
4175 * @handle: wma handle
4176 * @cmd_param_info: event buffer
4177 * @len: length of @cmd_param_info
4178 *
4179 * This function handles cached results event and indicate
4180 * cached results to upper layer.
4181 *
4182 * Return: 0 for success or error code.
4183 */
4184int wma_extscan_cached_results_event_handler(void *handle,
4185 uint8_t *cmd_param_info,
4186 uint32_t len)
4187{
4188 WMI_EXTSCAN_CACHED_RESULTS_EVENTID_param_tlvs *param_buf;
4189 wmi_extscan_cached_results_event_fixed_param *event;
4190 struct extscan_cached_scan_results *dest_cachelist;
4191 struct extscan_cached_scan_result *dest_result;
4192 struct extscan_cached_scan_results empty_cachelist;
4193 wmi_extscan_wlan_descriptor *src_hotlist;
4194 wmi_extscan_rssi_info *src_rssi;
Abhinav Kumarcc864962018-02-21 12:36:35 +05304195 int i, moredata, scan_ids_cnt, buf_len, status;
Jeff Johnson9f18aa72018-12-02 12:05:12 -08004196 struct mac_context *mac = cds_get_context(QDF_MODULE_ID_PE);
Varun Reddy Yeturu46ba20c2017-08-17 15:03:27 -07004197 uint32_t total_len;
4198 bool excess_data = false;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004199
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08004200 if (!mac) {
4201 WMA_LOGE("%s: Invalid mac", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004202 return -EINVAL;
4203 }
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08004204 if (!mac->sme.ext_scan_ind_cb) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004205 WMA_LOGE("%s: Callback not registered", __func__);
4206 return -EINVAL;
4207 }
4208 param_buf = (WMI_EXTSCAN_CACHED_RESULTS_EVENTID_param_tlvs *)
4209 cmd_param_info;
4210 if (!param_buf) {
4211 WMA_LOGE("%s: Invalid cached results event", __func__);
4212 return -EINVAL;
4213 }
4214 event = param_buf->fixed_param;
4215 src_hotlist = param_buf->bssid_list;
4216 src_rssi = param_buf->rssi_list;
Srinivas Girigowdadbfb2642016-08-28 21:32:38 -07004217 WMA_LOGI("Total_entries: %u first_entry_index: %u num_entries_in_page: %d",
4218 event->total_entries,
Vignesh Viswanathan4f75cf52017-11-29 14:19:13 +05304219 event->first_entry_index,
4220 event->num_entries_in_page);
4221
4222 if (!src_hotlist || !src_rssi || !event->num_entries_in_page) {
Srinivas Girigowdaf2599dd2015-11-16 18:20:46 -08004223 WMA_LOGW("%s: Cached results empty, send 0 results", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004224 goto noresults;
4225 }
Vignesh Viswanathan4f75cf52017-11-29 14:19:13 +05304226
4227 if (event->num_entries_in_page >
Abhinav Kumara03659c2017-12-28 15:18:07 +05304228 (WMI_SVC_MSG_MAX_SIZE - sizeof(*event))/sizeof(*src_hotlist) ||
4229 event->num_entries_in_page > param_buf->num_bssid_list) {
4230 WMA_LOGE("%s:excess num_entries_in_page %d in WMI event. num_bssid_list %d",
Vignesh Viswanathan4f75cf52017-11-29 14:19:13 +05304231 __func__,
Abhinav Kumara03659c2017-12-28 15:18:07 +05304232 event->num_entries_in_page, param_buf->num_bssid_list);
Vignesh Viswanathan4f75cf52017-11-29 14:19:13 +05304233 return -EINVAL;
4234 } else {
4235 total_len = sizeof(*event) +
4236 (event->num_entries_in_page * sizeof(*src_hotlist));
4237 }
4238 for (i = 0; i < event->num_entries_in_page; i++) {
4239 if (src_hotlist[i].ie_length >
4240 WMI_SVC_MSG_MAX_SIZE - total_len) {
4241 excess_data = true;
4242 break;
4243 } else {
4244 total_len += src_hotlist[i].ie_length;
4245 WMA_LOGD("total len IE: %d", total_len);
4246 }
4247
4248 if (src_hotlist[i].number_rssi_samples >
4249 (WMI_SVC_MSG_MAX_SIZE - total_len) / sizeof(*src_rssi)) {
4250 excess_data = true;
4251 break;
4252 } else {
4253 total_len += (src_hotlist[i].number_rssi_samples *
4254 sizeof(*src_rssi));
4255 WMA_LOGD("total len RSSI samples: %d", total_len);
4256 }
4257 }
4258 if (excess_data) {
4259 WMA_LOGE("%s:excess data in WMI event",
4260 __func__);
4261 return -EINVAL;
4262 }
4263
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004264 if (event->first_entry_index +
4265 event->num_entries_in_page < event->total_entries)
4266 moredata = 1;
4267 else
4268 moredata = 0;
4269
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304270 dest_cachelist = qdf_mem_malloc(sizeof(*dest_cachelist));
Arif Hussain157263f2018-10-03 13:07:15 -07004271 if (!dest_cachelist)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004272 return -ENOMEM;
Arif Hussain157263f2018-10-03 13:07:15 -07004273
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304274 qdf_mem_zero(dest_cachelist, sizeof(*dest_cachelist));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004275 dest_cachelist->request_id = event->request_id;
4276 dest_cachelist->more_data = moredata;
4277
4278 scan_ids_cnt = wma_extscan_find_unique_scan_ids(cmd_param_info);
Vignesh Viswanathan4f75cf52017-11-29 14:19:13 +05304279 WMA_LOGD("%s: scan_ids_cnt %d", __func__, scan_ids_cnt);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004280 dest_cachelist->num_scan_ids = scan_ids_cnt;
4281
4282 buf_len = sizeof(*dest_result) * scan_ids_cnt;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304283 dest_cachelist->result = qdf_mem_malloc(buf_len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004284 if (!dest_cachelist->result) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304285 qdf_mem_free(dest_cachelist);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004286 return -ENOMEM;
4287 }
4288
4289 dest_result = dest_cachelist->result;
4290 wma_fill_num_results_per_scan_id(cmd_param_info, dest_result);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004291
Abhinav Kumarcc864962018-02-21 12:36:35 +05304292 status = wma_group_num_bss_to_scan_id(cmd_param_info, dest_cachelist);
4293 if (!status)
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08004294 mac->sme.ext_scan_ind_cb(mac->hdd_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004295 eSIR_EXTSCAN_CACHED_RESULTS_IND,
4296 dest_cachelist);
Abhinav Kumarcc864962018-02-21 12:36:35 +05304297 else
4298 WMA_LOGD("wma_group_num_bss_to_scan_id failed, not calling callback");
4299
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004300 dest_result = dest_cachelist->result;
4301 for (i = 0; i < dest_cachelist->num_scan_ids; i++) {
Abhinav Kumarcc864962018-02-21 12:36:35 +05304302 if (dest_result->ap)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304303 qdf_mem_free(dest_result->ap);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004304 dest_result++;
4305 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304306 qdf_mem_free(dest_cachelist->result);
4307 qdf_mem_free(dest_cachelist);
Abhinav Kumarcc864962018-02-21 12:36:35 +05304308 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004309
4310noresults:
4311 empty_cachelist.request_id = event->request_id;
4312 empty_cachelist.more_data = 0;
4313 empty_cachelist.num_scan_ids = 0;
4314
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08004315 mac->sme.ext_scan_ind_cb(mac->hdd_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004316 eSIR_EXTSCAN_CACHED_RESULTS_IND,
4317 &empty_cachelist);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004318 return 0;
4319}
4320
4321/**
4322 * wma_extscan_change_results_event_handler() - change results event handler
4323 * @handle: wma handle
4324 * @cmd_param_info: event buffer
4325 * @len: length
4326 *
4327 * This function handles change results event and indicate
4328 * change results to upper layer.
4329 *
4330 * Return: 0 for success or error code.
4331 */
4332int wma_extscan_change_results_event_handler(void *handle,
4333 uint8_t *cmd_param_info,
4334 uint32_t len)
4335{
4336 WMI_EXTSCAN_WLAN_CHANGE_RESULTS_EVENTID_param_tlvs *param_buf;
4337 wmi_extscan_wlan_change_results_event_fixed_param *event;
4338 tSirWifiSignificantChangeEvent *dest_chglist;
4339 tSirWifiSignificantChange *dest_ap;
4340 wmi_extscan_wlan_change_result_bssid *src_chglist;
4341
Pragaspathi Thilagaraje8f5b1d2018-04-04 23:08:48 +05304342 uint32_t numap;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004343 int i, k;
4344 uint8_t *src_rssi;
4345 int count = 0;
4346 int moredata;
Pragaspathi Thilagaraje8f5b1d2018-04-04 23:08:48 +05304347 uint32_t rssi_num = 0;
Jeff Johnson9f18aa72018-12-02 12:05:12 -08004348 struct mac_context *mac = cds_get_context(QDF_MODULE_ID_PE);
Varun Reddy Yeturu46ba20c2017-08-17 15:03:27 -07004349 uint32_t buf_len;
4350 bool excess_data = false;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004351
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08004352 if (!mac) {
4353 WMA_LOGE("%s: Invalid mac", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004354 return -EINVAL;
4355 }
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08004356 if (!mac->sme.ext_scan_ind_cb) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004357 WMA_LOGE("%s: Callback not registered", __func__);
4358 return -EINVAL;
4359 }
4360 param_buf = (WMI_EXTSCAN_WLAN_CHANGE_RESULTS_EVENTID_param_tlvs *)
4361 cmd_param_info;
4362 if (!param_buf) {
4363 WMA_LOGE("%s: Invalid change monitor event", __func__);
4364 return -EINVAL;
4365 }
4366 event = param_buf->fixed_param;
4367 src_chglist = param_buf->bssid_signal_descriptor_list;
4368 src_rssi = param_buf->rssi_list;
4369 numap = event->num_entries_in_page;
4370
4371 if (!src_chglist || !numap) {
4372 WMA_LOGE("%s: Results invalid", __func__);
4373 return -EINVAL;
4374 }
Abhinav Kumara03659c2017-12-28 15:18:07 +05304375 if (numap > param_buf->num_bssid_signal_descriptor_list) {
4376 WMA_LOGE("%s: Invalid num of entries in page: %d", __func__, numap);
4377 return -EINVAL;
4378 }
Pragaspathi Thilagaraje8f5b1d2018-04-04 23:08:48 +05304379 for (i = 0; i < numap; i++) {
4380 if (src_chglist->num_rssi_samples > (UINT_MAX - rssi_num)) {
4381 WMA_LOGE("%s: Invalid num of rssi samples %d numap %d rssi_num %d",
4382 __func__, src_chglist->num_rssi_samples,
4383 numap, rssi_num);
4384 return -EINVAL;
4385 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004386 rssi_num += src_chglist->num_rssi_samples;
Pragaspathi Thilagaraje8f5b1d2018-04-04 23:08:48 +05304387 src_chglist++;
4388 }
4389 src_chglist = param_buf->bssid_signal_descriptor_list;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004390
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004391 if (event->first_entry_index +
4392 event->num_entries_in_page < event->total_entries) {
4393 moredata = 1;
4394 } else {
4395 moredata = 0;
4396 }
Varun Reddy Yeturu46ba20c2017-08-17 15:03:27 -07004397
4398 do {
4399 if (event->num_entries_in_page >
4400 (WMI_SVC_MSG_MAX_SIZE - sizeof(*event))/
4401 sizeof(*src_chglist)) {
4402 excess_data = true;
4403 break;
4404 } else {
4405 buf_len =
4406 sizeof(*event) + (event->num_entries_in_page *
4407 sizeof(*src_chglist));
4408 }
4409 if (rssi_num >
4410 (WMI_SVC_MSG_MAX_SIZE - buf_len)/sizeof(int32_t)) {
4411 excess_data = true;
4412 break;
4413 }
4414 } while (0);
4415
4416 if (excess_data) {
4417 WMA_LOGE("buffer len exceeds WMI payload,numap:%d, rssi_num:%d",
4418 numap, rssi_num);
4419 QDF_ASSERT(0);
4420 return -EINVAL;
4421 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304422 dest_chglist = qdf_mem_malloc(sizeof(*dest_chglist) +
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004423 sizeof(*dest_ap) * numap +
4424 sizeof(int32_t) * rssi_num);
Arif Hussain157263f2018-10-03 13:07:15 -07004425 if (!dest_chglist)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004426 return -ENOMEM;
Arif Hussain157263f2018-10-03 13:07:15 -07004427
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004428 dest_ap = &dest_chglist->ap[0];
4429 for (i = 0; i < numap; i++) {
4430 dest_ap->channel = src_chglist->channel;
4431 WMI_MAC_ADDR_TO_CHAR_ARRAY(&src_chglist->bssid,
4432 dest_ap->bssid.bytes);
4433 dest_ap->numOfRssi = src_chglist->num_rssi_samples;
4434 if (dest_ap->numOfRssi) {
Abhinav Kumara03659c2017-12-28 15:18:07 +05304435 if ((dest_ap->numOfRssi + count) >
4436 param_buf->num_rssi_list) {
4437 WMA_LOGE("%s: Invalid num in rssi list: %d",
4438 __func__, dest_ap->numOfRssi);
4439 qdf_mem_free(dest_chglist);
4440 return -EINVAL;
4441 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004442 for (k = 0; k < dest_ap->numOfRssi; k++) {
4443 dest_ap->rssi[k] = WMA_TGT_NOISE_FLOOR_DBM +
4444 src_rssi[count++];
4445 }
4446 }
Dundi Raviteja35668232018-06-26 13:05:20 +05304447 dest_ap = (tSirWifiSignificantChange *)((char *)dest_ap +
4448 dest_ap->numOfRssi * sizeof(int32_t) +
4449 sizeof(*dest_ap));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004450 src_chglist++;
4451 }
4452 dest_chglist->requestId = event->request_id;
4453 dest_chglist->moreData = moredata;
Dundi Raviteja35668232018-06-26 13:05:20 +05304454 dest_chglist->numResults = numap;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004455
Jeff Johnsonfe8dc692018-11-22 08:45:13 -08004456 mac->sme.ext_scan_ind_cb(mac->hdd_handle,
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004457 eSIR_EXTSCAN_SIGNIFICANT_WIFI_CHANGE_RESULTS_IND,
4458 dest_chglist);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004459 WMA_LOGI("%s: sending change monitor results", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304460 qdf_mem_free(dest_chglist);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004461 return 0;
4462}
4463
4464/**
4465 * wma_passpoint_match_event_handler() - passpoint match found event handler
4466 * @handle: WMA handle
4467 * @cmd_param_info: event data
4468 * @len: event data length
4469 *
4470 * This is the passpoint match found event handler; it reads event data from
4471 * @cmd_param_info and fill in the destination buffer and sends indication
4472 * up layer.
4473 *
4474 * Return: 0 on success; error number otherwise
4475 */
4476int wma_passpoint_match_event_handler(void *handle,
4477 uint8_t *cmd_param_info,
4478 uint32_t len)
4479{
4480 WMI_PASSPOINT_MATCH_EVENTID_param_tlvs *param_buf;
4481 wmi_passpoint_event_hdr *event;
4482 struct wifi_passpoint_match *dest_match;
4483 tSirWifiScanResult *dest_ap;
4484 uint8_t *buf_ptr;
Pragaspathi Thilagarajfda1af62018-03-09 15:11:58 +05304485 uint32_t buf_len = 0;
4486 bool excess_data = false;
Jeff Johnson9f18aa72018-12-02 12:05:12 -08004487 struct mac_context *mac = cds_get_context(QDF_MODULE_ID_PE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004488
4489 if (!mac) {
4490 WMA_LOGE("%s: Invalid mac", __func__);
4491 return -EINVAL;
4492 }
Jeff Johnson17b12392018-07-03 22:21:15 -07004493 if (!mac->sme.ext_scan_ind_cb) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004494 WMA_LOGE("%s: Callback not registered", __func__);
4495 return -EINVAL;
4496 }
4497
4498 param_buf = (WMI_PASSPOINT_MATCH_EVENTID_param_tlvs *) cmd_param_info;
4499 if (!param_buf) {
4500 WMA_LOGE("%s: Invalid passpoint match event", __func__);
4501 return -EINVAL;
4502 }
4503 event = param_buf->fixed_param;
4504 buf_ptr = (uint8_t *)param_buf->fixed_param;
4505
Pragaspathi Thilagarajfda1af62018-03-09 15:11:58 +05304506 do {
4507 if (event->ie_length > (WMI_SVC_MSG_MAX_SIZE)) {
4508 excess_data = true;
4509 break;
4510 } else {
4511 buf_len = event->ie_length;
4512 }
4513
4514 if (event->anqp_length > (WMI_SVC_MSG_MAX_SIZE)) {
4515 excess_data = true;
4516 break;
4517 } else {
4518 buf_len += event->anqp_length;
4519 }
4520
4521 } while (0);
4522
4523 if (excess_data || buf_len > (WMI_SVC_MSG_MAX_SIZE - sizeof(*event)) ||
4524 buf_len > (WMI_SVC_MSG_MAX_SIZE - sizeof(*dest_match)) ||
4525 (event->ie_length + event->anqp_length) > param_buf->num_bufp) {
Abhinav Kumara03659c2017-12-28 15:18:07 +05304526 WMA_LOGE("IE Length: %u or ANQP Length: %u is huge, num_bufp: %u",
4527 event->ie_length, event->anqp_length,
4528 param_buf->num_bufp);
Varun Reddy Yeturu46ba20c2017-08-17 15:03:27 -07004529 return -EINVAL;
4530 }
4531
Vignesh Viswanathandf0571a2017-11-28 17:39:08 +05304532 if (event->ssid.ssid_len > SIR_MAC_MAX_SSID_LENGTH) {
4533 WMA_LOGD("%s: Invalid ssid len %d, truncating",
4534 __func__, event->ssid.ssid_len);
4535 event->ssid.ssid_len = SIR_MAC_MAX_SSID_LENGTH;
4536 }
4537
Pragaspathi Thilagarajfda1af62018-03-09 15:11:58 +05304538 dest_match = qdf_mem_malloc(sizeof(*dest_match) + buf_len);
4539
Arif Hussain157263f2018-10-03 13:07:15 -07004540 if (!dest_match)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004541 return -EINVAL;
Arif Hussain157263f2018-10-03 13:07:15 -07004542
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004543 dest_ap = &dest_match->ap;
4544 dest_match->request_id = 0;
4545 dest_match->id = event->id;
4546 dest_match->anqp_len = event->anqp_length;
4547 WMA_LOGI("%s: passpoint match: id: %u anqp length %u", __func__,
4548 dest_match->id, dest_match->anqp_len);
4549
4550 dest_ap->channel = event->channel_mhz;
4551 dest_ap->ts = event->timestamp;
4552 dest_ap->rtt = event->rtt;
4553 dest_ap->rssi = event->rssi;
4554 dest_ap->rtt_sd = event->rtt_sd;
4555 dest_ap->beaconPeriod = event->beacon_period;
4556 dest_ap->capability = event->capability;
4557 dest_ap->ieLength = event->ie_length;
4558 WMI_MAC_ADDR_TO_CHAR_ARRAY(&event->bssid, dest_ap->bssid.bytes);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304559 qdf_mem_copy(dest_ap->ssid, event->ssid.ssid,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004560 event->ssid.ssid_len);
4561 dest_ap->ssid[event->ssid.ssid_len] = '\0';
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304562 qdf_mem_copy(dest_ap->ieData, buf_ptr + sizeof(*event) +
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004563 WMI_TLV_HDR_SIZE, dest_ap->ieLength);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304564 qdf_mem_copy(dest_match->anqp, buf_ptr + sizeof(*event) +
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004565 WMI_TLV_HDR_SIZE + dest_ap->ieLength,
4566 dest_match->anqp_len);
4567
Jeff Johnson17b12392018-07-03 22:21:15 -07004568 mac->sme.ext_scan_ind_cb(mac->hdd_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004569 eSIR_PASSPOINT_NETWORK_FOUND_IND,
4570 dest_match);
4571 WMA_LOGI("%s: sending passpoint match event to hdd", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304572 qdf_mem_free(dest_match);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004573 return 0;
4574}
4575
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304576QDF_STATUS wma_start_extscan(tp_wma_handle wma,
Jeff Johnsondab58602018-07-14 15:30:24 -07004577 struct wifi_scan_cmd_req_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004578{
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05304579 QDF_STATUS status;
4580
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004581 if (!wma || !wma->wmi_handle) {
Jeff Johnsondab58602018-07-14 15:30:24 -07004582 wma_err("WMA is closed, can not issue cmd");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304583 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004584 }
Jeff Johnsondab58602018-07-14 15:30:24 -07004585 if (!wmi_service_enabled(wma->wmi_handle, wmi_service_extscan)) {
4586 wma_err("extscan not enabled");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304587 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004588 }
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05304589
Arif Hussain157263f2018-10-03 13:07:15 -07004590 if (!params)
Jeff Johnsondab58602018-07-14 15:30:24 -07004591 wma_err("NULL param");
Naveen Rawat35804772016-06-27 15:40:28 -07004592 return QDF_STATUS_E_NOMEM;
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05304593
Jeff Johnsondab58602018-07-14 15:30:24 -07004594 status = wmi_unified_start_extscan_cmd(wma->wmi_handle, params);
4595 if (QDF_IS_STATUS_SUCCESS(status))
4596 wma->interfaces[params->vdev_id].extscan_in_progress = true;
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05304597
Jeff Johnsondab58602018-07-14 15:30:24 -07004598 wma_debug("Exit, vdev %d, status %d", params->vdev_id, status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004599
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05304600 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004601}
4602
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304603QDF_STATUS wma_stop_extscan(tp_wma_handle wma,
Jeff Johnson7272ea72018-07-15 17:22:27 -07004604 struct extscan_stop_req_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004605{
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05304606 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004607
4608 if (!wma || !wma->wmi_handle) {
4609 WMA_LOGE("%s: WMA is closed, cannot issue cmd", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304610 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004611 }
Jeff Johnson7272ea72018-07-15 17:22:27 -07004612 if (!wmi_service_enabled(wma->wmi_handle, wmi_service_extscan)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004613 WMA_LOGE("%s: extscan not enabled", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304614 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004615 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004616
Jeff Johnson7272ea72018-07-15 17:22:27 -07004617 status = wmi_unified_stop_extscan_cmd(wma->wmi_handle, params);
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05304618 if (QDF_IS_STATUS_ERROR(status))
4619 return status;
4620
Jeff Johnson7272ea72018-07-15 17:22:27 -07004621 wma->interfaces[params->vdev_id].extscan_in_progress = false;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004622 WMA_LOGD("Extscan stop request sent successfully for vdev %d",
Jeff Johnson7272ea72018-07-15 17:22:27 -07004623 params->vdev_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004624
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05304625 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004626}
4627
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304628QDF_STATUS wma_extscan_start_hotlist_monitor(tp_wma_handle wma,
Jeff Johnson1148cb02018-07-13 23:14:32 -07004629 struct extscan_bssid_hotlist_set_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004630{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004631 if (!wma || !wma->wmi_handle) {
4632 WMA_LOGE("%s: WMA is closed, can not issue hotlist cmd",
4633 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304634 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004635 }
Jeff Johnson1148cb02018-07-13 23:14:32 -07004636
4637 if (!params) {
4638 WMA_LOGE("%s: Invalid params", __func__);
4639 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004640 }
Jeff Johnson1148cb02018-07-13 23:14:32 -07004641
4642 return wmi_unified_extscan_start_hotlist_monitor_cmd(wma->wmi_handle,
4643 params);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004644}
4645
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304646QDF_STATUS wma_extscan_stop_hotlist_monitor(tp_wma_handle wma,
Jeff Johnson9743eb72018-07-14 10:30:04 -07004647 struct extscan_bssid_hotlist_reset_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004648{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004649 if (!wma || !wma->wmi_handle) {
Jeff Johnson9743eb72018-07-14 10:30:04 -07004650 WMA_LOGE("%s: WMA is closed, can not issue cmd", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304651 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004652 }
Jeff Johnson9743eb72018-07-14 10:30:04 -07004653
4654 if (!params) {
4655 WMA_LOGE("%s: Invalid params", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304656 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004657 }
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05304658 if (!wmi_service_enabled(wma->wmi_handle,
Jeff Johnson9743eb72018-07-14 10:30:04 -07004659 wmi_service_extscan)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004660 WMA_LOGE("%s: extscan not enabled", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304661 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004662 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004663
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05304664 return wmi_unified_extscan_stop_hotlist_monitor_cmd(wma->wmi_handle,
Jeff Johnson9743eb72018-07-14 10:30:04 -07004665 params);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004666}
4667
Jeff Johnsonb43ed032018-07-16 06:59:21 -07004668QDF_STATUS
4669wma_extscan_start_change_monitor(tp_wma_handle wma,
4670 struct extscan_set_sig_changereq_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004671{
Mohit Khanna0fe61672016-05-19 16:53:39 -07004672 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004673
4674 if (!wma || !wma->wmi_handle) {
Jeff Johnsonb43ed032018-07-16 06:59:21 -07004675 WMA_LOGE("%s: WMA is closed,can not issue cmd",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004676 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304677 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004678 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004679
Jeff Johnsonb43ed032018-07-16 06:59:21 -07004680 if (!params) {
4681 WMA_LOGE("%s: NULL params", __func__);
Mohit Khanna0fe61672016-05-19 16:53:39 -07004682 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004683 }
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05304684
Jeff Johnsonb43ed032018-07-16 06:59:21 -07004685 status = wmi_unified_extscan_start_change_monitor_cmd(wma->wmi_handle,
4686 params);
Mohit Khanna0fe61672016-05-19 16:53:39 -07004687 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004688}
4689
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304690QDF_STATUS wma_extscan_stop_change_monitor(tp_wma_handle wma,
Jeff Johnson0c8dbc32018-07-16 22:10:48 -07004691 struct extscan_capabilities_reset_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004692{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004693 if (!wma || !wma->wmi_handle) {
4694 WMA_LOGE("%s: WMA is closed, can not issue cmd", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304695 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004696 }
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05304697 if (!wmi_service_enabled(wma->wmi_handle,
4698 wmi_service_extscan)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004699 WMA_LOGE("%s: ext scan not enabled", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304700 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004701 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004702
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05304703 return wmi_unified_extscan_stop_change_monitor_cmd(wma->wmi_handle,
Jeff Johnson0c8dbc32018-07-16 22:10:48 -07004704 params);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004705}
4706
Jeff Johnson2ba60092018-07-17 08:19:37 -07004707QDF_STATUS
4708wma_extscan_get_cached_results(tp_wma_handle wma,
4709 struct extscan_cached_result_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004710{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004711 if (!wma || !wma->wmi_handle) {
4712 WMA_LOGE("%s: WMA is closed, cannot issue cmd", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304713 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004714 }
Jeff Johnson2ba60092018-07-17 08:19:37 -07004715 if (!wmi_service_enabled(wma->wmi_handle, wmi_service_extscan)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004716 WMA_LOGE("%s: extscan not enabled", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304717 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004718 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004719
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05304720 return wmi_unified_extscan_get_cached_results_cmd(wma->wmi_handle,
Jeff Johnson2ba60092018-07-17 08:19:37 -07004721 params);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004722}
4723
Jeff Johnsonfed9a732018-07-18 12:18:03 -07004724QDF_STATUS
4725wma_extscan_get_capabilities(tp_wma_handle wma,
4726 struct extscan_capabilities_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004727{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004728 if (!wma || !wma->wmi_handle) {
Jeff Johnsonfed9a732018-07-18 12:18:03 -07004729 WMA_LOGE("%s: WMA is closed, can not issue cmd", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304730 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004731 }
Jeff Johnsonfed9a732018-07-18 12:18:03 -07004732 if (!wmi_service_enabled(wma->wmi_handle, wmi_service_extscan)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004733 WMA_LOGE("%s: extscan not enabled", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304734 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004735 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004736
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05304737 return wmi_unified_extscan_get_capabilities_cmd(wma->wmi_handle,
Jeff Johnsonfed9a732018-07-18 12:18:03 -07004738 params);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004739}
4740
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304741QDF_STATUS wma_set_epno_network_list(tp_wma_handle wma,
Jeff Johnson360135b2018-07-18 20:51:47 -07004742 struct wifi_enhanced_pno_params *req)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004743{
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05304744 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004745
Jeff Johnson360135b2018-07-18 20:51:47 -07004746 wma_debug("Enter");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004747
4748 if (!wma || !wma->wmi_handle) {
Jeff Johnson360135b2018-07-18 20:51:47 -07004749 wma_err("WMA is closed, can not issue cmd");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304750 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004751 }
Jeff Johnson360135b2018-07-18 20:51:47 -07004752
4753 if (!wmi_service_enabled(wma->wmi_handle, wmi_service_extscan)) {
4754 wma_err("extscan not enabled");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304755 return QDF_STATUS_E_NOSUPPORT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004756 }
4757
Jeff Johnson360135b2018-07-18 20:51:47 -07004758 status = wmi_unified_set_epno_network_list_cmd(wma->wmi_handle, req);
4759 wma_debug("Exit, vdev %d, status %d", req->vdev_id, status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004760
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05304761 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004762}
4763
Jeff Johnson2a7f1012018-07-19 07:21:06 -07004764QDF_STATUS
4765wma_set_passpoint_network_list(tp_wma_handle wma,
4766 struct wifi_passpoint_req_param *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004767{
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05304768 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004769
Jeff Johnson2a7f1012018-07-19 07:21:06 -07004770 wma_debug("Enter");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004771
4772 if (!wma || !wma->wmi_handle) {
Jeff Johnson2a7f1012018-07-19 07:21:06 -07004773 wma_err("WMA is closed, can not issue cmd");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304774 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004775 }
Jeff Johnson2a7f1012018-07-19 07:21:06 -07004776 if (!wmi_service_enabled(wma->wmi_handle, wmi_service_extscan)) {
4777 wma_err("extscan not enabled");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304778 return QDF_STATUS_E_NOSUPPORT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004779 }
4780
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05304781 status = wmi_unified_set_passpoint_network_list_cmd(wma->wmi_handle,
Jeff Johnson2a7f1012018-07-19 07:21:06 -07004782 params);
4783 wma_debug("Exit, vdev %d, status %d", params->vdev_id, status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004784
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05304785 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004786}
4787
Jeff Johnson2a7f1012018-07-19 07:21:06 -07004788QDF_STATUS
4789wma_reset_passpoint_network_list(tp_wma_handle wma,
4790 struct wifi_passpoint_req_param *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004791{
Krishna Kumaar Natarajan1b909d72016-06-06 15:02:18 -07004792 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004793
Jeff Johnson2a7f1012018-07-19 07:21:06 -07004794 wma_debug("Enter");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004795
4796 if (!wma || !wma->wmi_handle) {
Jeff Johnson2a7f1012018-07-19 07:21:06 -07004797 wma_err("WMA is closed, can not issue cmd");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304798 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004799 }
Jeff Johnson2a7f1012018-07-19 07:21:06 -07004800 if (!wmi_service_enabled(wma->wmi_handle, wmi_service_extscan)) {
4801 wma_err("extscan not enabled");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304802 return QDF_STATUS_E_NOSUPPORT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004803 }
4804
Krishna Kumaar Natarajan1b909d72016-06-06 15:02:18 -07004805 status = wmi_unified_reset_passpoint_network_list_cmd(wma->wmi_handle,
Jeff Johnson2a7f1012018-07-19 07:21:06 -07004806 params);
4807 wma_debug("Exit, vdev %d, status %d", params->vdev_id, status);
Krishna Kumaar Natarajan1b909d72016-06-06 15:02:18 -07004808
4809 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004810}
4811
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004812#endif
4813
4814/**
4815 * wma_scan_probe_setoui() - set scan probe OUI
4816 * @wma: wma handle
4817 * @psetoui: OUI parameters
4818 *
4819 * set scan probe OUI parameters in firmware
4820 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05304821 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004822 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304823QDF_STATUS wma_scan_probe_setoui(tp_wma_handle wma, tSirScanMacOui *psetoui)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004824{
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05304825 struct scan_mac_oui set_oui;
4826
hangtian127c9532019-01-12 13:29:07 +08004827 qdf_mem_zero(&set_oui, sizeof(struct scan_mac_oui));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004828
4829 if (!wma || !wma->wmi_handle) {
4830 WMA_LOGE("%s: WMA is closed, can not issue cmd", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304831 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004832 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004833
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05304834 qdf_mem_copy(set_oui.oui, psetoui->oui,
4835 WMI_WIFI_SCANNING_MAC_OUI_LENGTH);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004836
Rajeev Kumar Sirasanagandla686abd92017-06-08 18:09:01 +05304837 set_oui.vdev_id = psetoui->vdev_id;
4838 set_oui.enb_probe_req_sno_randomization =
4839 psetoui->enb_probe_req_sno_randomization;
Rajeev Kumar Sirasanagandlaaec0b082017-06-21 11:59:41 +05304840 set_oui.ie_whitelist = psetoui->ie_whitelist;
Rajeev Kumar Sirasanagandla686abd92017-06-08 18:09:01 +05304841
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05304842 return wmi_unified_scan_probe_setoui_cmd(wma->wmi_handle,
4843 &set_oui);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004844}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004845/**
4846 * wma_roam_better_ap_handler() - better ap event handler
4847 * @wma: wma handle
4848 * @vdev_id: vdev id
4849 *
4850 * Handler for WMI_ROAM_REASON_BETTER_AP event from roam firmware in Rome.
4851 * This event means roam algorithm in Rome has found a better matching
4852 * candidate AP. The indication is sent to SME.
4853 *
4854 * Return: none
4855 */
4856void wma_roam_better_ap_handler(tp_wma_handle wma, uint32_t vdev_id)
4857{
Rajeev Kumarcf7bd802017-04-18 11:11:42 -07004858 struct scheduler_msg cds_msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004859 tSirSmeCandidateFoundInd *candidate_ind;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004860
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304861 candidate_ind = qdf_mem_malloc(sizeof(tSirSmeCandidateFoundInd));
Arif Hussain157263f2018-10-03 13:07:15 -07004862 if (!candidate_ind)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004863 return;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004864
Arif Hussain157263f2018-10-03 13:07:15 -07004865 wma->interfaces[vdev_id].roaming_in_progress = true;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004866 candidate_ind->messageType = eWNI_SME_CANDIDATE_FOUND_IND;
4867 candidate_ind->sessionId = vdev_id;
4868 candidate_ind->length = sizeof(tSirSmeCandidateFoundInd);
4869
4870 cds_msg.type = eWNI_SME_CANDIDATE_FOUND_IND;
4871 cds_msg.bodyptr = candidate_ind;
Vignesh Viswanathan067b9e62018-04-11 19:31:46 +05304872 cds_msg.callback = sme_mc_process_handler;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304873 QDF_TRACE(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_INFO,
Arif Hussain157263f2018-10-03 13:07:15 -07004874 FL("posting candidate ind to SME, vdev %d"), vdev_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004875
gaurank kathpalia00861f02018-08-28 19:16:12 +05304876 if (QDF_STATUS_SUCCESS != scheduler_post_message(QDF_MODULE_ID_WMA,
4877 QDF_MODULE_ID_SME,
4878 QDF_MODULE_ID_SCAN,
4879 &cds_msg)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304880 qdf_mem_free(candidate_ind);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304881 QDF_TRACE(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004882 FL("Failed to post candidate ind to SME"));
4883 }
4884}
4885
4886/**
yeshwanth sriram guntuka41f936c2017-09-01 17:53:49 +05304887 * wma_handle_btm_disassoc_imminent_msg() - Send del sta msg to lim on receiving
4888 * BTM request from AP with disassoc imminent reason
4889 * @wma_handle: wma handle
4890 * @vdev_id: vdev id
4891 *
4892 * Return: None
4893 */
4894static void wma_handle_btm_disassoc_imminent_msg(tp_wma_handle wma_handle,
4895 uint32_t vdev_id)
4896{
4897 tpDeleteStaContext del_sta_ctx;
4898
Arif Hussain157263f2018-10-03 13:07:15 -07004899 del_sta_ctx = qdf_mem_malloc(sizeof(tDeleteStaContext));
4900 if (!del_sta_ctx)
yeshwanth sriram guntuka41f936c2017-09-01 17:53:49 +05304901 return;
Arif Hussain157263f2018-10-03 13:07:15 -07004902
yeshwanth sriram guntuka41f936c2017-09-01 17:53:49 +05304903 del_sta_ctx->vdev_id = vdev_id;
4904 del_sta_ctx->reasonCode = HAL_DEL_STA_REASON_CODE_BTM_DISASSOC_IMMINENT;
4905 wma_send_msg(wma_handle, SIR_LIM_DELETE_STA_CONTEXT_IND,
4906 (void *)del_sta_ctx, 0);
4907}
4908
4909/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004910 * wma_roam_event_callback() - roam event callback
4911 * @handle: wma handle
4912 * @event_buf: event buffer
4913 * @len: buffer length
4914 *
4915 * Handler for all events from roam engine in firmware
4916 *
4917 * Return: 0 for success or error code
4918 */
4919int wma_roam_event_callback(WMA_HANDLE handle, uint8_t *event_buf,
4920 uint32_t len)
4921{
4922 tp_wma_handle wma_handle = (tp_wma_handle) handle;
4923 WMI_ROAM_EVENTID_param_tlvs *param_buf;
4924 wmi_roam_event_fixed_param *wmi_event;
Varun Reddy Yeturuf907f912016-03-21 15:06:22 -07004925 struct sSirSmeRoamOffloadSynchInd *roam_synch_data;
4926 enum sir_roam_op_code op_code = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004927
4928 param_buf = (WMI_ROAM_EVENTID_param_tlvs *) event_buf;
4929 if (!param_buf) {
4930 WMA_LOGE("Invalid roam event buffer");
4931 return -EINVAL;
4932 }
4933
4934 wmi_event = param_buf->fixed_param;
Varun Reddy Yeturuf907f912016-03-21 15:06:22 -07004935 WMA_LOGD("%s: Reason %x, Notif %x for vdevid %x, rssi %d",
4936 __func__, wmi_event->reason, wmi_event->notif,
4937 wmi_event->vdev_id, wmi_event->rssi);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004938
Himanshu Agarwal847dd5d2017-10-04 14:15:04 +05304939 if (wmi_event->vdev_id >= wma_handle->max_bssid) {
4940 WMA_LOGE("Invalid vdev id from firmware");
4941 return -EINVAL;
4942 }
Deepak Dhamdheref918d422017-07-06 12:56:29 -07004943 wlan_roam_debug_log(wmi_event->vdev_id, DEBUG_ROAM_EVENT,
4944 DEBUG_INVALID_PEER_ID, NULL, NULL,
4945 wmi_event->reason,
4946 (wmi_event->reason == WMI_ROAM_REASON_INVALID) ?
4947 wmi_event->notif : wmi_event->rssi);
Himanshu Agarwal847dd5d2017-10-04 14:15:04 +05304948
Himanshu Agarwal67a863b2016-09-20 15:09:09 +05304949 DPTRACE(qdf_dp_trace_record_event(QDF_DP_TRACE_EVENT_RECORD,
Venkata Sharath Chandra Manchala0b9fc632017-05-15 14:35:15 -07004950 wmi_event->vdev_id, QDF_TRACE_DEFAULT_PDEV_ID,
4951 QDF_PROTO_TYPE_EVENT, QDF_ROAM_EVENTID));
Himanshu Agarwal67a863b2016-09-20 15:09:09 +05304952
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004953 switch (wmi_event->reason) {
yeshwanth sriram guntuka41f936c2017-09-01 17:53:49 +05304954 case WMI_ROAM_REASON_BTM:
4955 /*
4956 * This event is received from firmware if firmware is unable to
4957 * find candidate AP after roam scan and BTM request from AP
4958 * has disassoc imminent bit set.
4959 */
4960 WMA_LOGD("Kickout due to btm request");
4961 wma_sta_kickout_event(HOST_STA_KICKOUT_REASON_BTM,
4962 wmi_event->vdev_id, NULL);
4963 wma_handle_btm_disassoc_imminent_msg(wma_handle,
4964 wmi_event->vdev_id);
4965 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004966 case WMI_ROAM_REASON_BMISS:
4967 WMA_LOGD("Beacon Miss for vdevid %x", wmi_event->vdev_id);
Sreelakshmi Konamki58c72432016-11-09 17:06:44 +05304968 wma_beacon_miss_handler(wma_handle, wmi_event->vdev_id,
4969 wmi_event->rssi);
Sen, Devendra154b3c42017-02-13 20:44:15 +05304970 wma_sta_kickout_event(HOST_STA_KICKOUT_REASON_BMISS,
4971 wmi_event->vdev_id, NULL);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004972 break;
4973 case WMI_ROAM_REASON_BETTER_AP:
4974 WMA_LOGD("%s:Better AP found for vdevid %x, rssi %d", __func__,
4975 wmi_event->vdev_id, wmi_event->rssi);
4976 wma_handle->suitable_ap_hb_failure = false;
4977 wma_roam_better_ap_handler(wma_handle, wmi_event->vdev_id);
4978 break;
4979 case WMI_ROAM_REASON_SUITABLE_AP:
4980 wma_handle->suitable_ap_hb_failure = true;
Sreelakshmi Konamki58c72432016-11-09 17:06:44 +05304981 wma_handle->suitable_ap_hb_failure_rssi = wmi_event->rssi;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004982 WMA_LOGD("%s:Bmiss scan AP found for vdevid %x, rssi %d",
4983 __func__, wmi_event->vdev_id, wmi_event->rssi);
4984 wma_roam_better_ap_handler(wma_handle, wmi_event->vdev_id);
4985 break;
4986#ifdef WLAN_FEATURE_ROAM_OFFLOAD
4987 case WMI_ROAM_REASON_HO_FAILED:
4988 WMA_LOGE("LFR3:Hand-Off Failed for vdevid %x",
4989 wmi_event->vdev_id);
4990 wma_roam_ho_fail_handler(wma_handle, wmi_event->vdev_id);
Tushnim Bhattacharyyaeb622b02018-05-07 13:50:51 -07004991 wma_handle->interfaces[wmi_event->vdev_id].
4992 roaming_in_progress = false;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004993 break;
4994#endif
Varun Reddy Yeturuf907f912016-03-21 15:06:22 -07004995 case WMI_ROAM_REASON_INVALID:
4996 roam_synch_data = qdf_mem_malloc(sizeof(*roam_synch_data));
Arif Hussain157263f2018-10-03 13:07:15 -07004997 if (!roam_synch_data)
Varun Reddy Yeturuf907f912016-03-21 15:06:22 -07004998 return -ENOMEM;
Arif Hussain157263f2018-10-03 13:07:15 -07004999
Tushnim Bhattacharyyaeb622b02018-05-07 13:50:51 -07005000 if (wmi_event->notif == WMI_ROAM_NOTIF_ROAM_START) {
Naveen Rawat8cc23b02016-07-14 12:22:56 -07005001 op_code = SIR_ROAMING_START;
Tushnim Bhattacharyyaeb622b02018-05-07 13:50:51 -07005002 wma_handle->interfaces[wmi_event->vdev_id].
5003 roaming_in_progress = true;
5004 }
5005 if (wmi_event->notif == WMI_ROAM_NOTIF_ROAM_ABORT) {
Naveen Rawat8cc23b02016-07-14 12:22:56 -07005006 op_code = SIR_ROAMING_ABORT;
Tushnim Bhattacharyyaeb622b02018-05-07 13:50:51 -07005007 wma_handle->interfaces[wmi_event->vdev_id].
5008 roaming_in_progress = false;
5009 }
Varun Reddy Yeturuf907f912016-03-21 15:06:22 -07005010 roam_synch_data->roamedVdevId = wmi_event->vdev_id;
Varun Reddy Yeturub5d858e2017-12-15 16:08:13 -08005011 wma_handle->pe_roam_synch_cb(
Jeff Johnson9f18aa72018-12-02 12:05:12 -08005012 (struct mac_context *)wma_handle->mac_context,
Varun Reddy Yeturub5d858e2017-12-15 16:08:13 -08005013 roam_synch_data, NULL, op_code);
Varun Reddy Yeturuf907f912016-03-21 15:06:22 -07005014 wma_handle->csr_roam_synch_cb(
Jeff Johnson9f18aa72018-12-02 12:05:12 -08005015 (struct mac_context *)wma_handle->mac_context,
Varun Reddy Yeturuf907f912016-03-21 15:06:22 -07005016 roam_synch_data, NULL, op_code);
5017 qdf_mem_free(roam_synch_data);
5018 break;
Sreelakshmi Konamki88a2a412017-04-14 15:11:55 +05305019 case WMI_ROAM_REASON_RSO_STATUS:
5020 wma_rso_cmd_status_event_handler(wmi_event);
5021 break;
Arif Hussain43354e62017-05-24 11:24:25 -07005022 case WMI_ROAM_REASON_INVOKE_ROAM_FAIL:
5023 roam_synch_data = qdf_mem_malloc(sizeof(*roam_synch_data));
Arif Hussain157263f2018-10-03 13:07:15 -07005024 if (!roam_synch_data)
Arif Hussain43354e62017-05-24 11:24:25 -07005025 return -ENOMEM;
Arif Hussain157263f2018-10-03 13:07:15 -07005026
Arif Hussain43354e62017-05-24 11:24:25 -07005027 roam_synch_data->roamedVdevId = wmi_event->vdev_id;
5028 wma_handle->csr_roam_synch_cb(
Jeff Johnson9f18aa72018-12-02 12:05:12 -08005029 (struct mac_context *)wma_handle->mac_context,
Arif Hussain43354e62017-05-24 11:24:25 -07005030 roam_synch_data, NULL, SIR_ROAMING_INVOKE_FAIL);
5031 qdf_mem_free(roam_synch_data);
5032 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005033 default:
5034 WMA_LOGD("%s:Unhandled Roam Event %x for vdevid %x", __func__,
5035 wmi_event->reason, wmi_event->vdev_id);
5036 break;
5037 }
5038 return 0;
5039}
5040
Ravi Joshi9e891ba2015-11-09 19:03:46 -08005041#ifdef FEATURE_LFR_SUBNET_DETECTION
5042/**
5043 * wma_set_gateway_params() - set gateway parameters
5044 * @wma: WMA handle
5045 * @req: gateway parameter update request structure
5046 *
5047 * This function reads the incoming @req and fill in the destination
5048 * WMI structure and sends down the gateway configs down to the firmware
5049 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305050 * Return: QDF_STATUS
Ravi Joshi9e891ba2015-11-09 19:03:46 -08005051 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305052QDF_STATUS wma_set_gateway_params(tp_wma_handle wma,
Ravi Joshi9e891ba2015-11-09 19:03:46 -08005053 struct gateway_param_update_req *req)
5054{
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05305055 struct gateway_update_req_param params = {0};
Ravi Joshi9e891ba2015-11-09 19:03:46 -08005056
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05305057 if (!wma) {
5058 WMA_LOGE("%s: wma handle is NULL", __func__);
5059 return QDF_STATUS_E_INVAL;
Ravi Joshi9e891ba2015-11-09 19:03:46 -08005060 }
5061
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05305062 params.request_id = req->request_id;
5063 params.session_id = req->session_id;
5064 params.max_retries = req->max_retries;
5065 params.timeout = req->timeout;
5066 params.ipv4_addr_type = req->ipv4_addr_type;
5067 params.ipv6_addr_type = req->ipv6_addr_type;
5068 qdf_mem_copy(&params.gw_mac_addr, &req->gw_mac_addr,
5069 sizeof(struct qdf_mac_addr));
5070 qdf_mem_copy(params.ipv4_addr, req->ipv4_addr,
5071 QDF_IPV4_ADDR_SIZE);
5072 qdf_mem_copy(params.ipv6_addr, req->ipv6_addr,
5073 QDF_IPV6_ADDR_SIZE);
Ravi Joshi9e891ba2015-11-09 19:03:46 -08005074
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05305075 return wmi_unified_set_gateway_params_cmd(wma->wmi_handle,
5076 &params);
Ravi Joshi9e891ba2015-11-09 19:03:46 -08005077}
5078#endif /* FEATURE_LFR_SUBNET_DETECTION */
5079
Sandeep Puligillae0875662016-02-12 16:09:21 -08005080/**
5081 * wma_ht40_stop_obss_scan() - ht40 obss stop scan
5082 * @wma: WMA handel
5083 * @vdev_id: vdev identifier
5084 *
5085 * Return: Return QDF_STATUS, otherwise appropriate failure code
5086 */
5087QDF_STATUS wma_ht40_stop_obss_scan(tp_wma_handle wma, int32_t vdev_id)
5088{
5089
5090 wmi_buf_t buf;
5091 wmi_obss_scan_disable_cmd_fixed_param *cmd;
5092 int ret;
5093 int len = sizeof(*cmd);
5094
5095 buf = wmi_buf_alloc(wma->wmi_handle, len);
Arif Hussain157263f2018-10-03 13:07:15 -07005096 if (!buf)
Sandeep Puligillae0875662016-02-12 16:09:21 -08005097 return QDF_STATUS_E_NOMEM;
Sandeep Puligillae0875662016-02-12 16:09:21 -08005098
5099 WMA_LOGD("cmd %x vdev_id %d", WMI_OBSS_SCAN_DISABLE_CMDID, vdev_id);
5100
5101 cmd = (wmi_obss_scan_disable_cmd_fixed_param *) wmi_buf_data(buf);
5102 WMITLV_SET_HDR(&cmd->tlv_header,
5103 WMITLV_TAG_STRUC_wmi_obss_scan_disable_cmd_fixed_param,
5104 WMITLV_GET_STRUCT_TLVLEN(
5105 wmi_obss_scan_disable_cmd_fixed_param));
5106
5107 cmd->vdev_id = vdev_id;
5108 ret = wmi_unified_cmd_send(wma->wmi_handle, buf, len,
5109 WMI_OBSS_SCAN_DISABLE_CMDID);
5110 if (ret != EOK) {
Sandeep Puligillae0875662016-02-12 16:09:21 -08005111 wmi_buf_free(buf);
5112 return QDF_STATUS_E_FAILURE;
5113 }
5114
5115 return QDF_STATUS_SUCCESS;
5116}
5117
5118/**
5119 * wma_send_ht40_obss_scanind() - ht40 obss start scan indication
5120 * @wma: WMA handel
5121 * @req: start scan request
5122 *
5123 * Return: Return QDF_STATUS, otherwise appropriate failure code
5124 */
5125QDF_STATUS wma_send_ht40_obss_scanind(tp_wma_handle wma,
5126 struct obss_ht40_scanind *req)
5127{
5128 wmi_buf_t buf;
5129 wmi_obss_scan_enable_cmd_fixed_param *cmd;
5130 int ret;
5131 int len = 0;
5132 uint8_t *buf_ptr, i;
5133 uint8_t *channel_list;
5134
5135 len += sizeof(wmi_obss_scan_enable_cmd_fixed_param);
5136
5137 len += WMI_TLV_HDR_SIZE;
5138 len += qdf_roundup(sizeof(uint8_t) * req->channel_count,
5139 sizeof(uint32_t));
5140
5141 len += WMI_TLV_HDR_SIZE;
5142 len += qdf_roundup(sizeof(uint8_t) * 1, sizeof(uint32_t));
5143
5144 WMA_LOGE("cmdlen %d vdev_id %d channel count %d iefield_len %d",
5145 len, req->bss_id, req->channel_count, req->iefield_len);
5146
5147 WMA_LOGE("scantype %d active_time %d passive %d Obss interval %d",
5148 req->scan_type, req->obss_active_dwelltime,
5149 req->obss_passive_dwelltime,
5150 req->obss_width_trigger_interval);
5151
5152 buf = wmi_buf_alloc(wma->wmi_handle, len);
Arif Hussain157263f2018-10-03 13:07:15 -07005153 if (!buf)
Sandeep Puligillae0875662016-02-12 16:09:21 -08005154 return QDF_STATUS_E_NOMEM;
Sandeep Puligillae0875662016-02-12 16:09:21 -08005155
5156 cmd = (wmi_obss_scan_enable_cmd_fixed_param *) wmi_buf_data(buf);
5157 WMITLV_SET_HDR(&cmd->tlv_header,
5158 WMITLV_TAG_STRUC_wmi_obss_scan_enable_cmd_fixed_param,
5159 WMITLV_GET_STRUCT_TLVLEN(wmi_obss_scan_enable_cmd_fixed_param));
5160
5161 buf_ptr = (uint8_t *) cmd;
5162
5163 cmd->vdev_id = req->bss_id;
5164 cmd->scan_type = req->scan_type;
5165 cmd->obss_scan_active_dwell =
5166 req->obss_active_dwelltime;
5167 cmd->obss_scan_passive_dwell =
5168 req->obss_passive_dwelltime;
5169 cmd->bss_channel_width_trigger_scan_interval =
5170 req->obss_width_trigger_interval;
5171 cmd->bss_width_channel_transition_delay_factor =
5172 req->bsswidth_ch_trans_delay;
5173 cmd->obss_scan_active_total_per_channel =
5174 req->obss_active_total_per_channel;
5175 cmd->obss_scan_passive_total_per_channel =
5176 req->obss_passive_total_per_channel;
5177 cmd->obss_scan_activity_threshold =
5178 req->obss_activity_threshold;
5179
5180 cmd->channel_len = req->channel_count;
5181 cmd->forty_mhz_intolerant = req->fortymhz_intolerent;
5182 cmd->current_operating_class = req->current_operatingclass;
5183 cmd->ie_len = req->iefield_len;
5184
5185 buf_ptr += sizeof(wmi_obss_scan_enable_cmd_fixed_param);
5186 WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_ARRAY_BYTE,
5187 qdf_roundup(req->channel_count, sizeof(uint32_t)));
5188
5189 buf_ptr += WMI_TLV_HDR_SIZE;
5190 channel_list = (uint8_t *) buf_ptr;
5191
5192 for (i = 0; i < req->channel_count; i++) {
5193 channel_list[i] = req->channels[i];
5194 WMA_LOGD("Ch[%d]: %d ", i, channel_list[i]);
5195 }
5196
5197 buf_ptr += qdf_roundup(sizeof(uint8_t) * req->channel_count,
5198 sizeof(uint32_t));
5199 WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_ARRAY_BYTE,
5200 qdf_roundup(1, sizeof(uint32_t)));
5201 buf_ptr += WMI_TLV_HDR_SIZE;
5202
5203 ret = wmi_unified_cmd_send(wma->wmi_handle, buf, len,
5204 WMI_OBSS_SCAN_ENABLE_CMDID);
5205 if (ret != EOK) {
Sandeep Puligillae0875662016-02-12 16:09:21 -08005206 wmi_buf_free(buf);
5207 return QDF_STATUS_E_FAILURE;
5208 }
5209 return QDF_STATUS_SUCCESS;
5210}
Pragaspathi Thilagaraj30251ec2018-12-18 17:22:57 +05305211
5212int wma_handle_btm_blacklist_event(void *handle, uint8_t *cmd_param_info,
5213 uint32_t len)
5214{
5215 tp_wma_handle wma = (tp_wma_handle) handle;
5216 WMI_ROAM_BLACKLIST_EVENTID_param_tlvs *param_buf;
5217 wmi_roam_blacklist_event_fixed_param *resp_event;
5218 wmi_roam_blacklist_with_timeout_tlv_param *src_list;
5219 struct roam_blacklist_event *dst_list;
5220 struct roam_blacklist_timeout *roam_blacklist;
5221 uint32_t num_entries, i;
5222
5223 param_buf = (WMI_ROAM_BLACKLIST_EVENTID_param_tlvs *)cmd_param_info;
5224 if (!param_buf) {
5225 WMA_LOGE("Invalid event buffer");
5226 return -EINVAL;
5227 }
5228
5229 resp_event = param_buf->fixed_param;
5230 if (!resp_event) {
5231 WMA_LOGE("%s: received null event data from target", __func__);
5232 return -EINVAL;
5233 }
5234
5235 if (resp_event->vdev_id >= wma->max_bssid) {
5236 WMA_LOGE("%s: received invalid vdev_id %d",
5237 __func__, resp_event->vdev_id);
5238 return -EINVAL;
5239 }
5240
5241 num_entries = param_buf->num_blacklist_with_timeout;
5242 if (num_entries == 0) {
5243 /* no aps to blacklist just return*/
5244 WMA_LOGE("%s: No APs in blacklist received", __func__);
5245 return 0;
5246 }
5247
5248 if (num_entries > MAX_RSSI_AVOID_BSSID_LIST) {
5249 WMA_LOGE("%s: num blacklist entries:%d exceeds maximum value",
5250 __func__, num_entries);
5251 return -EINVAL;
5252 }
5253
5254 src_list = param_buf->blacklist_with_timeout;
5255 if (len < (sizeof(*resp_event) + (num_entries * sizeof(*src_list)))) {
5256 WMA_LOGE("%s: Invalid length:%d", __func__, len);
5257 return -EINVAL;
5258 }
5259
5260 dst_list = qdf_mem_malloc(sizeof(struct roam_blacklist_event) +
5261 (sizeof(struct roam_blacklist_timeout) *
5262 num_entries));
5263 if (!dst_list)
5264 return -ENOMEM;
5265
5266 roam_blacklist = &dst_list->roam_blacklist[0];
5267 for (i = 0; i < num_entries; i++) {
5268 WMI_MAC_ADDR_TO_CHAR_ARRAY(&src_list->bssid,
5269 roam_blacklist->bssid.bytes);
5270 roam_blacklist->timeout = src_list->timeout;
5271 roam_blacklist->received_time =
5272 qdf_do_div(qdf_get_monotonic_boottime(),
5273 QDF_MC_TIMER_TO_MS_UNIT);
5274 roam_blacklist++;
5275 src_list++;
5276 }
5277
5278 dst_list->num_entries = num_entries;
5279 wma_send_msg(wma, WMA_ROAM_BLACKLIST_MSG, (void *)dst_list, 0);
5280 return 0;
5281}