blob: f4d7ca74edba9a1023dec6357c2a26e938aac5f7 [file] [log] [blame]
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001/*
Kabilan Kannan43d051f2018-01-04 17:54:34 -08002 * Copyright (c) 2013-2018 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"
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070063
Leo Chang96464902016-10-28 11:10:54 -070064/* This is temporary, should be removed */
65#include "ol_htt_api.h"
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -080066#include <cdp_txrx_handle.h>
Krishna Kumaar Natarajan0103ef82017-02-17 18:15:56 -080067#include "wma_he.h"
Sandeep Puligilla1fcdb772017-02-22 21:14:59 -080068#include <wlan_scan_public_structs.h>
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -070069#include <wlan_scan_ucfg_api.h>
Ravi Joshi3750de92017-06-01 13:26:09 -070070#include "wma_nan_datapath.h"
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -070071
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080072#define WMA_MCC_MIRACAST_REST_TIME 400
73#define WMA_SCAN_ID_MASK 0x0fff
74
75#ifdef FEATURE_WLAN_EXTSCAN
76/**
77 * enum extscan_report_events_type - extscan report events type
78 * @EXTSCAN_REPORT_EVENTS_BUFFER_FULL: report only when scan history is % full
79 * @EXTSCAN_REPORT_EVENTS_EACH_SCAN: report a scan completion event after scan
80 * @EXTSCAN_REPORT_EVENTS_FULL_RESULTS: forward scan results
81 * (beacons/probe responses + IEs)
82 * in real time to HAL, in addition to completion events.
83 * Note: To keep backward compatibility,
84 * fire completion events regardless of REPORT_EVENTS_EACH_SCAN.
85 * @EXTSCAN_REPORT_EVENTS_NO_BATCH: controls batching,
86 * 0 => batching, 1 => no batching
Mukul Sharmafa937be2016-08-12 18:13:36 +053087 * @EXTSCAN_REPORT_EVENTS_CONTEXT_HUB: forward results to context hub
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -070088 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080089enum extscan_report_events_type {
90 EXTSCAN_REPORT_EVENTS_BUFFER_FULL = 0x00,
91 EXTSCAN_REPORT_EVENTS_EACH_SCAN = 0x01,
92 EXTSCAN_REPORT_EVENTS_FULL_RESULTS = 0x02,
93 EXTSCAN_REPORT_EVENTS_NO_BATCH = 0x04,
Mukul Sharmafa937be2016-08-12 18:13:36 +053094 EXTSCAN_REPORT_EVENTS_CONTEXT_HUB = 0x08,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080095};
96
Dustin Brownd0a76562017-10-13 14:48:37 -070097#define WMA_EXTSCAN_CYCLE_WAKE_LOCK_DURATION WAKELOCK_DURATION_RECOMMENDED
Sridhar Selvaraj22943572017-07-26 15:06:40 +053098
99/*
100 * Maximum number of entires that could be present in the
101 * WMI_EXTSCAN_HOTLIST_MATCH_EVENT buffer from the firmware
102 */
103#define WMA_EXTSCAN_MAX_HOTLIST_ENTRIES 10
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800104#endif
105
106/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800107 * wma_update_channel_list() - update channel list
108 * @handle: wma handle
109 * @chan_list: channel list
110 *
111 * Function is used to update the support channel list in fw.
112 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +0530113 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800114 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530115QDF_STATUS wma_update_channel_list(WMA_HANDLE handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800116 tSirUpdateChanList *chan_list)
117{
118 tp_wma_handle wma_handle = (tp_wma_handle) handle;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530119 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Govind Singhbc64c9e2016-02-25 17:42:38 +0530120 int i;
121 struct scan_chan_list_params scan_ch_param = {0};
Himanshu Agarwalb56ad2e2016-07-19 15:43:09 +0530122 wmi_channel_param *tchan_info;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800123
Govind Singhbc64c9e2016-02-25 17:42:38 +0530124 scan_ch_param.chan_info = qdf_mem_malloc(sizeof(wmi_channel) *
125 chan_list->numChan);
126 if (NULL == scan_ch_param.chan_info) {
127 WMA_LOGE("%s: Failed to allocate channel info", __func__);
128 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800129 }
Govind Singhbc64c9e2016-02-25 17:42:38 +0530130 qdf_mem_zero(scan_ch_param.chan_info, sizeof(wmi_channel) *
131 chan_list->numChan);
132 WMA_LOGD("no of channels = %d", chan_list->numChan);
133 tchan_info = scan_ch_param.chan_info;
134 scan_ch_param.num_scan_chans = chan_list->numChan;
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +0530135 wma_handle->saved_chan.num_channels = chan_list->numChan;
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -0700136 WMA_LOGD("ht %d, vht %d, vht_24 %d", chan_list->ht_en,
137 chan_list->vht_en, chan_list->vht_24_en);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800138
139 for (i = 0; i < chan_list->numChan; ++i) {
Govind Singhbc64c9e2016-02-25 17:42:38 +0530140 tchan_info->mhz =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800141 cds_chan_to_freq(chan_list->chanParam[i].chanId);
Govind Singhbc64c9e2016-02-25 17:42:38 +0530142 tchan_info->band_center_freq1 =
143 tchan_info->mhz;
144 tchan_info->band_center_freq2 = 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",
149 i, tchan_info->mhz,
150 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) {
Amar Singhal4b7b78b2016-08-23 15:49:41 -0700155 WMI_SET_CHANNEL_FLAG(tchan_info,
156 WMI_CHAN_FLAG_PASSIVE);
Ganesh Kondabattinidadf1fb2017-09-13 11:15:06 +0530157 WMI_SET_CHANNEL_FLAG(tchan_info,
158 WMI_CHAN_FLAG_DFS);
159 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800160
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -0700161 if (tchan_info->mhz < WMA_2_4_GHZ_MAX_FREQ) {
Govind Singhbc64c9e2016-02-25 17:42:38 +0530162 WMI_SET_CHANNEL_MODE(tchan_info, MODE_11G);
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -0700163 if (chan_list->vht_en && chan_list->vht_24_en)
164 WMI_SET_CHANNEL_FLAG(tchan_info,
165 WMI_CHAN_FLAG_ALLOW_VHT);
166 } else {
Govind Singhbc64c9e2016-02-25 17:42:38 +0530167 WMI_SET_CHANNEL_MODE(tchan_info, MODE_11A);
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -0700168 if (chan_list->vht_en)
169 WMI_SET_CHANNEL_FLAG(tchan_info,
170 WMI_CHAN_FLAG_ALLOW_VHT);
171 }
172
173 if (chan_list->ht_en)
174 WMI_SET_CHANNEL_FLAG(tchan_info,
175 WMI_CHAN_FLAG_ALLOW_HT);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800176
177 if (chan_list->chanParam[i].half_rate)
Govind Singhbc64c9e2016-02-25 17:42:38 +0530178 WMI_SET_CHANNEL_FLAG(tchan_info,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800179 WMI_CHAN_FLAG_HALF_RATE);
180 else if (chan_list->chanParam[i].quarter_rate)
Govind Singhbc64c9e2016-02-25 17:42:38 +0530181 WMI_SET_CHANNEL_FLAG(tchan_info,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800182 WMI_CHAN_FLAG_QUARTER_RATE);
183
Govind Singhbc64c9e2016-02-25 17:42:38 +0530184 WMI_SET_CHANNEL_MAX_TX_POWER(tchan_info,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800185 chan_list->chanParam[i].pwr);
186
Govind Singhbc64c9e2016-02-25 17:42:38 +0530187 WMI_SET_CHANNEL_REG_POWER(tchan_info,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800188 chan_list->chanParam[i].pwr);
Govind Singhbc64c9e2016-02-25 17:42:38 +0530189 tchan_info++;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800190 }
191
Govind Singhbc64c9e2016-02-25 17:42:38 +0530192 qdf_status = wmi_unified_scan_chan_list_cmd_send(wma_handle->wmi_handle,
193 &scan_ch_param);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800194
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700195 if (QDF_IS_STATUS_ERROR(qdf_status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800196 WMA_LOGE("Failed to send WMI_SCAN_CHAN_LIST_CMDID");
Govind Singhbc64c9e2016-02-25 17:42:38 +0530197
198 qdf_mem_free(scan_ch_param.chan_info);
199
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530200 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800201}
202
Varun Reddy Yeturu061d4d62017-07-20 09:39:32 -0700203QDF_STATUS wma_roam_scan_mawc_params(tp_wma_handle wma_handle,
204 tSirRoamOffloadScanReq *roam_req)
205{
206 struct wmi_mawc_roam_params *params;
207 QDF_STATUS status;
208
209 if (!roam_req) {
210 WMA_LOGE("No MAWC parameters to send");
211 return QDF_STATUS_E_INVAL;
212 }
213 params = qdf_mem_malloc(sizeof(*params));
214 if (!params) {
215 WMA_LOGE("No memory allocated for MAWC roam params");
216 return QDF_STATUS_E_NOMEM;
217 }
218 params->vdev_id = roam_req->sessionId;
219 params->enable = roam_req->mawc_roam_params.mawc_enabled &&
220 roam_req->mawc_roam_params.mawc_roam_enabled;
221 params->traffic_load_threshold =
222 roam_req->mawc_roam_params.mawc_roam_traffic_threshold;
223 params->best_ap_rssi_threshold =
224 roam_req->mawc_roam_params.mawc_roam_ap_rssi_threshold -
225 WMA_NOISE_FLOOR_DBM_DEFAULT;
226 params->rssi_stationary_high_adjust =
227 roam_req->mawc_roam_params.mawc_roam_rssi_high_adjust;
228 params->rssi_stationary_low_adjust =
229 roam_req->mawc_roam_params.mawc_roam_rssi_low_adjust;
230 status = wmi_unified_roam_mawc_params_cmd(
231 wma_handle->wmi_handle, params);
232 qdf_mem_free(params);
233
234 return status;
235}
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +0530236#ifdef WLAN_FEATURE_FILS_SK
237/**
238 * wma_roam_scan_fill_fils_params() - API to fill FILS params in RSO command
239 * @wma_handle: WMA handle
240 * @params: Pointer to destination RSO params to be filled
241 * @roam_req: Pointer to RSO params from CSR
242 *
243 * Return: None
244 */
245static void wma_roam_scan_fill_fils_params(tp_wma_handle wma_handle,
246 struct roam_offload_scan_params
247 *params, tSirRoamOffloadScanReq
248 *roam_req)
249{
250 struct roam_fils_params *dst_fils_params, *src_fils_params;
251
252 if (!params || !roam_req || !roam_req->is_fils_connection) {
253 WMA_LOGE("wma_roam_scan_fill_fils_params- NULL");
254 return;
255 }
256
257 src_fils_params = &roam_req->roam_fils_params;
258 dst_fils_params = &params->roam_fils_params;
259
260 params->add_fils_tlv = true;
261
262 dst_fils_params->username_length = src_fils_params->username_length;
263 qdf_mem_copy(dst_fils_params->username, src_fils_params->username,
264 dst_fils_params->username_length);
265
266 dst_fils_params->next_erp_seq_num = src_fils_params->next_erp_seq_num;
267 dst_fils_params->rrk_length = src_fils_params->rrk_length;
268 qdf_mem_copy(dst_fils_params->rrk, src_fils_params->rrk,
269 dst_fils_params->rrk_length);
270
271 dst_fils_params->rik_length = src_fils_params->rik_length;
272 qdf_mem_copy(dst_fils_params->rik, src_fils_params->rik,
273 dst_fils_params->rik_length);
274
275 dst_fils_params->realm_len = src_fils_params->realm_len;
276 qdf_mem_copy(dst_fils_params->realm, src_fils_params->realm,
277 dst_fils_params->realm_len);
278}
279#else
280static inline void wma_roam_scan_fill_fils_params(
281 tp_wma_handle wma_handle,
282 struct roam_offload_scan_params *params,
283 tSirRoamOffloadScanReq *roam_req)
284
285{ }
286#endif
Varun Reddy Yeturu061d4d62017-07-20 09:39:32 -0700287
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800288/**
289 * wma_roam_scan_offload_mode() - send roam scan mode request to fw
290 * @wma_handle: wma handle
291 * @scan_cmd_fp: start scan command ptr
292 * @roam_req: roam request param
293 * @mode: mode
294 * @vdev_id: vdev id
295 *
296 * send WMI_ROAM_SCAN_MODE TLV to firmware. It has a piggyback
297 * of WMI_ROAM_SCAN_MODE.
298 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +0530299 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800300 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530301QDF_STATUS wma_roam_scan_offload_mode(tp_wma_handle wma_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800302 wmi_start_scan_cmd_fixed_param *
303 scan_cmd_fp,
304 tSirRoamOffloadScanReq *roam_req,
305 uint32_t mode, uint32_t vdev_id)
306{
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +0530307 QDF_STATUS status = QDF_STATUS_SUCCESS;
Selvaraj, Sridhara7fc7632016-09-04 13:13:38 +0530308 struct roam_offload_scan_params *params =
309 qdf_mem_malloc(sizeof(*params));
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +0530310
Arif Hussaincf6b9602016-10-25 14:46:53 -0700311 if (!params) {
312 WMA_LOGE("%s: Failed to allocate scan params", __func__);
313 return QDF_STATUS_E_NOMEM;
314 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800315#ifdef WLAN_FEATURE_ROAM_OFFLOAD
Arif Hussaincf6b9602016-10-25 14:46:53 -0700316 params->auth_mode = WMI_AUTH_NONE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800317 if (roam_req)
Arif Hussaincf6b9602016-10-25 14:46:53 -0700318 params->auth_mode = e_csr_auth_type_to_rsn_authmode
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800319 (roam_req->ConnectedNetwork.authentication,
320 roam_req->ConnectedNetwork.encryption);
Arif Hussaincf6b9602016-10-25 14:46:53 -0700321 WMA_LOGD("%s : auth mode = %d", __func__, params->auth_mode);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800322#endif /* WLAN_FEATURE_ROAM_OFFLOAD */
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +0530323
Selvaraj, Sridhara7fc7632016-09-04 13:13:38 +0530324 params->is_roam_req_valid = 0;
325 params->mode = mode;
326 params->vdev_id = vdev_id;
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +0530327 if (roam_req) {
Selvaraj, Sridhara7fc7632016-09-04 13:13:38 +0530328 params->is_roam_req_valid = 1;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800329#ifdef WLAN_FEATURE_ROAM_OFFLOAD
Selvaraj, Sridhara7fc7632016-09-04 13:13:38 +0530330 params->roam_offload_enabled = roam_req->RoamOffloadEnabled;
Abhinav Kumara083f212018-04-05 18:49:45 +0530331 params->roam_offload_params.ho_delay_for_rx =
332 roam_req->ho_delay_for_rx;
Selvaraj, Sridhara7fc7632016-09-04 13:13:38 +0530333 params->prefer_5ghz = roam_req->Prefer5GHz;
334 params->roam_rssi_cat_gap = roam_req->RoamRssiCatGap;
335 params->select_5ghz_margin = roam_req->Select5GHzMargin;
336 params->reassoc_failure_timeout =
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +0530337 roam_req->ReassocFailureTimeout;
Selvaraj, Sridhara7fc7632016-09-04 13:13:38 +0530338 params->rokh_id_length = roam_req->R0KH_ID_Length;
339 qdf_mem_copy(params->rokh_id, roam_req->R0KH_ID,
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +0530340 WMI_ROAM_R0KH_ID_MAX_LEN);
Selvaraj, Sridhara7fc7632016-09-04 13:13:38 +0530341 qdf_mem_copy(params->krk, roam_req->KRK, WMI_KRK_KEY_LEN);
342 qdf_mem_copy(params->btk, roam_req->BTK, WMI_BTK_KEY_LEN);
343 qdf_mem_copy(params->psk_pmk, roam_req->PSK_PMK,
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +0530344 WMI_ROAM_SCAN_PSK_SIZE);
Selvaraj, Sridhara7fc7632016-09-04 13:13:38 +0530345 params->pmk_len = roam_req->pmk_len;
346 params->roam_key_mgmt_offload_enabled =
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +0530347 roam_req->RoamKeyMgmtOffloadEnabled;
348 wma_roam_scan_fill_self_caps(wma_handle,
Selvaraj, Sridhara7fc7632016-09-04 13:13:38 +0530349 &params->roam_offload_params, roam_req);
Deepak Dhamdhere828f1892017-02-09 11:51:19 -0800350 params->fw_okc = roam_req->pmkid_modes.fw_okc;
351 params->fw_pmksa_cache = roam_req->pmkid_modes.fw_pmksa_cache;
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +0530352#endif
Abhinav Kumara95af7c2018-04-06 17:08:00 +0530353 params->min_delay_btw_roam_scans =
354 roam_req->min_delay_btw_roam_scans;
355 params->roam_trigger_reason_bitmask =
356 roam_req->roam_trigger_reason_bitmask;
Selvaraj, Sridhara7fc7632016-09-04 13:13:38 +0530357 params->is_ese_assoc = roam_req->IsESEAssoc;
Abhinav Kumar271f0632018-03-29 16:01:30 +0530358 params->is_11r_assoc = roam_req->is_11r_assoc;
Selvaraj, Sridhara7fc7632016-09-04 13:13:38 +0530359 params->mdid.mdie_present = roam_req->MDID.mdiePresent;
360 params->mdid.mobility_domain = roam_req->MDID.mobilityDomain;
361 params->assoc_ie_length = roam_req->assoc_ie.length;
362 qdf_mem_copy(params->assoc_ie, roam_req->assoc_ie.addIEdata,
363 roam_req->assoc_ie.length);
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +0530364
365 wma_roam_scan_fill_fils_params(wma_handle, params, roam_req);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800366 }
367
Abhinav Kumara083f212018-04-05 18:49:45 +0530368 WMA_LOGD(FL("qos_caps: %d, qos_enabled: %d, ho_delay_for_rx: %d, roam_scan_mode: %d"),
Naveen Rawat08340742016-11-17 14:54:39 -0800369 params->roam_offload_params.qos_caps,
Varun Reddy Yeturu69d44b22017-08-15 14:29:32 -0700370 params->roam_offload_params.qos_enabled,
Abhinav Kumara083f212018-04-05 18:49:45 +0530371 params->roam_offload_params.ho_delay_for_rx, params->mode);
Naveen Rawat08340742016-11-17 14:54:39 -0800372
Abhinav Kumaredd1d372018-05-11 15:33:35 +0530373 WMA_LOGD(FL("min_delay_btw_roam_scans:%d, roam_tri_reason_bitmask:%d"),
374 params->min_delay_btw_roam_scans,
375 params->roam_trigger_reason_bitmask);
376
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +0530377 status = wmi_unified_roam_scan_offload_mode_cmd(wma_handle->wmi_handle,
Selvaraj, Sridhara7fc7632016-09-04 13:13:38 +0530378 scan_cmd_fp, params);
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +0530379 if (QDF_IS_STATUS_ERROR(status))
380 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800381
Srinivas Girigowdaf1472122017-03-09 15:44:12 -0800382 WMA_LOGD("%s: WMA --> WMI_ROAM_SCAN_MODE", __func__);
Selvaraj, Sridhara7fc7632016-09-04 13:13:38 +0530383 qdf_mem_free(params);
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +0530384 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800385}
386
387/**
388 * wma_roam_scan_offload_rssi_threshold() - set scan offload rssi threashold
389 * @wma_handle: wma handle
390 * @roam_req: Roaming request buffer
391 *
392 * Send WMI_ROAM_SCAN_RSSI_THRESHOLD TLV to firmware
393 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +0530394 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800395 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530396QDF_STATUS wma_roam_scan_offload_rssi_thresh(tp_wma_handle wma_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800397 tSirRoamOffloadScanReq *roam_req)
398{
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +0530399 struct roam_offload_scan_rssi_params params = {0};
400 QDF_STATUS status = QDF_STATUS_SUCCESS;
401 int rssi_thresh, rssi_thresh_diff;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800402 struct roam_ext_params *roam_params;
403 int32_t good_rssi_threshold;
404 uint32_t hirssi_scan_max_count;
405 uint32_t hirssi_scan_delta;
406 int32_t hirssi_upper_bound;
407
408 /* Send rssi threshold */
409 roam_params = &roam_req->roam_params;
410 rssi_thresh = roam_req->LookupThreshold - WMA_NOISE_FLOOR_DBM_DEFAULT;
411 rssi_thresh_diff = roam_req->OpportunisticScanThresholdDiff;
412 hirssi_scan_max_count = roam_req->hi_rssi_scan_max_count;
413 hirssi_scan_delta = roam_req->hi_rssi_scan_rssi_delta;
414 hirssi_upper_bound = roam_req->hi_rssi_scan_rssi_ub -
415 WMA_NOISE_FLOOR_DBM_DEFAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800416
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800417 /* fill in threshold values */
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +0530418 params.session_id = roam_req->sessionId;
419 params.rssi_thresh = rssi_thresh & 0x000000ff;
420 params.rssi_thresh_diff = rssi_thresh_diff & 0x000000ff;
421 params.hi_rssi_scan_max_count = hirssi_scan_max_count;
422 params.hi_rssi_scan_rssi_delta = hirssi_scan_delta;
423 params.hi_rssi_scan_rssi_ub = hirssi_upper_bound & 0x00000ff;
424 params.raise_rssi_thresh_5g = roam_params->raise_rssi_thresh_5g;
Gupta, Kapilc68ad462016-02-01 19:17:23 +0530425 params.dense_rssi_thresh_offset =
426 roam_params->dense_rssi_thresh_offset;
427 params.dense_min_aps_cnt = roam_params->dense_min_aps_cnt;
428 params.traffic_threshold =
429 roam_params->traffic_threshold;
Kapil Gupta0a2477b2016-08-23 18:00:34 +0530430 params.initial_dense_status = roam_params->initial_dense_status;
Varun Reddy Yeturufaad37e2017-07-26 10:54:13 -0700431 params.bg_scan_bad_rssi_thresh = roam_params->bg_scan_bad_rssi_thresh -
432 WMA_NOISE_FLOOR_DBM_DEFAULT;
433 params.bg_scan_client_bitmap = roam_params->bg_scan_client_bitmap;
Vignesh Viswanathanc018e982017-09-07 18:49:19 +0530434 params.roam_bad_rssi_thresh_offset_2g =
435 roam_params->roam_bad_rssi_thresh_offset_2g;
436 if (params.roam_bad_rssi_thresh_offset_2g)
437 params.flags |= WMI_ROAM_BG_SCAN_FLAGS_2G_TO_5G_ONLY;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800438
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800439 /*
440 * The current Noise floor in firmware is -96dBm. Penalty/Boost
441 * threshold is applied on a weaker signal to make it even more weaker.
442 * So, there is a chance that the user may configure a very low
443 * Penalty/Boost threshold beyond the noise floor. If that is the case,
444 * then suppress the penalty/boost threshold to the noise floor.
445 */
446 if (roam_params->raise_rssi_thresh_5g < WMA_NOISE_FLOOR_DBM_DEFAULT)
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +0530447 params.penalty_threshold_5g = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800448 else
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +0530449 params.boost_threshold_5g =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800450 (roam_params->raise_rssi_thresh_5g -
451 WMA_NOISE_FLOOR_DBM_DEFAULT) & 0x000000ff;
452 if (roam_params->drop_rssi_thresh_5g < WMA_NOISE_FLOOR_DBM_DEFAULT)
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +0530453 params.penalty_threshold_5g = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800454 else
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +0530455 params.penalty_threshold_5g =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800456 (roam_params->drop_rssi_thresh_5g -
457 WMA_NOISE_FLOOR_DBM_DEFAULT) & 0x000000ff;
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +0530458 params.raise_factor_5g = roam_params->raise_factor_5g;
459 params.drop_factor_5g = roam_params->drop_factor_5g;
460 params.max_raise_rssi_5g = roam_params->max_raise_rssi_5g;
461 params.max_drop_rssi_5g = roam_params->max_drop_rssi_5g;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800462
463 if (roam_params->good_rssi_roam)
464 good_rssi_threshold = WMA_NOISE_FLOOR_DBM_DEFAULT;
465 else
466 good_rssi_threshold = 0;
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +0530467 params.good_rssi_threshold =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800468 (good_rssi_threshold - WMA_NOISE_FLOOR_DBM_DEFAULT) & 0x000000ff;
469
470 WMA_LOGD("WMA --> good_rssi_threshold=%d",
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +0530471 params.good_rssi_threshold);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800472
Varun Reddy Yeturu21953a22016-05-17 15:16:44 -0700473 if (roam_req->early_stop_scan_enable) {
474 params.roam_earlystop_thres_min =
475 roam_req->early_stop_scan_min_threshold -
476 WMA_NOISE_FLOOR_DBM_DEFAULT;
477 params.roam_earlystop_thres_max =
478 roam_req->early_stop_scan_max_threshold -
479 WMA_NOISE_FLOOR_DBM_DEFAULT;
480 } else {
481 params.roam_earlystop_thres_min = 0;
482 params.roam_earlystop_thres_max = 0;
483 }
Varun Reddy Yeturu168134f2017-06-26 13:46:05 -0700484 params.rssi_thresh_offset_5g =
485 roam_req->rssi_thresh_offset_5g;
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +0530486
Varun Reddy Yeturu05186292015-09-28 17:12:33 -0700487 WMA_LOGD("early_stop_thresholds en=%d, min=%d, max=%d",
488 roam_req->early_stop_scan_enable,
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +0530489 params.roam_earlystop_thres_min,
490 params.roam_earlystop_thres_max);
Varun Reddy Yeturu168134f2017-06-26 13:46:05 -0700491 WMA_LOGD("rssi_thresh_offset_5g = %d", params.rssi_thresh_offset_5g);
Varun Reddy Yeturu05186292015-09-28 17:12:33 -0700492
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +0530493 status = wmi_unified_roam_scan_offload_rssi_thresh_cmd(
494 wma_handle->wmi_handle, &params);
Varun Reddy Yeturufaad37e2017-07-26 10:54:13 -0700495 if (QDF_IS_STATUS_ERROR(status)) {
496 WMA_LOGE("roam_scan_offload_rssi_thresh_cmd failed %d", status);
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +0530497 return status;
Varun Reddy Yeturufaad37e2017-07-26 10:54:13 -0700498 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800499
Srinivas Girigowdaf1472122017-03-09 15:44:12 -0800500 WMA_LOGD(FL("roam_scan_rssi_thresh=%d, roam_rssi_thresh_diff=%d"),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800501 rssi_thresh, rssi_thresh_diff);
Srinivas Girigowdaf1472122017-03-09 15:44:12 -0800502 WMA_LOGD(
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800503 FL("hirssi_scan max_count=%d, delta=%d, hirssi_upper_bound=%d"),
504 hirssi_scan_max_count, hirssi_scan_delta, hirssi_upper_bound);
Srinivas Girigowdaf1472122017-03-09 15:44:12 -0800505 WMA_LOGD(
Kapil Gupta0a2477b2016-08-23 18:00:34 +0530506 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 +0530507 roam_params->dense_rssi_thresh_offset,
508 roam_params->dense_min_aps_cnt,
Kapil Gupta0a2477b2016-08-23 18:00:34 +0530509 roam_params->traffic_threshold,
510 roam_params->initial_dense_status);
Vignesh Viswanathanc018e982017-09-07 18:49:19 +0530511 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 -0700512 roam_params->bg_scan_bad_rssi_thresh,
Vignesh Viswanathanc018e982017-09-07 18:49:19 +0530513 roam_params->bg_scan_client_bitmap,
514 roam_params->roam_bad_rssi_thresh_offset_2g);
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +0530515 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800516}
517
518/**
519 * wma_roam_scan_offload_scan_period() - set roam offload scan period
520 * @wma_handle: wma handle
521 * @scan_period: scan period
522 * @scan_age: scan age
523 * @vdev_id: vdev id
524 *
525 * Send WMI_ROAM_SCAN_PERIOD parameters to fw.
526 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +0530527 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800528 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530529QDF_STATUS wma_roam_scan_offload_scan_period(tp_wma_handle wma_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800530 uint32_t scan_period,
531 uint32_t scan_age,
532 uint32_t vdev_id)
533{
Govind Singh64b5e112016-03-08 11:53:50 +0530534 return wmi_unified_roam_scan_offload_scan_period(wma_handle->wmi_handle,
535 scan_period, scan_age, vdev_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800536}
537
538/**
539 * wma_roam_scan_offload_rssi_change() - set roam offload RSSI change threshold
540 * @wma_handle: wma handle
541 * @rssi_change_thresh: RSSI Change threshold
542 * @bcn_rssi_weight: beacon RSSI weight
543 * @vdev_id: vdev id
544 *
545 * Send WMI_ROAM_SCAN_RSSI_CHANGE_THRESHOLD parameters to fw.
546 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +0530547 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800548 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530549QDF_STATUS wma_roam_scan_offload_rssi_change(tp_wma_handle wma_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800550 uint32_t vdev_id,
551 int32_t rssi_change_thresh,
552 uint32_t bcn_rssi_weight,
553 uint32_t hirssi_delay_btw_scans)
554{
Govind Singh64b5e112016-03-08 11:53:50 +0530555 int status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800556
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700557 status = wmi_unified_roam_scan_offload_rssi_change_cmd(
558 wma_handle->wmi_handle,
559 vdev_id, rssi_change_thresh,
560 bcn_rssi_weight, hirssi_delay_btw_scans);
Govind Singh64b5e112016-03-08 11:53:50 +0530561 if (status != EOK)
562 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800563
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800564
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530565 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800566}
567
568/**
569 * wma_roam_scan_offload_chan_list() - set roam offload channel list
570 * @wma_handle: wma handle
571 * @chan_count: channel count
572 * @chan_list: channel list
573 * @list_type: list type
574 * @vdev_id: vdev id
575 *
576 * Set roam offload channel list.
577 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +0530578 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800579 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530580QDF_STATUS wma_roam_scan_offload_chan_list(tp_wma_handle wma_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800581 uint8_t chan_count,
582 uint8_t *chan_list,
583 uint8_t list_type, uint32_t vdev_id)
584{
Govind Singh64b5e112016-03-08 11:53:50 +0530585 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800586 int i;
Varun Reddy Yeturu823e9c22016-07-07 17:38:44 -0700587 uint32_t *chan_list_mhz;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800588
589 if (chan_count == 0) {
590 WMA_LOGD("%s : invalid number of channels %d", __func__,
591 chan_count);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530592 return QDF_STATUS_E_EMPTY;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800593 }
Varun Reddy Yeturu823e9c22016-07-07 17:38:44 -0700594 chan_list_mhz = qdf_mem_malloc(chan_count * sizeof(*chan_list_mhz));
595 if (chan_list_mhz == NULL) {
Naveen Rawat35804772016-06-27 15:40:28 -0700596 WMA_LOGE("%s : Memory allocation failed", __func__);
597 return QDF_STATUS_E_NOMEM;
598 }
599
Govind Singh64b5e112016-03-08 11:53:50 +0530600 for (i = 0; ((i < chan_count) &&
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800601 (i < SIR_ROAM_MAX_CHANNELS)); i++) {
Varun Reddy Yeturu823e9c22016-07-07 17:38:44 -0700602 chan_list_mhz[i] = cds_chan_to_freq(chan_list[i]);
Srinivas Girigowdaf1472122017-03-09 15:44:12 -0800603 WMA_LOGD("%d,", chan_list_mhz[i]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800604 }
605
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700606 status = wmi_unified_roam_scan_offload_chan_list_cmd(
607 wma_handle->wmi_handle,
608 chan_count, chan_list_mhz,
609 list_type, vdev_id);
Varun Reddy Yeturu823e9c22016-07-07 17:38:44 -0700610 qdf_mem_free(chan_list_mhz);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800611
Govind Singh64b5e112016-03-08 11:53:50 +0530612 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800613}
614
615/**
616 * e_csr_auth_type_to_rsn_authmode() - map csr auth type to rsn authmode
617 * @authtype: CSR authtype
618 * @encr: CSR Encryption
619 *
620 * Map CSR's authentication type into RSN auth mode used by firmware
621 *
622 * Return: WMI RSN auth mode
623 */
624A_UINT32 e_csr_auth_type_to_rsn_authmode(eCsrAuthType authtype,
625 eCsrEncryptionType encr)
626{
627 switch (authtype) {
628 case eCSR_AUTH_TYPE_OPEN_SYSTEM:
629 return WMI_AUTH_OPEN;
630 case eCSR_AUTH_TYPE_WPA:
631 return WMI_AUTH_WPA;
632 case eCSR_AUTH_TYPE_WPA_PSK:
633 return WMI_AUTH_WPA_PSK;
634 case eCSR_AUTH_TYPE_RSN:
635 return WMI_AUTH_RSNA;
636 case eCSR_AUTH_TYPE_RSN_PSK:
637 return WMI_AUTH_RSNA_PSK;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800638 case eCSR_AUTH_TYPE_FT_RSN:
639 return WMI_AUTH_FT_RSNA;
640 case eCSR_AUTH_TYPE_FT_RSN_PSK:
641 return WMI_AUTH_FT_RSNA_PSK;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800642#ifdef FEATURE_WLAN_WAPI
643 case eCSR_AUTH_TYPE_WAPI_WAI_CERTIFICATE:
644 return WMI_AUTH_WAPI;
645 case eCSR_AUTH_TYPE_WAPI_WAI_PSK:
646 return WMI_AUTH_WAPI_PSK;
647#endif /* FEATURE_WLAN_WAPI */
648#ifdef FEATURE_WLAN_ESE
649 case eCSR_AUTH_TYPE_CCKM_WPA:
Varun Reddy Yeturu101f9542016-05-24 10:07:52 -0700650 return WMI_AUTH_CCKM_WPA;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800651 case eCSR_AUTH_TYPE_CCKM_RSN:
Varun Reddy Yeturu101f9542016-05-24 10:07:52 -0700652 return WMI_AUTH_CCKM_RSNA;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800653#endif /* FEATURE_WLAN_ESE */
654#ifdef WLAN_FEATURE_11W
655 case eCSR_AUTH_TYPE_RSN_PSK_SHA256:
656 return WMI_AUTH_RSNA_PSK_SHA256;
657 case eCSR_AUTH_TYPE_RSN_8021X_SHA256:
658 return WMI_AUTH_RSNA_8021X_SHA256;
659#endif /* WLAN_FEATURE_11W */
660 case eCSR_AUTH_TYPE_NONE:
661 case eCSR_AUTH_TYPE_AUTOSWITCH:
662 /* In case of WEP and other keys, NONE means OPEN auth */
663 if (encr == eCSR_ENCRYPT_TYPE_WEP40_STATICKEY ||
664 encr == eCSR_ENCRYPT_TYPE_WEP104_STATICKEY ||
665 encr == eCSR_ENCRYPT_TYPE_WEP40 ||
666 encr == eCSR_ENCRYPT_TYPE_WEP104 ||
667 encr == eCSR_ENCRYPT_TYPE_TKIP ||
Mukul Sharma05504ac2017-06-08 12:35:53 +0530668 encr == eCSR_ENCRYPT_TYPE_AES ||
669 encr == eCSR_ENCRYPT_TYPE_AES_GCMP ||
670 encr == eCSR_ENCRYPT_TYPE_AES_GCMP_256) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800671 return WMI_AUTH_OPEN;
672 }
673 return WMI_AUTH_NONE;
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +0530674 case eCSR_AUTH_TYPE_FILS_SHA256:
675 return WMI_AUTH_RSNA_FILS_SHA256;
676 case eCSR_AUTH_TYPE_FILS_SHA384:
677 return WMI_AUTH_RSNA_FILS_SHA384;
Padma, Santhosh Kumar96682402018-02-02 18:16:27 +0530678 case eCSR_AUTH_TYPE_SUITEB_EAP_SHA256:
679 return WMI_AUTH_RSNA_SUITE_B_8021X_SHA256;
680 case eCSR_AUTH_TYPE_SUITEB_EAP_SHA384:
681 return WMI_AUTH_RSNA_SUITE_B_8021X_SHA384;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800682 default:
683 return WMI_AUTH_NONE;
684 }
685}
686
687/**
688 * e_csr_encryption_type_to_rsn_cipherset() - map csr enc type to ESN cipher
689 * @encr: CSR Encryption
690 *
691 * Map CSR's encryption type into RSN cipher types used by firmware
692 *
693 * Return: WMI RSN cipher
694 */
695A_UINT32 e_csr_encryption_type_to_rsn_cipherset(eCsrEncryptionType encr)
696{
697
698 switch (encr) {
699 case eCSR_ENCRYPT_TYPE_WEP40_STATICKEY:
700 case eCSR_ENCRYPT_TYPE_WEP104_STATICKEY:
701 case eCSR_ENCRYPT_TYPE_WEP40:
702 case eCSR_ENCRYPT_TYPE_WEP104:
703 return WMI_CIPHER_WEP;
704 case eCSR_ENCRYPT_TYPE_TKIP:
705 return WMI_CIPHER_TKIP;
706 case eCSR_ENCRYPT_TYPE_AES:
707 return WMI_CIPHER_AES_CCM;
Mukul Sharma05504ac2017-06-08 12:35:53 +0530708 /* FWR will use key length to distinguish GCMP 128 or 256 */
709 case eCSR_ENCRYPT_TYPE_AES_GCMP:
710 case eCSR_ENCRYPT_TYPE_AES_GCMP_256:
711 return WMI_CIPHER_AES_GCM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800712#ifdef FEATURE_WLAN_WAPI
713 case eCSR_ENCRYPT_TYPE_WPI:
714 return WMI_CIPHER_WAPI;
715#endif /* FEATURE_WLAN_WAPI */
716 case eCSR_ENCRYPT_TYPE_ANY:
717 return WMI_CIPHER_ANY;
718 case eCSR_ENCRYPT_TYPE_NONE:
719 default:
720 return WMI_CIPHER_NONE;
721 }
722}
723
Varun Reddy Yeturu101f9542016-05-24 10:07:52 -0700724#ifdef WLAN_FEATURE_ROAM_OFFLOAD
725/**
726 * wma_roam_scan_get_cckm_mode() - Get the CCKM auth mode
727 * @roam_req: Roaming request buffer
728 * @auth_mode: Auth mode to be converted
729 *
730 * Based on LFR2.0 or LFR3.0, return the proper auth type
731 *
732 * Return: if LFR2.0, then return WMI_AUTH_CCKM for backward compatibility
733 * if LFR3.0 then return the appropriate auth type
734 */
735static uint32_t wma_roam_scan_get_cckm_mode(tSirRoamOffloadScanReq *roam_req,
736 uint32_t auth_mode)
737{
738 if (roam_req->RoamOffloadEnabled)
739 return auth_mode;
740 else
741 return WMI_AUTH_CCKM;
742
743}
744#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800745/**
746 * wma_roam_scan_fill_ap_profile() - fill ap_profile
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800747 * @roam_req: roam offload scan request
Himanshu Agarwal8bcec572017-09-28 11:54:37 +0530748 * @profile: ap profile
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800749 *
750 * Fill ap_profile structure from configured parameters
751 *
752 * Return: none
753 */
Himanshu Agarwal8bcec572017-09-28 11:54:37 +0530754static void wma_roam_scan_fill_ap_profile(tSirRoamOffloadScanReq *roam_req,
755 struct ap_profile *profile)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800756{
Varun Reddy Yeturu101f9542016-05-24 10:07:52 -0700757 uint32_t rsn_authmode;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700758
Himanshu Agarwal8bcec572017-09-28 11:54:37 +0530759 qdf_mem_zero(profile, sizeof(*profile));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800760 if (roam_req == NULL) {
Himanshu Agarwal8bcec572017-09-28 11:54:37 +0530761 profile->ssid.length = 0;
762 profile->ssid.mac_ssid[0] = 0;
763 profile->rsn_authmode = WMI_AUTH_NONE;
764 profile->rsn_ucastcipherset = WMI_CIPHER_NONE;
765 profile->rsn_mcastcipherset = WMI_CIPHER_NONE;
766 profile->rsn_mcastmgmtcipherset = WMI_CIPHER_NONE;
767 profile->rssi_threshold = WMA_ROAM_RSSI_DIFF_DEFAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800768 } else {
Himanshu Agarwal8bcec572017-09-28 11:54:37 +0530769 profile->ssid.length =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800770 roam_req->ConnectedNetwork.ssId.length;
Himanshu Agarwal8bcec572017-09-28 11:54:37 +0530771 qdf_mem_copy(profile->ssid.mac_ssid,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800772 roam_req->ConnectedNetwork.ssId.ssId,
Himanshu Agarwal8bcec572017-09-28 11:54:37 +0530773 profile->ssid.length);
774 profile->rsn_authmode =
Varun Reddy Yeturu101f9542016-05-24 10:07:52 -0700775 e_csr_auth_type_to_rsn_authmode(
776 roam_req->ConnectedNetwork.authentication,
777 roam_req->ConnectedNetwork.encryption);
Himanshu Agarwal8bcec572017-09-28 11:54:37 +0530778 rsn_authmode = profile->rsn_authmode;
Varun Reddy Yeturu101f9542016-05-24 10:07:52 -0700779
780 if ((rsn_authmode == WMI_AUTH_CCKM_WPA) ||
781 (rsn_authmode == WMI_AUTH_CCKM_RSNA))
Himanshu Agarwal8bcec572017-09-28 11:54:37 +0530782 profile->rsn_authmode =
Varun Reddy Yeturu101f9542016-05-24 10:07:52 -0700783 wma_roam_scan_get_cckm_mode(
784 roam_req, rsn_authmode);
Himanshu Agarwal8bcec572017-09-28 11:54:37 +0530785 profile->rsn_ucastcipherset =
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700786 e_csr_encryption_type_to_rsn_cipherset(
787 roam_req->ConnectedNetwork.encryption);
Himanshu Agarwal8bcec572017-09-28 11:54:37 +0530788 profile->rsn_mcastcipherset =
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700789 e_csr_encryption_type_to_rsn_cipherset(
790 roam_req->ConnectedNetwork.mcencryption);
Himanshu Agarwal8bcec572017-09-28 11:54:37 +0530791 profile->rsn_mcastmgmtcipherset =
792 profile->rsn_mcastcipherset;
793 profile->rssi_threshold = roam_req->RoamRssiDiff;
Abhishek Singh34c0e632017-09-28 14:39:29 +0530794 if (roam_req->rssi_abs_thresh)
795 profile->rssi_abs_thresh =
796 roam_req->rssi_abs_thresh -
797 WMA_NOISE_FLOOR_DBM_DEFAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800798#ifdef WLAN_FEATURE_11W
799 if (roam_req->ConnectedNetwork.mfp_enabled)
Himanshu Agarwal8bcec572017-09-28 11:54:37 +0530800 profile->flags |= WMI_AP_PROFILE_FLAG_PMF;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800801#endif
802 }
803}
804
805/**
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -0700806 * wma_process_set_pdev_ie_req() - process the pdev set IE req
807 * @wma: Pointer to wma handle
808 * @ie_params: Pointer to IE data.
809 *
810 * Sends the WMI req to set the IE to FW.
811 *
812 * Return: None
813 */
814void wma_process_set_pdev_ie_req(tp_wma_handle wma,
815 struct set_ie_param *ie_params)
816{
817 if (ie_params->ie_type == DOT11_HT_IE)
818 wma_process_set_pdev_ht_ie_req(wma, ie_params);
819 if (ie_params->ie_type == DOT11_VHT_IE)
820 wma_process_set_pdev_vht_ie_req(wma, ie_params);
821
822 qdf_mem_free(ie_params->ie_ptr);
823}
824
825/**
826 * wma_process_set_pdev_ht_ie_req() - sends HT IE data to FW
827 * @wma: Pointer to wma handle
828 * @ie_params: Pointer to IE data.
829 * @nss: Nss values to prepare the HT IE.
830 *
831 * Sends the WMI req to set the HT IE to FW.
832 *
833 * Return: None
834 */
835void wma_process_set_pdev_ht_ie_req(tp_wma_handle wma,
836 struct set_ie_param *ie_params)
837{
838 int ret;
839 wmi_pdev_set_ht_ie_cmd_fixed_param *cmd;
840 wmi_buf_t buf;
841 uint16_t len;
842 uint16_t ie_len_pad;
843 uint8_t *buf_ptr;
844
845 len = sizeof(*cmd) + WMI_TLV_HDR_SIZE;
846 ie_len_pad = roundup(ie_params->ie_len, sizeof(uint32_t));
847 len += ie_len_pad;
848
849 buf = wmi_buf_alloc(wma->wmi_handle, len);
850 if (!buf) {
851 WMA_LOGE("%s:wmi_buf_alloc failed", __func__);
852 return;
853 }
854 cmd = (wmi_pdev_set_ht_ie_cmd_fixed_param *) wmi_buf_data(buf);
855 WMITLV_SET_HDR(&cmd->tlv_header,
856 WMITLV_TAG_STRUC_wmi_pdev_set_ht_ie_cmd_fixed_param,
857 WMITLV_GET_STRUCT_TLVLEN(
858 wmi_pdev_set_ht_ie_cmd_fixed_param));
859 cmd->reserved0 = 0;
860 cmd->ie_len = ie_params->ie_len;
861 cmd->tx_streams = ie_params->nss;
862 cmd->rx_streams = ie_params->nss;
863 WMA_LOGD("Setting pdev HT ie with Nss = %u",
864 ie_params->nss);
865 buf_ptr = (uint8_t *)cmd + sizeof(*cmd);
866 WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_ARRAY_BYTE, ie_len_pad);
867 if (ie_params->ie_len) {
868 qdf_mem_copy(buf_ptr + WMI_TLV_HDR_SIZE,
869 (uint8_t *)ie_params->ie_ptr,
870 ie_params->ie_len);
871 }
872 ret = wmi_unified_cmd_send(wma->wmi_handle, buf, len,
873 WMI_PDEV_SET_HT_CAP_IE_CMDID);
874 if (ret != EOK) {
875 WMA_LOGE("Failed to send set param command ret = %d", ret);
876 wmi_buf_free(buf);
877 }
878}
879
880/**
881 * wma_process_set_pdev_vht_ie_req() - sends VHT IE data to FW
882 * @wma: Pointer to wma handle
883 * @ie_params: Pointer to IE data.
884 * @nss: Nss values to prepare the VHT IE.
885 *
886 * Sends the WMI req to set the VHT IE to FW.
887 *
888 * Return: None
889 */
890void wma_process_set_pdev_vht_ie_req(tp_wma_handle wma,
891 struct set_ie_param *ie_params)
892{
893 int ret;
894 wmi_pdev_set_vht_ie_cmd_fixed_param *cmd;
895 wmi_buf_t buf;
896 uint16_t len;
897 uint16_t ie_len_pad;
898 uint8_t *buf_ptr;
899
900 len = sizeof(*cmd) + WMI_TLV_HDR_SIZE;
901 ie_len_pad = roundup(ie_params->ie_len, sizeof(uint32_t));
902 len += ie_len_pad;
903
904 buf = wmi_buf_alloc(wma->wmi_handle, len);
905 if (!buf) {
906 WMA_LOGE("%s:wmi_buf_alloc failed", __func__);
907 return;
908 }
909 cmd = (wmi_pdev_set_vht_ie_cmd_fixed_param *) wmi_buf_data(buf);
910 WMITLV_SET_HDR(&cmd->tlv_header,
911 WMITLV_TAG_STRUC_wmi_pdev_set_vht_ie_cmd_fixed_param,
912 WMITLV_GET_STRUCT_TLVLEN(
913 wmi_pdev_set_vht_ie_cmd_fixed_param));
914 cmd->reserved0 = 0;
915 cmd->ie_len = ie_params->ie_len;
916 cmd->tx_streams = ie_params->nss;
917 cmd->rx_streams = ie_params->nss;
918 WMA_LOGD("Setting pdev VHT ie with Nss = %u",
919 ie_params->nss);
920 buf_ptr = (uint8_t *)cmd + sizeof(*cmd);
921 WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_ARRAY_BYTE, ie_len_pad);
922 if (ie_params->ie_len) {
923 qdf_mem_copy(buf_ptr + WMI_TLV_HDR_SIZE,
924 (uint8_t *)ie_params->ie_ptr,
925 ie_params->ie_len);
926 }
927 ret = wmi_unified_cmd_send(wma->wmi_handle, buf, len,
928 WMI_PDEV_SET_VHT_CAP_IE_CMDID);
929 if (ret != EOK) {
930 WMA_LOGE("Failed to send set param command ret = %d", ret);
931 wmi_buf_free(buf);
932 }
933}
934
935/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800936 * wma_roam_scan_scan_params() - fill roam scan params
937 * @wma_handle: wma handle
938 * @pMac: Mac ptr
939 * @scan_params: scan parameters
940 * @roam_req: NULL if this routine is called before connect
941 * It will be non-NULL if called after assoc.
942 *
943 * Fill scan_params structure from configured parameters
944 *
945 * Return: none
946 */
947void wma_roam_scan_fill_scan_params(tp_wma_handle wma_handle,
948 tpAniSirGlobal pMac,
949 tSirRoamOffloadScanReq *roam_req,
950 wmi_start_scan_cmd_fixed_param *
951 scan_params)
952{
953 uint8_t channels_per_burst = 0;
954 uint32_t val = 0;
955
956 if (NULL == pMac) {
957 WMA_LOGE("%s: pMac is NULL", __func__);
958 return;
959 }
960
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530961 qdf_mem_zero(scan_params, sizeof(wmi_start_scan_cmd_fixed_param));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800962 scan_params->scan_ctrl_flags = WMI_SCAN_ADD_CCK_RATES |
Sreelakshmi Konamki75deb332015-09-14 10:58:03 +0530963 WMI_SCAN_ADD_OFDM_RATES |
964 WMI_SCAN_ADD_DS_IE_IN_PROBE_REQ;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800965 if (roam_req != NULL) {
966 /* Parameters updated after association is complete */
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700967 WMA_LOGD("%s: NeighborScanChannelMinTime: %d NeighborScanChannelMaxTime: %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800968 __func__,
969 roam_req->NeighborScanChannelMinTime,
970 roam_req->NeighborScanChannelMaxTime);
Sridhar Selvaraj1b2330c2017-07-21 15:16:42 +0530971 WMA_LOGD("%s: NeighborScanTimerPeriod: %d "
972 "neighbor_scan_min_timer_period %d "
973 "HomeAwayTime: %d nProbes: %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800974 __func__,
975 roam_req->NeighborScanTimerPeriod,
Sridhar Selvaraj1b2330c2017-07-21 15:16:42 +0530976 roam_req->neighbor_scan_min_timer_period,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800977 roam_req->HomeAwayTime, roam_req->nProbes);
978
979 /*
980 * roam_req->NeighborScanChannelMaxTime = SCAN_CHANNEL_TIME
981 * roam_req->HomeAwayTime = SCAN_HOME_AWAY_TIME
982 * roam_req->NeighborScanTimerPeriod = SCAN_HOME_TIME
983 *
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700984 * scan_params->dwell_time_active :time station stays on channel
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800985 * and sends probes;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700986 * scan_params->dwell_time_passive:time station stays on channel
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800987 * and listens probes;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700988 * scan_params->burst_duration :time station goes off channel
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800989 * to scan;
990 */
991
992 if (wlan_cfg_get_int
993 (pMac, WNI_CFG_PASSIVE_MAXIMUM_CHANNEL_TIME,
Jeff Johnsone88dd752018-06-07 22:57:54 -0700994 &val) != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800995 /*
996 * Could not get max channel value from CFG. Log error.
997 */
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700998 WMA_LOGE("could not retrieve passive max channel value");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800999
1000 /* use a default value of 110ms */
1001 val = WMA_ROAM_DWELL_TIME_PASSIVE_DEFAULT;
1002 }
1003
1004 scan_params->dwell_time_passive = val;
1005 /*
1006 * Here is the formula,
1007 * T(HomeAway) = N * T(dwell) + (N+1) * T(cs)
1008 * where N is number of channels scanned in single burst
1009 */
1010 scan_params->dwell_time_active =
1011 roam_req->NeighborScanChannelMaxTime;
1012 if (roam_req->HomeAwayTime <
1013 2 * WMA_ROAM_SCAN_CHANNEL_SWITCH_TIME) {
1014 /* clearly we can't follow home away time.
1015 * Make it a split scan.
1016 */
1017 scan_params->burst_duration = 0;
1018 } else {
1019 channels_per_burst =
1020 (roam_req->HomeAwayTime -
1021 WMA_ROAM_SCAN_CHANNEL_SWITCH_TIME)
1022 / (scan_params->dwell_time_active +
1023 WMA_ROAM_SCAN_CHANNEL_SWITCH_TIME);
1024
1025 if (channels_per_burst < 1) {
1026 /* dwell time and home away time conflicts */
1027 /* we will override dwell time */
1028 scan_params->dwell_time_active =
1029 roam_req->HomeAwayTime -
1030 2 * WMA_ROAM_SCAN_CHANNEL_SWITCH_TIME;
1031 scan_params->burst_duration =
1032 scan_params->dwell_time_active;
1033 } else {
1034 scan_params->burst_duration =
1035 channels_per_burst *
1036 scan_params->dwell_time_active;
1037 }
1038 }
1039 if (roam_req->allowDFSChannelRoam ==
1040 SIR_ROAMING_DFS_CHANNEL_ENABLED_NORMAL
1041 && roam_req->HomeAwayTime > 0
1042 && roam_req->ChannelCacheType != CHANNEL_LIST_STATIC) {
1043 /* Roaming on DFS channels is supported and it is not
1044 * app channel list. It is ok to override homeAwayTime
Jeff Johnsonc97816c2018-05-12 17:13:23 -07001045 * to accommodate DFS dwell time in burst
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001046 * duration.
1047 */
1048 scan_params->burst_duration =
Anurag Chouhan6d760662016-02-20 16:05:43 +05301049 QDF_MAX(scan_params->burst_duration,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001050 scan_params->dwell_time_passive);
1051 }
Sridhar Selvaraj1b2330c2017-07-21 15:16:42 +05301052 scan_params->min_rest_time =
1053 roam_req->neighbor_scan_min_timer_period;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001054 scan_params->max_rest_time = roam_req->NeighborScanTimerPeriod;
1055 scan_params->repeat_probe_time = (roam_req->nProbes > 0) ?
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001056 QDF_MAX(scan_params->dwell_time_active /
1057 roam_req->nProbes, 1) : 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001058 scan_params->probe_spacing_time = 0;
1059 scan_params->probe_delay = 0;
1060 /* 30 seconds for full scan cycle */
1061 scan_params->max_scan_time = WMA_HW_DEF_SCAN_MAX_DURATION;
1062 scan_params->idle_time = scan_params->min_rest_time;
1063 scan_params->n_probes = roam_req->nProbes;
1064 if (roam_req->allowDFSChannelRoam ==
1065 SIR_ROAMING_DFS_CHANNEL_DISABLED) {
1066 scan_params->scan_ctrl_flags |= WMI_SCAN_BYPASS_DFS_CHN;
1067 } else {
1068 /* Roaming scan on DFS channel is allowed.
1069 * No need to change any flags for default
1070 * allowDFSChannelRoam = 1.
1071 * Special case where static channel list is given by\
1072 * application that contains DFS channels.
1073 * Assume that the application has knowledge of matching
1074 * APs being active and that probe request transmission
1075 * is permitted on those channel.
1076 * Force active scans on those channels.
1077 */
1078
1079 if (roam_req->allowDFSChannelRoam ==
1080 SIR_ROAMING_DFS_CHANNEL_ENABLED_ACTIVE &&
1081 roam_req->ChannelCacheType == CHANNEL_LIST_STATIC &&
1082 roam_req->ConnectedNetwork.ChannelCount > 0) {
1083 scan_params->scan_ctrl_flags |=
1084 WMI_SCAN_FLAG_FORCE_ACTIVE_ON_DFS;
1085 }
1086 }
Gupta, Kapil96c7f2f2016-04-25 19:13:41 +05301087 WMI_SCAN_SET_DWELL_MODE(scan_params->scan_ctrl_flags,
1088 roam_req->roamscan_adaptive_dwell_mode);
1089
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001090 } else {
1091 /* roam_req = NULL during initial or pre-assoc invocation */
1092 scan_params->dwell_time_active =
1093 WMA_ROAM_DWELL_TIME_ACTIVE_DEFAULT;
1094 scan_params->dwell_time_passive =
1095 WMA_ROAM_DWELL_TIME_PASSIVE_DEFAULT;
1096 scan_params->min_rest_time = WMA_ROAM_MIN_REST_TIME_DEFAULT;
1097 scan_params->max_rest_time = WMA_ROAM_MAX_REST_TIME_DEFAULT;
1098 scan_params->repeat_probe_time = 0;
1099 scan_params->probe_spacing_time = 0;
1100 scan_params->probe_delay = 0;
1101 scan_params->max_scan_time = WMA_HW_DEF_SCAN_MAX_DURATION;
1102 scan_params->idle_time = scan_params->min_rest_time;
1103 scan_params->burst_duration = 0;
1104 scan_params->n_probes = 0;
1105 }
1106
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001107 WMA_LOGD("%s: Rome roam scan parameters: dwell_time_active = %d, dwell_time_passive = %d",
1108 __func__, scan_params->dwell_time_active,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001109 scan_params->dwell_time_passive);
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001110 WMA_LOGD("%s: min_rest_time = %d, max_rest_time = %d, repeat_probe_time = %d n_probes = %d",
1111 __func__, scan_params->min_rest_time,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001112 scan_params->max_rest_time,
1113 scan_params->repeat_probe_time, scan_params->n_probes);
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001114 WMA_LOGD("%s: max_scan_time = %d, idle_time = %d, burst_duration = %d, scan_ctrl_flags = 0x%x",
1115 __func__, scan_params->max_scan_time, scan_params->idle_time,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001116 scan_params->burst_duration, scan_params->scan_ctrl_flags);
1117}
1118
1119/**
1120 * wma_roam_scan_offload_ap_profile() - set roam ap profile in fw
1121 * @wma_handle: wma handle
Himanshu Agarwal8bcec572017-09-28 11:54:37 +05301122 * @mac_ctx: Mac ptr
1123 * @roam_req: Request which contains the ap profile
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001124 *
1125 * Send WMI_ROAM_AP_PROFILE to firmware
1126 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05301127 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001128 */
Himanshu Agarwal8bcec572017-09-28 11:54:37 +05301129static QDF_STATUS wma_roam_scan_offload_ap_profile(tp_wma_handle wma_handle,
1130 tSirRoamOffloadScanReq *roam_req)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001131{
Himanshu Agarwal8bcec572017-09-28 11:54:37 +05301132 struct ap_profile_params ap_profile;
1133
1134 ap_profile.vdev_id = roam_req->sessionId;
1135 wma_roam_scan_fill_ap_profile(roam_req, &ap_profile.profile);
1136 ap_profile.param = roam_req->score_params;
Govind Singh64b5e112016-03-08 11:53:50 +05301137 return wmi_unified_send_roam_scan_offload_ap_cmd(wma_handle->wmi_handle,
Himanshu Agarwal8bcec572017-09-28 11:54:37 +05301138 &ap_profile);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001139}
1140
1141/**
1142 * wma_roam_scan_filter() - Filter to be applied while roaming
1143 * @wma_handle: Global WMA Handle
1144 * @roam_req: Request which contains the filters
1145 *
1146 * There are filters such as whitelist, blacklist and preferred
1147 * list that need to be applied to the scan results to form the
1148 * probable candidates for roaming.
1149 *
Jeff Johnson3370f3a2018-05-11 09:54:12 -07001150 * Return: Return success upon successfully passing the
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001151 * parameters to the firmware, otherwise failure.
1152 */
Jeff Johnsonc4b47a92016-10-07 12:34:41 -07001153static QDF_STATUS wma_roam_scan_filter(tp_wma_handle wma_handle,
1154 tSirRoamOffloadScanReq *roam_req)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001155{
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05301156 int i;
1157 QDF_STATUS status = QDF_STATUS_SUCCESS;
Abhishek Singh2e1a11a2017-07-06 11:24:11 +05301158 uint32_t num_bssid_black_list = 0, num_ssid_white_list = 0,
Abhishek Singh4db8c152017-07-18 10:40:08 +05301159 num_bssid_preferred_list = 0, num_rssi_rejection_ap = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001160 uint32_t op_bitmap = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001161 struct roam_ext_params *roam_params;
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05301162 struct roam_scan_filter_params *params;
Selvaraj, Sridhar57ce4df2017-05-29 18:30:49 +05301163 struct lca_disallow_config_params *lca_config_params;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001164
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05301165 params = qdf_mem_malloc(sizeof(struct roam_scan_filter_params));
Naveen Rawat35804772016-06-27 15:40:28 -07001166 if (params == NULL) {
1167 WMA_LOGE("%s : Memory allocation failed", __func__);
1168 return QDF_STATUS_E_NOMEM;
1169 }
1170
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001171 roam_params = &roam_req->roam_params;
Selvaraj, Sridhar57ce4df2017-05-29 18:30:49 +05301172 lca_config_params = &roam_req->lca_config_params;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001173 if (roam_req->Command != ROAM_SCAN_OFFLOAD_STOP) {
1174 switch (roam_req->reason) {
1175 case REASON_ROAM_SET_BLACKLIST_BSSID:
1176 op_bitmap |= 0x1;
1177 num_bssid_black_list =
1178 roam_params->num_bssid_avoid_list;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001179 break;
1180 case REASON_ROAM_SET_SSID_ALLOWED:
1181 op_bitmap |= 0x2;
1182 num_ssid_white_list =
1183 roam_params->num_ssid_allowed_list;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001184 break;
1185 case REASON_ROAM_SET_FAVORED_BSSID:
1186 op_bitmap |= 0x4;
1187 num_bssid_preferred_list =
1188 roam_params->num_bssid_favored;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001189 break;
Selvaraj, Sridhar57ce4df2017-05-29 18:30:49 +05301190 case REASON_CTX_INIT:
1191 if (roam_req->Command == ROAM_SCAN_OFFLOAD_START) {
1192 params->lca_disallow_config_present = true;
Abhishek Singh4db8c152017-07-18 10:40:08 +05301193 op_bitmap |=
1194 ROAM_FILTER_OP_BITMAP_LCA_DISALLOW |
1195 ROAM_FILTER_OP_BITMAP_RSSI_REJECTION_OCE;
1196 num_rssi_rejection_ap =
1197 roam_params->num_rssi_rejection_ap;
Selvaraj, Sridhar57ce4df2017-05-29 18:30:49 +05301198 } else {
1199 WMA_LOGD("%s : Roam Filter need not be sent", __func__);
1200 qdf_mem_free(params);
1201 return QDF_STATUS_SUCCESS;
1202 }
1203 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001204 default:
1205 WMA_LOGD("%s : Roam Filter need not be sent", __func__);
Arif Hussaina915f492016-07-29 15:29:42 -07001206 qdf_mem_free(params);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301207 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001208 }
1209 } else {
1210 /* In case of STOP command, reset all the variables
1211 * except for blacklist BSSID which should be retained
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001212 * across connections.
1213 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001214 op_bitmap = 0x2 | 0x4;
1215 num_ssid_white_list = roam_params->num_ssid_allowed_list;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001216 num_bssid_preferred_list = roam_params->num_bssid_favored;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001217 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001218
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001219 /* fill in fixed values */
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05301220 params->session_id = roam_req->sessionId;
1221 params->op_bitmap = op_bitmap;
1222 params->num_bssid_black_list = num_bssid_black_list;
1223 params->num_ssid_white_list = num_ssid_white_list;
1224 params->num_bssid_preferred_list = num_bssid_preferred_list;
Abhishek Singh4db8c152017-07-18 10:40:08 +05301225 params->num_rssi_rejection_ap = num_rssi_rejection_ap;
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05301226 qdf_mem_copy(params->bssid_avoid_list, roam_params->bssid_avoid_list,
1227 MAX_BSSID_AVOID_LIST * sizeof(struct qdf_mac_addr));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001228
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001229 for (i = 0; i < num_ssid_white_list; i++) {
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05301230 qdf_mem_copy(params->ssid_allowed_list[i].mac_ssid,
1231 roam_params->ssid_allowed_list[i].ssId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001232 roam_params->ssid_allowed_list[i].length);
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05301233 params->ssid_allowed_list[i].length =
1234 roam_params->ssid_allowed_list[i].length;
1235 WMA_LOGD("%s: SSID length=%d", __func__,
1236 params->ssid_allowed_list[i].length);
1237 qdf_trace_hex_dump(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_DEBUG,
1238 (uint8_t *)params->ssid_allowed_list[i].mac_ssid,
1239 params->ssid_allowed_list[i].length);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001240 }
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05301241 qdf_mem_copy(params->bssid_favored, roam_params->bssid_favored,
1242 MAX_BSSID_FAVORED * sizeof(struct qdf_mac_addr));
1243 qdf_mem_copy(params->bssid_favored_factor,
1244 roam_params->bssid_favored_factor, MAX_BSSID_FAVORED);
Abhishek Singh4db8c152017-07-18 10:40:08 +05301245 qdf_mem_copy(params->rssi_rejection_ap,
1246 roam_params->rssi_rejection_ap,
1247 MAX_RSSI_AVOID_BSSID_LIST *
1248 sizeof(struct rssi_disallow_bssid));
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05301249
Selvaraj, Sridhar57ce4df2017-05-29 18:30:49 +05301250 if (params->lca_disallow_config_present) {
1251 params->disallow_duration
1252 = lca_config_params->disallow_duration;
1253 params->rssi_channel_penalization
1254 = lca_config_params->rssi_channel_penalization;
1255 params->num_disallowed_aps
1256 = lca_config_params->num_disallowed_aps;
1257 }
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05301258 status = wmi_unified_roam_scan_filter_cmd(wma_handle->wmi_handle,
1259 params);
1260
1261 qdf_mem_free(params);
1262 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001263}
1264
1265/**
1266 * wma_roam_scan_bmiss_cnt() - set bmiss count to fw
1267 * @wma_handle: wma handle
1268 * @first_bcnt: first bmiss count
1269 * @final_bcnt: final bmiss count
1270 * @vdev_id: vdev id
1271 *
1272 * set first & final biss count to fw.
1273 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05301274 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001275 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301276QDF_STATUS wma_roam_scan_bmiss_cnt(tp_wma_handle wma_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001277 A_INT32 first_bcnt,
1278 A_UINT32 final_bcnt, uint32_t vdev_id)
1279{
Govind Singhd76a5b02016-03-08 15:12:14 +05301280 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001281
Srinivas Girigowdaf1472122017-03-09 15:44:12 -08001282 WMA_LOGD("%s: first_bcnt: %d, final_bcnt: %d", __func__, first_bcnt,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001283 final_bcnt);
1284
Govind Singhd76a5b02016-03-08 15:12:14 +05301285 status = wma_vdev_set_param(wma_handle->wmi_handle,
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001286 vdev_id, WMI_VDEV_PARAM_BMISS_FIRST_BCNT,
1287 first_bcnt);
Govind Singhd76a5b02016-03-08 15:12:14 +05301288 if (QDF_IS_STATUS_ERROR(status)) {
1289 WMA_LOGE("wma_vdev_set_param WMI_VDEV_PARAM_BMISS_FIRST_BCNT returned Error %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001290 status);
Govind Singhd76a5b02016-03-08 15:12:14 +05301291 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001292 }
1293
Govind Singhd76a5b02016-03-08 15:12:14 +05301294 status = wma_vdev_set_param(wma_handle->wmi_handle,
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001295 vdev_id, WMI_VDEV_PARAM_BMISS_FINAL_BCNT,
1296 final_bcnt);
Govind Singhd76a5b02016-03-08 15:12:14 +05301297 if (QDF_IS_STATUS_ERROR(status)) {
1298 WMA_LOGE("wma_vdev_set_param WMI_VDEV_PARAM_BMISS_FINAL_BCNT returned Error %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001299 status);
Govind Singhd76a5b02016-03-08 15:12:14 +05301300 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001301 }
1302
Govind Singhd76a5b02016-03-08 15:12:14 +05301303 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001304}
1305
1306/**
1307 * wma_roam_scan_offload_command() - set roam offload command
1308 * @wma_handle: wma handle
1309 * @command: command
1310 * @vdev_id: vdev id
1311 *
1312 * This function set roam offload command to fw.
1313 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05301314 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001315 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301316QDF_STATUS wma_roam_scan_offload_command(tp_wma_handle wma_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001317 uint32_t command, uint32_t vdev_id)
1318{
Govind Singh64b5e112016-03-08 11:53:50 +05301319 return wmi_unified_roam_scan_offload_cmd(wma_handle->wmi_handle,
1320 command, vdev_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001321}
1322
1323/**
yeshwanth sriram guntuka41f936c2017-09-01 17:53:49 +05301324 * wma_roam_scan_btm_offload() - Send BTM offload config
1325 * @wma_handle: wma handle
1326 * @roam_req: roam request parameters
1327 *
1328 * This function is used to send BTM offload config to fw
1329 *
1330 * Return: QDF status
1331 */
1332static QDF_STATUS wma_roam_scan_btm_offload(tp_wma_handle wma_handle,
1333 tSirRoamOffloadScanReq *roam_req)
1334{
1335 struct wmi_btm_config *params;
1336 QDF_STATUS status;
1337
1338 params = qdf_mem_malloc(sizeof(struct wmi_btm_config));
1339 if (!params) {
1340 WMA_LOGE("Memory alloc failed for btm params");
1341 return QDF_STATUS_E_FAILURE;
1342 }
1343
1344 params->vdev_id = roam_req->sessionId;
1345 params->btm_offload_config = roam_req->btm_offload_config;
Jiachao Wu84bb2ea2018-01-08 16:17:33 +08001346 params->btm_solicited_timeout = roam_req->btm_solicited_timeout;
1347 params->btm_max_attempt_cnt = roam_req->btm_max_attempt_cnt;
1348 params->btm_sticky_time = roam_req->btm_sticky_time;
Vignesh Viswanathana3d5c272018-06-04 19:36:02 +05301349
1350 WMA_LOGD("%s: Sending BTM offload to FW for vdev %u btm_offload_config %u",
1351 __func__, params->vdev_id, params->btm_offload_config);
1352
yeshwanth sriram guntuka41f936c2017-09-01 17:53:49 +05301353 status = wmi_unified_send_btm_config(wma_handle->wmi_handle, params);
1354 qdf_mem_free(params);
1355
Vignesh Viswanathana3d5c272018-06-04 19:36:02 +05301356
yeshwanth sriram guntuka41f936c2017-09-01 17:53:49 +05301357 return status;
1358}
1359
1360/**
Vignesh Viswanathanfb9d0752018-02-06 16:19:00 +05301361 * wma_send_offload_11k_params() - API to send 11k offload params to FW
1362 * @handle: WMA handle
1363 * @params: Pointer to 11k offload params
1364 *
1365 * Return: None
1366 */
1367static
1368QDF_STATUS wma_send_offload_11k_params(WMA_HANDLE handle,
1369 struct wmi_11k_offload_params *params)
1370{
1371 QDF_STATUS status;
1372 tp_wma_handle wma_handle = (tp_wma_handle) handle;
1373
1374 if (!wma_handle || !wma_handle->wmi_handle) {
1375 WMA_LOGE("%s: WMA is closed, cannot send 11k offload cmd",
1376 __func__);
1377 return QDF_STATUS_E_FAILURE;
1378 }
1379
Vignesh Viswanathanb58161c2018-06-07 16:39:46 +05301380 if (!wmi_service_enabled(wma_handle->wmi_handle,
1381 wmi_service_11k_neighbour_report_support)) {
1382 WMA_LOGE(FL("FW doesn't support 11k offload"));
Vignesh Viswanathanfb9d0752018-02-06 16:19:00 +05301383 return QDF_STATUS_E_NOSUPPORT;
1384 }
1385
Vignesh Viswanathane25af782018-03-23 14:49:50 +05301386 /*
1387 * If 11k enable command and ssid length is 0, drop it
1388 */
1389 if (params->offload_11k_bitmask &&
1390 !params->neighbor_report_params.ssid.length) {
Vignesh Viswanathanfb9d0752018-02-06 16:19:00 +05301391 WMA_LOGD("%s: SSID Len 0", __func__);
1392 return QDF_STATUS_E_INVAL;
1393 }
1394
1395 status = wmi_unified_offload_11k_cmd(wma_handle->wmi_handle, params);
1396
1397 if (status != QDF_STATUS_SUCCESS)
1398 WMA_LOGE("failed to send 11k offload command");
1399
1400 return status;
1401}
1402
1403/**
Varun Reddy Yeturu30bc42c2016-02-04 10:07:30 -08001404 * wma_process_roaming_config() - process roam request
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001405 * @wma_handle: wma handle
1406 * @roam_req: roam request parameters
1407 *
1408 * Main routine to handle ROAM commands coming from CSR module.
1409 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05301410 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001411 */
Varun Reddy Yeturu30bc42c2016-02-04 10:07:30 -08001412QDF_STATUS wma_process_roaming_config(tp_wma_handle wma_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001413 tSirRoamOffloadScanReq *roam_req)
1414{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301415 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001416 wmi_start_scan_cmd_fixed_param scan_params;
Anurag Chouhan6d760662016-02-20 16:05:43 +05301417 tpAniSirGlobal pMac = cds_get_context(QDF_MODULE_ID_PE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001418 uint32_t mode = 0;
1419 struct wma_txrx_node *intr = NULL;
1420
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001421 if (NULL == pMac) {
1422 WMA_LOGE("%s: pMac is NULL", __func__);
Selvaraj, Sridhar8fe6c672017-01-10 11:37:29 +05301423 qdf_mem_free(roam_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301424 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001425 }
1426
1427 if (!wma_handle->roam_offload_enabled) {
1428 /* roam scan offload is not enabled in firmware.
1429 * Cannot initialize it in the middle of connection.
1430 */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301431 qdf_mem_free(roam_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301432 return QDF_STATUS_E_PERM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001433 }
Abhishek Singh1f217ec2017-12-22 11:48:27 +05301434 WMA_LOGD("%s: RSO Command:%d, reason:%d session ID %d", __func__,
1435 roam_req->Command, roam_req->reason, roam_req->sessionId);
Varun Reddy Yeturu30bc42c2016-02-04 10:07:30 -08001436 wma_handle->interfaces[roam_req->sessionId].roaming_in_progress = false;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001437 switch (roam_req->Command) {
1438 case ROAM_SCAN_OFFLOAD_START:
1439 intr = &wma_handle->interfaces[roam_req->sessionId];
1440 intr->delay_before_vdev_stop = roam_req->delay_before_vdev_stop;
1441 /*
1442 * Scan/Roam threshold parameters are translated from fields of
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001443 * tSirRoamOffloadScanReq to WMITLV values sent to Rome firmware
1444 * some of these parameters are configurable in qcom_cfg.ini
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001445 */
1446
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001447 /* First param is positive rssi value to trigger rssi based scan
1448 * Opportunistic scan is started at 30dB > trigger rssi.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001449 */
1450 wma_handle->suitable_ap_hb_failure = false;
1451
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301452 qdf_status = wma_roam_scan_offload_rssi_thresh(wma_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001453 roam_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301454 if (qdf_status != QDF_STATUS_SUCCESS)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001455 break;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301456 qdf_status = wma_roam_scan_bmiss_cnt(wma_handle,
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001457 roam_req->RoamBmissFirstBcnt,
1458 roam_req->RoamBmissFinalBcnt,
1459 roam_req->sessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301460 if (qdf_status != QDF_STATUS_SUCCESS)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001461 break;
1462
1463 /* Opportunistic scan runs on a timer, value set by
1464 * EmptyRefreshScanPeriod. Age out the entries after 3 such
1465 * cycles.
1466 */
1467 if (roam_req->EmptyRefreshScanPeriod > 0) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301468 qdf_status =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001469 wma_roam_scan_offload_scan_period(wma_handle,
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001470 roam_req->EmptyRefreshScanPeriod,
1471 roam_req->EmptyRefreshScanPeriod * 3,
1472 roam_req->sessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301473 if (qdf_status != QDF_STATUS_SUCCESS)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001474 break;
1475
1476 mode = WMI_ROAM_SCAN_MODE_PERIODIC;
1477 /* Don't use rssi triggered roam scans if external app
1478 * is in control of channel list.
1479 */
Abhinav Kumaredd1d372018-05-11 15:33:35 +05301480 if (roam_req->ChannelCacheType != CHANNEL_LIST_STATIC ||
1481 roam_req->roam_force_rssi_trigger)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001482 mode |= WMI_ROAM_SCAN_MODE_RSSI_CHANGE;
1483
1484 } else {
1485 mode = WMI_ROAM_SCAN_MODE_RSSI_CHANGE;
1486 }
1487
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001488 /* Start new rssi triggered scan only if it changes by
1489 * RoamRssiDiff value. Beacon weight of 14 means average rssi
1490 * is taken over 14 previous samples + 2 times the current
1491 * beacon's rssi.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001492 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301493 qdf_status = wma_roam_scan_offload_rssi_change(wma_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001494 roam_req->sessionId,
1495 roam_req->RoamRescanRssiDiff,
1496 roam_req->RoamBeaconRssiWeight,
1497 roam_req->hi_rssi_scan_delay);
1498
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301499 if (qdf_status != QDF_STATUS_SUCCESS)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001500 break;
1501
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301502 qdf_status = wma_roam_scan_offload_ap_profile(wma_handle,
Himanshu Agarwal8bcec572017-09-28 11:54:37 +05301503 roam_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301504 if (qdf_status != QDF_STATUS_SUCCESS)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001505 break;
1506
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301507 qdf_status = wma_roam_scan_offload_chan_list(wma_handle,
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001508 roam_req->ConnectedNetwork.ChannelCount,
1509 &roam_req->ConnectedNetwork.ChannelCache[0],
1510 roam_req->ChannelCacheType,
1511 roam_req->sessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301512 if ((qdf_status != QDF_STATUS_SUCCESS) &&
1513 (qdf_status != QDF_STATUS_E_EMPTY))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001514 break;
1515
1516
1517 wma_roam_scan_fill_scan_params(wma_handle, pMac, roam_req,
1518 &scan_params);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301519 qdf_status =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001520 wma_roam_scan_offload_mode(wma_handle, &scan_params,
1521 roam_req, mode,
1522 roam_req->sessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301523 if (qdf_status != QDF_STATUS_SUCCESS)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001524 break;
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05301525 if (wmi_service_enabled(wma_handle->wmi_handle,
1526 wmi_service_mawc_support)) {
Varun Reddy Yeturu62c32652017-10-26 15:32:35 -07001527 qdf_status =
1528 wma_roam_scan_mawc_params(wma_handle, roam_req);
1529 if (qdf_status != QDF_STATUS_SUCCESS) {
1530 WMA_LOGE("Sending roaming MAWC params failed");
1531 break;
1532 }
1533 } else {
1534 WMA_LOGD("MAWC roaming not supported by firmware");
Varun Reddy Yeturu061d4d62017-07-20 09:39:32 -07001535 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301536 qdf_status = wma_roam_scan_filter(wma_handle, roam_req);
1537 if (qdf_status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001538 WMA_LOGE("Sending start for roam scan filter failed");
1539 break;
1540 }
yeshwanth sriram guntuka41f936c2017-09-01 17:53:49 +05301541 qdf_status = wma_roam_scan_btm_offload(wma_handle, roam_req);
1542 if (qdf_status != QDF_STATUS_SUCCESS) {
1543 WMA_LOGE("Sending BTM config to fw failed");
1544 break;
1545 }
Vignesh Viswanathanfb9d0752018-02-06 16:19:00 +05301546
Vignesh Viswanathane25af782018-03-23 14:49:50 +05301547 /*
1548 * Send 11k offload enable to FW as part of RSO Start
1549 */
Vignesh Viswanathanfb9d0752018-02-06 16:19:00 +05301550 if (roam_req->reason == REASON_CTX_INIT) {
1551 qdf_status = wma_send_offload_11k_params(wma_handle,
1552 &roam_req->offload_11k_params);
1553 if (qdf_status != QDF_STATUS_SUCCESS) {
Vignesh Viswanathane25af782018-03-23 14:49:50 +05301554 WMA_LOGE("11k offload enable not sent, status %d",
Vignesh Viswanathanfb9d0752018-02-06 16:19:00 +05301555 qdf_status);
1556 break;
1557 }
1558 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001559 break;
1560
1561 case ROAM_SCAN_OFFLOAD_STOP:
Varun Reddy Yeturu06488012017-05-25 11:44:10 -07001562 /*
1563 * If roam synch propagation is in progress and an user space
1564 * disconnect is requested, then there is no need to send the
1565 * RSO STOP to firmware, since the roaming is already complete.
1566 * If the RSO STOP is sent to firmware, then an HO_FAIL will be
1567 * generated and the expectation from firmware would be to
1568 * clean up the peer context on the host and not send down any
1569 * WMI PEER DELETE commands to firmware. But, if the user space
1570 * disconnect gets processed first, then there is a chance to
1571 * send down the PEER DELETE commands. Hence, if we do not
1572 * receive the HO_FAIL, and we complete the roam sync
1573 * propagation, then the host and firmware will be in sync with
1574 * respect to the peer and then the user space disconnect can
1575 * be handled gracefully in a normal way.
1576 *
1577 * Ensure to check the reason code since the RSO Stop might
1578 * come when roam sync failed as well and at that point it
1579 * should go through to the firmware and receive HO_FAIL
1580 * and clean up.
1581 */
1582 if (wma_is_roam_synch_in_progress(wma_handle,
1583 roam_req->sessionId) &&
1584 roam_req->reason ==
1585 REASON_ROAM_STOP_ALL) {
1586 WMA_LOGD("Dont send RSO stop during roam sync");
1587 break;
1588 }
Vignesh Viswanathane25af782018-03-23 14:49:50 +05301589
1590 /*
1591 * Send 11k offload disable command to FW as part of RSO Stop
1592 */
1593 if (roam_req->reason == REASON_DISCONNECTED) {
1594 qdf_status = wma_send_offload_11k_params(wma_handle,
1595 &roam_req->offload_11k_params);
1596 if (qdf_status != QDF_STATUS_SUCCESS) {
1597 WMA_LOGE("11k offload disable not sent, status %d",
1598 qdf_status);
1599 break;
1600 }
1601 }
1602
Vignesh Viswanathana3d5c272018-06-04 19:36:02 +05301603 /* Send BTM config as disabled during RSO Stop */
1604 qdf_status = wma_roam_scan_btm_offload(wma_handle, roam_req);
1605 if (qdf_status != QDF_STATUS_SUCCESS) {
1606 WMA_LOGE(FL("Sending BTM config to fw failed"));
1607 break;
1608 }
1609
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001610 wma_handle->suitable_ap_hb_failure = false;
1611 if (wma_handle->roam_offload_enabled) {
Abhishek Singh533c9da2017-05-04 10:23:34 +05301612 uint32_t mode;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001613
1614 wma_roam_scan_fill_scan_params(wma_handle, pMac,
1615 NULL, &scan_params);
Abhishek Singh533c9da2017-05-04 10:23:34 +05301616
Varun Reddy Yeturubc1bea02018-02-01 18:12:34 -08001617 if (roam_req->reason == REASON_ROAM_STOP_ALL ||
Vignesh Viswanathane92b6ce2018-06-28 16:37:56 +05301618 roam_req->reason == REASON_DISCONNECTED ||
hqua8d079d2018-05-10 22:10:20 +08001619 roam_req->reason == REASON_ROAM_SYNCH_FAILED) {
Abhishek Singh533c9da2017-05-04 10:23:34 +05301620 mode = WMI_ROAM_SCAN_MODE_NONE;
hqua8d079d2018-05-10 22:10:20 +08001621 } else {
1622 if (csr_roamIsRoamOffloadEnabled(pMac))
1623 mode = WMI_ROAM_SCAN_MODE_NONE |
1624 WMI_ROAM_SCAN_MODE_ROAMOFFLOAD;
1625 else
1626 mode = WMI_ROAM_SCAN_MODE_NONE;
1627 }
1628
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301629 qdf_status = wma_roam_scan_offload_mode(wma_handle,
Abhishek Singh533c9da2017-05-04 10:23:34 +05301630 &scan_params, NULL, mode,
Selvaraj, Sridharecc81df2016-10-14 23:26:16 +05301631 roam_req->sessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001632 }
1633 /*
Varun Reddy Yeturu69d44b22017-08-15 14:29:32 -07001634 * After sending the roam scan mode because of a disconnect,
1635 * clear the scan bitmap client as well by sending
1636 * the following command
1637 */
1638 wma_roam_scan_offload_rssi_thresh(wma_handle, roam_req);
1639 /*
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001640 * If the STOP command is due to a disconnect, then
1641 * send the filter command to clear all the filter
1642 * entries. If it is roaming scenario, then do not
1643 * send the cleared entries.
1644 */
1645 if (!roam_req->middle_of_roaming) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301646 qdf_status = wma_roam_scan_filter(wma_handle, roam_req);
1647 if (qdf_status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001648 WMA_LOGE("clear for roam scan filter failed");
1649 break;
1650 }
1651 }
1652
1653 if (roam_req->reason ==
1654 REASON_OS_REQUESTED_ROAMING_NOW) {
Rajeev Kumarcf7bd802017-04-18 11:11:42 -07001655 struct scheduler_msg cds_msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001656 tSirRoamOffloadScanRsp *scan_offload_rsp;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001657
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001658 scan_offload_rsp =
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301659 qdf_mem_malloc(sizeof(*scan_offload_rsp));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001660 if (!scan_offload_rsp) {
1661 WMA_LOGE("%s: Alloc failed for scan_offload_rsp",
1662 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301663 qdf_mem_free(roam_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301664 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001665 }
1666 cds_msg.type = eWNI_SME_ROAM_SCAN_OFFLOAD_RSP;
1667 scan_offload_rsp->sessionId = roam_req->sessionId;
1668 scan_offload_rsp->reason = roam_req->reason;
1669 cds_msg.bodyptr = scan_offload_rsp;
1670 /*
1671 * Since REASSOC request is processed in
1672 * Roam_Scan_Offload_Rsp post a dummy rsp msg back to
1673 * SME with proper reason code.
1674 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301675 if (QDF_STATUS_SUCCESS !=
Rajeev Kumarb60abe42017-01-21 15:39:31 -08001676 scheduler_post_msg(QDF_MODULE_ID_SME,
Rajeev Kumar156188e2017-01-21 17:23:52 -08001677 &cds_msg)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301678 qdf_mem_free(scan_offload_rsp);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301679 QDF_TRACE(QDF_MODULE_ID_WMA,
1680 QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001681 "%s: Failed to post Scan Offload Rsp to UMAC",
1682 __func__);
1683 }
1684 }
1685 break;
1686
1687 case ROAM_SCAN_OFFLOAD_ABORT_SCAN:
1688 /* If roam scan is running, stop that cycle.
1689 * It will continue automatically on next trigger.
1690 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301691 qdf_status = wma_roam_scan_offload_command(wma_handle,
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001692 WMI_ROAM_SCAN_STOP_CMD,
1693 roam_req->sessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001694 break;
1695
1696 case ROAM_SCAN_OFFLOAD_RESTART:
1697 /* Rome offload engine does not stop after any scan.
1698 * If this command is sent because all preauth attempts failed
1699 * and WMI_ROAM_REASON_SUITABLE_AP event was received earlier,
1700 * now it is time to call it heartbeat failure.
1701 */
1702 if ((roam_req->reason == REASON_PREAUTH_FAILED_FOR_ALL)
1703 && wma_handle->suitable_ap_hb_failure) {
1704 WMA_LOGE("%s: Sending heartbeat failure after preauth failures",
1705 __func__);
1706 wma_beacon_miss_handler(wma_handle,
Sreelakshmi Konamki58c72432016-11-09 17:06:44 +05301707 roam_req->sessionId,
1708 wma_handle->suitable_ap_hb_failure_rssi);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001709 wma_handle->suitable_ap_hb_failure = false;
1710 }
1711 break;
1712
1713 case ROAM_SCAN_OFFLOAD_UPDATE_CFG:
1714 wma_handle->suitable_ap_hb_failure = false;
1715 wma_roam_scan_fill_scan_params(wma_handle, pMac, roam_req,
1716 &scan_params);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301717 qdf_status =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001718 wma_roam_scan_offload_mode(wma_handle, &scan_params,
1719 roam_req,
1720 WMI_ROAM_SCAN_MODE_NONE,
1721 roam_req->sessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301722 if (qdf_status != QDF_STATUS_SUCCESS)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001723 break;
1724
1725 if (roam_req->RoamScanOffloadEnabled == false)
1726 break;
1727
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301728 qdf_status = wma_roam_scan_bmiss_cnt(wma_handle,
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001729 roam_req->RoamBmissFirstBcnt,
1730 roam_req->RoamBmissFinalBcnt,
1731 roam_req->sessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301732 if (qdf_status != QDF_STATUS_SUCCESS)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001733 break;
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05301734
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301735 qdf_status = wma_roam_scan_filter(wma_handle, roam_req);
1736 if (qdf_status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001737 WMA_LOGE("Sending update for roam scan filter failed");
1738 break;
1739 }
1740
1741
1742 /*
1743 * Runtime (after association) changes to rssi thresholds and
1744 * other parameters.
1745 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301746 qdf_status = wma_roam_scan_offload_chan_list(wma_handle,
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001747 roam_req->ConnectedNetwork.ChannelCount,
1748 &roam_req->ConnectedNetwork.ChannelCache[0],
1749 roam_req->ChannelCacheType,
1750 roam_req->sessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001751 /*
1752 * Even though the channel list is empty, we can
1753 * still go ahead and start Roaming.
1754 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301755 if ((qdf_status != QDF_STATUS_SUCCESS) &&
1756 (qdf_status != QDF_STATUS_E_EMPTY))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001757 break;
1758
1759
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301760 qdf_status = wma_roam_scan_offload_rssi_thresh(wma_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001761 roam_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301762 if (qdf_status != QDF_STATUS_SUCCESS)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001763 break;
1764
1765 if (roam_req->EmptyRefreshScanPeriod > 0) {
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001766 qdf_status = wma_roam_scan_offload_scan_period(
1767 wma_handle,
1768 roam_req->EmptyRefreshScanPeriod,
1769 roam_req->EmptyRefreshScanPeriod * 3,
1770 roam_req->sessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301771 if (qdf_status != QDF_STATUS_SUCCESS)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001772 break;
1773
1774 mode = WMI_ROAM_SCAN_MODE_PERIODIC;
1775 /* Don't use rssi triggered roam scans if external app
1776 * is in control of channel list.
1777 */
Abhinav Kumaredd1d372018-05-11 15:33:35 +05301778 if (roam_req->ChannelCacheType != CHANNEL_LIST_STATIC ||
1779 roam_req->roam_force_rssi_trigger)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001780 mode |= WMI_ROAM_SCAN_MODE_RSSI_CHANGE;
1781
1782 } else {
1783 mode = WMI_ROAM_SCAN_MODE_RSSI_CHANGE;
1784 }
1785
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301786 qdf_status = wma_roam_scan_offload_rssi_change(wma_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001787 roam_req->sessionId,
1788 roam_req->RoamRescanRssiDiff,
1789 roam_req->RoamBeaconRssiWeight,
1790 roam_req->hi_rssi_scan_delay);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301791 if (qdf_status != QDF_STATUS_SUCCESS)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001792 break;
1793
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001794 qdf_status = wma_roam_scan_offload_ap_profile(wma_handle,
Himanshu Agarwal8bcec572017-09-28 11:54:37 +05301795 roam_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301796 if (qdf_status != QDF_STATUS_SUCCESS)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001797 break;
1798
1799 wma_roam_scan_fill_scan_params(wma_handle, pMac, roam_req,
1800 &scan_params);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301801 qdf_status =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001802 wma_roam_scan_offload_mode(wma_handle, &scan_params,
1803 roam_req, mode,
1804 roam_req->sessionId);
1805
1806 break;
1807
1808 default:
1809 break;
1810 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301811 qdf_mem_free(roam_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301812 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001813}
1814
Kapil Gupta5cda2252016-12-29 18:44:26 +05301815void wma_update_per_roam_config(WMA_HANDLE handle,
1816 struct wmi_per_roam_config_req *req_buf)
1817{
1818 int status;
1819 tp_wma_handle wma_handle = (tp_wma_handle) handle;
1820
1821 if (!wma_handle || !wma_handle->wmi_handle) {
1822 WMA_LOGE("%s: WMA is closed, cannot send per roam config",
1823 __func__);
1824 return;
1825 }
1826
1827 status = wmi_unified_set_per_roam_config(wma_handle->wmi_handle,
1828 req_buf);
1829 if (status != EOK)
1830 WMA_LOGE("%s: failed to set per roam config to FW",
1831 __func__);
1832}
1833
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001834#ifdef WLAN_FEATURE_ROAM_OFFLOAD
1835
1836/**
1837 * wma_process_roam_invoke() - send roam invoke command to fw.
1838 * @handle: wma handle
1839 * @roaminvoke: roam invoke command
1840 *
1841 * Send roam invoke command to fw for fastreassoc.
1842 *
1843 * Return: none
1844 */
1845void wma_process_roam_invoke(WMA_HANDLE handle,
1846 struct wma_roam_invoke_cmd *roaminvoke)
1847{
1848 tp_wma_handle wma_handle = (tp_wma_handle) handle;
Govind Singh64b5e112016-03-08 11:53:50 +05301849 uint32_t ch_hz;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001850
1851 if (!wma_handle || !wma_handle->wmi_handle) {
1852 WMA_LOGE("%s: WMA is closed, can not send roam invoke",
1853 __func__);
Naveen Rawat664a7cb2017-01-19 17:58:14 -08001854 goto free_frame_buf;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001855 }
Govind Singh64b5e112016-03-08 11:53:50 +05301856 ch_hz = (A_UINT32)cds_chan_to_freq(roaminvoke->channel);
1857 wmi_unified_roam_invoke_cmd(wma_handle->wmi_handle,
1858 (struct wmi_roam_invoke_cmd *)roaminvoke,
1859 ch_hz);
Naveen Rawat664a7cb2017-01-19 17:58:14 -08001860free_frame_buf:
1861 if (roaminvoke->frame_len) {
1862 qdf_mem_free(roaminvoke->frame_buf);
1863 roaminvoke->frame_buf = NULL;
1864 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001865}
1866
1867/**
1868 * wma_process_roam_synch_fail() -roam synch failure handle
1869 * @handle: wma handle
1870 * @synch_fail: roam synch fail parameters
1871 *
1872 * Return: none
1873 */
1874void wma_process_roam_synch_fail(WMA_HANDLE handle,
1875 struct roam_offload_synch_fail *synch_fail)
1876{
1877 tp_wma_handle wma_handle = (tp_wma_handle) handle;
Srinivas Girigowda4d65ebe2017-10-13 21:41:42 -07001878
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001879 if (!wma_handle || !wma_handle->wmi_handle) {
1880 WMA_LOGE("%s: WMA is closed, can not clean-up roam synch",
1881 __func__);
1882 return;
1883 }
Deepak Dhamdheref918d422017-07-06 12:56:29 -07001884 wlan_roam_debug_log(synch_fail->session_id,
1885 DEBUG_ROAM_SYNCH_FAIL,
1886 DEBUG_INVALID_PEER_ID, NULL, NULL, 0, 0);
1887
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001888 /* Hand Off Failure could happen as an exception, when a roam synch
1889 * indication is posted to Host, but a roam synch complete is not
1890 * posted to the firmware.So, clear the roam synch in progress
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001891 * flag before disconnecting the session through this event.
1892 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001893 wma_handle->interfaces[synch_fail->session_id].roam_synch_in_progress =
1894 false;
1895}
1896
1897/**
Pragaspathi Thilagarajea97fe92018-07-23 15:01:54 +05301898 * wma_free_roam_synch_frame_ind() - Free the bcn_probe_rsp, reassoc_req,
1899 * reassoc_rsp received as part of the ROAM_SYNC_FRAME event
1900 *
1901 * @iface - interaface corresponding to a vdev
1902 *
1903 * This API is used to free the buffer allocated during the ROAM_SYNC_FRAME
1904 * event
1905 *
1906 */
1907static void wma_free_roam_synch_frame_ind(struct wma_txrx_node *iface)
1908{
1909 if (iface->roam_synch_frame_ind.bcn_probe_rsp) {
1910 qdf_mem_free(iface->roam_synch_frame_ind.bcn_probe_rsp);
1911 iface->roam_synch_frame_ind.bcn_probe_rsp_len = 0;
1912 iface->roam_synch_frame_ind.bcn_probe_rsp = NULL;
1913 }
1914 if (iface->roam_synch_frame_ind.reassoc_req) {
1915 qdf_mem_free(iface->roam_synch_frame_ind.reassoc_req);
1916 iface->roam_synch_frame_ind.reassoc_req_len = 0;
1917 iface->roam_synch_frame_ind.reassoc_req = NULL;
1918 }
1919 if (iface->roam_synch_frame_ind.reassoc_rsp) {
1920 qdf_mem_free(iface->roam_synch_frame_ind.reassoc_rsp);
1921 iface->roam_synch_frame_ind.reassoc_rsp_len = 0;
1922 iface->roam_synch_frame_ind.reassoc_rsp = NULL;
1923 }
1924}
1925
1926/**
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05301927 * wma_fill_data_synch_frame_event() - Fill the the roam sync data buffer using
1928 * synch frame event data
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08001929 * @wma: Global WMA Handle
1930 * @roam_synch_ind_ptr: Buffer to be filled
1931 * @param_buf: Source buffer
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001932 *
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08001933 * Firmware sends all the required information required for roam
1934 * synch propagation as TLV's and stored in param_buf. These
1935 * parameters are parsed and filled into the roam synch indication
1936 * buffer which will be used at different layers for propagation.
1937 *
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05301938 * Return: None
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001939 */
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05301940static void wma_fill_data_synch_frame_event(tp_wma_handle wma,
Jeff Johnsonc4b47a92016-10-07 12:34:41 -07001941 roam_offload_synch_ind *roam_synch_ind_ptr,
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05301942 struct wma_txrx_node *iface)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001943{
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08001944 uint8_t *bcn_probersp_ptr;
1945 uint8_t *reassoc_rsp_ptr;
1946 uint8_t *reassoc_req_ptr;
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05301947
1948 /* Beacon/Probe Rsp data */
1949 roam_synch_ind_ptr->beaconProbeRespOffset =
1950 sizeof(roam_offload_synch_ind);
1951 bcn_probersp_ptr = (uint8_t *) roam_synch_ind_ptr +
1952 roam_synch_ind_ptr->beaconProbeRespOffset;
1953 roam_synch_ind_ptr->beaconProbeRespLength =
1954 iface->roam_synch_frame_ind.bcn_probe_rsp_len;
1955 qdf_mem_copy(bcn_probersp_ptr,
1956 iface->roam_synch_frame_ind.bcn_probe_rsp,
1957 roam_synch_ind_ptr->beaconProbeRespLength);
1958 qdf_mem_free(iface->roam_synch_frame_ind.bcn_probe_rsp);
1959 iface->roam_synch_frame_ind.bcn_probe_rsp = NULL;
1960
1961 /* ReAssoc Rsp data */
1962 roam_synch_ind_ptr->reassocRespOffset =
1963 sizeof(roam_offload_synch_ind) +
1964 roam_synch_ind_ptr->beaconProbeRespLength;
1965 roam_synch_ind_ptr->reassocRespLength =
1966 iface->roam_synch_frame_ind.reassoc_rsp_len;
1967 reassoc_rsp_ptr = (uint8_t *) roam_synch_ind_ptr +
1968 roam_synch_ind_ptr->reassocRespOffset;
1969 qdf_mem_copy(reassoc_rsp_ptr,
1970 iface->roam_synch_frame_ind.reassoc_rsp,
1971 roam_synch_ind_ptr->reassocRespLength);
1972 qdf_mem_free(iface->roam_synch_frame_ind.reassoc_rsp);
1973 iface->roam_synch_frame_ind.reassoc_rsp = NULL;
1974
1975 /* ReAssoc Req data */
1976 roam_synch_ind_ptr->reassoc_req_offset =
1977 sizeof(roam_offload_synch_ind) +
1978 roam_synch_ind_ptr->beaconProbeRespLength +
1979 roam_synch_ind_ptr->reassocRespLength;
1980 roam_synch_ind_ptr->reassoc_req_length =
1981 iface->roam_synch_frame_ind.reassoc_req_len;
1982 reassoc_req_ptr = (uint8_t *) roam_synch_ind_ptr +
1983 roam_synch_ind_ptr->reassoc_req_offset;
1984 qdf_mem_copy(reassoc_req_ptr,
1985 iface->roam_synch_frame_ind.reassoc_req,
1986 roam_synch_ind_ptr->reassoc_req_length);
1987 qdf_mem_free(iface->roam_synch_frame_ind.reassoc_req);
1988 iface->roam_synch_frame_ind.reassoc_req = NULL;
1989}
1990
1991/**
1992 * wma_fill_data_synch_event() - Fill the the roam sync data buffer using synch
1993 * event data
1994 * @wma: Global WMA Handle
1995 * @roam_synch_ind_ptr: Buffer to be filled
1996 * @param_buf: Source buffer
1997 *
1998 * Firmware sends all the required information required for roam
1999 * synch propagation as TLV's and stored in param_buf. These
2000 * parameters are parsed and filled into the roam synch indication
2001 * buffer which will be used at different layers for propagation.
2002 *
2003 * Return: None
2004 */
2005static void wma_fill_data_synch_event(tp_wma_handle wma,
2006 roam_offload_synch_ind *roam_synch_ind_ptr,
2007 WMI_ROAM_SYNCH_EVENTID_param_tlvs *param_buf)
2008{
2009 uint8_t *bcn_probersp_ptr;
2010 uint8_t *reassoc_rsp_ptr;
2011 uint8_t *reassoc_req_ptr;
2012 wmi_roam_synch_event_fixed_param *synch_event;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002013
2014 synch_event = param_buf->fixed_param;
Padma, Santhosh Kumarcd35f532016-12-27 12:07:39 +05302015
Naveen Rawat14298b92015-11-25 16:27:41 -08002016 /* Beacon/Probe Rsp data */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002017 roam_synch_ind_ptr->beaconProbeRespOffset =
2018 sizeof(roam_offload_synch_ind);
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002019 bcn_probersp_ptr = (uint8_t *) roam_synch_ind_ptr +
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002020 roam_synch_ind_ptr->beaconProbeRespOffset;
2021 roam_synch_ind_ptr->beaconProbeRespLength =
2022 synch_event->bcn_probe_rsp_len;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302023 qdf_mem_copy(bcn_probersp_ptr, param_buf->bcn_probe_rsp_frame,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002024 roam_synch_ind_ptr->beaconProbeRespLength);
Naveen Rawat14298b92015-11-25 16:27:41 -08002025 /* ReAssoc Rsp data */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002026 roam_synch_ind_ptr->reassocRespOffset =
2027 sizeof(roam_offload_synch_ind) +
2028 roam_synch_ind_ptr->beaconProbeRespLength;
2029 roam_synch_ind_ptr->reassocRespLength = synch_event->reassoc_rsp_len;
2030 reassoc_rsp_ptr = (uint8_t *) roam_synch_ind_ptr +
2031 roam_synch_ind_ptr->reassocRespOffset;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302032 qdf_mem_copy(reassoc_rsp_ptr,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002033 param_buf->reassoc_rsp_frame,
2034 roam_synch_ind_ptr->reassocRespLength);
Naveen Rawat14298b92015-11-25 16:27:41 -08002035
2036 /* ReAssoc Req data */
2037 roam_synch_ind_ptr->reassoc_req_offset =
2038 sizeof(roam_offload_synch_ind) +
2039 roam_synch_ind_ptr->beaconProbeRespLength +
2040 roam_synch_ind_ptr->reassocRespLength;
2041 roam_synch_ind_ptr->reassoc_req_length = synch_event->reassoc_req_len;
2042 reassoc_req_ptr = (uint8_t *) roam_synch_ind_ptr +
2043 roam_synch_ind_ptr->reassoc_req_offset;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302044 qdf_mem_copy(reassoc_req_ptr, param_buf->reassoc_req_frame,
Naveen Rawat14298b92015-11-25 16:27:41 -08002045 roam_synch_ind_ptr->reassoc_req_length);
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302046}
2047
2048/**
2049 * wma_fill_roam_synch_buffer() - Fill the the roam sync buffer
2050 * @wma: Global WMA Handle
2051 * @roam_synch_ind_ptr: Buffer to be filled
2052 * @param_buf: Source buffer
2053 *
2054 * Firmware sends all the required information required for roam
2055 * synch propagation as TLV's and stored in param_buf. These
2056 * parameters are parsed and filled into the roam synch indication
2057 * buffer which will be used at different layers for propagation.
2058 *
2059 * Return: Success or Failure
2060 */
2061static int wma_fill_roam_synch_buffer(tp_wma_handle wma,
2062 roam_offload_synch_ind *roam_synch_ind_ptr,
2063 WMI_ROAM_SYNCH_EVENTID_param_tlvs *param_buf)
2064{
2065 wmi_roam_synch_event_fixed_param *synch_event;
2066 wmi_channel *chan;
2067 wmi_key_material *key;
2068 struct wma_txrx_node *iface = NULL;
2069 wmi_roam_fils_synch_tlv_param *fils_info;
Pragaspathi Thilagarajea97fe92018-07-23 15:01:54 +05302070 int status = -EINVAL;
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302071
2072 synch_event = param_buf->fixed_param;
2073 roam_synch_ind_ptr->roamedVdevId = synch_event->vdev_id;
2074 roam_synch_ind_ptr->authStatus = synch_event->auth_status;
2075 roam_synch_ind_ptr->roamReason = synch_event->roam_reason;
2076 roam_synch_ind_ptr->rssi = synch_event->rssi;
Pragaspathi Thilagarajea97fe92018-07-23 15:01:54 +05302077 iface = &wma->interfaces[synch_event->vdev_id];
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302078 WMI_MAC_ADDR_TO_CHAR_ARRAY(&synch_event->bssid,
2079 roam_synch_ind_ptr->bssid.bytes);
2080 WMA_LOGD("%s: roamedVdevId %d authStatus %d roamReason %d rssi %d isBeacon %d",
2081 __func__, roam_synch_ind_ptr->roamedVdevId,
2082 roam_synch_ind_ptr->authStatus, roam_synch_ind_ptr->roamReason,
2083 roam_synch_ind_ptr->rssi, roam_synch_ind_ptr->isBeacon);
2084
2085 if (!QDF_IS_STATUS_SUCCESS(
2086 wma->csr_roam_synch_cb((tpAniSirGlobal)wma->mac_context,
2087 roam_synch_ind_ptr, NULL, SIR_ROAMING_DEREGISTER_STA))) {
2088 WMA_LOGE("LFR3: CSR Roam synch cb failed");
Pragaspathi Thilagarajea97fe92018-07-23 15:01:54 +05302089 wma_free_roam_synch_frame_ind(iface);
2090 return status;
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302091 }
2092
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302093 /*
2094 * If lengths of bcn_probe_rsp, reassoc_req and reassoc_rsp are zero in
2095 * synch_event driver would have received bcn_probe_rsp, reassoc_req
2096 * and reassoc_rsp via the event WMI_ROAM_SYNCH_FRAME_EVENTID
2097 */
2098 if ((!synch_event->bcn_probe_rsp_len) &&
2099 (!synch_event->reassoc_req_len) &&
2100 (!synch_event->reassoc_rsp_len)) {
2101 if (!iface->roam_synch_frame_ind.bcn_probe_rsp) {
2102 WMA_LOGE("LFR3: bcn_probe_rsp is NULL");
2103 QDF_ASSERT(iface->roam_synch_frame_ind.
2104 bcn_probe_rsp != NULL);
Pragaspathi Thilagarajea97fe92018-07-23 15:01:54 +05302105 wma_free_roam_synch_frame_ind(iface);
2106 return status;
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302107 }
2108 if (!iface->roam_synch_frame_ind.reassoc_rsp) {
2109 WMA_LOGE("LFR3: reassoc_rsp is NULL");
2110 QDF_ASSERT(iface->roam_synch_frame_ind.
2111 reassoc_rsp != NULL);
Pragaspathi Thilagarajea97fe92018-07-23 15:01:54 +05302112 wma_free_roam_synch_frame_ind(iface);
2113 return status;
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302114 }
2115 if (!iface->roam_synch_frame_ind.reassoc_req) {
2116 WMA_LOGE("LFR3: reassoc_req is NULL");
2117 QDF_ASSERT(iface->roam_synch_frame_ind.
2118 reassoc_req != NULL);
Pragaspathi Thilagarajea97fe92018-07-23 15:01:54 +05302119 wma_free_roam_synch_frame_ind(iface);
2120 return status;
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302121 }
2122 wma_fill_data_synch_frame_event(wma, roam_synch_ind_ptr, iface);
2123 } else {
2124 wma_fill_data_synch_event(wma, roam_synch_ind_ptr, param_buf);
2125 }
Naveen Rawat14298b92015-11-25 16:27:41 -08002126
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002127 chan = (wmi_channel *) param_buf->chan;
2128 roam_synch_ind_ptr->chan_freq = chan->mhz;
2129 key = (wmi_key_material *) param_buf->key;
2130 if (key != NULL) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302131 qdf_mem_copy(roam_synch_ind_ptr->kck, key->kck,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002132 SIR_KCK_KEY_LEN);
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05302133 roam_synch_ind_ptr->kek_len = SIR_KEK_KEY_LEN;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302134 qdf_mem_copy(roam_synch_ind_ptr->kek, key->kek,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002135 SIR_KEK_KEY_LEN);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302136 qdf_mem_copy(roam_synch_ind_ptr->replay_ctr,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002137 key->replay_counter, SIR_REPLAY_CTR_LEN);
2138 }
Naveen Rawat8cc23b02016-07-14 12:22:56 -07002139 if (param_buf->hw_mode_transition_fixed_param)
2140 wma_process_pdev_hw_mode_trans_ind(wma,
2141 param_buf->hw_mode_transition_fixed_param,
2142 param_buf->wmi_pdev_set_hw_mode_response_vdev_mac_mapping,
2143 &roam_synch_ind_ptr->hw_mode_trans_ind);
2144 else
2145 WMA_LOGD(FL("hw_mode transition fixed param is NULL"));
Varun Reddy Yeturu88f123c2017-03-14 18:24:32 -07002146
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05302147 fils_info = (wmi_roam_fils_synch_tlv_param *)
2148 (param_buf->roam_fils_synch_info);
Vignesh Viswanathan686833a2018-04-20 12:51:24 +05302149 if (fils_info) {
2150 if ((fils_info->kek_len > SIR_KEK_KEY_LEN_FILS) ||
2151 (fils_info->pmk_len > SIR_PMK_LEN)) {
2152 WMA_LOGE("%s: Invalid kek_len %d or pmk_len %d",
2153 __func__,
2154 fils_info->kek_len,
2155 fils_info->pmk_len);
Pragaspathi Thilagarajea97fe92018-07-23 15:01:54 +05302156 wma_free_roam_synch_frame_ind(iface);
2157 return status;
Vignesh Viswanathan686833a2018-04-20 12:51:24 +05302158 }
2159
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05302160 roam_synch_ind_ptr->kek_len = fils_info->kek_len;
2161 qdf_mem_copy(roam_synch_ind_ptr->kek, fils_info->kek,
2162 fils_info->kek_len);
2163
2164 roam_synch_ind_ptr->pmk_len = fils_info->pmk_len;
2165 qdf_mem_copy(roam_synch_ind_ptr->pmk, fils_info->pmk,
2166 fils_info->pmk_len);
2167
2168 qdf_mem_copy(roam_synch_ind_ptr->pmkid, fils_info->pmkid,
2169 SIR_PMKID_LEN);
2170
2171 roam_synch_ind_ptr->update_erp_next_seq_num =
2172 fils_info->update_erp_next_seq_num;
2173 roam_synch_ind_ptr->next_erp_seq_num =
2174 fils_info->next_erp_seq_num;
2175
Vignesh Viswanathan8da68cf2017-09-07 14:00:04 +05302176 WMA_LOGD("Update ERP Seq Num %d, Next ERP Seq Num %d",
2177 roam_synch_ind_ptr->update_erp_next_seq_num,
2178 roam_synch_ind_ptr->next_erp_seq_num);
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05302179 }
Pragaspathi Thilagarajea97fe92018-07-23 15:01:54 +05302180 wma_free_roam_synch_frame_ind(iface);
Varun Reddy Yeturu1ce7aff2017-03-15 16:14:03 -07002181 return 0;
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002182}
2183
2184/**
2185 * wma_roam_update_vdev() - Update the STA and BSS
2186 * @wma: Global WMA Handle
2187 * @roam_synch_ind_ptr: Information needed for roam sync propagation
2188 *
2189 * This function will perform all the vdev related operations with
2190 * respect to the self sta and the peer after roaming and completes
2191 * the roam synch propagation with respect to WMA layer.
2192 *
2193 * Return: None
2194 */
Jeff Johnsonc4b47a92016-10-07 12:34:41 -07002195static void wma_roam_update_vdev(tp_wma_handle wma,
2196 roam_offload_synch_ind *roam_synch_ind_ptr)
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002197{
2198 tDeleteBssParams *del_bss_params;
2199 tDeleteStaParams *del_sta_params;
2200 tLinkStateParams *set_link_params;
2201 tAddStaParams *add_sta_params;
2202 uint8_t vdev_id;
2203
Naveen Rawat746a90b2017-06-07 15:16:35 -07002204 vdev_id = roam_synch_ind_ptr->roamedVdevId;
2205 wma->interfaces[vdev_id].nss = roam_synch_ind_ptr->nss;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302206 del_bss_params = qdf_mem_malloc(sizeof(*del_bss_params));
2207 del_sta_params = qdf_mem_malloc(sizeof(*del_sta_params));
2208 set_link_params = qdf_mem_malloc(sizeof(*set_link_params));
2209 add_sta_params = qdf_mem_malloc(sizeof(*add_sta_params));
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002210 if (!del_bss_params || !del_sta_params ||
2211 !set_link_params || !add_sta_params) {
2212 WMA_LOGE("%s: failed to allocate memory", __func__);
2213 return;
2214 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302215 qdf_mem_zero(del_bss_params, sizeof(*del_bss_params));
2216 qdf_mem_zero(del_sta_params, sizeof(*del_sta_params));
2217 qdf_mem_zero(set_link_params, sizeof(*set_link_params));
2218 qdf_mem_zero(add_sta_params, sizeof(*add_sta_params));
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002219
2220 del_bss_params->smesessionId = vdev_id;
2221 del_sta_params->smesessionId = vdev_id;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302222 qdf_mem_copy(del_bss_params->bssid, wma->interfaces[vdev_id].bssid,
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002223 IEEE80211_ADDR_LEN);
2224 set_link_params->state = eSIR_LINK_PREASSOC_STATE;
Varun Reddy Yeturu28925b42016-02-08 07:18:50 -08002225 qdf_mem_copy(set_link_params->selfMacAddr,
2226 roam_synch_ind_ptr->self_mac.bytes, IEEE80211_ADDR_LEN);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302227 qdf_mem_copy(set_link_params->bssid, roam_synch_ind_ptr->bssid.bytes,
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002228 IEEE80211_ADDR_LEN);
2229 add_sta_params->staType = STA_ENTRY_SELF;
2230 add_sta_params->smesessionId = vdev_id;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302231 qdf_mem_copy(&add_sta_params->bssId, &roam_synch_ind_ptr->bssid.bytes,
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002232 IEEE80211_ADDR_LEN);
2233 add_sta_params->staIdx = STA_INVALID_IDX;
2234 add_sta_params->assocId = roam_synch_ind_ptr->aid;
2235
2236 wma_delete_sta(wma, del_sta_params);
2237 wma_delete_bss(wma, del_bss_params);
2238 wma_set_linkstate(wma, set_link_params);
2239 wma_add_bss(wma, (tpAddBssParams)roam_synch_ind_ptr->add_bss_params);
2240 wma_add_sta(wma, add_sta_params);
Mukul Sharmaf9047232017-03-02 16:58:56 +05302241 wma_vdev_set_mlme_state(wma, vdev_id, WLAN_VDEV_S_RUN);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302242 qdf_mem_copy(wma->interfaces[vdev_id].bssid,
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002243 roam_synch_ind_ptr->bssid.bytes, IEEE80211_ADDR_LEN);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302244 qdf_mem_free(del_bss_params);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302245 qdf_mem_free(set_link_params);
2246 qdf_mem_free(add_sta_params);
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002247}
2248
2249/**
2250 * wma_roam_synch_event_handler() - roam synch event handler
2251 * @handle: wma handle
2252 * @event: event data
2253 * @len: length of data
2254 *
2255 * This function is roam synch event handler. It sends roam
2256 * indication for upper layer.
2257 *
2258 * Return: Success or Failure status
2259 */
2260int wma_roam_synch_event_handler(void *handle, uint8_t *event,
2261 uint32_t len)
2262{
2263 WMI_ROAM_SYNCH_EVENTID_param_tlvs *param_buf = NULL;
2264 wmi_roam_synch_event_fixed_param *synch_event = NULL;
2265 tp_wma_handle wma = (tp_wma_handle) handle;
Varun Reddy Yeturu1ce7aff2017-03-15 16:14:03 -07002266 roam_offload_synch_ind *roam_synch_ind_ptr = NULL;
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002267 tpSirBssDescription bss_desc_ptr = NULL;
2268 uint16_t ie_len = 0;
2269 int status = -EINVAL;
Varun Reddy Yeturu1ce7aff2017-03-15 16:14:03 -07002270 tSirRoamOffloadScanReq *roam_req;
Varun Reddy Yeturu5ab47462016-05-08 18:08:11 -07002271 qdf_time_t roam_synch_received = qdf_get_system_timestamp();
Vignesh Viswanathanf8800692017-09-28 14:49:00 +05302272 uint32_t roam_synch_data_len;
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302273 A_UINT32 bcn_probe_rsp_len;
2274 A_UINT32 reassoc_rsp_len;
2275 A_UINT32 reassoc_req_len;
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002276
2277 WMA_LOGD("LFR3:%s", __func__);
2278 if (!event) {
2279 WMA_LOGE("%s: event param null", __func__);
Varun Reddy Yeturu1ce7aff2017-03-15 16:14:03 -07002280 goto cleanup_label;
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002281 }
2282
2283 param_buf = (WMI_ROAM_SYNCH_EVENTID_param_tlvs *) event;
2284 if (!param_buf) {
2285 WMA_LOGE("%s: received null buf from target", __func__);
Varun Reddy Yeturu1ce7aff2017-03-15 16:14:03 -07002286 goto cleanup_label;
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002287 }
2288
2289 synch_event = param_buf->fixed_param;
2290 if (!synch_event) {
2291 WMA_LOGE("%s: received null event data from target", __func__);
Varun Reddy Yeturu1ce7aff2017-03-15 16:14:03 -07002292 goto cleanup_label;
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002293 }
2294
Pragaspathi Thilagaraj54ac69d2018-04-02 17:21:26 +05302295 if (synch_event->vdev_id >= wma->max_bssid) {
2296 WMA_LOGE("%s: received invalid vdev_id %d",
2297 __func__, synch_event->vdev_id);
2298 return status;
2299 }
2300
Tushnim Bhattacharyyaeb622b02018-05-07 13:50:51 -07002301 /*
2302 * This flag is set during ROAM_START and once this event is being
2303 * executed which is a run to completion, no other event can interrupt
2304 * this in MC thread context. So, it is OK to reset the flag here as
2305 * soon as we receive this event.
2306 */
2307 wma->interfaces[synch_event->vdev_id].roaming_in_progress = false;
2308
Abhinav Kumara03659c2017-12-28 15:18:07 +05302309 if (synch_event->bcn_probe_rsp_len >
2310 param_buf->num_bcn_probe_rsp_frame ||
2311 synch_event->reassoc_req_len >
2312 param_buf->num_reassoc_req_frame ||
2313 synch_event->reassoc_rsp_len >
2314 param_buf->num_reassoc_rsp_frame) {
2315 WMA_LOGD("Invalid synch payload: LEN bcn:%d, req:%d, rsp:%d",
2316 synch_event->bcn_probe_rsp_len,
2317 synch_event->reassoc_req_len,
2318 synch_event->reassoc_rsp_len);
2319 goto cleanup_label;
2320 }
Vignesh Viswanathanf8800692017-09-28 14:49:00 +05302321
Deepak Dhamdheref918d422017-07-06 12:56:29 -07002322 wlan_roam_debug_log(synch_event->vdev_id, DEBUG_ROAM_SYNCH_IND,
2323 DEBUG_INVALID_PEER_ID, NULL, NULL,
2324 synch_event->bssid.mac_addr31to0,
2325 synch_event->bssid.mac_addr47to32);
Himanshu Agarwal67a863b2016-09-20 15:09:09 +05302326 DPTRACE(qdf_dp_trace_record_event(QDF_DP_TRACE_EVENT_RECORD,
Venkata Sharath Chandra Manchala0b9fc632017-05-15 14:35:15 -07002327 synch_event->vdev_id, QDF_TRACE_DEFAULT_PDEV_ID,
2328 QDF_PROTO_TYPE_EVENT, QDF_ROAM_SYNCH));
Himanshu Agarwal67a863b2016-09-20 15:09:09 +05302329
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002330 if (wma_is_roam_synch_in_progress(wma, synch_event->vdev_id)) {
2331 WMA_LOGE("%s: Ignoring RSI since one is already in progress",
2332 __func__);
Varun Reddy Yeturu1ce7aff2017-03-15 16:14:03 -07002333 goto cleanup_label;
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002334 }
Abhinav Kumar50d4dc72018-06-15 16:35:50 +05302335 WMA_LOGD("LFR3: Received WMA_ROAM_OFFLOAD_SYNCH_IND");
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002336
Varun Reddy Yeturu46ba20c2017-08-17 15:03:27 -07002337 /*
2338 * All below length fields are unsigned and hence positive numbers.
2339 * Maximum number during the addition would be (3 * MAX_LIMIT(UINT32) +
2340 * few fixed fields).
2341 */
Vignesh Viswanathanf8800692017-09-28 14:49:00 +05302342 WMA_LOGD("synch payload: LEN bcn:%d, req:%d, rsp:%d",
2343 synch_event->bcn_probe_rsp_len,
2344 synch_event->reassoc_req_len,
2345 synch_event->reassoc_rsp_len);
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302346
Vignesh Viswanathanf8800692017-09-28 14:49:00 +05302347 /*
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302348 * If lengths of bcn_probe_rsp, reassoc_req and reassoc_rsp are zero in
2349 * synch_event driver would have received bcn_probe_rsp, reassoc_req
2350 * and reassoc_rsp via the event WMI_ROAM_SYNCH_FRAME_EVENTID
Vignesh Viswanathanf8800692017-09-28 14:49:00 +05302351 */
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302352 if ((!synch_event->bcn_probe_rsp_len) &&
2353 (!synch_event->reassoc_req_len) &&
2354 (!synch_event->reassoc_rsp_len)) {
2355 bcn_probe_rsp_len = wma->interfaces[synch_event->vdev_id].
2356 roam_synch_frame_ind.
2357 bcn_probe_rsp_len;
2358 reassoc_req_len = wma->interfaces[synch_event->vdev_id].
2359 roam_synch_frame_ind.reassoc_req_len;
2360 reassoc_rsp_len = wma->interfaces[synch_event->vdev_id].
2361 roam_synch_frame_ind.reassoc_rsp_len;
2362
2363 roam_synch_data_len = bcn_probe_rsp_len + reassoc_rsp_len +
2364 reassoc_req_len + sizeof(roam_offload_synch_ind);
2365
2366 WMA_LOGD("Updated synch payload: LEN bcn:%d, req:%d, rsp:%d",
2367 bcn_probe_rsp_len,
2368 reassoc_req_len,
2369 reassoc_rsp_len);
2370 } else {
2371 bcn_probe_rsp_len = synch_event->bcn_probe_rsp_len;
2372 reassoc_req_len = synch_event->reassoc_req_len;
2373 reassoc_rsp_len = synch_event->reassoc_rsp_len;
2374
2375 if (synch_event->bcn_probe_rsp_len > WMI_SVC_MSG_MAX_SIZE)
2376 goto cleanup_label;
2377 if (synch_event->reassoc_rsp_len >
2378 (WMI_SVC_MSG_MAX_SIZE - synch_event->bcn_probe_rsp_len))
2379 goto cleanup_label;
2380 if (synch_event->reassoc_req_len >
2381 WMI_SVC_MSG_MAX_SIZE - (synch_event->bcn_probe_rsp_len +
2382 synch_event->reassoc_rsp_len))
2383 goto cleanup_label;
2384
2385 roam_synch_data_len = bcn_probe_rsp_len +
2386 reassoc_rsp_len + reassoc_req_len;
2387
2388 /*
2389 * Below is the check for the entire size of the message
2390 * received from the firmware.
2391 */
2392 if (roam_synch_data_len > WMI_SVC_MSG_MAX_SIZE -
2393 (sizeof(*synch_event) + sizeof(wmi_channel) +
2394 sizeof(wmi_key_material) + sizeof(uint32_t)))
2395 goto cleanup_label;
2396
2397 roam_synch_data_len += sizeof(roam_offload_synch_ind);
2398 }
2399
Kiran Kumar Lokere1d411bb2017-11-29 15:24:05 -08002400 WMA_LOGD("synch payload: LEN bcn:%d, req:%d, rsp:%d",
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302401 bcn_probe_rsp_len,
2402 reassoc_req_len,
2403 reassoc_rsp_len);
Varun Reddy Yeturu46ba20c2017-08-17 15:03:27 -07002404
Mukul Sharmae44d0542017-05-23 21:50:56 +05302405 cds_host_diag_log_work(&wma->roam_ho_wl,
2406 WMA_ROAM_HO_WAKE_LOCK_DURATION,
2407 WIFI_POWER_EVENT_WAKELOCK_WOW);
2408 qdf_wake_lock_timeout_acquire(&wma->roam_ho_wl,
yeshwanth sriram guntuka37c09822017-01-24 18:30:15 +05302409 WMA_ROAM_HO_WAKE_LOCK_DURATION);
2410
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002411 wma->interfaces[synch_event->vdev_id].roam_synch_in_progress = true;
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302412
Vignesh Viswanathanf8800692017-09-28 14:49:00 +05302413 roam_synch_ind_ptr =
2414 (roam_offload_synch_ind *)qdf_mem_malloc(roam_synch_data_len);
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002415 if (!roam_synch_ind_ptr) {
2416 WMA_LOGE("%s: failed to allocate memory for roam_synch_event",
2417 __func__);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302418 QDF_ASSERT(roam_synch_ind_ptr != NULL);
yeshwanth sriram guntuka37c09822017-01-24 18:30:15 +05302419 status = -ENOMEM;
2420 goto cleanup_label;
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002421 }
Vignesh Viswanathanf8800692017-09-28 14:49:00 +05302422 qdf_mem_zero(roam_synch_ind_ptr, roam_synch_data_len);
Varun Reddy Yeturu1ce7aff2017-03-15 16:14:03 -07002423 status = wma_fill_roam_synch_buffer(wma,
2424 roam_synch_ind_ptr, param_buf);
2425 if (status != 0)
Varun Reddy Yeturu88f123c2017-03-14 18:24:32 -07002426 goto cleanup_label;
Naveen Rawat8cc23b02016-07-14 12:22:56 -07002427 /* 24 byte MAC header and 12 byte to ssid IE */
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002428 if (roam_synch_ind_ptr->beaconProbeRespLength >
2429 (SIR_MAC_HDR_LEN_3A + SIR_MAC_B_PR_SSID_OFFSET)) {
2430 ie_len = roam_synch_ind_ptr->beaconProbeRespLength -
2431 (SIR_MAC_HDR_LEN_3A + SIR_MAC_B_PR_SSID_OFFSET);
2432 } else {
2433 WMA_LOGE("LFR3: Invalid Beacon Length");
2434 goto cleanup_label;
2435 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302436 bss_desc_ptr = qdf_mem_malloc(sizeof(tSirBssDescription) + ie_len);
Kiran Kumar Lokereba3b4312016-04-29 16:40:20 -07002437 if (NULL == bss_desc_ptr) {
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002438 WMA_LOGE("LFR3: mem alloc failed!");
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302439 QDF_ASSERT(bss_desc_ptr != NULL);
yeshwanth sriram guntuka37c09822017-01-24 18:30:15 +05302440 status = -ENOMEM;
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002441 goto cleanup_label;
2442 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302443 qdf_mem_zero(bss_desc_ptr, sizeof(tSirBssDescription) + ie_len);
Selvaraj, Sridhara6e3eba2017-03-14 19:52:39 +05302444 if (QDF_IS_STATUS_ERROR(wma->pe_roam_synch_cb(
2445 (tpAniSirGlobal)wma->mac_context,
Varun Reddy Yeturub5d858e2017-12-15 16:08:13 -08002446 roam_synch_ind_ptr, bss_desc_ptr,
2447 SIR_ROAM_SYNCH_PROPAGATION))) {
Selvaraj, Sridhara6e3eba2017-03-14 19:52:39 +05302448 WMA_LOGE("LFR3: PE roam synch cb failed");
2449 status = -EBUSY;
2450 goto cleanup_label;
2451 }
Naveen Rawat746a90b2017-06-07 15:16:35 -07002452
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002453 wma_roam_update_vdev(wma, roam_synch_ind_ptr);
2454 wma->csr_roam_synch_cb((tpAniSirGlobal)wma->mac_context,
Varun Reddy Yeturuf907f912016-03-21 15:06:22 -07002455 roam_synch_ind_ptr, bss_desc_ptr, SIR_ROAM_SYNCH_PROPAGATION);
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002456 wma_process_roam_synch_complete(wma, synch_event->vdev_id);
Naveen Rawat8cc23b02016-07-14 12:22:56 -07002457
2458 /* update freq and channel width */
2459 wma->interfaces[synch_event->vdev_id].mhz =
2460 roam_synch_ind_ptr->chan_freq;
2461 if (roam_synch_ind_ptr->join_rsp)
2462 wma->interfaces[synch_event->vdev_id].chan_width =
2463 roam_synch_ind_ptr->join_rsp->vht_channel_width;
2464
2465 wma->csr_roam_synch_cb((tpAniSirGlobal)wma->mac_context,
2466 roam_synch_ind_ptr, bss_desc_ptr, SIR_ROAM_SYNCH_COMPLETE);
Varun Reddy Yeturu5ab47462016-05-08 18:08:11 -07002467 wma->interfaces[synch_event->vdev_id].roam_synch_delay =
2468 qdf_get_system_timestamp() - roam_synch_received;
2469 WMA_LOGD("LFR3: roam_synch_delay:%d",
2470 wma->interfaces[synch_event->vdev_id].roam_synch_delay);
Varun Reddy Yeturu04251862016-09-16 10:33:19 -07002471 wma->csr_roam_synch_cb((tpAniSirGlobal)wma->mac_context,
2472 roam_synch_ind_ptr, bss_desc_ptr, SIR_ROAM_SYNCH_NAPI_OFF);
yeshwanth sriram guntuka37c09822017-01-24 18:30:15 +05302473
2474 status = 0;
2475
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002476cleanup_label:
Varun Reddy Yeturu1ce7aff2017-03-15 16:14:03 -07002477 if (status != 0) {
2478 if (roam_synch_ind_ptr)
2479 wma->csr_roam_synch_cb((tpAniSirGlobal)wma->mac_context,
2480 roam_synch_ind_ptr, NULL, SIR_ROAMING_ABORT);
2481 roam_req = qdf_mem_malloc(sizeof(tSirRoamOffloadScanReq));
Varun Reddy Yeturu06488012017-05-25 11:44:10 -07002482 if (roam_req && synch_event) {
Krunal Sonifea06802017-04-13 14:44:48 -07002483 roam_req->Command = ROAM_SCAN_OFFLOAD_STOP;
Varun Reddy Yeturubc1bea02018-02-01 18:12:34 -08002484 roam_req->reason = REASON_ROAM_SYNCH_FAILED;
Varun Reddy Yeturu06488012017-05-25 11:44:10 -07002485 roam_req->sessionId = synch_event->vdev_id;
Krunal Sonifea06802017-04-13 14:44:48 -07002486 wma_process_roaming_config(wma, roam_req);
2487 }
Varun Reddy Yeturu1ce7aff2017-03-15 16:14:03 -07002488 }
yeshwanth sriram guntuka37c09822017-01-24 18:30:15 +05302489 if (roam_synch_ind_ptr && roam_synch_ind_ptr->join_rsp)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302490 qdf_mem_free(roam_synch_ind_ptr->join_rsp);
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002491 if (roam_synch_ind_ptr)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302492 qdf_mem_free(roam_synch_ind_ptr);
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002493 if (bss_desc_ptr)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302494 qdf_mem_free(bss_desc_ptr);
Krunal Sonifea06802017-04-13 14:44:48 -07002495 if (wma && synch_event)
2496 wma->interfaces[synch_event->vdev_id].roam_synch_in_progress =
2497 false;
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002498
yeshwanth sriram guntuka37c09822017-01-24 18:30:15 +05302499 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002500}
2501
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302502int wma_roam_synch_frame_event_handler(void *handle, uint8_t *event,
2503 uint32_t len)
2504{
2505 WMI_ROAM_SYNCH_FRAME_EVENTID_param_tlvs *param_buf = NULL;
2506 wmi_roam_synch_frame_event_fixed_param *synch_frame_event = NULL;
2507 tp_wma_handle wma = (tp_wma_handle) handle;
2508 A_UINT32 vdev_id;
2509 struct wma_txrx_node *iface = NULL;
2510 int status = -EINVAL;
2511
2512 WMA_LOGD("LFR3:Synch Frame event");
2513 if (!event) {
2514 WMA_LOGE("event param null");
Pragaspathi Thilagarajea97fe92018-07-23 15:01:54 +05302515 return status;
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302516 }
2517
2518 param_buf = (WMI_ROAM_SYNCH_FRAME_EVENTID_param_tlvs *) event;
2519 if (!param_buf) {
2520 WMA_LOGE("received null buf from target");
Pragaspathi Thilagarajea97fe92018-07-23 15:01:54 +05302521 return status;
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302522 }
2523
2524 synch_frame_event = param_buf->fixed_param;
2525 if (!synch_frame_event) {
2526 WMA_LOGE("received null event data from target");
Pragaspathi Thilagarajea97fe92018-07-23 15:01:54 +05302527 return status;
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302528 }
2529
2530 if (synch_frame_event->vdev_id >= wma->max_bssid) {
2531 WMA_LOGE("received invalid vdev_id %d",
2532 synch_frame_event->vdev_id);
Pragaspathi Thilagarajea97fe92018-07-23 15:01:54 +05302533 return status;
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302534 }
2535
2536 vdev_id = synch_frame_event->vdev_id;
2537 iface = &wma->interfaces[vdev_id];
2538
2539 if (wma_is_roam_synch_in_progress(wma, vdev_id)) {
2540 WMA_LOGE("Ignoring this event as it is unexpected");
Pragaspathi Thilagarajea97fe92018-07-23 15:01:54 +05302541 wma_free_roam_synch_frame_ind(iface);
2542 return status;
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302543 }
2544 WMA_LOGD("LFR3: Received ROAM_SYNCH_FRAME_EVENT");
2545
2546 WMA_LOGD("synch frame payload: LEN bcn:%d, req:%d, rsp:%d morefrag: %d",
2547 synch_frame_event->bcn_probe_rsp_len,
2548 synch_frame_event->reassoc_req_len,
2549 synch_frame_event->reassoc_rsp_len,
2550 synch_frame_event->more_frag);
2551
2552 if (synch_frame_event->bcn_probe_rsp_len) {
2553 iface->roam_synch_frame_ind.bcn_probe_rsp_len =
2554 synch_frame_event->bcn_probe_rsp_len;
2555 iface->roam_synch_frame_ind.is_beacon =
2556 synch_frame_event->is_beacon;
2557
Pragaspathi Thilagarajea97fe92018-07-23 15:01:54 +05302558 if (iface->roam_synch_frame_ind.bcn_probe_rsp)
2559 qdf_mem_free(iface->roam_synch_frame_ind.
2560 bcn_probe_rsp);
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302561 iface->roam_synch_frame_ind.bcn_probe_rsp =
2562 qdf_mem_malloc(iface->roam_synch_frame_ind.
2563 bcn_probe_rsp_len);
2564 if (!iface->roam_synch_frame_ind.bcn_probe_rsp) {
2565 WMA_LOGE("failed to allocate memory for bcn_probe_rsp");
2566 QDF_ASSERT(iface->roam_synch_frame_ind.
2567 bcn_probe_rsp != NULL);
2568 status = -ENOMEM;
Pragaspathi Thilagarajea97fe92018-07-23 15:01:54 +05302569 wma_free_roam_synch_frame_ind(iface);
2570 return status;
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302571 }
2572 qdf_mem_copy(iface->roam_synch_frame_ind.
2573 bcn_probe_rsp,
2574 param_buf->bcn_probe_rsp_frame,
2575 iface->roam_synch_frame_ind.bcn_probe_rsp_len);
2576 }
2577
2578 if (synch_frame_event->reassoc_req_len) {
2579 iface->roam_synch_frame_ind.reassoc_req_len =
2580 synch_frame_event->reassoc_req_len;
2581
Pragaspathi Thilagarajea97fe92018-07-23 15:01:54 +05302582 if (iface->roam_synch_frame_ind.reassoc_req)
2583 qdf_mem_free(iface->roam_synch_frame_ind.reassoc_req);
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302584 iface->roam_synch_frame_ind.reassoc_req =
2585 qdf_mem_malloc(iface->roam_synch_frame_ind.
2586 reassoc_req_len);
2587 if (!iface->roam_synch_frame_ind.reassoc_req) {
2588 WMA_LOGE("failed to allocate memory for reassoc_req");
2589 QDF_ASSERT(iface->roam_synch_frame_ind.
2590 reassoc_req != NULL);
2591 status = -ENOMEM;
Pragaspathi Thilagarajea97fe92018-07-23 15:01:54 +05302592 wma_free_roam_synch_frame_ind(iface);
2593 return status;
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302594 }
2595 qdf_mem_copy(iface->roam_synch_frame_ind.reassoc_req,
2596 param_buf->reassoc_req_frame,
2597 iface->roam_synch_frame_ind.reassoc_req_len);
2598 }
2599
2600 if (synch_frame_event->reassoc_rsp_len) {
Pragaspathi Thilagarajea97fe92018-07-23 15:01:54 +05302601 if (!iface->roam_synch_frame_ind.bcn_probe_rsp ||
2602 !iface->roam_synch_frame_ind.reassoc_req) {
2603 WMA_LOGE("failed: No probe or reassoc rsp");
2604 wma_free_roam_synch_frame_ind(iface);
2605 return status;
2606 }
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302607 iface->roam_synch_frame_ind.reassoc_rsp_len =
2608 synch_frame_event->reassoc_rsp_len;
2609
Pragaspathi Thilagarajea97fe92018-07-23 15:01:54 +05302610 if (iface->roam_synch_frame_ind.reassoc_rsp)
2611 qdf_mem_free(iface->roam_synch_frame_ind.reassoc_rsp);
2612
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302613 iface->roam_synch_frame_ind.reassoc_rsp =
2614 qdf_mem_malloc(iface->roam_synch_frame_ind.
2615 reassoc_rsp_len);
2616 if (!iface->roam_synch_frame_ind.reassoc_rsp) {
2617 WMA_LOGE("failed to allocate memory for reassoc_req");
2618 QDF_ASSERT(iface->roam_synch_frame_ind.
2619 reassoc_rsp != NULL);
2620 status = -ENOMEM;
Pragaspathi Thilagarajea97fe92018-07-23 15:01:54 +05302621 wma_free_roam_synch_frame_ind(iface);
2622 return status;
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302623 }
2624 qdf_mem_copy(iface->roam_synch_frame_ind.reassoc_rsp,
2625 param_buf->reassoc_rsp_frame,
2626 iface->roam_synch_frame_ind.reassoc_rsp_len);
2627 }
2628 return 0;
Padma, Santhosh Kumaraa2433e2017-10-06 14:34:46 +05302629}
2630
gaurank kathpaliac63859d2018-05-03 18:48:41 +05302631#define RSN_CAPS_SHIFT 16
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002632/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002633 * wma_roam_scan_fill_self_caps() - fill capabilities
2634 * @wma_handle: wma handle
2635 * @roam_offload_params: offload parameters
2636 * @roam_req: roam request
2637 *
2638 * This function fills roam self capablities.
2639 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05302640 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002641 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302642QDF_STATUS wma_roam_scan_fill_self_caps(tp_wma_handle wma_handle,
Himanshu Agarwalb56ad2e2016-07-19 15:43:09 +05302643 roam_offload_param *
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002644 roam_offload_params,
2645 tSirRoamOffloadScanReq *roam_req)
2646{
2647 struct sAniSirGlobal *pMac = NULL;
2648 tSirMacCapabilityInfo selfCaps;
2649 uint32_t val = 0;
2650 uint32_t nCfgValue;
2651 uint16_t *pCfgValue16;
2652 uint8_t nCfgValue8, *pCfgValue8;
2653 tSirMacQosInfoStation macQosInfoSta;
2654 union {
2655 uint16_t nCfgValue16;
2656 tSirMacHTCapabilityInfo htCapInfo;
2657 tSirMacExtendedHTCapabilityInfo extHtCapInfo;
2658 } uHTCapabilityInfo;
2659
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302660 qdf_mem_set(&macQosInfoSta, sizeof(tSirMacQosInfoStation), 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002661 /* Roaming is done only for INFRA STA type.
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07002662 * So, ess will be one and ibss will be Zero
2663 */
Anurag Chouhan6d760662016-02-20 16:05:43 +05302664 pMac = cds_get_context(QDF_MODULE_ID_PE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002665 if (!pMac) {
2666 WMA_LOGE("%s:NULL pMac ptr. Exiting", __func__);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302667 QDF_ASSERT(0);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302668 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002669 }
2670
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07002671 if (wlan_cfg_get_int(pMac, WNI_CFG_PRIVACY_ENABLED, &val) !=
Jeff Johnsone88dd752018-06-07 22:57:54 -07002672 QDF_STATUS_SUCCESS) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302673 QDF_TRACE(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002674 "Failed to get WNI_CFG_PRIVACY_ENABLED");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302675 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002676 }
2677 selfCaps.ess = 1;
2678 selfCaps.ibss = 0;
2679 if (val)
2680 selfCaps.privacy = 1;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07002681 if (wlan_cfg_get_int(pMac, WNI_CFG_SHORT_PREAMBLE, &val) !=
Jeff Johnsone88dd752018-06-07 22:57:54 -07002682 QDF_STATUS_SUCCESS) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302683 QDF_TRACE(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002684 "Failed to get WNI_CFG_SHORT_PREAMBLE");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302685 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002686 }
2687 if (val)
2688 selfCaps.shortPreamble = 1;
2689
2690 selfCaps.pbcc = 0;
2691 selfCaps.channelAgility = 0;
2692 if (wlan_cfg_get_int(pMac, WNI_CFG_11G_SHORT_SLOT_TIME_ENABLED,
Jeff Johnsone88dd752018-06-07 22:57:54 -07002693 &val) != QDF_STATUS_SUCCESS) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302694 QDF_TRACE(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002695 "Failed to get WNI_CFG_11G_SHORT_SLOT_TIME_ENABLED");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302696 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002697 }
2698 if (val)
2699 selfCaps.shortSlotTime = 1;
Jeff Johnsone88dd752018-06-07 22:57:54 -07002700 if (wlan_cfg_get_int(pMac, WNI_CFG_11H_ENABLED, &val) !=
2701 QDF_STATUS_SUCCESS) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302702 QDF_TRACE(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002703 "Failed to get WNI_CFG_11H_ENABLED");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302704 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002705 }
2706 if (val)
2707 selfCaps.spectrumMgt = 1;
Jeff Johnsone88dd752018-06-07 22:57:54 -07002708 if (wlan_cfg_get_int(pMac, WNI_CFG_QOS_ENABLED, &val) !=
2709 QDF_STATUS_SUCCESS) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302710 QDF_TRACE(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002711 "Failed to get WNI_CFG_QOS_ENABLED");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302712 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002713 }
2714 if (val)
2715 selfCaps.qos = 1;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07002716 if (wlan_cfg_get_int(pMac, WNI_CFG_APSD_ENABLED, &val) !=
Jeff Johnsone88dd752018-06-07 22:57:54 -07002717 QDF_STATUS_SUCCESS) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302718 QDF_TRACE(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002719 "Failed to get WNI_CFG_APSD_ENABLED");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302720 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002721 }
2722 if (val)
2723 selfCaps.apsd = 1;
Krishna Kumaar Natarajan4340c682015-11-03 12:09:00 -08002724
2725 selfCaps.rrm = pMac->rrm.rrmSmeContext.rrmConfig.rrm_enabled;
2726
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002727 if (wlan_cfg_get_int(pMac, WNI_CFG_BLOCK_ACK_ENABLED, &val) !=
Jeff Johnsone88dd752018-06-07 22:57:54 -07002728 QDF_STATUS_SUCCESS) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302729 QDF_TRACE(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002730 "Failed to get WNI_CFG_BLOCK_ACK_ENABLED");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302731 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002732 }
2733 selfCaps.delayedBA =
2734 (uint16_t) ((val >> WNI_CFG_BLOCK_ACK_ENABLED_DELAYED) & 1);
2735 selfCaps.immediateBA =
2736 (uint16_t) ((val >> WNI_CFG_BLOCK_ACK_ENABLED_IMMEDIATE) & 1);
2737 pCfgValue16 = (uint16_t *) &selfCaps;
gaurank kathpaliac63859d2018-05-03 18:48:41 +05302738
2739 /*
2740 * RSN caps arent been sent to firmware, so in case of PMF required,
2741 * the firmware connects to a non PMF AP advertising PMF not required
2742 * in the re-assoc request which violates protocol.
2743 * So send this to firmware in the roam SCAN offload command to
2744 * let it configure the params in the re-assoc request too.
2745 * Instead of making another infra, send the RSN-CAPS in MSB of
2746 * beacon Caps.
2747 */
2748 roam_offload_params->capability = *((uint32_t *)(&roam_req->rsn_caps));
2749 roam_offload_params->capability <<= RSN_CAPS_SHIFT;
2750 roam_offload_params->capability |= ((*pCfgValue16) & 0xFFFF);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002751
2752 if (wlan_cfg_get_int(pMac, WNI_CFG_HT_CAP_INFO, &nCfgValue) !=
Jeff Johnsone88dd752018-06-07 22:57:54 -07002753 QDF_STATUS_SUCCESS) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302754 QDF_TRACE(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002755 "Failed to get WNI_CFG_HT_CAP_INFO");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302756 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002757 }
2758 uHTCapabilityInfo.nCfgValue16 = nCfgValue & 0xFFFF;
2759 roam_offload_params->ht_caps_info =
2760 uHTCapabilityInfo.nCfgValue16 & 0xFFFF;
2761 if (wlan_cfg_get_int(pMac, WNI_CFG_HT_AMPDU_PARAMS, &nCfgValue) !=
Jeff Johnsone88dd752018-06-07 22:57:54 -07002762 QDF_STATUS_SUCCESS) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302763 QDF_TRACE(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002764 "Failed to get WNI_CFG_HT_AMPDU_PARAMS");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302765 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002766 }
2767 /* tSirMacHTParametersInfo */
2768 nCfgValue8 = (uint8_t) nCfgValue;
2769 roam_offload_params->ampdu_param = (nCfgValue8) & 0xFF;
2770
2771 val = ROAM_OFFLOAD_NUM_MCS_SET;
2772 if (wlan_cfg_get_str(pMac, WNI_CFG_SUPPORTED_MCS_SET,
2773 (uint8_t *) roam_offload_params->mcsset,
Jeff Johnsone88dd752018-06-07 22:57:54 -07002774 &val) != QDF_STATUS_SUCCESS) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302775 QDF_TRACE(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002776 "Failed to get WNI_CFG_SUPPORTED_MCS_SET");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302777 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002778 }
2779 if (wlan_cfg_get_int(pMac, WNI_CFG_EXT_HT_CAP_INFO, &nCfgValue) !=
Jeff Johnsone88dd752018-06-07 22:57:54 -07002780 QDF_STATUS_SUCCESS) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302781 QDF_TRACE(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002782 "Failed to get WNI_CFG_EXT_HT_CAP_INFO");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302783 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002784 }
2785 /* uHTCapabilityInfo.extHtCapInfo */
2786 uHTCapabilityInfo.nCfgValue16 = nCfgValue & 0xFFFF;
2787 roam_offload_params->ht_ext_cap =
2788 uHTCapabilityInfo.nCfgValue16 & 0xFFFF;
2789
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07002790 if (wlan_cfg_get_int(pMac, WNI_CFG_TX_BF_CAP, &nCfgValue) !=
Jeff Johnsone88dd752018-06-07 22:57:54 -07002791 QDF_STATUS_SUCCESS) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302792 QDF_TRACE(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002793 "Failed to get WNI_CFG_TX_BF_CAP");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302794 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002795 }
2796 /* tSirMacTxBFCapabilityInfo */
2797 nCfgValue8 = (uint8_t) nCfgValue;
2798 roam_offload_params->ht_txbf = nCfgValue8 & 0xFF;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07002799 if (wlan_cfg_get_int(pMac, WNI_CFG_AS_CAP, &nCfgValue) !=
Jeff Johnsone88dd752018-06-07 22:57:54 -07002800 QDF_STATUS_SUCCESS) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302801 QDF_TRACE(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002802 "Failed to get WNI_CFG_AS_CAP");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302803 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002804 }
2805 /* tSirMacASCapabilityInfo */
2806 nCfgValue8 = (uint8_t) nCfgValue;
2807 roam_offload_params->asel_cap = nCfgValue8 & 0xFF;
2808
2809 /* QOS Info */
2810 if (wlan_cfg_get_int(pMac, WNI_CFG_MAX_SP_LENGTH, &nCfgValue) !=
Jeff Johnsone88dd752018-06-07 22:57:54 -07002811 QDF_STATUS_SUCCESS) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302812 QDF_TRACE(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002813 "Failed to get WNI_CFG_MAX_SP_LENGTH");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302814 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002815 }
2816 nCfgValue8 = (uint8_t) nCfgValue;
2817 macQosInfoSta.maxSpLen = nCfgValue8;
2818 macQosInfoSta.moreDataAck = 0;
2819 macQosInfoSta.qack = 0;
2820 macQosInfoSta.acbe_uapsd = roam_req->AcUapsd.acbe_uapsd;
2821 macQosInfoSta.acbk_uapsd = roam_req->AcUapsd.acbk_uapsd;
2822 macQosInfoSta.acvi_uapsd = roam_req->AcUapsd.acvi_uapsd;
2823 macQosInfoSta.acvo_uapsd = roam_req->AcUapsd.acvo_uapsd;
2824 pCfgValue8 = (uint8_t *) &macQosInfoSta;
2825 /* macQosInfoSta Only queue_request is set.Refer to
2826 * populate_dot11f_wmm_caps for more details
2827 */
2828 roam_offload_params->qos_caps = (*pCfgValue8) & 0xFF;
Naveen Rawat08340742016-11-17 14:54:39 -08002829 if (roam_offload_params->qos_caps)
2830 roam_offload_params->qos_enabled = true;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002831 roam_offload_params->wmm_caps = 0x4 & 0xFF;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302832 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002833}
2834
2835/**
2836 * wma_set_ric_req() - set ric request element
2837 * @wma: wma handle
2838 * @msg: message
2839 * @is_add_ts: is addts required
2840 *
2841 * This function sets ric request element for 11r roaming.
2842 *
2843 * Return: none
2844 */
2845void wma_set_ric_req(tp_wma_handle wma, void *msg, uint8_t is_add_ts)
2846{
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05302847 if (!wma) {
2848 WMA_LOGE("%s: wma handle is NULL", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002849 return;
2850 }
2851
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05302852 wmi_unified_set_ric_req_cmd(wma->wmi_handle, msg, is_add_ts);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002853}
2854#endif /* WLAN_FEATURE_ROAM_OFFLOAD */
2855
Qiwei Caie689a262018-07-26 15:50:22 +08002856#ifdef FEATURE_RSSI_MONITOR
2857/**
2858 * wma_set_rssi_monitoring() - set rssi monitoring
2859 * @handle: WMA handle
2860 * @req: rssi monitoring request structure
2861 *
2862 * This function reads the incoming @req and fill in the destination
2863 * WMI structure and send down the rssi monitoring configs down to the firmware
2864 *
2865 * Return: 0 on success; error number otherwise
2866 */
2867QDF_STATUS wma_set_rssi_monitoring(tp_wma_handle wma,
2868 struct rssi_monitor_req *req)
2869{
2870 struct rssi_monitor_param params = {0};
2871
2872 if (!wma) {
2873 WMA_LOGE("%s: wma handle is NULL", __func__);
2874 return QDF_STATUS_E_INVAL;
2875 }
2876
2877 params.request_id = req->request_id;
2878 params.session_id = req->session_id;
2879 params.min_rssi = req->min_rssi;
2880 params.max_rssi = req->max_rssi;
2881 params.control = req->control;
2882
2883 return wmi_unified_set_rssi_monitoring_cmd(wma->wmi_handle,
2884 &params);
2885}
2886
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002887/**
Varun Reddy Yeturubbbbe232016-02-29 14:01:57 -08002888 * wma_rssi_breached_event_handler() - rssi breached event handler
2889 * @handle: wma handle
2890 * @cmd_param_info: event handler data
2891 * @len: length of @cmd_param_info
2892 *
2893 * Return: 0 on success; error number otherwise
2894 */
2895int wma_rssi_breached_event_handler(void *handle,
2896 u_int8_t *cmd_param_info, u_int32_t len)
2897{
2898 WMI_RSSI_BREACH_EVENTID_param_tlvs *param_buf;
2899 wmi_rssi_breach_event_fixed_param *event;
2900 struct rssi_breach_event rssi;
2901 tpAniSirGlobal mac = cds_get_context(QDF_MODULE_ID_PE);
2902
2903 if (!mac) {
2904 WMA_LOGE("%s: Invalid mac context", __func__);
2905 return -EINVAL;
2906 }
2907 if (!mac->sme.rssi_threshold_breached_cb) {
2908 WMA_LOGE("%s: Callback not registered", __func__);
2909 return -EINVAL;
2910 }
2911 param_buf = (WMI_RSSI_BREACH_EVENTID_param_tlvs *)cmd_param_info;
2912 if (!param_buf) {
2913 WMA_LOGE("%s: Invalid rssi breached event", __func__);
2914 return -EINVAL;
2915 }
2916 event = param_buf->fixed_param;
2917
2918 rssi.request_id = event->request_id;
2919 rssi.session_id = event->vdev_id;
2920 rssi.curr_rssi = event->rssi + WMA_TGT_NOISE_FLOOR_DBM;
2921 WMI_MAC_ADDR_TO_CHAR_ARRAY(&event->bssid, rssi.curr_bssid.bytes);
2922
2923 WMA_LOGD("%s: req_id: %u vdev_id: %d curr_rssi: %d", __func__,
Qiwei Caie689a262018-07-26 15:50:22 +08002924 rssi.request_id, rssi.session_id, rssi.curr_rssi);
Varun Reddy Yeturubbbbe232016-02-29 14:01:57 -08002925 WMA_LOGI("%s: curr_bssid: %pM", __func__, rssi.curr_bssid.bytes);
2926
Jeff Johnson6aaaa992018-06-30 10:43:04 -07002927 mac->sme.rssi_threshold_breached_cb(mac->hdd_handle, &rssi);
Varun Reddy Yeturubbbbe232016-02-29 14:01:57 -08002928 WMA_LOGD("%s: Invoke HDD rssi breached callback", __func__);
2929 return 0;
2930}
Qiwei Caie689a262018-07-26 15:50:22 +08002931#endif /* FEATURE_RSSI_MONITOR */
Varun Reddy Yeturubbbbe232016-02-29 14:01:57 -08002932
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002933#ifdef WLAN_FEATURE_ROAM_OFFLOAD
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002934/**
2935 * wma_roam_ho_fail_handler() - LFR3.0 roam hand off failed handler
2936 * @wma: wma handle
2937 * @vdev_id: vdev id
2938 *
2939 * Return: none
2940 */
2941static void wma_roam_ho_fail_handler(tp_wma_handle wma, uint32_t vdev_id)
2942{
2943 tSirSmeHOFailureInd *ho_failure_ind;
Rajeev Kumarb60abe42017-01-21 15:39:31 -08002944 struct scheduler_msg sme_msg = { 0 };
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302945 QDF_STATUS qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002946
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302947 ho_failure_ind = qdf_mem_malloc(sizeof(tSirSmeHOFailureInd));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002948
2949 if (NULL == ho_failure_ind) {
2950 WMA_LOGE("%s: Memory allocation failure", __func__);
2951 return;
2952 }
2953 ho_failure_ind->sessionId = vdev_id;
2954 sme_msg.type = eWNI_SME_HO_FAIL_IND;
2955 sme_msg.bodyptr = ho_failure_ind;
2956 sme_msg.bodyval = 0;
2957
Rajeev Kumarb60abe42017-01-21 15:39:31 -08002958 qdf_status = scheduler_post_msg(QDF_MODULE_ID_SME, &sme_msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302959 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002960 WMA_LOGE("Fail to post eWNI_SME_HO_FAIL_IND msg to SME");
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302961 qdf_mem_free(ho_failure_ind);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002962 return;
2963 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002964}
2965
2966/**
2967 * wma_process_roam_synch_complete() - roam synch complete command to fw.
2968 * @handle: wma handle
2969 * @synchcnf: offload synch confirmation params
2970 *
2971 * This function sends roam synch complete event to fw.
2972 *
2973 * Return: none
2974 */
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08002975void wma_process_roam_synch_complete(WMA_HANDLE handle, uint8_t vdev_id)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002976{
2977 tp_wma_handle wma_handle = (tp_wma_handle) handle;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002978
2979 if (!wma_handle || !wma_handle->wmi_handle) {
2980 WMA_LOGE("%s: WMA is closed, can not issue roam synch cnf",
2981 __func__);
2982 return;
2983 }
Govind Singh64b5e112016-03-08 11:53:50 +05302984
2985 if (wmi_unified_roam_synch_complete_cmd(wma_handle->wmi_handle,
2986 vdev_id)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002987 return;
2988 }
Himanshu Agarwal67a863b2016-09-20 15:09:09 +05302989
2990 DPTRACE(qdf_dp_trace_record_event(QDF_DP_TRACE_EVENT_RECORD,
Venkata Sharath Chandra Manchala0b9fc632017-05-15 14:35:15 -07002991 vdev_id, QDF_TRACE_DEFAULT_PDEV_ID,
2992 QDF_PROTO_TYPE_EVENT, QDF_ROAM_COMPLETE));
Himanshu Agarwal67a863b2016-09-20 15:09:09 +05302993
Srinivas Girigowda6598eea2017-07-06 19:26:19 -07002994 WMA_LOGI("LFR3: Posting WMA_ROAM_OFFLOAD_SYNCH_CNF");
Deepak Dhamdheref918d422017-07-06 12:56:29 -07002995 wlan_roam_debug_log(vdev_id, DEBUG_ROAM_SYNCH_CNF,
2996 DEBUG_INVALID_PEER_ID, NULL, NULL, 0, 0);
2997
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002998}
2999#endif /* WLAN_FEATURE_ROAM_OFFLOAD */
3000
3001/**
3002 * wma_set_channel() - set channel
3003 * @wma: wma handle
3004 * @params: switch channel parameters
3005 *
3006 * Return: none
3007 */
3008void wma_set_channel(tp_wma_handle wma, tpSwitchChannelParams params)
3009{
3010 struct wma_vdev_start_req req;
3011 struct wma_target_req *msg;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303012 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003013 uint8_t vdev_id, peer_id;
Leo Chang96464902016-10-28 11:10:54 -07003014 void *peer;
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08003015 struct cdp_pdev *pdev;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003016 struct wma_txrx_node *intr = wma->interfaces;
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07003017 struct policy_mgr_hw_mode_params hw_mode = {0};
Leo Chang96464902016-10-28 11:10:54 -07003018 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
lifeng7c607dd2017-02-21 21:16:49 +08003019 uint16_t beacon_interval_ori;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003020
3021 WMA_LOGD("%s: Enter", __func__);
3022 if (!wma_find_vdev_by_addr(wma, params->selfStaMacAddr, &vdev_id)) {
3023 WMA_LOGP("%s: Failed to find vdev id for %pM",
3024 __func__, params->selfStaMacAddr);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303025 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003026 goto send_resp;
3027 }
Anurag Chouhan6d760662016-02-20 16:05:43 +05303028 pdev = cds_get_context(QDF_MODULE_ID_TXRX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003029 if (NULL == pdev) {
3030 WMA_LOGE("%s: Failed to get pdev", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303031 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003032 goto send_resp;
3033 }
3034
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08003035 peer = cdp_peer_find_by_addr(soc,
3036 pdev,
3037 intr[vdev_id].bssid, &peer_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003038
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303039 qdf_mem_zero(&req, sizeof(req));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003040 req.vdev_id = vdev_id;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003041 req.chan = params->channelNumber;
3042 req.chan_width = params->ch_width;
Naveen Rawat64e477e2016-05-20 10:34:56 -07003043
3044 if (params->ch_width == CH_WIDTH_10MHZ)
3045 req.is_half_rate = 1;
3046 else if (params->ch_width == CH_WIDTH_5MHZ)
3047 req.is_quarter_rate = 1;
3048
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003049 req.vht_capable = params->vhtCapable;
3050 req.ch_center_freq_seg0 = params->ch_center_freq_seg0;
3051 req.ch_center_freq_seg1 = params->ch_center_freq_seg1;
3052 req.dot11_mode = params->dot11_mode;
Krishna Kumaar Natarajan0103ef82017-02-17 18:15:56 -08003053 wma_update_vdev_he_capable(&req, params);
Krishna Kumaar Natarajan4f1d7722017-03-03 21:12:51 -08003054
Krishna Kumaar Natarajan0103ef82017-02-17 18:15:56 -08003055 WMA_LOGI(FL("vht_capable: %d, dot11_mode: %d"),
3056 req.vht_capable, req.dot11_mode);
Krishna Kumaar Natarajan4f1d7722017-03-03 21:12:51 -08003057
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07003058 status = policy_mgr_get_current_hw_mode(wma->psoc, &hw_mode);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303059 if (!QDF_IS_STATUS_SUCCESS(status))
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07003060 WMA_LOGE("policy_mgr_get_current_hw_mode failed");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003061
Tushnim Bhattacharyya825b0f72017-07-14 15:21:04 -07003062 if (params->nss == 2) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003063 req.preferred_rx_streams = 2;
3064 req.preferred_tx_streams = 2;
3065 } else {
3066 req.preferred_rx_streams = 1;
3067 req.preferred_tx_streams = 1;
3068 }
3069
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003070 req.max_txpow = params->maxTxPower;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003071 req.beacon_intval = 100;
3072 req.dtim_period = 1;
3073 req.is_dfs = params->isDfsChannel;
Arif Hussain671a1902017-03-17 09:08:32 -07003074 req.cac_duration_ms = params->cac_duration_ms;
3075 req.dfs_regdomain = params->dfs_regdomain;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003076
3077 /* In case of AP mode, once radar is detected, we need to
3078 * issuse VDEV RESTART, so we making is_channel_switch as
3079 * true
3080 */
3081 if ((wma_is_vdev_in_ap_mode(wma, req.vdev_id) == true) ||
gaurank kathpalia1b42e8d2017-12-15 15:44:06 +05303082 (params->restart_on_chan_switch == true)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003083 wma->interfaces[req.vdev_id].is_channel_switch = true;
gaurank kathpalia1b42e8d2017-12-15 15:44:06 +05303084 req.hidden_ssid = intr[vdev_id].vdev_restart_params.ssidHidden;
3085 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003086
Kiran Kumar Lokeref9dc7912017-06-28 18:10:58 -07003087 if (params->restart_on_chan_switch == true &&
3088 wma->interfaces[req.vdev_id].beacon_filter_enabled)
3089 wma_remove_beacon_filter(wma,
3090 &wma->interfaces[req.vdev_id].beacon_filter);
3091
lifeng7c607dd2017-02-21 21:16:49 +08003092 if ((wma_is_vdev_in_ap_mode(wma, req.vdev_id) == true) &&
3093 (params->reduced_beacon_interval)) {
3094 /* Reduce the beacon interval just before the channel switch.
3095 * This would help in reducing the downtime on the STA side
3096 * (which is waiting for beacons from the AP to resume back
3097 * transmission). Switch back the beacon_interval to its
3098 * original value after the channel switch based on the
3099 * timeout. This would ensure there are atleast some beacons
3100 * sent with increased frequency.
3101 */
3102
3103 WMA_LOGD("%s: Changing beacon interval to %d",
3104 __func__, params->reduced_beacon_interval);
3105
3106 /* Add a timer to reset the beacon interval back*/
3107 beacon_interval_ori = req.beacon_intval;
3108 req.beacon_intval = params->reduced_beacon_interval;
3109 if (wma_fill_beacon_interval_reset_req(wma,
3110 req.vdev_id,
3111 beacon_interval_ori,
3112 RESET_BEACON_INTERVAL_TIMEOUT)) {
3113
3114 WMA_LOGD("%s: Failed to fill beacon interval reset req",
3115 __func__);
3116 }
3117 }
3118
Manjunathappa Prakash0e6e6b52016-04-21 11:48:48 -07003119 if (QDF_GLOBAL_MONITOR_MODE == cds_get_conparam() &&
3120 wma_is_vdev_up(vdev_id)) {
Krunal Sonia5388a22018-02-12 19:47:44 -08003121 WMA_LOGD("%s: setting channel switch to true for vdev_id:%d",
3122 __func__, req.vdev_id);
3123 wma->interfaces[req.vdev_id].is_channel_switch = true;
Manjunathappa Prakash0e6e6b52016-04-21 11:48:48 -07003124 }
Krunal Sonia5388a22018-02-12 19:47:44 -08003125
3126 msg = wma_fill_vdev_req(wma, req.vdev_id, WMA_CHNL_SWITCH_REQ,
3127 WMA_TARGET_REQ_TYPE_VDEV_START, params,
3128 WMA_VDEV_START_REQUEST_TIMEOUT);
3129 if (!msg) {
3130 WMA_LOGP("%s: Failed to fill channel switch request for vdev %d",
3131 __func__, req.vdev_id);
3132 status = QDF_STATUS_E_NOMEM;
3133 goto send_resp;
3134 }
3135 status = wma_vdev_start(wma, &req,
3136 wma->interfaces[req.vdev_id].is_channel_switch);
3137 if (status != QDF_STATUS_SUCCESS) {
3138 wma_remove_vdev_req(wma, req.vdev_id,
3139 WMA_TARGET_REQ_TYPE_VDEV_START);
3140 WMA_LOGP("%s: vdev start failed status = %d", __func__,
3141 status);
3142 goto send_resp;
3143 }
3144
3145 /* This is temporary, should be removed */
3146 if (QDF_GLOBAL_MONITOR_MODE == cds_get_conparam())
3147 ol_htt_mon_note_chan(pdev, req.chan);
3148
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003149 return;
3150send_resp:
3151 WMA_LOGD("%s: channel %d ch_width %d txpower %d status %d", __func__,
3152 params->channelNumber, params->ch_width,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003153 params->maxTxPower,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003154 status);
3155 params->status = status;
3156 WMA_LOGI("%s: sending WMA_SWITCH_CHANNEL_RSP, status = 0x%x",
3157 __func__, status);
Abhishek Singh2d775fd2017-08-18 10:51:33 +05303158 wma_send_msg_high_priority(wma, WMA_SWITCH_CHANNEL_RSP,
3159 (void *)params, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003160}
3161
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08003162#ifdef FEATURE_WLAN_ESE
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003163/**
3164 * wma_plm_start() - plm start request
3165 * @wma: wma handle
3166 * @plm: plm request parameters
3167 *
3168 * This function request FW to start PLM.
3169 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05303170 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003171 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303172QDF_STATUS wma_plm_start(tp_wma_handle wma, const tpSirPlmReq plm)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003173{
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05303174 struct plm_req_params params = {0};
3175 uint32_t num_channels;
3176 uint32_t *channel_list = NULL;
3177 uint32_t i;
3178 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003179
3180 if (NULL == plm || NULL == wma) {
3181 WMA_LOGE("%s: input pointer is NULL ", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303182 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003183 }
3184 WMA_LOGD("PLM Start");
3185
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05303186 num_channels = plm->plmNumCh;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003187
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05303188 if (num_channels) {
3189 channel_list = qdf_mem_malloc(sizeof(uint32_t) * num_channels);
3190 if (!channel_list)
3191 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003192
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05303193 for (i = 0; i < num_channels; i++) {
3194 channel_list[i] = plm->plmChList[i];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003195
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05303196 if (channel_list[i] < WMA_NLO_FREQ_THRESH)
3197 channel_list[i] =
3198 cds_chan_to_freq(channel_list[i]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003199 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003200 }
3201
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05303202 params.diag_token = plm->diag_token;
3203 params.meas_token = plm->meas_token;
3204 params.num_bursts = plm->numBursts;
3205 params.burst_int = plm->burstInt;
3206 params.meas_duration = plm->measDuration;
3207 params.burst_len = plm->burstLen;
3208 params.desired_tx_pwr = plm->desiredTxPwr;
3209 params.plm_num_ch = plm->plmNumCh;
3210 params.session_id = plm->sessionId;
3211 params.enable = plm->enable;
3212 qdf_mem_copy(&params.mac_addr, &plm->mac_addr,
3213 sizeof(struct qdf_mac_addr));
3214 qdf_mem_copy(params.plm_ch_list, plm->plmChList,
3215 WMI_CFG_VALID_CHANNEL_LIST_LEN);
3216
3217 status = wmi_unified_plm_start_cmd(wma->wmi_handle,
3218 &params, channel_list);
3219 if (QDF_IS_STATUS_ERROR(status)) {
3220 qdf_mem_free(channel_list);
3221 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003222 }
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05303223
3224 qdf_mem_free(channel_list);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003225 wma->interfaces[plm->sessionId].plm_in_progress = true;
3226
3227 WMA_LOGD("Plm start request sent successfully for vdev %d",
3228 plm->sessionId);
3229
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05303230 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003231}
3232
3233/**
3234 * wma_plm_stop() - plm stop request
3235 * @wma: wma handle
3236 * @plm: plm request parameters
3237 *
3238 * This function request FW to stop PLM.
3239 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05303240 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003241 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303242QDF_STATUS wma_plm_stop(tp_wma_handle wma, const tpSirPlmReq plm)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003243{
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05303244 struct plm_req_params params = {0};
3245 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003246
3247 if (NULL == plm || NULL == wma) {
3248 WMA_LOGE("%s: input pointer is NULL ", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303249 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003250 }
3251
3252 if (false == wma->interfaces[plm->sessionId].plm_in_progress) {
3253 WMA_LOGE("No active plm req found, skip plm stop req");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303254 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003255 }
3256
3257 WMA_LOGD("PLM Stop");
3258
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05303259 params.diag_token = plm->diag_token;
3260 params.meas_token = plm->meas_token;
3261 params.num_bursts = plm->numBursts;
3262 params.burst_int = plm->burstInt;
3263 params.meas_duration = plm->measDuration;
3264 params.burst_len = plm->burstLen;
3265 params.desired_tx_pwr = plm->desiredTxPwr;
3266 params.plm_num_ch = plm->plmNumCh;
3267 params.session_id = plm->sessionId;
3268 params.enable = plm->enable;
3269 qdf_mem_copy(&params.mac_addr, &plm->mac_addr,
3270 sizeof(struct qdf_mac_addr));
3271 qdf_mem_copy(params.plm_ch_list, plm->plmChList,
3272 WMI_CFG_VALID_CHANNEL_LIST_LEN);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003273
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05303274 status = wmi_unified_plm_stop_cmd(wma->wmi_handle,
3275 &params);
3276 if (QDF_IS_STATUS_ERROR(status))
3277 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003278
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003279 wma->interfaces[plm->sessionId].plm_in_progress = false;
3280
3281 WMA_LOGD("Plm stop request sent successfully for vdev %d",
3282 plm->sessionId);
3283
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05303284 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003285}
3286
3287/**
3288 * wma_config_plm()- config PLM
3289 * @wma: wma handle
3290 * @plm: plm request parameters
3291 *
3292 * Return: none
3293 */
3294void wma_config_plm(tp_wma_handle wma, tpSirPlmReq plm)
3295{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303296 QDF_STATUS ret = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003297
3298 if (NULL == plm || NULL == wma)
3299 return;
3300
3301 if (plm->enable)
3302 ret = wma_plm_start(wma, plm);
3303 else
3304 ret = wma_plm_stop(wma, plm);
3305
3306 if (ret)
3307 WMA_LOGE("%s: PLM %s failed %d", __func__,
3308 plm->enable ? "start" : "stop", ret);
3309
3310 /* SME expects WMA to free tpSirPlmReq memory after
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003311 * processing PLM request.
3312 */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303313 qdf_mem_free(plm);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003314 plm = NULL;
3315}
3316#endif
3317
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003318#ifdef FEATURE_WLAN_EXTSCAN
3319/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003320 * wma_extscan_wow_event_callback() - extscan wow event callback
3321 * @handle: WMA handle
3322 * @event: event buffer
3323 * @len: length of @event buffer
3324 *
3325 * In wow case, the wow event is followed by the payload of the event
3326 * which generated the wow event.
3327 * payload is 4 bytes of length followed by event buffer. the first 4 bytes
3328 * of event buffer is common tlv header, which is a combination
3329 * of tag (higher 2 bytes) and length (lower 2 bytes). The tag is used to
3330 * identify the event which triggered wow event.
Krishna Kumaar Natarajan36e5aa02016-07-02 17:44:25 -07003331 * Payload is extracted and converted into generic tlv structure before
3332 * being passed to this function.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003333 *
Dustin Browne2206fb2017-04-20 13:39:25 -07003334 * @Return: Errno
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003335 */
Dustin Browne2206fb2017-04-20 13:39:25 -07003336int wma_extscan_wow_event_callback(void *handle, void *event, uint32_t len)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003337{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003338 uint32_t tag = WMITLV_GET_TLVTAG(WMITLV_GET_HDR(event));
3339
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003340 switch (tag) {
3341 case WMITLV_TAG_STRUC_wmi_extscan_start_stop_event_fixed_param:
Dustin Browne2206fb2017-04-20 13:39:25 -07003342 return wma_extscan_start_stop_event_handler(handle, event, len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003343
3344 case WMITLV_TAG_STRUC_wmi_extscan_operation_event_fixed_param:
Dustin Browne2206fb2017-04-20 13:39:25 -07003345 return wma_extscan_operations_event_handler(handle, event, len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003346
3347 case WMITLV_TAG_STRUC_wmi_extscan_table_usage_event_fixed_param:
Dustin Browne2206fb2017-04-20 13:39:25 -07003348 return wma_extscan_table_usage_event_handler(handle, event,
3349 len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003350
3351 case WMITLV_TAG_STRUC_wmi_extscan_cached_results_event_fixed_param:
Dustin Browne2206fb2017-04-20 13:39:25 -07003352 return wma_extscan_cached_results_event_handler(handle, event,
3353 len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003354
3355 case WMITLV_TAG_STRUC_wmi_extscan_wlan_change_results_event_fixed_param:
Dustin Browne2206fb2017-04-20 13:39:25 -07003356 return wma_extscan_change_results_event_handler(handle, event,
3357 len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003358
3359 case WMITLV_TAG_STRUC_wmi_extscan_hotlist_match_event_fixed_param:
Dustin Browne2206fb2017-04-20 13:39:25 -07003360 return wma_extscan_hotlist_match_event_handler(handle, event,
3361 len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003362
3363 case WMITLV_TAG_STRUC_wmi_extscan_capabilities_event_fixed_param:
Dustin Browne2206fb2017-04-20 13:39:25 -07003364 return wma_extscan_capabilities_event_handler(handle, event,
3365 len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003366
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003367 default:
Krishna Kumaar Natarajan36e5aa02016-07-02 17:44:25 -07003368 WMA_LOGE(FL("Unknown tag: %d"), tag);
Dustin Browne2206fb2017-04-20 13:39:25 -07003369 return 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003370 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003371}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003372
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003373/**
3374 * wma_register_extscan_event_handler() - register extscan event handler
3375 * @wma_handle: wma handle
3376 *
3377 * This function register extscan related event handlers.
3378 *
3379 * Return: none
3380 */
3381void wma_register_extscan_event_handler(tp_wma_handle wma_handle)
3382{
3383 if (!wma_handle) {
3384 WMA_LOGE("%s: extscan wma_handle is NULL", __func__);
3385 return;
3386 }
3387 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303388 wmi_extscan_start_stop_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05303389 wma_extscan_start_stop_event_handler,
3390 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003391
3392 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303393 wmi_extscan_capabilities_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05303394 wma_extscan_capabilities_event_handler,
3395 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003396
3397 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303398 wmi_extscan_hotlist_match_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05303399 wma_extscan_hotlist_match_event_handler,
3400 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003401
3402 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303403 wmi_extscan_wlan_change_results_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05303404 wma_extscan_change_results_event_handler,
3405 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003406
3407 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303408 wmi_extscan_operation_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05303409 wma_extscan_operations_event_handler,
3410 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003411 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303412 wmi_extscan_table_usage_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05303413 wma_extscan_table_usage_event_handler,
3414 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003415
3416 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303417 wmi_extscan_cached_results_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05303418 wma_extscan_cached_results_event_handler,
3419 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003420
3421 wmi_unified_register_event_handler(wma_handle->wmi_handle,
Mukul Sharma228223a2017-11-03 19:25:39 +05303422 wmi_passpoint_match_event_id,
Govind Singhd76a5b02016-03-08 15:12:14 +05303423 wma_passpoint_match_event_handler,
3424 WMA_RX_SERIALIZER_CTX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003425}
3426
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003427/**
3428 * wma_extscan_start_stop_event_handler() - extscan start/stop event handler
3429 * @handle: wma handle
3430 * @cmd_param_info: event buffer
3431 * @len: data length
3432 *
3433 * This function handles different extscan related commands
3434 * like start/stop/get results etc and indicate to upper layers.
3435 *
3436 * Return: 0 for success or error code.
3437 */
3438int wma_extscan_start_stop_event_handler(void *handle,
3439 uint8_t *cmd_param_info,
3440 uint32_t len)
3441{
3442 WMI_EXTSCAN_START_STOP_EVENTID_param_tlvs *param_buf;
3443 wmi_extscan_start_stop_event_fixed_param *event;
3444 struct sir_extscan_generic_response *extscan_ind;
3445 uint16_t event_type;
Anurag Chouhan6d760662016-02-20 16:05:43 +05303446 tpAniSirGlobal pMac = cds_get_context(QDF_MODULE_ID_PE);
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003447
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003448 if (!pMac) {
3449 WMA_LOGE("%s: Invalid pMac", __func__);
3450 return -EINVAL;
3451 }
Jeff Johnson17b12392018-07-03 22:21:15 -07003452 if (!pMac->sme.ext_scan_ind_cb) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003453 WMA_LOGE("%s: Callback not registered", __func__);
3454 return -EINVAL;
3455 }
3456 param_buf = (WMI_EXTSCAN_START_STOP_EVENTID_param_tlvs *)
3457 cmd_param_info;
3458 if (!param_buf) {
3459 WMA_LOGE("%s: Invalid extscan event", __func__);
3460 return -EINVAL;
3461 }
3462 event = param_buf->fixed_param;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303463 extscan_ind = qdf_mem_malloc(sizeof(*extscan_ind));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003464 if (!extscan_ind) {
3465 WMA_LOGE("%s: extscan memory allocation failed", __func__);
3466 return -ENOMEM;
3467 }
3468 switch (event->command) {
3469 case WMI_EXTSCAN_START_CMDID:
3470 event_type = eSIR_EXTSCAN_START_RSP;
3471 extscan_ind->status = event->status;
3472 extscan_ind->request_id = event->request_id;
3473 break;
3474 case WMI_EXTSCAN_STOP_CMDID:
3475 event_type = eSIR_EXTSCAN_STOP_RSP;
3476 extscan_ind->status = event->status;
3477 extscan_ind->request_id = event->request_id;
3478 break;
3479 case WMI_EXTSCAN_CONFIGURE_WLAN_CHANGE_MONITOR_CMDID:
3480 extscan_ind->status = event->status;
3481 extscan_ind->request_id = event->request_id;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003482 if (event->mode == WMI_EXTSCAN_MODE_STOP)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003483 event_type =
3484 eSIR_EXTSCAN_RESET_SIGNIFICANT_WIFI_CHANGE_RSP;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003485 else
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003486 event_type =
3487 eSIR_EXTSCAN_SET_SIGNIFICANT_WIFI_CHANGE_RSP;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003488 break;
3489 case WMI_EXTSCAN_CONFIGURE_HOTLIST_MONITOR_CMDID:
3490 extscan_ind->status = event->status;
3491 extscan_ind->request_id = event->request_id;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003492 if (event->mode == WMI_EXTSCAN_MODE_STOP)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003493 event_type = eSIR_EXTSCAN_RESET_BSSID_HOTLIST_RSP;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003494 else
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003495 event_type = eSIR_EXTSCAN_SET_BSSID_HOTLIST_RSP;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003496 break;
3497 case WMI_EXTSCAN_GET_CACHED_RESULTS_CMDID:
3498 extscan_ind->status = event->status;
3499 extscan_ind->request_id = event->request_id;
3500 event_type = eSIR_EXTSCAN_CACHED_RESULTS_RSP;
3501 break;
3502 case WMI_EXTSCAN_CONFIGURE_HOTLIST_SSID_MONITOR_CMDID:
3503 extscan_ind->status = event->status;
3504 extscan_ind->request_id = event->request_id;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003505 if (event->mode == WMI_EXTSCAN_MODE_STOP)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003506 event_type =
3507 eSIR_EXTSCAN_RESET_SSID_HOTLIST_RSP;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003508 else
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003509 event_type =
3510 eSIR_EXTSCAN_SET_SSID_HOTLIST_RSP;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003511 break;
3512 default:
3513 WMA_LOGE("%s: Unknown event(%d) from target",
3514 __func__, event->status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303515 qdf_mem_free(extscan_ind);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003516 return -EINVAL;
3517 }
Jeff Johnson17b12392018-07-03 22:21:15 -07003518 pMac->sme.ext_scan_ind_cb(pMac->hdd_handle, event_type, extscan_ind);
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003519 WMA_LOGD("%s: sending event to umac for requestid %u with status %d",
3520 __func__, extscan_ind->request_id, extscan_ind->status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303521 qdf_mem_free(extscan_ind);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003522 return 0;
3523}
3524
3525/**
3526 * wma_extscan_operations_event_handler() - extscan operation event handler
3527 * @handle: wma handle
3528 * @cmd_param_info: event buffer
3529 * @len: length
3530 *
3531 * This function handles different operations related event and indicate
3532 * upper layers with appropriate callback.
3533 *
3534 * Return: 0 for success or error code.
3535 */
3536int wma_extscan_operations_event_handler(void *handle,
3537 uint8_t *cmd_param_info,
3538 uint32_t len)
3539{
3540 tp_wma_handle wma = (tp_wma_handle) handle;
3541 WMI_EXTSCAN_OPERATION_EVENTID_param_tlvs *param_buf;
3542 wmi_extscan_operation_event_fixed_param *oprn_event;
3543 tSirExtScanOnScanEventIndParams *oprn_ind;
Mukul Sharmafa937be2016-08-12 18:13:36 +05303544 uint32_t cnt;
Anurag Chouhan6d760662016-02-20 16:05:43 +05303545 tpAniSirGlobal pMac = cds_get_context(QDF_MODULE_ID_PE);
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003546
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003547 if (!pMac) {
3548 WMA_LOGE("%s: Invalid pMac", __func__);
3549 return -EINVAL;
3550 }
Jeff Johnson17b12392018-07-03 22:21:15 -07003551 if (!pMac->sme.ext_scan_ind_cb) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003552 WMA_LOGE("%s: Callback not registered", __func__);
3553 return -EINVAL;
3554 }
3555 param_buf = (WMI_EXTSCAN_OPERATION_EVENTID_param_tlvs *)
3556 cmd_param_info;
3557 if (!param_buf) {
3558 WMA_LOGE("%s: Invalid scan operation event", __func__);
3559 return -EINVAL;
3560 }
3561 oprn_event = param_buf->fixed_param;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303562 oprn_ind = qdf_mem_malloc(sizeof(*oprn_ind));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003563 if (!oprn_ind) {
3564 WMA_LOGE("%s: extscan memory allocation failed", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303565 qdf_mem_free(oprn_ind);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003566 return -ENOMEM;
3567 }
3568
3569 oprn_ind->requestId = oprn_event->request_id;
3570
3571 switch (oprn_event->event) {
3572 case WMI_EXTSCAN_BUCKET_COMPLETED_EVENT:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003573 oprn_ind->status = 0;
Mukul Sharma45114d92016-08-12 19:34:14 +05303574 goto exit_handler;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003575 case WMI_EXTSCAN_CYCLE_STARTED_EVENT:
3576 WMA_LOGD("%s: received WMI_EXTSCAN_CYCLE_STARTED_EVENT",
3577 __func__);
Amar Singhal16c170d2017-10-03 13:32:21 -07003578
3579 if (oprn_event->num_buckets > param_buf->num_bucket_id) {
3580 WMA_LOGE("FW mesg num_buk %d more than TLV hdr %d",
3581 oprn_event->num_buckets,
3582 param_buf->num_bucket_id);
3583 return -EINVAL;
3584 }
3585
Anurag Chouhan01cfa4e2016-09-04 15:10:49 +05303586 cds_host_diag_log_work(&wma->extscan_wake_lock,
3587 WMA_EXTSCAN_CYCLE_WAKE_LOCK_DURATION,
3588 WIFI_POWER_EVENT_WAKELOCK_EXT_SCAN);
Anurag Chouhana37b5b72016-02-21 14:53:42 +05303589 qdf_wake_lock_timeout_acquire(&wma->extscan_wake_lock,
Anurag Chouhan01cfa4e2016-09-04 15:10:49 +05303590 WMA_EXTSCAN_CYCLE_WAKE_LOCK_DURATION);
Mukul Sharmafa937be2016-08-12 18:13:36 +05303591 oprn_ind->scanEventType = WIFI_EXTSCAN_CYCLE_STARTED_EVENT;
3592 oprn_ind->status = 0;
3593 oprn_ind->buckets_scanned = 0;
3594 for (cnt = 0; cnt < oprn_event->num_buckets; cnt++)
3595 oprn_ind->buckets_scanned |=
3596 (1 << param_buf->bucket_id[cnt]);
3597 WMA_LOGD(FL("num_buckets %u request_id %u buckets_scanned %u"),
3598 oprn_event->num_buckets, oprn_ind->requestId,
3599 oprn_ind->buckets_scanned);
3600 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003601 case WMI_EXTSCAN_CYCLE_COMPLETED_EVENT:
3602 WMA_LOGD("%s: received WMI_EXTSCAN_CYCLE_COMPLETED_EVENT",
3603 __func__);
Anurag Chouhana37b5b72016-02-21 14:53:42 +05303604 qdf_wake_lock_release(&wma->extscan_wake_lock,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003605 WIFI_POWER_EVENT_WAKELOCK_EXT_SCAN);
Mukul Sharmafa937be2016-08-12 18:13:36 +05303606 oprn_ind->scanEventType = WIFI_EXTSCAN_CYCLE_COMPLETED_EVENT;
3607 oprn_ind->status = 0;
3608 /* Set bucket scanned mask to zero on cycle complete */
3609 oprn_ind->buckets_scanned = 0;
3610 break;
3611 case WMI_EXTSCAN_BUCKET_STARTED_EVENT:
Mukul Sharma45114d92016-08-12 19:34:14 +05303612 WMA_LOGD("%s: received WMI_EXTSCAN_BUCKET_STARTED_EVENT",
Mukul Sharmafa937be2016-08-12 18:13:36 +05303613 __func__);
3614 oprn_ind->scanEventType = WIFI_EXTSCAN_BUCKET_STARTED_EVENT;
3615 oprn_ind->status = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003616 goto exit_handler;
Mukul Sharmafa937be2016-08-12 18:13:36 +05303617 case WMI_EXTSCAN_THRESHOLD_NUM_SCANS:
Mukul Sharma45114d92016-08-12 19:34:14 +05303618 WMA_LOGD("%s: received WMI_EXTSCAN_THRESHOLD_NUM_SCANS",
Mukul Sharmafa937be2016-08-12 18:13:36 +05303619 __func__);
3620 oprn_ind->scanEventType = WIFI_EXTSCAN_THRESHOLD_NUM_SCANS;
3621 oprn_ind->status = 0;
3622 break;
3623 case WMI_EXTSCAN_THRESHOLD_PERCENT:
Mukul Sharma45114d92016-08-12 19:34:14 +05303624 WMA_LOGD("%s: received WMI_EXTSCAN_THRESHOLD_PERCENT",
Mukul Sharmafa937be2016-08-12 18:13:36 +05303625 __func__);
3626 oprn_ind->scanEventType = WIFI_EXTSCAN_THRESHOLD_PERCENT;
3627 oprn_ind->status = 0;
3628 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003629 default:
3630 WMA_LOGE("%s: Unknown event(%d) from target",
3631 __func__, oprn_event->event);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303632 qdf_mem_free(oprn_ind);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003633 return -EINVAL;
3634 }
Jeff Johnson17b12392018-07-03 22:21:15 -07003635 pMac->sme.ext_scan_ind_cb(pMac->hdd_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003636 eSIR_EXTSCAN_SCAN_PROGRESS_EVENT_IND, oprn_ind);
3637 WMA_LOGI("%s: sending scan progress event to hdd", __func__);
3638exit_handler:
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303639 qdf_mem_free(oprn_ind);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003640 return 0;
3641}
3642
3643/**
3644 * wma_extscan_table_usage_event_handler() - extscan table usage event handler
3645 * @handle: wma handle
3646 * @cmd_param_info: event buffer
3647 * @len: length
3648 *
3649 * This function handles table usage related event and indicate
3650 * upper layers with appropriate callback.
3651 *
3652 * Return: 0 for success or error code.
3653 */
3654int wma_extscan_table_usage_event_handler(void *handle,
3655 uint8_t *cmd_param_info,
3656 uint32_t len)
3657{
3658 WMI_EXTSCAN_TABLE_USAGE_EVENTID_param_tlvs *param_buf;
3659 wmi_extscan_table_usage_event_fixed_param *event;
3660 tSirExtScanResultsAvailableIndParams *tbl_usg_ind;
Anurag Chouhan6d760662016-02-20 16:05:43 +05303661 tpAniSirGlobal pMac = cds_get_context(QDF_MODULE_ID_PE);
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003662
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003663 if (!pMac) {
3664 WMA_LOGE("%s: Invalid pMac", __func__);
3665 return -EINVAL;
3666 }
Jeff Johnson17b12392018-07-03 22:21:15 -07003667 if (!pMac->sme.ext_scan_ind_cb) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003668 WMA_LOGE("%s: Callback not registered", __func__);
3669 return -EINVAL;
3670 }
3671 param_buf = (WMI_EXTSCAN_TABLE_USAGE_EVENTID_param_tlvs *)
3672 cmd_param_info;
3673 if (!param_buf) {
3674 WMA_LOGE("%s: Invalid table usage event", __func__);
3675 return -EINVAL;
3676 }
3677 event = param_buf->fixed_param;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303678 tbl_usg_ind = qdf_mem_malloc(sizeof(*tbl_usg_ind));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003679 if (!tbl_usg_ind) {
3680 WMA_LOGE("%s: table usage allocation failed", __func__);
3681 return -ENOMEM;
3682 }
3683 tbl_usg_ind->requestId = event->request_id;
3684 tbl_usg_ind->numResultsAvailable = event->entries_in_use;
Jeff Johnson17b12392018-07-03 22:21:15 -07003685 pMac->sme.ext_scan_ind_cb(pMac->hdd_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003686 eSIR_EXTSCAN_SCAN_RES_AVAILABLE_IND,
3687 tbl_usg_ind);
3688 WMA_LOGI("%s: sending scan_res available event to hdd", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303689 qdf_mem_free(tbl_usg_ind);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003690 return 0;
3691}
3692
3693/**
3694 * wma_extscan_capabilities_event_handler() - extscan capabilities event handler
3695 * @handle: wma handle
3696 * @cmd_param_info: event buffer
3697 * @len: length
3698 *
3699 * This function handles capabilities event and indicate
3700 * upper layers with registered callback.
3701 *
3702 * Return: 0 for success or error code.
3703 */
3704int wma_extscan_capabilities_event_handler(void *handle,
3705 uint8_t *cmd_param_info,
3706 uint32_t len)
3707{
3708 WMI_EXTSCAN_CAPABILITIES_EVENTID_param_tlvs *param_buf;
3709 wmi_extscan_capabilities_event_fixed_param *event;
3710 wmi_extscan_cache_capabilities *src_cache;
3711 wmi_extscan_hotlist_monitor_capabilities *src_hotlist;
3712 wmi_extscan_wlan_change_monitor_capabilities *src_change;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003713 struct ext_scan_capabilities_response *dest_capab;
Anurag Chouhan6d760662016-02-20 16:05:43 +05303714 tpAniSirGlobal pMac = cds_get_context(QDF_MODULE_ID_PE);
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003715
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003716 if (!pMac) {
3717 WMA_LOGE("%s: Invalid pMac", __func__);
3718 return -EINVAL;
3719 }
Jeff Johnson17b12392018-07-03 22:21:15 -07003720 if (!pMac->sme.ext_scan_ind_cb) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003721 WMA_LOGE("%s: Callback not registered", __func__);
3722 return -EINVAL;
3723 }
3724 param_buf = (WMI_EXTSCAN_CAPABILITIES_EVENTID_param_tlvs *)
3725 cmd_param_info;
3726 if (!param_buf) {
3727 WMA_LOGE("%s: Invalid capabilities event", __func__);
3728 return -EINVAL;
3729 }
3730 event = param_buf->fixed_param;
3731 src_cache = param_buf->extscan_cache_capabilities;
3732 src_hotlist = param_buf->hotlist_capabilities;
3733 src_change = param_buf->wlan_change_capabilities;
3734
3735 if (!src_cache || !src_hotlist || !src_change) {
3736 WMA_LOGE("%s: Invalid capabilities list", __func__);
3737 return -EINVAL;
3738 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303739 dest_capab = qdf_mem_malloc(sizeof(*dest_capab));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003740 if (!dest_capab) {
3741 WMA_LOGE("%s: Allocation failed for capabilities buffer",
3742 __func__);
3743 return -ENOMEM;
3744 }
3745 dest_capab->requestId = event->request_id;
3746 dest_capab->max_scan_buckets = src_cache->max_buckets;
3747 dest_capab->max_scan_cache_size = src_cache->scan_cache_entry_size;
3748 dest_capab->max_ap_cache_per_scan = src_cache->max_bssid_per_scan;
3749 dest_capab->max_scan_reporting_threshold =
3750 src_cache->max_table_usage_threshold;
3751
3752 dest_capab->max_hotlist_bssids = src_hotlist->max_hotlist_entries;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003753 dest_capab->max_rssi_sample_size =
3754 src_change->max_rssi_averaging_samples;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003755 dest_capab->max_bssid_history_entries =
3756 src_change->max_rssi_history_entries;
3757 dest_capab->max_significant_wifi_change_aps =
3758 src_change->max_wlan_change_entries;
3759 dest_capab->max_hotlist_ssids =
3760 event->num_extscan_hotlist_ssid;
3761 dest_capab->max_number_epno_networks =
3762 event->num_epno_networks;
3763 dest_capab->max_number_epno_networks_by_ssid =
3764 event->num_epno_networks;
3765 dest_capab->max_number_of_white_listed_ssid =
3766 event->num_roam_ssid_whitelist;
Padma, Santhosh Kumar1ac02402016-11-02 18:04:14 +05303767 dest_capab->max_number_of_black_listed_bssid =
3768 event->num_roam_bssid_blacklist;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003769 dest_capab->status = 0;
3770
3771 WMA_LOGD("%s: request_id: %u status: %d",
3772 __func__, dest_capab->requestId, dest_capab->status);
3773
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003774 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 -08003775 __func__, dest_capab->max_scan_buckets,
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003776 dest_capab->max_hotlist_bssids, dest_capab->max_scan_cache_size,
3777 dest_capab->max_ap_cache_per_scan);
3778 WMA_LOGD("%s: max_scan_reporting_threshold: %d, max_rssi_sample_size: %d, max_bssid_history_entries: %d, max_significant_wifi_change_aps: %d",
3779 __func__, dest_capab->max_scan_reporting_threshold,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003780 dest_capab->max_rssi_sample_size,
3781 dest_capab->max_bssid_history_entries,
3782 dest_capab->max_significant_wifi_change_aps);
3783
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003784 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 -08003785 __func__, dest_capab->max_hotlist_ssids,
3786 dest_capab->max_number_epno_networks,
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003787 dest_capab->max_number_epno_networks_by_ssid);
3788 WMA_LOGD("%s: max_number_of_white_listed_ssid: %d, max_number_of_black_listed_bssid: %d",
3789 __func__, dest_capab->max_number_of_white_listed_ssid,
Padma, Santhosh Kumar1ac02402016-11-02 18:04:14 +05303790 dest_capab->max_number_of_black_listed_bssid);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003791
Jeff Johnson17b12392018-07-03 22:21:15 -07003792 pMac->sme.ext_scan_ind_cb(pMac->hdd_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003793 eSIR_EXTSCAN_GET_CAPABILITIES_IND, dest_capab);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303794 qdf_mem_free(dest_capab);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003795 return 0;
3796}
3797
3798/**
3799 * wma_extscan_hotlist_match_event_handler() - hotlist match event handler
3800 * @handle: wma handle
3801 * @cmd_param_info: event buffer
3802 * @len: length
3803 *
3804 * This function handles hotlist match event and indicate
3805 * upper layers with registered callback.
3806 *
3807 * Return: 0 for success or error code.
3808 */
3809int wma_extscan_hotlist_match_event_handler(void *handle,
3810 uint8_t *cmd_param_info,
3811 uint32_t len)
3812{
3813 WMI_EXTSCAN_HOTLIST_MATCH_EVENTID_param_tlvs *param_buf;
3814 wmi_extscan_hotlist_match_event_fixed_param *event;
3815 struct extscan_hotlist_match *dest_hotlist;
3816 tSirWifiScanResult *dest_ap;
3817 wmi_extscan_wlan_descriptor *src_hotlist;
Sridhar Selvaraj22943572017-07-26 15:06:40 +05303818 uint32_t numap;
3819 int j, ap_found = 0;
Vignesh Viswanathanfc5bbed2017-11-23 14:14:01 +05303820 uint32_t buf_len;
Anurag Chouhan6d760662016-02-20 16:05:43 +05303821 tpAniSirGlobal pMac = cds_get_context(QDF_MODULE_ID_PE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003822
3823 if (!pMac) {
3824 WMA_LOGE("%s: Invalid pMac", __func__);
3825 return -EINVAL;
3826 }
Jeff Johnson17b12392018-07-03 22:21:15 -07003827 if (!pMac->sme.ext_scan_ind_cb) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003828 WMA_LOGE("%s: Callback not registered", __func__);
3829 return -EINVAL;
3830 }
3831 param_buf = (WMI_EXTSCAN_HOTLIST_MATCH_EVENTID_param_tlvs *)
3832 cmd_param_info;
3833 if (!param_buf) {
3834 WMA_LOGE("%s: Invalid hotlist match event", __func__);
3835 return -EINVAL;
3836 }
3837 event = param_buf->fixed_param;
3838 src_hotlist = param_buf->hotlist_match;
3839 numap = event->total_entries;
3840
3841 if (!src_hotlist || !numap) {
3842 WMA_LOGE("%s: Hotlist AP's list invalid", __func__);
3843 return -EINVAL;
3844 }
Abhinav Kumara03659c2017-12-28 15:18:07 +05303845 if (numap > param_buf->num_hotlist_match) {
3846 WMA_LOGE("Invalid no of total enteries %d", numap);
3847 return -EINVAL;
3848 }
Sridhar Selvaraj22943572017-07-26 15:06:40 +05303849 if (numap > WMA_EXTSCAN_MAX_HOTLIST_ENTRIES) {
3850 WMA_LOGE("%s: Total Entries %u greater than max",
3851 __func__, numap);
3852 numap = WMA_EXTSCAN_MAX_HOTLIST_ENTRIES;
3853 }
Vignesh Viswanathanfc5bbed2017-11-23 14:14:01 +05303854
3855 buf_len = sizeof(wmi_extscan_hotlist_match_event_fixed_param) +
Himanshu Agarwalff399e32017-12-26 17:21:28 +05303856 WMI_TLV_HDR_SIZE +
Vignesh Viswanathanfc5bbed2017-11-23 14:14:01 +05303857 (numap * sizeof(wmi_extscan_wlan_descriptor));
3858
3859 if (buf_len > len) {
3860 WMA_LOGE("Invalid buf len from FW %d numap %d", len, numap);
3861 return -EINVAL;
3862 }
3863
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303864 dest_hotlist = qdf_mem_malloc(sizeof(*dest_hotlist) +
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003865 sizeof(*dest_ap) * numap);
3866 if (!dest_hotlist) {
3867 WMA_LOGE("%s: Allocation failed for hotlist buffer", __func__);
3868 return -ENOMEM;
3869 }
3870 dest_ap = &dest_hotlist->ap[0];
3871 dest_hotlist->numOfAps = event->total_entries;
3872 dest_hotlist->requestId = event->config_request_id;
3873
3874 if (event->first_entry_index +
3875 event->num_entries_in_page < event->total_entries)
3876 dest_hotlist->moreData = 1;
3877 else
3878 dest_hotlist->moreData = 0;
3879
3880 WMA_LOGD("%s: Hotlist match: requestId: %u,"
3881 "numOfAps: %d", __func__,
3882 dest_hotlist->requestId, dest_hotlist->numOfAps);
3883
3884 /*
3885 * Currently firmware sends only one bss information in-case
3886 * of both hotlist ap found and lost.
3887 */
3888 for (j = 0; j < numap; j++) {
3889 dest_ap->rssi = 0;
3890 dest_ap->channel = src_hotlist->channel;
3891 dest_ap->ts = src_hotlist->tstamp;
3892 ap_found = src_hotlist->flags & WMI_HOTLIST_FLAG_PRESENCE;
3893 dest_ap->rtt = src_hotlist->rtt;
3894 dest_ap->rtt_sd = src_hotlist->rtt_sd;
3895 dest_ap->beaconPeriod = src_hotlist->beacon_interval;
3896 dest_ap->capability = src_hotlist->capabilities;
3897 dest_ap->ieLength = src_hotlist->ie_length;
3898 WMI_MAC_ADDR_TO_CHAR_ARRAY(&src_hotlist->bssid,
3899 dest_ap->bssid.bytes);
Vignesh Viswanathandf0571a2017-11-28 17:39:08 +05303900 if (src_hotlist->ssid.ssid_len > SIR_MAC_MAX_SSID_LENGTH) {
3901 WMA_LOGE("%s Invalid SSID len %d, truncating",
3902 __func__, src_hotlist->ssid.ssid_len);
3903 src_hotlist->ssid.ssid_len = SIR_MAC_MAX_SSID_LENGTH;
3904 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303905 qdf_mem_copy(dest_ap->ssid, src_hotlist->ssid.ssid,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003906 src_hotlist->ssid.ssid_len);
3907 dest_ap->ssid[src_hotlist->ssid.ssid_len] = '\0';
3908 dest_ap++;
3909 src_hotlist++;
3910 }
3911 dest_hotlist->ap_found = ap_found;
Jeff Johnson17b12392018-07-03 22:21:15 -07003912 pMac->sme.ext_scan_ind_cb(pMac->hdd_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003913 eSIR_EXTSCAN_HOTLIST_MATCH_IND, dest_hotlist);
3914 WMA_LOGI("%s: sending hotlist match event to hdd", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303915 qdf_mem_free(dest_hotlist);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003916 return 0;
3917}
3918
3919/** wma_extscan_find_unique_scan_ids() - find unique scan ids
3920 * @cmd_param_info: event data.
3921 *
3922 * This utility function parses the input bss table of information
3923 * and find the unique number of scan ids
3924 *
3925 * Return: 0 on success; error number otherwise
3926 */
3927static int wma_extscan_find_unique_scan_ids(const u_int8_t *cmd_param_info)
3928{
3929 WMI_EXTSCAN_CACHED_RESULTS_EVENTID_param_tlvs *param_buf;
3930 wmi_extscan_cached_results_event_fixed_param *event;
3931 wmi_extscan_wlan_descriptor *src_hotlist;
3932 wmi_extscan_rssi_info *src_rssi;
3933 int prev_scan_id, scan_ids_cnt, i;
3934
3935 param_buf = (WMI_EXTSCAN_CACHED_RESULTS_EVENTID_param_tlvs *)
3936 cmd_param_info;
3937 event = param_buf->fixed_param;
3938 src_hotlist = param_buf->bssid_list;
3939 src_rssi = param_buf->rssi_list;
3940
3941 /* Find the unique number of scan_id's for grouping */
3942 prev_scan_id = src_rssi->scan_cycle_id;
3943 scan_ids_cnt = 1;
3944 for (i = 1; i < event->num_entries_in_page; i++) {
3945 src_rssi++;
3946
3947 if (prev_scan_id != src_rssi->scan_cycle_id) {
3948 scan_ids_cnt++;
3949 prev_scan_id = src_rssi->scan_cycle_id;
3950 }
3951 }
3952
3953 return scan_ids_cnt;
3954}
3955
3956/** wma_fill_num_results_per_scan_id() - fill number of bss per scan id
3957 * @cmd_param_info: event data.
3958 * @scan_id_group: pointer to scan id group.
3959 *
3960 * This utility function parses the input bss table of information
3961 * and finds how many bss are there per unique scan id.
3962 *
3963 * Return: 0 on success; error number otherwise
3964 */
3965static int wma_fill_num_results_per_scan_id(const u_int8_t *cmd_param_info,
3966 struct extscan_cached_scan_result *scan_id_group)
3967{
3968 WMI_EXTSCAN_CACHED_RESULTS_EVENTID_param_tlvs *param_buf;
3969 wmi_extscan_cached_results_event_fixed_param *event;
3970 wmi_extscan_wlan_descriptor *src_hotlist;
3971 wmi_extscan_rssi_info *src_rssi;
3972 struct extscan_cached_scan_result *t_scan_id_grp;
3973 int i, prev_scan_id;
3974
3975 param_buf = (WMI_EXTSCAN_CACHED_RESULTS_EVENTID_param_tlvs *)
3976 cmd_param_info;
3977 event = param_buf->fixed_param;
3978 src_hotlist = param_buf->bssid_list;
3979 src_rssi = param_buf->rssi_list;
3980 t_scan_id_grp = scan_id_group;
3981
3982 prev_scan_id = src_rssi->scan_cycle_id;
3983
3984 t_scan_id_grp->scan_id = src_rssi->scan_cycle_id;
3985 t_scan_id_grp->flags = src_rssi->flags;
Mukul Sharmaf7cb3ab2016-08-12 19:53:52 +05303986 t_scan_id_grp->buckets_scanned = src_rssi->buckets_scanned;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003987 t_scan_id_grp->num_results = 1;
3988 for (i = 1; i < event->num_entries_in_page; i++) {
3989 src_rssi++;
3990 if (prev_scan_id == src_rssi->scan_cycle_id) {
3991 t_scan_id_grp->num_results++;
3992 } else {
3993 t_scan_id_grp++;
3994 prev_scan_id = t_scan_id_grp->scan_id =
3995 src_rssi->scan_cycle_id;
3996 t_scan_id_grp->flags = src_rssi->flags;
Mukul Sharmaf7cb3ab2016-08-12 19:53:52 +05303997 t_scan_id_grp->buckets_scanned =
3998 src_rssi->buckets_scanned;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003999 t_scan_id_grp->num_results = 1;
4000 }
4001 }
4002 return 0;
4003}
4004
4005/** wma_group_num_bss_to_scan_id() - group bss to scan id table
4006 * @cmd_param_info: event data.
4007 * @cached_result: pointer to cached table.
4008 *
4009 * This function reads the bss information from the format
4010 * ------------------------------------------------------------------------
4011 * | bss info {rssi, channel, ssid, bssid, timestamp} | scan id_1 | flags |
4012 * | bss info {rssi, channel, ssid, bssid, timestamp} | scan id_2 | flags |
4013 * ........................................................................
4014 * | bss info {rssi, channel, ssid, bssid, timestamp} | scan id_N | flags |
4015 * ------------------------------------------------------------------------
4016 *
4017 * and converts it into the below format and store it
4018 *
4019 * ------------------------------------------------------------------------
4020 * | scan id_1 | -> bss info_1 -> bss info_2 -> .... bss info_M1
4021 * | scan id_2 | -> bss info_1 -> bss info_2 -> .... bss info_M2
4022 * ......................
4023 * | scan id_N | -> bss info_1 -> bss info_2 -> .... bss info_Mn
4024 * ------------------------------------------------------------------------
4025 *
4026 * Return: 0 on success; error number otherwise
4027 */
4028static int wma_group_num_bss_to_scan_id(const u_int8_t *cmd_param_info,
4029 struct extscan_cached_scan_results *cached_result)
4030{
4031 WMI_EXTSCAN_CACHED_RESULTS_EVENTID_param_tlvs *param_buf;
4032 wmi_extscan_cached_results_event_fixed_param *event;
4033 wmi_extscan_wlan_descriptor *src_hotlist;
4034 wmi_extscan_rssi_info *src_rssi;
4035 struct extscan_cached_scan_results *t_cached_result;
4036 struct extscan_cached_scan_result *t_scan_id_grp;
4037 int i, j;
4038 tSirWifiScanResult *ap;
4039
4040 param_buf = (WMI_EXTSCAN_CACHED_RESULTS_EVENTID_param_tlvs *)
4041 cmd_param_info;
4042 event = param_buf->fixed_param;
4043 src_hotlist = param_buf->bssid_list;
4044 src_rssi = param_buf->rssi_list;
4045 t_cached_result = cached_result;
4046 t_scan_id_grp = &t_cached_result->result[0];
4047
4048 WMA_LOGD("%s: num_scan_ids:%d", __func__,
4049 t_cached_result->num_scan_ids);
4050 for (i = 0; i < t_cached_result->num_scan_ids; i++) {
4051 WMA_LOGD("%s: num_results:%d", __func__,
4052 t_scan_id_grp->num_results);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304053 t_scan_id_grp->ap = qdf_mem_malloc(t_scan_id_grp->num_results *
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004054 sizeof(*ap));
4055 if (!t_scan_id_grp->ap) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304056 WMA_LOGD("%s: qdf_mem_malloc failed", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004057 return -ENOMEM;
4058 }
4059
4060 ap = &t_scan_id_grp->ap[0];
4061 for (j = 0; j < t_scan_id_grp->num_results; j++) {
4062 ap->channel = src_hotlist->channel;
4063 ap->ts = WMA_MSEC_TO_USEC(src_rssi->tstamp);
4064 ap->rtt = src_hotlist->rtt;
4065 ap->rtt_sd = src_hotlist->rtt_sd;
4066 ap->beaconPeriod = src_hotlist->beacon_interval;
4067 ap->capability = src_hotlist->capabilities;
4068 ap->ieLength = src_hotlist->ie_length;
4069
4070 /* Firmware already applied noise floor adjustment and
4071 * due to WMI interface "UINT32 rssi", host driver
4072 * receives a positive value, hence convert to
4073 * signed char to get the absolute rssi.
4074 */
4075 ap->rssi = (signed char) src_rssi->rssi;
4076 WMI_MAC_ADDR_TO_CHAR_ARRAY(&src_hotlist->bssid,
4077 ap->bssid.bytes);
4078
Vignesh Viswanathandf0571a2017-11-28 17:39:08 +05304079 if (src_hotlist->ssid.ssid_len >
4080 SIR_MAC_MAX_SSID_LENGTH) {
4081 WMA_LOGD("%s Invalid SSID len %d, truncating",
4082 __func__, src_hotlist->ssid.ssid_len);
4083 src_hotlist->ssid.ssid_len =
4084 SIR_MAC_MAX_SSID_LENGTH;
4085 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304086 qdf_mem_copy(ap->ssid, src_hotlist->ssid.ssid,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004087 src_hotlist->ssid.ssid_len);
4088 ap->ssid[src_hotlist->ssid.ssid_len] = '\0';
4089 ap++;
4090 src_rssi++;
4091 src_hotlist++;
4092 }
4093 t_scan_id_grp++;
4094 }
4095 return 0;
4096}
4097
4098/**
4099 * wma_extscan_cached_results_event_handler() - cached results event handler
4100 * @handle: wma handle
4101 * @cmd_param_info: event buffer
4102 * @len: length of @cmd_param_info
4103 *
4104 * This function handles cached results event and indicate
4105 * cached results to upper layer.
4106 *
4107 * Return: 0 for success or error code.
4108 */
4109int wma_extscan_cached_results_event_handler(void *handle,
4110 uint8_t *cmd_param_info,
4111 uint32_t len)
4112{
4113 WMI_EXTSCAN_CACHED_RESULTS_EVENTID_param_tlvs *param_buf;
4114 wmi_extscan_cached_results_event_fixed_param *event;
4115 struct extscan_cached_scan_results *dest_cachelist;
4116 struct extscan_cached_scan_result *dest_result;
4117 struct extscan_cached_scan_results empty_cachelist;
4118 wmi_extscan_wlan_descriptor *src_hotlist;
4119 wmi_extscan_rssi_info *src_rssi;
Abhinav Kumarcc864962018-02-21 12:36:35 +05304120 int i, moredata, scan_ids_cnt, buf_len, status;
Anurag Chouhan6d760662016-02-20 16:05:43 +05304121 tpAniSirGlobal pMac = cds_get_context(QDF_MODULE_ID_PE);
Varun Reddy Yeturu46ba20c2017-08-17 15:03:27 -07004122 uint32_t total_len;
4123 bool excess_data = false;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004124
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004125 if (!pMac) {
4126 WMA_LOGE("%s: Invalid pMac", __func__);
4127 return -EINVAL;
4128 }
Jeff Johnson17b12392018-07-03 22:21:15 -07004129 if (!pMac->sme.ext_scan_ind_cb) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004130 WMA_LOGE("%s: Callback not registered", __func__);
4131 return -EINVAL;
4132 }
4133 param_buf = (WMI_EXTSCAN_CACHED_RESULTS_EVENTID_param_tlvs *)
4134 cmd_param_info;
4135 if (!param_buf) {
4136 WMA_LOGE("%s: Invalid cached results event", __func__);
4137 return -EINVAL;
4138 }
4139 event = param_buf->fixed_param;
4140 src_hotlist = param_buf->bssid_list;
4141 src_rssi = param_buf->rssi_list;
Srinivas Girigowdadbfb2642016-08-28 21:32:38 -07004142 WMA_LOGI("Total_entries: %u first_entry_index: %u num_entries_in_page: %d",
4143 event->total_entries,
Vignesh Viswanathan4f75cf52017-11-29 14:19:13 +05304144 event->first_entry_index,
4145 event->num_entries_in_page);
4146
4147 if (!src_hotlist || !src_rssi || !event->num_entries_in_page) {
Srinivas Girigowdaf2599dd2015-11-16 18:20:46 -08004148 WMA_LOGW("%s: Cached results empty, send 0 results", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004149 goto noresults;
4150 }
Vignesh Viswanathan4f75cf52017-11-29 14:19:13 +05304151
4152 if (event->num_entries_in_page >
Abhinav Kumara03659c2017-12-28 15:18:07 +05304153 (WMI_SVC_MSG_MAX_SIZE - sizeof(*event))/sizeof(*src_hotlist) ||
4154 event->num_entries_in_page > param_buf->num_bssid_list) {
4155 WMA_LOGE("%s:excess num_entries_in_page %d in WMI event. num_bssid_list %d",
Vignesh Viswanathan4f75cf52017-11-29 14:19:13 +05304156 __func__,
Abhinav Kumara03659c2017-12-28 15:18:07 +05304157 event->num_entries_in_page, param_buf->num_bssid_list);
Vignesh Viswanathan4f75cf52017-11-29 14:19:13 +05304158 return -EINVAL;
4159 } else {
4160 total_len = sizeof(*event) +
4161 (event->num_entries_in_page * sizeof(*src_hotlist));
4162 }
4163 for (i = 0; i < event->num_entries_in_page; i++) {
4164 if (src_hotlist[i].ie_length >
4165 WMI_SVC_MSG_MAX_SIZE - total_len) {
4166 excess_data = true;
4167 break;
4168 } else {
4169 total_len += src_hotlist[i].ie_length;
4170 WMA_LOGD("total len IE: %d", total_len);
4171 }
4172
4173 if (src_hotlist[i].number_rssi_samples >
4174 (WMI_SVC_MSG_MAX_SIZE - total_len) / sizeof(*src_rssi)) {
4175 excess_data = true;
4176 break;
4177 } else {
4178 total_len += (src_hotlist[i].number_rssi_samples *
4179 sizeof(*src_rssi));
4180 WMA_LOGD("total len RSSI samples: %d", total_len);
4181 }
4182 }
4183 if (excess_data) {
4184 WMA_LOGE("%s:excess data in WMI event",
4185 __func__);
4186 return -EINVAL;
4187 }
4188
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004189 if (event->first_entry_index +
4190 event->num_entries_in_page < event->total_entries)
4191 moredata = 1;
4192 else
4193 moredata = 0;
4194
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304195 dest_cachelist = qdf_mem_malloc(sizeof(*dest_cachelist));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004196 if (!dest_cachelist) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304197 WMA_LOGE("%s: qdf_mem_malloc failed", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004198 return -ENOMEM;
4199 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304200 qdf_mem_zero(dest_cachelist, sizeof(*dest_cachelist));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004201 dest_cachelist->request_id = event->request_id;
4202 dest_cachelist->more_data = moredata;
4203
4204 scan_ids_cnt = wma_extscan_find_unique_scan_ids(cmd_param_info);
Vignesh Viswanathan4f75cf52017-11-29 14:19:13 +05304205 WMA_LOGD("%s: scan_ids_cnt %d", __func__, scan_ids_cnt);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004206 dest_cachelist->num_scan_ids = scan_ids_cnt;
4207
4208 buf_len = sizeof(*dest_result) * scan_ids_cnt;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304209 dest_cachelist->result = qdf_mem_malloc(buf_len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004210 if (!dest_cachelist->result) {
4211 WMA_LOGE("%s: Allocation failed for scanid grouping", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304212 qdf_mem_free(dest_cachelist);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004213 return -ENOMEM;
4214 }
4215
4216 dest_result = dest_cachelist->result;
4217 wma_fill_num_results_per_scan_id(cmd_param_info, dest_result);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004218
Abhinav Kumarcc864962018-02-21 12:36:35 +05304219 status = wma_group_num_bss_to_scan_id(cmd_param_info, dest_cachelist);
4220 if (!status)
Jeff Johnson17b12392018-07-03 22:21:15 -07004221 pMac->sme.ext_scan_ind_cb(pMac->hdd_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004222 eSIR_EXTSCAN_CACHED_RESULTS_IND,
4223 dest_cachelist);
Abhinav Kumarcc864962018-02-21 12:36:35 +05304224 else
4225 WMA_LOGD("wma_group_num_bss_to_scan_id failed, not calling callback");
4226
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004227 dest_result = dest_cachelist->result;
4228 for (i = 0; i < dest_cachelist->num_scan_ids; i++) {
Abhinav Kumarcc864962018-02-21 12:36:35 +05304229 if (dest_result->ap)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304230 qdf_mem_free(dest_result->ap);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004231 dest_result++;
4232 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304233 qdf_mem_free(dest_cachelist->result);
4234 qdf_mem_free(dest_cachelist);
Abhinav Kumarcc864962018-02-21 12:36:35 +05304235 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004236
4237noresults:
4238 empty_cachelist.request_id = event->request_id;
4239 empty_cachelist.more_data = 0;
4240 empty_cachelist.num_scan_ids = 0;
4241
Jeff Johnson17b12392018-07-03 22:21:15 -07004242 pMac->sme.ext_scan_ind_cb(pMac->hdd_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004243 eSIR_EXTSCAN_CACHED_RESULTS_IND,
4244 &empty_cachelist);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004245 return 0;
4246}
4247
4248/**
4249 * wma_extscan_change_results_event_handler() - change results event handler
4250 * @handle: wma handle
4251 * @cmd_param_info: event buffer
4252 * @len: length
4253 *
4254 * This function handles change results event and indicate
4255 * change results to upper layer.
4256 *
4257 * Return: 0 for success or error code.
4258 */
4259int wma_extscan_change_results_event_handler(void *handle,
4260 uint8_t *cmd_param_info,
4261 uint32_t len)
4262{
4263 WMI_EXTSCAN_WLAN_CHANGE_RESULTS_EVENTID_param_tlvs *param_buf;
4264 wmi_extscan_wlan_change_results_event_fixed_param *event;
4265 tSirWifiSignificantChangeEvent *dest_chglist;
4266 tSirWifiSignificantChange *dest_ap;
4267 wmi_extscan_wlan_change_result_bssid *src_chglist;
4268
Pragaspathi Thilagaraje8f5b1d2018-04-04 23:08:48 +05304269 uint32_t numap;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004270 int i, k;
4271 uint8_t *src_rssi;
4272 int count = 0;
4273 int moredata;
Pragaspathi Thilagaraje8f5b1d2018-04-04 23:08:48 +05304274 uint32_t rssi_num = 0;
Anurag Chouhan6d760662016-02-20 16:05:43 +05304275 tpAniSirGlobal pMac = cds_get_context(QDF_MODULE_ID_PE);
Varun Reddy Yeturu46ba20c2017-08-17 15:03:27 -07004276 uint32_t buf_len;
4277 bool excess_data = false;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004278
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004279 if (!pMac) {
4280 WMA_LOGE("%s: Invalid pMac", __func__);
4281 return -EINVAL;
4282 }
Jeff Johnson17b12392018-07-03 22:21:15 -07004283 if (!pMac->sme.ext_scan_ind_cb) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004284 WMA_LOGE("%s: Callback not registered", __func__);
4285 return -EINVAL;
4286 }
4287 param_buf = (WMI_EXTSCAN_WLAN_CHANGE_RESULTS_EVENTID_param_tlvs *)
4288 cmd_param_info;
4289 if (!param_buf) {
4290 WMA_LOGE("%s: Invalid change monitor event", __func__);
4291 return -EINVAL;
4292 }
4293 event = param_buf->fixed_param;
4294 src_chglist = param_buf->bssid_signal_descriptor_list;
4295 src_rssi = param_buf->rssi_list;
4296 numap = event->num_entries_in_page;
4297
4298 if (!src_chglist || !numap) {
4299 WMA_LOGE("%s: Results invalid", __func__);
4300 return -EINVAL;
4301 }
Abhinav Kumara03659c2017-12-28 15:18:07 +05304302 if (numap > param_buf->num_bssid_signal_descriptor_list) {
4303 WMA_LOGE("%s: Invalid num of entries in page: %d", __func__, numap);
4304 return -EINVAL;
4305 }
Pragaspathi Thilagaraje8f5b1d2018-04-04 23:08:48 +05304306 for (i = 0; i < numap; i++) {
4307 if (src_chglist->num_rssi_samples > (UINT_MAX - rssi_num)) {
4308 WMA_LOGE("%s: Invalid num of rssi samples %d numap %d rssi_num %d",
4309 __func__, src_chglist->num_rssi_samples,
4310 numap, rssi_num);
4311 return -EINVAL;
4312 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004313 rssi_num += src_chglist->num_rssi_samples;
Pragaspathi Thilagaraje8f5b1d2018-04-04 23:08:48 +05304314 src_chglist++;
4315 }
4316 src_chglist = param_buf->bssid_signal_descriptor_list;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004317
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004318 if (event->first_entry_index +
4319 event->num_entries_in_page < event->total_entries) {
4320 moredata = 1;
4321 } else {
4322 moredata = 0;
4323 }
Varun Reddy Yeturu46ba20c2017-08-17 15:03:27 -07004324
4325 do {
4326 if (event->num_entries_in_page >
4327 (WMI_SVC_MSG_MAX_SIZE - sizeof(*event))/
4328 sizeof(*src_chglist)) {
4329 excess_data = true;
4330 break;
4331 } else {
4332 buf_len =
4333 sizeof(*event) + (event->num_entries_in_page *
4334 sizeof(*src_chglist));
4335 }
4336 if (rssi_num >
4337 (WMI_SVC_MSG_MAX_SIZE - buf_len)/sizeof(int32_t)) {
4338 excess_data = true;
4339 break;
4340 }
4341 } while (0);
4342
4343 if (excess_data) {
4344 WMA_LOGE("buffer len exceeds WMI payload,numap:%d, rssi_num:%d",
4345 numap, rssi_num);
4346 QDF_ASSERT(0);
4347 return -EINVAL;
4348 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304349 dest_chglist = qdf_mem_malloc(sizeof(*dest_chglist) +
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004350 sizeof(*dest_ap) * numap +
4351 sizeof(int32_t) * rssi_num);
4352 if (!dest_chglist) {
4353 WMA_LOGE("%s: Allocation failed for change monitor", __func__);
4354 return -ENOMEM;
4355 }
4356 dest_ap = &dest_chglist->ap[0];
4357 for (i = 0; i < numap; i++) {
4358 dest_ap->channel = src_chglist->channel;
4359 WMI_MAC_ADDR_TO_CHAR_ARRAY(&src_chglist->bssid,
4360 dest_ap->bssid.bytes);
4361 dest_ap->numOfRssi = src_chglist->num_rssi_samples;
4362 if (dest_ap->numOfRssi) {
Abhinav Kumara03659c2017-12-28 15:18:07 +05304363 if ((dest_ap->numOfRssi + count) >
4364 param_buf->num_rssi_list) {
4365 WMA_LOGE("%s: Invalid num in rssi list: %d",
4366 __func__, dest_ap->numOfRssi);
4367 qdf_mem_free(dest_chglist);
4368 return -EINVAL;
4369 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004370 for (k = 0; k < dest_ap->numOfRssi; k++) {
4371 dest_ap->rssi[k] = WMA_TGT_NOISE_FLOOR_DBM +
4372 src_rssi[count++];
4373 }
4374 }
Dundi Raviteja35668232018-06-26 13:05:20 +05304375 dest_ap = (tSirWifiSignificantChange *)((char *)dest_ap +
4376 dest_ap->numOfRssi * sizeof(int32_t) +
4377 sizeof(*dest_ap));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004378 src_chglist++;
4379 }
4380 dest_chglist->requestId = event->request_id;
4381 dest_chglist->moreData = moredata;
Dundi Raviteja35668232018-06-26 13:05:20 +05304382 dest_chglist->numResults = numap;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004383
Jeff Johnson17b12392018-07-03 22:21:15 -07004384 pMac->sme.ext_scan_ind_cb(pMac->hdd_handle,
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004385 eSIR_EXTSCAN_SIGNIFICANT_WIFI_CHANGE_RESULTS_IND,
4386 dest_chglist);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004387 WMA_LOGI("%s: sending change monitor results", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304388 qdf_mem_free(dest_chglist);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004389 return 0;
4390}
4391
4392/**
4393 * wma_passpoint_match_event_handler() - passpoint match found event handler
4394 * @handle: WMA handle
4395 * @cmd_param_info: event data
4396 * @len: event data length
4397 *
4398 * This is the passpoint match found event handler; it reads event data from
4399 * @cmd_param_info and fill in the destination buffer and sends indication
4400 * up layer.
4401 *
4402 * Return: 0 on success; error number otherwise
4403 */
4404int wma_passpoint_match_event_handler(void *handle,
4405 uint8_t *cmd_param_info,
4406 uint32_t len)
4407{
4408 WMI_PASSPOINT_MATCH_EVENTID_param_tlvs *param_buf;
4409 wmi_passpoint_event_hdr *event;
4410 struct wifi_passpoint_match *dest_match;
4411 tSirWifiScanResult *dest_ap;
4412 uint8_t *buf_ptr;
Pragaspathi Thilagarajfda1af62018-03-09 15:11:58 +05304413 uint32_t buf_len = 0;
4414 bool excess_data = false;
Anurag Chouhan6d760662016-02-20 16:05:43 +05304415 tpAniSirGlobal mac = cds_get_context(QDF_MODULE_ID_PE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004416
4417 if (!mac) {
4418 WMA_LOGE("%s: Invalid mac", __func__);
4419 return -EINVAL;
4420 }
Jeff Johnson17b12392018-07-03 22:21:15 -07004421 if (!mac->sme.ext_scan_ind_cb) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004422 WMA_LOGE("%s: Callback not registered", __func__);
4423 return -EINVAL;
4424 }
4425
4426 param_buf = (WMI_PASSPOINT_MATCH_EVENTID_param_tlvs *) cmd_param_info;
4427 if (!param_buf) {
4428 WMA_LOGE("%s: Invalid passpoint match event", __func__);
4429 return -EINVAL;
4430 }
4431 event = param_buf->fixed_param;
4432 buf_ptr = (uint8_t *)param_buf->fixed_param;
4433
Pragaspathi Thilagarajfda1af62018-03-09 15:11:58 +05304434 do {
4435 if (event->ie_length > (WMI_SVC_MSG_MAX_SIZE)) {
4436 excess_data = true;
4437 break;
4438 } else {
4439 buf_len = event->ie_length;
4440 }
4441
4442 if (event->anqp_length > (WMI_SVC_MSG_MAX_SIZE)) {
4443 excess_data = true;
4444 break;
4445 } else {
4446 buf_len += event->anqp_length;
4447 }
4448
4449 } while (0);
4450
4451 if (excess_data || buf_len > (WMI_SVC_MSG_MAX_SIZE - sizeof(*event)) ||
4452 buf_len > (WMI_SVC_MSG_MAX_SIZE - sizeof(*dest_match)) ||
4453 (event->ie_length + event->anqp_length) > param_buf->num_bufp) {
Abhinav Kumara03659c2017-12-28 15:18:07 +05304454 WMA_LOGE("IE Length: %u or ANQP Length: %u is huge, num_bufp: %u",
4455 event->ie_length, event->anqp_length,
4456 param_buf->num_bufp);
Varun Reddy Yeturu46ba20c2017-08-17 15:03:27 -07004457 return -EINVAL;
4458 }
4459
Vignesh Viswanathandf0571a2017-11-28 17:39:08 +05304460 if (event->ssid.ssid_len > SIR_MAC_MAX_SSID_LENGTH) {
4461 WMA_LOGD("%s: Invalid ssid len %d, truncating",
4462 __func__, event->ssid.ssid_len);
4463 event->ssid.ssid_len = SIR_MAC_MAX_SSID_LENGTH;
4464 }
4465
Pragaspathi Thilagarajfda1af62018-03-09 15:11:58 +05304466 dest_match = qdf_mem_malloc(sizeof(*dest_match) + buf_len);
4467
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004468 if (!dest_match) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304469 WMA_LOGE("%s: qdf_mem_malloc failed", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004470 return -EINVAL;
4471 }
4472 dest_ap = &dest_match->ap;
4473 dest_match->request_id = 0;
4474 dest_match->id = event->id;
4475 dest_match->anqp_len = event->anqp_length;
4476 WMA_LOGI("%s: passpoint match: id: %u anqp length %u", __func__,
4477 dest_match->id, dest_match->anqp_len);
4478
4479 dest_ap->channel = event->channel_mhz;
4480 dest_ap->ts = event->timestamp;
4481 dest_ap->rtt = event->rtt;
4482 dest_ap->rssi = event->rssi;
4483 dest_ap->rtt_sd = event->rtt_sd;
4484 dest_ap->beaconPeriod = event->beacon_period;
4485 dest_ap->capability = event->capability;
4486 dest_ap->ieLength = event->ie_length;
4487 WMI_MAC_ADDR_TO_CHAR_ARRAY(&event->bssid, dest_ap->bssid.bytes);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304488 qdf_mem_copy(dest_ap->ssid, event->ssid.ssid,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004489 event->ssid.ssid_len);
4490 dest_ap->ssid[event->ssid.ssid_len] = '\0';
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304491 qdf_mem_copy(dest_ap->ieData, buf_ptr + sizeof(*event) +
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004492 WMI_TLV_HDR_SIZE, dest_ap->ieLength);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304493 qdf_mem_copy(dest_match->anqp, buf_ptr + sizeof(*event) +
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004494 WMI_TLV_HDR_SIZE + dest_ap->ieLength,
4495 dest_match->anqp_len);
4496
Jeff Johnson17b12392018-07-03 22:21:15 -07004497 mac->sme.ext_scan_ind_cb(mac->hdd_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004498 eSIR_PASSPOINT_NETWORK_FOUND_IND,
4499 dest_match);
4500 WMA_LOGI("%s: sending passpoint match event to hdd", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304501 qdf_mem_free(dest_match);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004502 return 0;
4503}
4504
4505/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004506 * wma_start_extscan() - start extscan command to fw.
4507 * @handle: wma handle
4508 * @pstart: scan command request params
4509 *
4510 * This function sends start extscan request to fw.
4511 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05304512 * Return: QDF Status.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004513 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304514QDF_STATUS wma_start_extscan(tp_wma_handle wma,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004515 tSirWifiScanCmdReqParams *pstart)
4516{
Abhishek Singhb61b5452017-04-10 10:14:18 +05304517 struct wifi_scan_cmd_req_params *params;
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05304518 int i, j;
4519 QDF_STATUS status;
4520
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004521 if (!wma || !wma->wmi_handle) {
4522 WMA_LOGE("%s: WMA is closed,can not issue extscan cmd",
4523 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304524 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004525 }
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05304526 if (!wmi_service_enabled(wma->wmi_handle,
4527 wmi_service_extscan)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004528 WMA_LOGE("%s: extscan feature bit not enabled", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304529 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004530 }
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05304531
4532 params = qdf_mem_malloc(sizeof(struct wifi_scan_cmd_req_params));
Naveen Rawat35804772016-06-27 15:40:28 -07004533 if (params == NULL) {
4534 WMA_LOGE("%s : Memory allocation failed", __func__);
4535 return QDF_STATUS_E_NOMEM;
4536 }
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05304537
Jeff Johnson81b59a32018-07-12 21:59:28 -07004538 params->base_period = pstart->basePeriod;
4539 params->max_ap_per_scan = pstart->maxAPperScan;
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05304540 params->report_threshold_percent = pstart->report_threshold_percent;
4541 params->report_threshold_num_scans = pstart->report_threshold_num_scans;
Jeff Johnson81b59a32018-07-12 21:59:28 -07004542 params->request_id = pstart->requestId;
4543 params->vdev_id = pstart->sessionId;
4544 params->num_buckets = pstart->numBuckets;
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05304545 params->min_dwell_time_active = pstart->min_dwell_time_active;
4546 params->min_dwell_time_passive = pstart->min_dwell_time_passive;
4547 params->max_dwell_time_active = pstart->max_dwell_time_active;
4548 params->max_dwell_time_passive = pstart->max_dwell_time_passive;
4549 params->configuration_flags = pstart->configuration_flags;
Gupta, Kapil96c7f2f2016-04-25 19:13:41 +05304550 params->extscan_adaptive_dwell_mode =
4551 pstart->extscan_adaptive_dwell_mode;
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05304552 for (i = 0; i < WMI_WLAN_EXTSCAN_MAX_BUCKETS; i++) {
4553 params->buckets[i].bucket = pstart->buckets[i].bucket;
4554 params->buckets[i].band =
4555 (enum wmi_wifi_band) pstart->buckets[i].band;
4556 params->buckets[i].period = pstart->buckets[i].period;
Jeff Johnson81b59a32018-07-12 21:59:28 -07004557 params->buckets[i].report_events =
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05304558 pstart->buckets[i].reportEvents;
4559 params->buckets[i].max_period = pstart->buckets[i].max_period;
4560 params->buckets[i].exponent = pstart->buckets[i].exponent;
4561 params->buckets[i].step_count = pstart->buckets[i].step_count;
Jeff Johnson81b59a32018-07-12 21:59:28 -07004562 params->buckets[i].num_channels =
4563 pstart->buckets[i].numChannels;
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05304564 params->buckets[i].min_dwell_time_active =
4565 pstart->buckets[i].min_dwell_time_active;
4566 params->buckets[i].min_dwell_time_passive =
4567 pstart->buckets[i].min_dwell_time_passive;
4568 params->buckets[i].max_dwell_time_active =
4569 pstart->buckets[i].max_dwell_time_active;
4570 params->buckets[i].max_dwell_time_passive =
4571 pstart->buckets[i].max_dwell_time_passive;
4572 for (j = 0; j < WLAN_EXTSCAN_MAX_CHANNELS; j++) {
4573 params->buckets[i].channels[j].channel =
4574 pstart->buckets[i].channels[j].channel;
Jeff Johnson81b59a32018-07-12 21:59:28 -07004575 params->buckets[i].channels[j].dwell_time_ms =
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05304576 pstart->buckets[i].channels[j].dwellTimeMs;
4577 params->buckets[i].channels[j].passive =
4578 pstart->buckets[i].channels[j].passive;
Jeff Johnson81b59a32018-07-12 21:59:28 -07004579 params->buckets[i].channels[j].channel_class =
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05304580 pstart->buckets[i].channels[j].chnlClass;
4581 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004582 }
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05304583
4584 status = wmi_unified_start_extscan_cmd(wma->wmi_handle,
4585 params);
Abhishek Singhb61b5452017-04-10 10:14:18 +05304586 qdf_mem_free(params);
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05304587 if (QDF_IS_STATUS_ERROR(status))
4588 return status;
4589
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004590 wma->interfaces[pstart->sessionId].extscan_in_progress = true;
4591 WMA_LOGD("Extscan start request sent successfully for vdev %d",
4592 pstart->sessionId);
4593
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05304594 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004595}
4596
4597/**
4598 * wma_stop_extscan() - stop extscan command to fw.
4599 * @handle: wma handle
4600 * @pstopcmd: stop scan command request params
4601 *
4602 * This function sends stop extscan request to fw.
4603 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05304604 * Return: QDF Status.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004605 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304606QDF_STATUS wma_stop_extscan(tp_wma_handle wma,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004607 tSirExtScanStopReqParams *pstopcmd)
4608{
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05304609 struct extscan_stop_req_params params = {0};
4610 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004611
4612 if (!wma || !wma->wmi_handle) {
4613 WMA_LOGE("%s: WMA is closed, cannot issue cmd", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304614 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004615 }
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05304616 if (!wmi_service_enabled(wma->wmi_handle,
4617 wmi_service_extscan)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004618 WMA_LOGE("%s: extscan not enabled", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304619 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004620 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004621
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05304622 params.request_id = pstopcmd->requestId;
Jeff Johnson81b59a32018-07-12 21:59:28 -07004623 params.vdev_id = pstopcmd->sessionId;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004624
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05304625 status = wmi_unified_stop_extscan_cmd(wma->wmi_handle,
4626 &params);
4627 if (QDF_IS_STATUS_ERROR(status))
4628 return status;
4629
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004630 wma->interfaces[pstopcmd->sessionId].extscan_in_progress = false;
4631 WMA_LOGD("Extscan stop request sent successfully for vdev %d",
4632 pstopcmd->sessionId);
4633
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05304634 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004635}
4636
4637/** wma_get_hotlist_entries_per_page() - hotlist entries per page
4638 * @wmi_handle: wmi handle.
4639 * @cmd: size of command structure.
4640 * @per_entry_size: per entry size.
4641 *
4642 * This utility function calculates how many hotlist entries can
4643 * fit in one page.
4644 *
4645 * Return: number of entries
4646 */
4647static inline int wma_get_hotlist_entries_per_page(wmi_unified_t wmi_handle,
4648 size_t cmd_size,
4649 size_t per_entry_size)
4650{
4651 uint32_t avail_space = 0;
4652 int num_entries = 0;
4653 uint16_t max_msg_len = wmi_get_max_msg_len(wmi_handle);
4654
4655 /* Calculate number of hotlist entries that can
4656 * be passed in wma message request.
4657 */
4658 avail_space = max_msg_len - cmd_size;
4659 num_entries = avail_space / per_entry_size;
4660 return num_entries;
4661}
4662
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304663QDF_STATUS wma_extscan_start_hotlist_monitor(tp_wma_handle wma,
Jeff Johnson1148cb02018-07-13 23:14:32 -07004664 struct extscan_bssid_hotlist_set_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004665{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004666 if (!wma || !wma->wmi_handle) {
4667 WMA_LOGE("%s: WMA is closed, can not issue hotlist cmd",
4668 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304669 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004670 }
Jeff Johnson1148cb02018-07-13 23:14:32 -07004671
4672 if (!params) {
4673 WMA_LOGE("%s: Invalid params", __func__);
4674 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004675 }
Jeff Johnson1148cb02018-07-13 23:14:32 -07004676
4677 return wmi_unified_extscan_start_hotlist_monitor_cmd(wma->wmi_handle,
4678 params);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004679}
4680
4681/**
4682 * wma_extscan_stop_hotlist_monitor() - stop hotlist monitor
4683 * @wma: wma handle
4684 * @photlist_reset: hotlist reset params
4685 *
4686 * This function configures hotlist monitor to stop in fw.
4687 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05304688 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004689 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304690QDF_STATUS wma_extscan_stop_hotlist_monitor(tp_wma_handle wma,
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004691 tSirExtScanResetBssidHotlistReqParams *photlist_reset)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004692{
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05304693 struct extscan_bssid_hotlist_reset_params params = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004694
4695 if (!wma || !wma->wmi_handle) {
4696 WMA_LOGE("%s: WMA is closed, can not issue cmd", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304697 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004698 }
4699 if (!photlist_reset) {
4700 WMA_LOGE("%s: Invalid reset hotlist buffer", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304701 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004702 }
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05304703 if (!wmi_service_enabled(wma->wmi_handle,
4704 wmi_service_extscan)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004705 WMA_LOGE("%s: extscan not enabled", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304706 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004707 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004708
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05304709 params.request_id = photlist_reset->requestId;
Jeff Johnson81b59a32018-07-12 21:59:28 -07004710 params.vdev_id = photlist_reset->requestId;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004711
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05304712 return wmi_unified_extscan_stop_hotlist_monitor_cmd(wma->wmi_handle,
4713 &params);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004714}
4715
4716/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004717 * wma_extscan_start_change_monitor() - send start change monitor cmd
4718 * @wma: wma handle
4719 * @psigchange: change monitor request params
4720 *
4721 * This function sends start change monitor request to fw.
4722 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05304723 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004724 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304725QDF_STATUS wma_extscan_start_change_monitor(tp_wma_handle wma,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004726 tSirExtScanSetSigChangeReqParams *
4727 psigchange)
4728{
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05304729 int i = 0;
Mohit Khanna0fe61672016-05-19 16:53:39 -07004730 QDF_STATUS status;
4731 struct extscan_set_sig_changereq_params *params_ptr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004732
4733 if (!wma || !wma->wmi_handle) {
4734 WMA_LOGE("%s: WMA is closed,can not issue extscan cmd",
4735 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304736 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004737 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004738
Mohit Khanna0fe61672016-05-19 16:53:39 -07004739 params_ptr = qdf_mem_malloc(sizeof(*params_ptr));
4740
4741 if (!params_ptr) {
4742 WMA_LOGE(
4743 "%s: unable to allocate memory for extscan_set_sig_changereq_params",
4744 __func__);
4745 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004746 }
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05304747
Mohit Khanna0fe61672016-05-19 16:53:39 -07004748 params_ptr->request_id = psigchange->requestId;
Jeff Johnson81b59a32018-07-12 21:59:28 -07004749 params_ptr->vdev_id = psigchange->sessionId;
Mohit Khanna0fe61672016-05-19 16:53:39 -07004750 params_ptr->rssi_sample_size = psigchange->rssiSampleSize;
4751 params_ptr->lostap_sample_size = psigchange->lostApSampleSize;
4752 params_ptr->min_breaching = psigchange->minBreaching;
4753 params_ptr->num_ap = psigchange->numAp;
4754 for (i = 0; i < WLAN_EXTSCAN_MAX_SIGNIFICANT_CHANGE_APS; i++) {
4755 qdf_mem_copy(&params_ptr->ap[i].bssid,
4756 &psigchange->ap[i].bssid,
4757 sizeof(struct qdf_mac_addr));
4758 params_ptr->ap[i].high = psigchange->ap[i].high;
4759 params_ptr->ap[i].low = psigchange->ap[i].low;
4760 }
4761
4762 status = wmi_unified_extscan_start_change_monitor_cmd
4763 (wma->wmi_handle,
4764 params_ptr);
4765 qdf_mem_free(params_ptr);
4766 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004767}
4768
4769/**
4770 * wma_extscan_stop_change_monitor() - send stop change monitor cmd
4771 * @wma: wma handle
4772 * @pResetReq: Reset change request params
4773 *
4774 * This function sends stop change monitor request to fw.
4775 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05304776 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004777 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304778QDF_STATUS wma_extscan_stop_change_monitor(tp_wma_handle wma,
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004779 tSirExtScanResetSignificantChangeReqParams *pResetReq)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004780{
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05304781 struct extscan_capabilities_reset_params params = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004782
4783 if (!wma || !wma->wmi_handle) {
4784 WMA_LOGE("%s: WMA is closed, can not issue cmd", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304785 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004786 }
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05304787 if (!wmi_service_enabled(wma->wmi_handle,
4788 wmi_service_extscan)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004789 WMA_LOGE("%s: ext scan not enabled", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304790 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004791 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004792
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05304793 params.request_id = pResetReq->requestId;
Jeff Johnson81b59a32018-07-12 21:59:28 -07004794 params.vdev_id = pResetReq->sessionId;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004795
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05304796 return wmi_unified_extscan_stop_change_monitor_cmd(wma->wmi_handle,
4797 &params);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004798}
4799
4800/**
4801 * wma_extscan_get_cached_results() - extscan get cached results
4802 * @wma: wma handle
4803 * @pcached_results: cached results parameters
4804 *
4805 * This function send request to fw to get cached results.
4806 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05304807 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004808 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304809QDF_STATUS wma_extscan_get_cached_results(tp_wma_handle wma,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004810 tSirExtScanGetCachedResultsReqParams *
4811 pcached_results)
4812{
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05304813 struct extscan_cached_result_params params = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004814
4815 if (!wma || !wma->wmi_handle) {
4816 WMA_LOGE("%s: WMA is closed, cannot issue cmd", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304817 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004818 }
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05304819 if (!wmi_service_enabled(wma->wmi_handle,
4820 wmi_service_extscan)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004821 WMA_LOGE("%s: extscan not enabled", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304822 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004823 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004824
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05304825 params.request_id = pcached_results->requestId;
Jeff Johnson81b59a32018-07-12 21:59:28 -07004826 params.vdev_id = pcached_results->sessionId;
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05304827 params.flush = pcached_results->flush;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004828
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05304829 return wmi_unified_extscan_get_cached_results_cmd(wma->wmi_handle,
4830 &params);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004831}
4832
4833/**
4834 * wma_extscan_get_capabilities() - extscan get capabilities
4835 * @wma: wma handle
4836 * @pgetcapab: get capabilities params
4837 *
4838 * This function send request to fw to get extscan capabilities.
4839 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05304840 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004841 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304842QDF_STATUS wma_extscan_get_capabilities(tp_wma_handle wma,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004843 tSirGetExtScanCapabilitiesReqParams *
4844 pgetcapab)
4845{
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05304846 struct extscan_capabilities_params params = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004847
4848 if (!wma || !wma->wmi_handle) {
4849 WMA_LOGE("%s: WMA is closed, can not issue cmd", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304850 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004851 }
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05304852 if (!wmi_service_enabled(wma->wmi_handle,
4853 wmi_service_extscan)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004854 WMA_LOGE("%s: extscan not enabled", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304855 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004856 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004857
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05304858 params.request_id = pgetcapab->requestId;
Jeff Johnson81b59a32018-07-12 21:59:28 -07004859 params.vdev_id = pgetcapab->sessionId;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004860
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05304861 return wmi_unified_extscan_get_capabilities_cmd(wma->wmi_handle,
4862 &params);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004863}
4864
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004865/** wma_set_epno_network_list() - set epno network list
4866 * @wma: WMA handle
4867 * @req: epno config params request structure
4868 *
4869 * This function reads the incoming epno config request structure
4870 * and constructs the WMI message to the firmware.
4871 *
4872 * Returns: 0 on success, error number otherwise
4873 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304874QDF_STATUS wma_set_epno_network_list(tp_wma_handle wma,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004875 struct wifi_epno_params *req)
4876{
Jeff Johnson81b59a32018-07-12 21:59:28 -07004877 struct wifi_enhanced_pno_params *params;
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05304878 uint8_t i = 0;
4879 QDF_STATUS status;
Krishna Kumaar Natarajan1b909d72016-06-06 15:02:18 -07004880 size_t params_len;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004881
4882 WMA_LOGD("wma_set_epno_network_list");
4883
4884 if (!wma || !wma->wmi_handle) {
4885 WMA_LOGE("%s: WMA is closed, can not issue cmd", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304886 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004887 }
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05304888 if (!wmi_service_enabled(wma->wmi_handle,
4889 wmi_service_extscan)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004890 WMA_LOGE("%s: extscan not enabled", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304891 return QDF_STATUS_E_NOSUPPORT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004892 }
4893
Krishna Kumaar Natarajan1b909d72016-06-06 15:02:18 -07004894 params_len = sizeof(*params) + (req->num_networks *
4895 sizeof(struct wifi_epno_network_params));
4896 params = qdf_mem_malloc(params_len);
4897 if (params == NULL) {
4898 WMA_LOGE(FL("memory allocation failed"));
4899 return QDF_STATUS_E_NOMEM;
4900 }
4901
4902 params->request_id = req->request_id;
Jeff Johnson81b59a32018-07-12 21:59:28 -07004903 params->vdev_id = req->session_id;
Krishna Kumaar Natarajan1b909d72016-06-06 15:02:18 -07004904 params->num_networks = req->num_networks;
Mukul Sharmae8c919f2016-10-02 20:35:15 +05304905
4906 /* Fill only when num_networks are non zero */
4907 if (req->num_networks) {
4908 params->min_5ghz_rssi = req->min_5ghz_rssi;
4909 params->min_24ghz_rssi = req->min_24ghz_rssi;
4910 params->initial_score_max = req->initial_score_max;
4911 params->same_network_bonus = req->same_network_bonus;
4912 params->secure_bonus = req->secure_bonus;
4913 params->band_5ghz_bonus = req->band_5ghz_bonus;
4914 params->current_connection_bonus =
4915 req->current_connection_bonus;
4916
4917 for (i = 0; i < req->num_networks; i++) {
4918 params->networks[i].flags = req->networks[i].flags;
4919 params->networks[i].auth_bit_field =
4920 req->networks[i].auth_bit_field;
4921 params->networks[i].ssid.length =
4922 req->networks[i].ssid.length;
4923 qdf_mem_copy(params->networks[i].ssid.mac_ssid,
4924 req->networks[i].ssid.ssId,
Pragaspathi Thilagaraj26283432018-05-04 19:16:00 +05304925 req->networks[i].ssid.length);
Mukul Sharmae8c919f2016-10-02 20:35:15 +05304926 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004927 }
Varun Reddy Yeturub43fda12015-09-10 18:16:21 -07004928
Krishna Kumaar Natarajan1b909d72016-06-06 15:02:18 -07004929 status = wmi_unified_set_epno_network_list_cmd(wma->wmi_handle, params);
4930 qdf_mem_free(params);
4931
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05304932 if (QDF_IS_STATUS_ERROR(status))
4933 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004934
4935 WMA_LOGD("set ePNO list request sent successfully for vdev %d",
4936 req->session_id);
4937
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05304938 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004939}
4940
4941/**
4942 * wma_set_passpoint_network_list() - set passpoint network list
4943 * @handle: WMA handle
4944 * @req: passpoint network request structure
4945 *
4946 * This function reads the incoming @req and fill in the destination
4947 * WMI structure and send down the passpoint configs down to the firmware
4948 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304949 * Return: QDF_STATUS enumeration
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004950 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304951QDF_STATUS wma_set_passpoint_network_list(tp_wma_handle wma,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004952 struct wifi_passpoint_req *req)
4953{
Krishna Kumaar Natarajan1b909d72016-06-06 15:02:18 -07004954 struct wifi_passpoint_req_param *params;
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05304955 int i = 0;
4956 QDF_STATUS status;
Krishna Kumaar Natarajan1b909d72016-06-06 15:02:18 -07004957 size_t params_len;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004958
4959 WMA_LOGD("wma_set_passpoint_network_list");
4960
4961 if (!wma || !wma->wmi_handle) {
4962 WMA_LOGE("%s: WMA is closed, can not issue cmd", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304963 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004964 }
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05304965 if (!wmi_service_enabled(wma->wmi_handle,
4966 wmi_service_extscan)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004967 WMA_LOGE("%s: extscan not enabled", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304968 return QDF_STATUS_E_NOSUPPORT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004969 }
4970
Krishna Kumaar Natarajan1b909d72016-06-06 15:02:18 -07004971 params_len = sizeof(*params) + (req->num_networks *
4972 sizeof(struct wifi_passpoint_network_param));
4973 params = qdf_mem_malloc(params_len);
4974 if (params == NULL) {
4975 WMA_LOGE(FL("memory allocation failed"));
4976 return QDF_STATUS_E_NOMEM;
4977 }
4978
4979 params->request_id = req->request_id;
Jeff Johnson81b59a32018-07-12 21:59:28 -07004980 params->vdev_id = req->session_id;
Krishna Kumaar Natarajan1b909d72016-06-06 15:02:18 -07004981 params->num_networks = req->num_networks;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004982 for (i = 0; i < req->num_networks; i++) {
Krishna Kumaar Natarajan1b909d72016-06-06 15:02:18 -07004983 params->networks[i].id = req->networks[i].id;
4984 qdf_mem_copy(params->networks[i].realm, req->networks[i].realm,
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05304985 WMI_PASSPOINT_REALM_LEN);
Krishna Kumaar Natarajan1b909d72016-06-06 15:02:18 -07004986 qdf_mem_copy(params->networks[i].roaming_consortium_ids,
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05304987 req->networks[i].roaming_consortium_ids,
4988 WMI_PASSPOINT_ROAMING_CONSORTIUM_ID_NUM *
4989 sizeof(int64_t));
Krishna Kumaar Natarajan1b909d72016-06-06 15:02:18 -07004990 qdf_mem_copy(params->networks[i].plmn, req->networks[i].plmn,
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05304991 WMI_PASSPOINT_PLMN_LEN);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004992 }
4993
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05304994 status = wmi_unified_set_passpoint_network_list_cmd(wma->wmi_handle,
Krishna Kumaar Natarajan1b909d72016-06-06 15:02:18 -07004995 params);
4996 qdf_mem_free(params);
4997
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05304998 if (QDF_IS_STATUS_ERROR(status))
4999 return status;
5000
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005001 WMA_LOGD("Set passpoint network list request is sent successfully for vdev %d",
5002 req->session_id);
5003
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05305004 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005005}
5006
5007/**
5008 * wma_reset_passpoint_network_list() - reset passpoint network list
5009 * @handle: WMA handle
5010 * @req: passpoint network request structure
5011 *
5012 * This function sends down WMI command with network id set to wildcard id.
5013 * firmware shall clear all the config entries
5014 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305015 * Return: QDF_STATUS enumeration
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005016 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305017QDF_STATUS wma_reset_passpoint_network_list(tp_wma_handle wma,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005018 struct wifi_passpoint_req *req)
5019{
Krishna Kumaar Natarajan1b909d72016-06-06 15:02:18 -07005020 struct wifi_passpoint_req_param *params;
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05305021 int i = 0;
Krishna Kumaar Natarajan1b909d72016-06-06 15:02:18 -07005022 QDF_STATUS status;
5023 size_t params_len;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005024
5025 WMA_LOGD("wma_reset_passpoint_network_list");
5026
5027 if (!wma || !wma->wmi_handle) {
5028 WMA_LOGE("%s: WMA is closed, can not issue cmd", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305029 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005030 }
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05305031 if (!wmi_service_enabled(wma->wmi_handle,
5032 wmi_service_extscan)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005033 WMA_LOGE("%s: extscan not enabled", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305034 return QDF_STATUS_E_NOSUPPORT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005035 }
5036
Krishna Kumaar Natarajan1b909d72016-06-06 15:02:18 -07005037 params_len = sizeof(*params) + (req->num_networks *
5038 sizeof(struct wifi_passpoint_network_param));
5039 params = qdf_mem_malloc(params_len);
5040 if (params == NULL) {
5041 WMA_LOGE(FL("memory allocation failed"));
5042 return QDF_STATUS_E_NOMEM;
5043 }
5044
5045 params->request_id = req->request_id;
Jeff Johnson81b59a32018-07-12 21:59:28 -07005046 params->vdev_id = req->session_id;
Krishna Kumaar Natarajan1b909d72016-06-06 15:02:18 -07005047 params->num_networks = req->num_networks;
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05305048 for (i = 0; i < req->num_networks; i++) {
Krishna Kumaar Natarajan1b909d72016-06-06 15:02:18 -07005049 params->networks[i].id = req->networks[i].id;
5050 qdf_mem_copy(params->networks[i].realm, req->networks[i].realm,
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05305051 WMI_PASSPOINT_REALM_LEN);
Krishna Kumaar Natarajan1b909d72016-06-06 15:02:18 -07005052 qdf_mem_copy(params->networks[i].roaming_consortium_ids,
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05305053 req->networks[i].roaming_consortium_ids,
5054 WMI_PASSPOINT_ROAMING_CONSORTIUM_ID_NUM *
5055 sizeof(int64_t));
Krishna Kumaar Natarajan1b909d72016-06-06 15:02:18 -07005056 qdf_mem_copy(params->networks[i].plmn, req->networks[i].plmn,
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05305057 WMI_PASSPOINT_PLMN_LEN);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005058 }
5059
Krishna Kumaar Natarajan1b909d72016-06-06 15:02:18 -07005060 status = wmi_unified_reset_passpoint_network_list_cmd(wma->wmi_handle,
5061 params);
5062 qdf_mem_free(params);
5063
5064 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005065}
5066
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005067#endif
5068
5069/**
5070 * wma_scan_probe_setoui() - set scan probe OUI
5071 * @wma: wma handle
5072 * @psetoui: OUI parameters
5073 *
5074 * set scan probe OUI parameters in firmware
5075 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05305076 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005077 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305078QDF_STATUS wma_scan_probe_setoui(tp_wma_handle wma, tSirScanMacOui *psetoui)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005079{
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05305080 struct scan_mac_oui set_oui;
5081
5082 qdf_mem_set(&set_oui, sizeof(struct scan_mac_oui), 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005083
5084 if (!wma || !wma->wmi_handle) {
5085 WMA_LOGE("%s: WMA is closed, can not issue cmd", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305086 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005087 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005088
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05305089 qdf_mem_copy(set_oui.oui, psetoui->oui,
5090 WMI_WIFI_SCANNING_MAC_OUI_LENGTH);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005091
Rajeev Kumar Sirasanagandla686abd92017-06-08 18:09:01 +05305092 set_oui.vdev_id = psetoui->vdev_id;
5093 set_oui.enb_probe_req_sno_randomization =
5094 psetoui->enb_probe_req_sno_randomization;
Rajeev Kumar Sirasanagandlaaec0b082017-06-21 11:59:41 +05305095 set_oui.ie_whitelist = psetoui->ie_whitelist;
Rajeev Kumar Sirasanagandla686abd92017-06-08 18:09:01 +05305096
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05305097 return wmi_unified_scan_probe_setoui_cmd(wma->wmi_handle,
5098 &set_oui);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005099}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005100/**
5101 * wma_roam_better_ap_handler() - better ap event handler
5102 * @wma: wma handle
5103 * @vdev_id: vdev id
5104 *
5105 * Handler for WMI_ROAM_REASON_BETTER_AP event from roam firmware in Rome.
5106 * This event means roam algorithm in Rome has found a better matching
5107 * candidate AP. The indication is sent to SME.
5108 *
5109 * Return: none
5110 */
5111void wma_roam_better_ap_handler(tp_wma_handle wma, uint32_t vdev_id)
5112{
Rajeev Kumarcf7bd802017-04-18 11:11:42 -07005113 struct scheduler_msg cds_msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005114 tSirSmeCandidateFoundInd *candidate_ind;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005115
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305116 candidate_ind = qdf_mem_malloc(sizeof(tSirSmeCandidateFoundInd));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005117 if (!candidate_ind) {
5118 WMA_LOGE("%s: Alloc failed for tSirSmeCandidateFoundInd",
5119 __func__);
5120 return;
5121 }
Varun Reddy Yeturu30bc42c2016-02-04 10:07:30 -08005122 WMA_LOGD("%s: roaming in progress for vdev %d",
5123 __func__, vdev_id);
5124 wma->interfaces[vdev_id].roaming_in_progress = true;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005125
5126 candidate_ind->messageType = eWNI_SME_CANDIDATE_FOUND_IND;
5127 candidate_ind->sessionId = vdev_id;
5128 candidate_ind->length = sizeof(tSirSmeCandidateFoundInd);
5129
5130 cds_msg.type = eWNI_SME_CANDIDATE_FOUND_IND;
5131 cds_msg.bodyptr = candidate_ind;
Vignesh Viswanathan067b9e62018-04-11 19:31:46 +05305132 cds_msg.callback = sme_mc_process_handler;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305133 QDF_TRACE(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005134 FL("posting candidate ind to SME"));
5135
Vignesh Viswanathan067b9e62018-04-11 19:31:46 +05305136 if (QDF_STATUS_SUCCESS != scheduler_post_msg(QDF_MODULE_ID_SCAN,
Rajeev Kumar156188e2017-01-21 17:23:52 -08005137 &cds_msg)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305138 qdf_mem_free(candidate_ind);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305139 QDF_TRACE(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005140 FL("Failed to post candidate ind to SME"));
5141 }
5142}
5143
5144/**
yeshwanth sriram guntuka41f936c2017-09-01 17:53:49 +05305145 * wma_handle_btm_disassoc_imminent_msg() - Send del sta msg to lim on receiving
5146 * BTM request from AP with disassoc imminent reason
5147 * @wma_handle: wma handle
5148 * @vdev_id: vdev id
5149 *
5150 * Return: None
5151 */
5152static void wma_handle_btm_disassoc_imminent_msg(tp_wma_handle wma_handle,
5153 uint32_t vdev_id)
5154{
5155 tpDeleteStaContext del_sta_ctx;
5156
5157 del_sta_ctx =
5158 (tDeleteStaContext *)qdf_mem_malloc(sizeof(tDeleteStaContext));
5159 if (!del_sta_ctx) {
5160 WMA_LOGE("Memory alloc failed for del sta context");
5161 return;
5162 }
5163 del_sta_ctx->vdev_id = vdev_id;
5164 del_sta_ctx->reasonCode = HAL_DEL_STA_REASON_CODE_BTM_DISASSOC_IMMINENT;
5165 wma_send_msg(wma_handle, SIR_LIM_DELETE_STA_CONTEXT_IND,
5166 (void *)del_sta_ctx, 0);
5167}
5168
5169/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005170 * wma_roam_event_callback() - roam event callback
5171 * @handle: wma handle
5172 * @event_buf: event buffer
5173 * @len: buffer length
5174 *
5175 * Handler for all events from roam engine in firmware
5176 *
5177 * Return: 0 for success or error code
5178 */
5179int wma_roam_event_callback(WMA_HANDLE handle, uint8_t *event_buf,
5180 uint32_t len)
5181{
5182 tp_wma_handle wma_handle = (tp_wma_handle) handle;
5183 WMI_ROAM_EVENTID_param_tlvs *param_buf;
5184 wmi_roam_event_fixed_param *wmi_event;
Varun Reddy Yeturuf907f912016-03-21 15:06:22 -07005185 struct sSirSmeRoamOffloadSynchInd *roam_synch_data;
5186 enum sir_roam_op_code op_code = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005187
5188 param_buf = (WMI_ROAM_EVENTID_param_tlvs *) event_buf;
5189 if (!param_buf) {
5190 WMA_LOGE("Invalid roam event buffer");
5191 return -EINVAL;
5192 }
5193
5194 wmi_event = param_buf->fixed_param;
Varun Reddy Yeturuf907f912016-03-21 15:06:22 -07005195 WMA_LOGD("%s: Reason %x, Notif %x for vdevid %x, rssi %d",
5196 __func__, wmi_event->reason, wmi_event->notif,
5197 wmi_event->vdev_id, wmi_event->rssi);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005198
Himanshu Agarwal847dd5d2017-10-04 14:15:04 +05305199 if (wmi_event->vdev_id >= wma_handle->max_bssid) {
5200 WMA_LOGE("Invalid vdev id from firmware");
5201 return -EINVAL;
5202 }
Deepak Dhamdheref918d422017-07-06 12:56:29 -07005203 wlan_roam_debug_log(wmi_event->vdev_id, DEBUG_ROAM_EVENT,
5204 DEBUG_INVALID_PEER_ID, NULL, NULL,
5205 wmi_event->reason,
5206 (wmi_event->reason == WMI_ROAM_REASON_INVALID) ?
5207 wmi_event->notif : wmi_event->rssi);
Himanshu Agarwal847dd5d2017-10-04 14:15:04 +05305208
Himanshu Agarwal67a863b2016-09-20 15:09:09 +05305209 DPTRACE(qdf_dp_trace_record_event(QDF_DP_TRACE_EVENT_RECORD,
Venkata Sharath Chandra Manchala0b9fc632017-05-15 14:35:15 -07005210 wmi_event->vdev_id, QDF_TRACE_DEFAULT_PDEV_ID,
5211 QDF_PROTO_TYPE_EVENT, QDF_ROAM_EVENTID));
Himanshu Agarwal67a863b2016-09-20 15:09:09 +05305212
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005213 switch (wmi_event->reason) {
yeshwanth sriram guntuka41f936c2017-09-01 17:53:49 +05305214 case WMI_ROAM_REASON_BTM:
5215 /*
5216 * This event is received from firmware if firmware is unable to
5217 * find candidate AP after roam scan and BTM request from AP
5218 * has disassoc imminent bit set.
5219 */
5220 WMA_LOGD("Kickout due to btm request");
5221 wma_sta_kickout_event(HOST_STA_KICKOUT_REASON_BTM,
5222 wmi_event->vdev_id, NULL);
5223 wma_handle_btm_disassoc_imminent_msg(wma_handle,
5224 wmi_event->vdev_id);
5225 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005226 case WMI_ROAM_REASON_BMISS:
5227 WMA_LOGD("Beacon Miss for vdevid %x", wmi_event->vdev_id);
Sreelakshmi Konamki58c72432016-11-09 17:06:44 +05305228 wma_beacon_miss_handler(wma_handle, wmi_event->vdev_id,
5229 wmi_event->rssi);
Sen, Devendra154b3c42017-02-13 20:44:15 +05305230 wma_sta_kickout_event(HOST_STA_KICKOUT_REASON_BMISS,
5231 wmi_event->vdev_id, NULL);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005232 break;
5233 case WMI_ROAM_REASON_BETTER_AP:
5234 WMA_LOGD("%s:Better AP found for vdevid %x, rssi %d", __func__,
5235 wmi_event->vdev_id, wmi_event->rssi);
5236 wma_handle->suitable_ap_hb_failure = false;
5237 wma_roam_better_ap_handler(wma_handle, wmi_event->vdev_id);
5238 break;
5239 case WMI_ROAM_REASON_SUITABLE_AP:
5240 wma_handle->suitable_ap_hb_failure = true;
Sreelakshmi Konamki58c72432016-11-09 17:06:44 +05305241 wma_handle->suitable_ap_hb_failure_rssi = wmi_event->rssi;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005242 WMA_LOGD("%s:Bmiss scan AP found for vdevid %x, rssi %d",
5243 __func__, wmi_event->vdev_id, wmi_event->rssi);
5244 wma_roam_better_ap_handler(wma_handle, wmi_event->vdev_id);
5245 break;
5246#ifdef WLAN_FEATURE_ROAM_OFFLOAD
5247 case WMI_ROAM_REASON_HO_FAILED:
5248 WMA_LOGE("LFR3:Hand-Off Failed for vdevid %x",
5249 wmi_event->vdev_id);
5250 wma_roam_ho_fail_handler(wma_handle, wmi_event->vdev_id);
Tushnim Bhattacharyyaeb622b02018-05-07 13:50:51 -07005251 wma_handle->interfaces[wmi_event->vdev_id].
5252 roaming_in_progress = false;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005253 break;
5254#endif
Varun Reddy Yeturuf907f912016-03-21 15:06:22 -07005255 case WMI_ROAM_REASON_INVALID:
5256 roam_synch_data = qdf_mem_malloc(sizeof(*roam_synch_data));
5257 if (NULL == roam_synch_data) {
5258 WMA_LOGE("Memory unavailable for roam synch data");
5259 return -ENOMEM;
5260 }
Tushnim Bhattacharyyaeb622b02018-05-07 13:50:51 -07005261 if (wmi_event->notif == WMI_ROAM_NOTIF_ROAM_START) {
Naveen Rawat8cc23b02016-07-14 12:22:56 -07005262 op_code = SIR_ROAMING_START;
Tushnim Bhattacharyyaeb622b02018-05-07 13:50:51 -07005263 wma_handle->interfaces[wmi_event->vdev_id].
5264 roaming_in_progress = true;
5265 }
5266 if (wmi_event->notif == WMI_ROAM_NOTIF_ROAM_ABORT) {
Naveen Rawat8cc23b02016-07-14 12:22:56 -07005267 op_code = SIR_ROAMING_ABORT;
Tushnim Bhattacharyyaeb622b02018-05-07 13:50:51 -07005268 wma_handle->interfaces[wmi_event->vdev_id].
5269 roaming_in_progress = false;
5270 }
Varun Reddy Yeturuf907f912016-03-21 15:06:22 -07005271 roam_synch_data->roamedVdevId = wmi_event->vdev_id;
Varun Reddy Yeturub5d858e2017-12-15 16:08:13 -08005272 wma_handle->pe_roam_synch_cb(
5273 (tpAniSirGlobal)wma_handle->mac_context,
5274 roam_synch_data, NULL, op_code);
Varun Reddy Yeturuf907f912016-03-21 15:06:22 -07005275 wma_handle->csr_roam_synch_cb(
5276 (tpAniSirGlobal)wma_handle->mac_context,
5277 roam_synch_data, NULL, op_code);
5278 qdf_mem_free(roam_synch_data);
5279 break;
Sreelakshmi Konamki88a2a412017-04-14 15:11:55 +05305280 case WMI_ROAM_REASON_RSO_STATUS:
5281 wma_rso_cmd_status_event_handler(wmi_event);
5282 break;
Arif Hussain43354e62017-05-24 11:24:25 -07005283 case WMI_ROAM_REASON_INVOKE_ROAM_FAIL:
5284 roam_synch_data = qdf_mem_malloc(sizeof(*roam_synch_data));
5285 if (!roam_synch_data) {
5286 WMA_LOGE("Memory unavailable for roam synch data");
5287 return -ENOMEM;
5288 }
5289 roam_synch_data->roamedVdevId = wmi_event->vdev_id;
5290 wma_handle->csr_roam_synch_cb(
5291 (tpAniSirGlobal)wma_handle->mac_context,
5292 roam_synch_data, NULL, SIR_ROAMING_INVOKE_FAIL);
5293 qdf_mem_free(roam_synch_data);
5294 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005295 default:
5296 WMA_LOGD("%s:Unhandled Roam Event %x for vdevid %x", __func__,
5297 wmi_event->reason, wmi_event->vdev_id);
5298 break;
5299 }
5300 return 0;
5301}
5302
Ravi Joshi9e891ba2015-11-09 19:03:46 -08005303#ifdef FEATURE_LFR_SUBNET_DETECTION
5304/**
5305 * wma_set_gateway_params() - set gateway parameters
5306 * @wma: WMA handle
5307 * @req: gateway parameter update request structure
5308 *
5309 * This function reads the incoming @req and fill in the destination
5310 * WMI structure and sends down the gateway configs down to the firmware
5311 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305312 * Return: QDF_STATUS
Ravi Joshi9e891ba2015-11-09 19:03:46 -08005313 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305314QDF_STATUS wma_set_gateway_params(tp_wma_handle wma,
Ravi Joshi9e891ba2015-11-09 19:03:46 -08005315 struct gateway_param_update_req *req)
5316{
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05305317 struct gateway_update_req_param params = {0};
Ravi Joshi9e891ba2015-11-09 19:03:46 -08005318
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05305319 if (!wma) {
5320 WMA_LOGE("%s: wma handle is NULL", __func__);
5321 return QDF_STATUS_E_INVAL;
Ravi Joshi9e891ba2015-11-09 19:03:46 -08005322 }
5323
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05305324 params.request_id = req->request_id;
5325 params.session_id = req->session_id;
5326 params.max_retries = req->max_retries;
5327 params.timeout = req->timeout;
5328 params.ipv4_addr_type = req->ipv4_addr_type;
5329 params.ipv6_addr_type = req->ipv6_addr_type;
5330 qdf_mem_copy(&params.gw_mac_addr, &req->gw_mac_addr,
5331 sizeof(struct qdf_mac_addr));
5332 qdf_mem_copy(params.ipv4_addr, req->ipv4_addr,
5333 QDF_IPV4_ADDR_SIZE);
5334 qdf_mem_copy(params.ipv6_addr, req->ipv6_addr,
5335 QDF_IPV6_ADDR_SIZE);
Ravi Joshi9e891ba2015-11-09 19:03:46 -08005336
Himanshu Agarwalbf6a12b2016-03-09 14:48:05 +05305337 return wmi_unified_set_gateway_params_cmd(wma->wmi_handle,
5338 &params);
Ravi Joshi9e891ba2015-11-09 19:03:46 -08005339}
5340#endif /* FEATURE_LFR_SUBNET_DETECTION */
5341
Sandeep Puligillae0875662016-02-12 16:09:21 -08005342/**
5343 * wma_ht40_stop_obss_scan() - ht40 obss stop scan
5344 * @wma: WMA handel
5345 * @vdev_id: vdev identifier
5346 *
5347 * Return: Return QDF_STATUS, otherwise appropriate failure code
5348 */
5349QDF_STATUS wma_ht40_stop_obss_scan(tp_wma_handle wma, int32_t vdev_id)
5350{
5351
5352 wmi_buf_t buf;
5353 wmi_obss_scan_disable_cmd_fixed_param *cmd;
5354 int ret;
5355 int len = sizeof(*cmd);
5356
5357 buf = wmi_buf_alloc(wma->wmi_handle, len);
5358 if (!buf) {
5359 WMA_LOGP("%s: wmi_buf_alloc failed", __func__);
5360 return QDF_STATUS_E_NOMEM;
5361 }
5362
5363 WMA_LOGD("cmd %x vdev_id %d", WMI_OBSS_SCAN_DISABLE_CMDID, vdev_id);
5364
5365 cmd = (wmi_obss_scan_disable_cmd_fixed_param *) wmi_buf_data(buf);
5366 WMITLV_SET_HDR(&cmd->tlv_header,
5367 WMITLV_TAG_STRUC_wmi_obss_scan_disable_cmd_fixed_param,
5368 WMITLV_GET_STRUCT_TLVLEN(
5369 wmi_obss_scan_disable_cmd_fixed_param));
5370
5371 cmd->vdev_id = vdev_id;
5372 ret = wmi_unified_cmd_send(wma->wmi_handle, buf, len,
5373 WMI_OBSS_SCAN_DISABLE_CMDID);
5374 if (ret != EOK) {
5375 WMA_LOGE("Failed to send gw config parameter to fw, ret: %d",
5376 ret);
5377 wmi_buf_free(buf);
5378 return QDF_STATUS_E_FAILURE;
5379 }
5380
5381 return QDF_STATUS_SUCCESS;
5382}
5383
5384/**
5385 * wma_send_ht40_obss_scanind() - ht40 obss start scan indication
5386 * @wma: WMA handel
5387 * @req: start scan request
5388 *
5389 * Return: Return QDF_STATUS, otherwise appropriate failure code
5390 */
5391QDF_STATUS wma_send_ht40_obss_scanind(tp_wma_handle wma,
5392 struct obss_ht40_scanind *req)
5393{
5394 wmi_buf_t buf;
5395 wmi_obss_scan_enable_cmd_fixed_param *cmd;
5396 int ret;
5397 int len = 0;
5398 uint8_t *buf_ptr, i;
5399 uint8_t *channel_list;
5400
5401 len += sizeof(wmi_obss_scan_enable_cmd_fixed_param);
5402
5403 len += WMI_TLV_HDR_SIZE;
5404 len += qdf_roundup(sizeof(uint8_t) * req->channel_count,
5405 sizeof(uint32_t));
5406
5407 len += WMI_TLV_HDR_SIZE;
5408 len += qdf_roundup(sizeof(uint8_t) * 1, sizeof(uint32_t));
5409
5410 WMA_LOGE("cmdlen %d vdev_id %d channel count %d iefield_len %d",
5411 len, req->bss_id, req->channel_count, req->iefield_len);
5412
5413 WMA_LOGE("scantype %d active_time %d passive %d Obss interval %d",
5414 req->scan_type, req->obss_active_dwelltime,
5415 req->obss_passive_dwelltime,
5416 req->obss_width_trigger_interval);
5417
5418 buf = wmi_buf_alloc(wma->wmi_handle, len);
5419 if (!buf) {
5420 WMA_LOGP("%s: wmi_buf_alloc failed", __func__);
5421 return QDF_STATUS_E_NOMEM;
5422 }
5423
5424 cmd = (wmi_obss_scan_enable_cmd_fixed_param *) wmi_buf_data(buf);
5425 WMITLV_SET_HDR(&cmd->tlv_header,
5426 WMITLV_TAG_STRUC_wmi_obss_scan_enable_cmd_fixed_param,
5427 WMITLV_GET_STRUCT_TLVLEN(wmi_obss_scan_enable_cmd_fixed_param));
5428
5429 buf_ptr = (uint8_t *) cmd;
5430
5431 cmd->vdev_id = req->bss_id;
5432 cmd->scan_type = req->scan_type;
5433 cmd->obss_scan_active_dwell =
5434 req->obss_active_dwelltime;
5435 cmd->obss_scan_passive_dwell =
5436 req->obss_passive_dwelltime;
5437 cmd->bss_channel_width_trigger_scan_interval =
5438 req->obss_width_trigger_interval;
5439 cmd->bss_width_channel_transition_delay_factor =
5440 req->bsswidth_ch_trans_delay;
5441 cmd->obss_scan_active_total_per_channel =
5442 req->obss_active_total_per_channel;
5443 cmd->obss_scan_passive_total_per_channel =
5444 req->obss_passive_total_per_channel;
5445 cmd->obss_scan_activity_threshold =
5446 req->obss_activity_threshold;
5447
5448 cmd->channel_len = req->channel_count;
5449 cmd->forty_mhz_intolerant = req->fortymhz_intolerent;
5450 cmd->current_operating_class = req->current_operatingclass;
5451 cmd->ie_len = req->iefield_len;
5452
5453 buf_ptr += sizeof(wmi_obss_scan_enable_cmd_fixed_param);
5454 WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_ARRAY_BYTE,
5455 qdf_roundup(req->channel_count, sizeof(uint32_t)));
5456
5457 buf_ptr += WMI_TLV_HDR_SIZE;
5458 channel_list = (uint8_t *) buf_ptr;
5459
5460 for (i = 0; i < req->channel_count; i++) {
5461 channel_list[i] = req->channels[i];
5462 WMA_LOGD("Ch[%d]: %d ", i, channel_list[i]);
5463 }
5464
5465 buf_ptr += qdf_roundup(sizeof(uint8_t) * req->channel_count,
5466 sizeof(uint32_t));
5467 WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_ARRAY_BYTE,
5468 qdf_roundup(1, sizeof(uint32_t)));
5469 buf_ptr += WMI_TLV_HDR_SIZE;
5470
5471 ret = wmi_unified_cmd_send(wma->wmi_handle, buf, len,
5472 WMI_OBSS_SCAN_ENABLE_CMDID);
5473 if (ret != EOK) {
5474 WMA_LOGE("Failed to send gw config parameter to fw, ret: %d",
5475 ret);
5476 wmi_buf_free(buf);
5477 return QDF_STATUS_E_FAILURE;
5478 }
5479 return QDF_STATUS_SUCCESS;
5480}