xref: /wlan-driver/qca-wifi-host-cmn/wmi/src/wmi_unified_extscan_tlv.c (revision 5113495b16420b49004c444715d2daae2066e7dc)
1*5113495bSYour Name /*
2*5113495bSYour Name  * Copyright (c) 2016-2018, 2020, The Linux Foundation. All rights reserved.
3*5113495bSYour Name  * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
4*5113495bSYour Name  *
5*5113495bSYour Name  * Permission to use, copy, modify, and/or distribute this software for
6*5113495bSYour Name  * any purpose with or without fee is hereby granted, provided that the
7*5113495bSYour Name  * above copyright notice and this permission notice appear in all
8*5113495bSYour Name  * copies.
9*5113495bSYour Name  *
10*5113495bSYour Name  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11*5113495bSYour Name  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12*5113495bSYour Name  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13*5113495bSYour Name  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14*5113495bSYour Name  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15*5113495bSYour Name  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16*5113495bSYour Name  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17*5113495bSYour Name  * PERFORMANCE OF THIS SOFTWARE.
18*5113495bSYour Name  */
19*5113495bSYour Name 
20*5113495bSYour Name #include <osdep.h>
21*5113495bSYour Name #include "wmi.h"
22*5113495bSYour Name #include "wmi_unified_priv.h"
23*5113495bSYour Name 
24*5113495bSYour Name /**
25*5113495bSYour Name  * send_reset_passpoint_network_list_cmd_tlv() - reset passpoint network list
26*5113495bSYour Name  * @wmi_handle: wmi handle
27*5113495bSYour Name  * @req: passpoint network request structure
28*5113495bSYour Name  *
29*5113495bSYour Name  * This function sends down WMI command with network id set to wildcard id.
30*5113495bSYour Name  * firmware shall clear all the config entries
31*5113495bSYour Name  *
32*5113495bSYour Name  * Return: QDF_STATUS enumeration
33*5113495bSYour Name  */
send_reset_passpoint_network_list_cmd_tlv(wmi_unified_t wmi_handle,struct wifi_passpoint_req_param * req)34*5113495bSYour Name static QDF_STATUS send_reset_passpoint_network_list_cmd_tlv
35*5113495bSYour Name 					(wmi_unified_t wmi_handle,
36*5113495bSYour Name 					struct wifi_passpoint_req_param *req)
37*5113495bSYour Name {
38*5113495bSYour Name 	wmi_passpoint_config_cmd_fixed_param *cmd;
39*5113495bSYour Name 	wmi_buf_t buf;
40*5113495bSYour Name 	uint32_t len;
41*5113495bSYour Name 	int ret;
42*5113495bSYour Name 
43*5113495bSYour Name 	len = sizeof(*cmd);
44*5113495bSYour Name 	buf = wmi_buf_alloc(wmi_handle, len);
45*5113495bSYour Name 	if (!buf) {
46*5113495bSYour Name 		wmi_err("Failed allocate wmi buffer");
47*5113495bSYour Name 		return QDF_STATUS_E_NOMEM;
48*5113495bSYour Name 	}
49*5113495bSYour Name 
50*5113495bSYour Name 	cmd = (wmi_passpoint_config_cmd_fixed_param *) wmi_buf_data(buf);
51*5113495bSYour Name 
52*5113495bSYour Name 	WMITLV_SET_HDR(&cmd->tlv_header,
53*5113495bSYour Name 			WMITLV_TAG_STRUC_wmi_passpoint_config_cmd_fixed_param,
54*5113495bSYour Name 			WMITLV_GET_STRUCT_TLVLEN(
55*5113495bSYour Name 			wmi_passpoint_config_cmd_fixed_param));
56*5113495bSYour Name 	cmd->id = WMI_PASSPOINT_NETWORK_ID_WILDCARD;
57*5113495bSYour Name 
58*5113495bSYour Name 	ret = wmi_unified_cmd_send(wmi_handle, buf, len,
59*5113495bSYour Name 				   WMI_PASSPOINT_LIST_CONFIG_CMDID);
60*5113495bSYour Name 	if (ret) {
61*5113495bSYour Name 		wmi_err("Failed to send reset passpoint network list wmi cmd");
62*5113495bSYour Name 		wmi_buf_free(buf);
63*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
64*5113495bSYour Name 	}
65*5113495bSYour Name 
66*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
67*5113495bSYour Name }
68*5113495bSYour Name 
69*5113495bSYour Name /**
70*5113495bSYour Name  * send_set_passpoint_network_list_cmd_tlv() - set passpoint network list
71*5113495bSYour Name  * @wmi_handle: wmi handle
72*5113495bSYour Name  * @req: passpoint network request structure
73*5113495bSYour Name  *
74*5113495bSYour Name  * This function reads the incoming @req and fill in the destination
75*5113495bSYour Name  * WMI structure and send down the passpoint configs down to the firmware
76*5113495bSYour Name  *
77*5113495bSYour Name  * Return: QDF_STATUS enumeration
78*5113495bSYour Name  */
send_set_passpoint_network_list_cmd_tlv(wmi_unified_t wmi_handle,struct wifi_passpoint_req_param * req)79*5113495bSYour Name static QDF_STATUS send_set_passpoint_network_list_cmd_tlv
80*5113495bSYour Name 					(wmi_unified_t wmi_handle,
81*5113495bSYour Name 					struct wifi_passpoint_req_param *req)
82*5113495bSYour Name {
83*5113495bSYour Name 	wmi_passpoint_config_cmd_fixed_param *cmd;
84*5113495bSYour Name 	u_int8_t i, j, *bytes;
85*5113495bSYour Name 	wmi_buf_t buf;
86*5113495bSYour Name 	uint32_t len;
87*5113495bSYour Name 	int ret;
88*5113495bSYour Name 
89*5113495bSYour Name 	len = sizeof(*cmd);
90*5113495bSYour Name 	for (i = 0; i < req->num_networks; i++) {
91*5113495bSYour Name 		buf = wmi_buf_alloc(wmi_handle, len);
92*5113495bSYour Name 		if (!buf) {
93*5113495bSYour Name 			wmi_err("Failed allocate wmi buffer");
94*5113495bSYour Name 			return QDF_STATUS_E_NOMEM;
95*5113495bSYour Name 		}
96*5113495bSYour Name 
97*5113495bSYour Name 		cmd = (wmi_passpoint_config_cmd_fixed_param *)
98*5113495bSYour Name 				wmi_buf_data(buf);
99*5113495bSYour Name 
100*5113495bSYour Name 		WMITLV_SET_HDR(&cmd->tlv_header,
101*5113495bSYour Name 			WMITLV_TAG_STRUC_wmi_passpoint_config_cmd_fixed_param,
102*5113495bSYour Name 			WMITLV_GET_STRUCT_TLVLEN(
103*5113495bSYour Name 			wmi_passpoint_config_cmd_fixed_param));
104*5113495bSYour Name 		cmd->id = req->networks[i].id;
105*5113495bSYour Name 		wmi_debug("network id: %u", cmd->id);
106*5113495bSYour Name 		qdf_mem_copy(cmd->realm, req->networks[i].realm,
107*5113495bSYour Name 			strlen(req->networks[i].realm) + 1);
108*5113495bSYour Name 		wmi_debug("realm: %s", cmd->realm);
109*5113495bSYour Name 		for (j = 0; j < PASSPOINT_ROAMING_CONSORTIUM_ID_NUM; j++) {
110*5113495bSYour Name 			bytes = (uint8_t *) &req->networks[i].roaming_consortium_ids[j];
111*5113495bSYour Name 			wmi_debug("index: %d rcids: %02x %02x %02x %02x %02x %02x %02x %02x",
112*5113495bSYour Name 				j, bytes[0], bytes[1], bytes[2], bytes[3],
113*5113495bSYour Name 				bytes[4], bytes[5], bytes[6], bytes[7]);
114*5113495bSYour Name 
115*5113495bSYour Name 			qdf_mem_copy(&cmd->roaming_consortium_ids[j],
116*5113495bSYour Name 				&req->networks[i].roaming_consortium_ids[j],
117*5113495bSYour Name 				PASSPOINT_ROAMING_CONSORTIUM_ID_LEN);
118*5113495bSYour Name 		}
119*5113495bSYour Name 		qdf_mem_copy(cmd->plmn, req->networks[i].plmn,
120*5113495bSYour Name 				PASSPOINT_PLMN_ID_LEN);
121*5113495bSYour Name 		wmi_debug("plmn: %02x:%02x:%02x",
122*5113495bSYour Name 			 cmd->plmn[0], cmd->plmn[1], cmd->plmn[2]);
123*5113495bSYour Name 
124*5113495bSYour Name 		ret = wmi_unified_cmd_send(wmi_handle, buf, len,
125*5113495bSYour Name 					   WMI_PASSPOINT_LIST_CONFIG_CMDID);
126*5113495bSYour Name 		if (ret) {
127*5113495bSYour Name 			wmi_err("Failed to send set passpoint network list wmi cmd");
128*5113495bSYour Name 			wmi_buf_free(buf);
129*5113495bSYour Name 			return QDF_STATUS_E_FAILURE;
130*5113495bSYour Name 		}
131*5113495bSYour Name 	}
132*5113495bSYour Name 
133*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
134*5113495bSYour Name }
135*5113495bSYour Name 
136*5113495bSYour Name /** send_set_epno_network_list_cmd_tlv() - set epno network list
137*5113495bSYour Name  * @wmi_handle: wmi handle
138*5113495bSYour Name  * @req: epno config params request structure
139*5113495bSYour Name  *
140*5113495bSYour Name  * This function reads the incoming epno config request structure
141*5113495bSYour Name  * and constructs the WMI message to the firmware.
142*5113495bSYour Name  *
143*5113495bSYour Name  * Returns: 0 on success, error number otherwise
144*5113495bSYour Name  */
send_set_epno_network_list_cmd_tlv(wmi_unified_t wmi_handle,struct wifi_enhanced_pno_params * req)145*5113495bSYour Name static QDF_STATUS send_set_epno_network_list_cmd_tlv(wmi_unified_t wmi_handle,
146*5113495bSYour Name 		struct wifi_enhanced_pno_params *req)
147*5113495bSYour Name {
148*5113495bSYour Name 	wmi_nlo_config_cmd_fixed_param *cmd;
149*5113495bSYour Name 	nlo_configured_parameters *nlo_list;
150*5113495bSYour Name 	enlo_candidate_score_params *cand_score_params;
151*5113495bSYour Name 	u_int8_t i, *buf_ptr;
152*5113495bSYour Name 	wmi_buf_t buf;
153*5113495bSYour Name 	uint32_t len;
154*5113495bSYour Name 	QDF_STATUS ret;
155*5113495bSYour Name 
156*5113495bSYour Name 	/* Fixed Params */
157*5113495bSYour Name 	len = sizeof(*cmd);
158*5113495bSYour Name 	if (req->num_networks) {
159*5113495bSYour Name 		/* TLV place holder for array of structures
160*5113495bSYour Name 		 * then each nlo_configured_parameters(nlo_list) TLV.
161*5113495bSYour Name 		 */
162*5113495bSYour Name 		len += WMI_TLV_HDR_SIZE;
163*5113495bSYour Name 		len += (sizeof(nlo_configured_parameters)
164*5113495bSYour Name 			    * QDF_MIN(req->num_networks, WMI_NLO_MAX_SSIDS));
165*5113495bSYour Name 		/* TLV for array of uint32 channel_list */
166*5113495bSYour Name 		len += WMI_TLV_HDR_SIZE;
167*5113495bSYour Name 		/* TLV for nlo_channel_prediction_cfg */
168*5113495bSYour Name 		len += WMI_TLV_HDR_SIZE;
169*5113495bSYour Name 		/* TLV for candidate score params */
170*5113495bSYour Name 		len += sizeof(enlo_candidate_score_params);
171*5113495bSYour Name 	}
172*5113495bSYour Name 
173*5113495bSYour Name 	buf = wmi_buf_alloc(wmi_handle, len);
174*5113495bSYour Name 	if (!buf) {
175*5113495bSYour Name 		wmi_err("Failed allocate wmi buffer");
176*5113495bSYour Name 		return QDF_STATUS_E_NOMEM;
177*5113495bSYour Name 	}
178*5113495bSYour Name 
179*5113495bSYour Name 	cmd = (wmi_nlo_config_cmd_fixed_param *) wmi_buf_data(buf);
180*5113495bSYour Name 
181*5113495bSYour Name 	buf_ptr = (u_int8_t *) cmd;
182*5113495bSYour Name 	WMITLV_SET_HDR(&cmd->tlv_header,
183*5113495bSYour Name 		       WMITLV_TAG_STRUC_wmi_nlo_config_cmd_fixed_param,
184*5113495bSYour Name 		       WMITLV_GET_STRUCT_TLVLEN(
185*5113495bSYour Name 			       wmi_nlo_config_cmd_fixed_param));
186*5113495bSYour Name 	cmd->vdev_id = req->vdev_id;
187*5113495bSYour Name 
188*5113495bSYour Name 	/* set flag to reset if num of networks are 0 */
189*5113495bSYour Name 	cmd->flags = (req->num_networks == 0 ?
190*5113495bSYour Name 		WMI_NLO_CONFIG_ENLO_RESET : WMI_NLO_CONFIG_ENLO);
191*5113495bSYour Name 
192*5113495bSYour Name 	buf_ptr += sizeof(wmi_nlo_config_cmd_fixed_param);
193*5113495bSYour Name 
194*5113495bSYour Name 	cmd->no_of_ssids = QDF_MIN(req->num_networks, WMI_NLO_MAX_SSIDS);
195*5113495bSYour Name 	wmi_debug("SSID count: %d flags: %d",
196*5113495bSYour Name 		 cmd->no_of_ssids, cmd->flags);
197*5113495bSYour Name 
198*5113495bSYour Name 	/* Fill nlo_config only when num_networks are non zero */
199*5113495bSYour Name 	if (cmd->no_of_ssids) {
200*5113495bSYour Name 		/* Fill networks */
201*5113495bSYour Name 		WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_ARRAY_STRUC,
202*5113495bSYour Name 			cmd->no_of_ssids * sizeof(nlo_configured_parameters));
203*5113495bSYour Name 		buf_ptr += WMI_TLV_HDR_SIZE;
204*5113495bSYour Name 
205*5113495bSYour Name 		nlo_list = (nlo_configured_parameters *) buf_ptr;
206*5113495bSYour Name 		for (i = 0; i < cmd->no_of_ssids; i++) {
207*5113495bSYour Name 			WMITLV_SET_HDR(&nlo_list[i].tlv_header,
208*5113495bSYour Name 				WMITLV_TAG_ARRAY_BYTE,
209*5113495bSYour Name 				WMITLV_GET_STRUCT_TLVLEN(
210*5113495bSYour Name 				nlo_configured_parameters));
211*5113495bSYour Name 			/* Copy ssid and it's length */
212*5113495bSYour Name 			nlo_list[i].ssid.valid = true;
213*5113495bSYour Name 			nlo_list[i].ssid.ssid.ssid_len =
214*5113495bSYour Name 				req->networks[i].ssid.length;
215*5113495bSYour Name 			qdf_mem_copy(nlo_list[i].ssid.ssid.ssid,
216*5113495bSYour Name 				     req->networks[i].ssid.ssid,
217*5113495bSYour Name 				     nlo_list[i].ssid.ssid.ssid_len);
218*5113495bSYour Name 			wmi_debug("index: %d ssid: " QDF_SSID_FMT " len: %d", i,
219*5113495bSYour Name 				  QDF_SSID_REF(nlo_list[i].ssid.ssid.ssid_len,
220*5113495bSYour Name 					       nlo_list[i].ssid.ssid.ssid),
221*5113495bSYour Name 				  nlo_list[i].ssid.ssid.ssid_len);
222*5113495bSYour Name 
223*5113495bSYour Name 			/* Copy pno flags */
224*5113495bSYour Name 			nlo_list[i].bcast_nw_type.valid = true;
225*5113495bSYour Name 			nlo_list[i].bcast_nw_type.bcast_nw_type =
226*5113495bSYour Name 					req->networks[i].flags;
227*5113495bSYour Name 			wmi_debug("PNO flags: %u",
228*5113495bSYour Name 				 nlo_list[i].bcast_nw_type.bcast_nw_type);
229*5113495bSYour Name 
230*5113495bSYour Name 			/* Copy auth bit field */
231*5113495bSYour Name 			nlo_list[i].auth_type.valid = true;
232*5113495bSYour Name 			nlo_list[i].auth_type.auth_type =
233*5113495bSYour Name 					req->networks[i].auth_bit_field;
234*5113495bSYour Name 			wmi_debug("Auth bit field: %u",
235*5113495bSYour Name 				 nlo_list[i].auth_type.auth_type);
236*5113495bSYour Name 		}
237*5113495bSYour Name 
238*5113495bSYour Name 		buf_ptr += cmd->no_of_ssids * sizeof(nlo_configured_parameters);
239*5113495bSYour Name 		/* Fill the channel list */
240*5113495bSYour Name 		WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_ARRAY_UINT32, 0);
241*5113495bSYour Name 		buf_ptr += WMI_TLV_HDR_SIZE;
242*5113495bSYour Name 
243*5113495bSYour Name 		/* Fill prediction_param */
244*5113495bSYour Name 		WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_ARRAY_STRUC, 0);
245*5113495bSYour Name 		buf_ptr += WMI_TLV_HDR_SIZE;
246*5113495bSYour Name 
247*5113495bSYour Name 		/* Fill epno candidate score params */
248*5113495bSYour Name 		cand_score_params = (enlo_candidate_score_params *) buf_ptr;
249*5113495bSYour Name 		WMITLV_SET_HDR(buf_ptr,
250*5113495bSYour Name 			WMITLV_TAG_STRUC_enlo_candidate_score_param,
251*5113495bSYour Name 			WMITLV_GET_STRUCT_TLVLEN(enlo_candidate_score_params));
252*5113495bSYour Name 		cand_score_params->min5GHz_rssi =
253*5113495bSYour Name 			req->min_5ghz_rssi;
254*5113495bSYour Name 		cand_score_params->min24GHz_rssi =
255*5113495bSYour Name 			req->min_24ghz_rssi;
256*5113495bSYour Name 		cand_score_params->initial_score_max =
257*5113495bSYour Name 			req->initial_score_max;
258*5113495bSYour Name 		cand_score_params->current_connection_bonus =
259*5113495bSYour Name 			req->current_connection_bonus;
260*5113495bSYour Name 		cand_score_params->same_network_bonus =
261*5113495bSYour Name 			req->same_network_bonus;
262*5113495bSYour Name 		cand_score_params->secure_bonus =
263*5113495bSYour Name 			req->secure_bonus;
264*5113495bSYour Name 		cand_score_params->band5GHz_bonus =
265*5113495bSYour Name 			req->band_5ghz_bonus;
266*5113495bSYour Name 		buf_ptr += sizeof(enlo_candidate_score_params);
267*5113495bSYour Name 	}
268*5113495bSYour Name 
269*5113495bSYour Name 	ret = wmi_unified_cmd_send(wmi_handle, buf, len,
270*5113495bSYour Name 			WMI_NETWORK_LIST_OFFLOAD_CONFIG_CMDID);
271*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(ret)) {
272*5113495bSYour Name 		wmi_err("Failed to send nlo wmi cmd");
273*5113495bSYour Name 		wmi_buf_free(buf);
274*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
275*5113495bSYour Name 	}
276*5113495bSYour Name 
277*5113495bSYour Name 	wmi_debug("set ePNO list request sent successfully for vdev %d",
278*5113495bSYour Name 		 req->vdev_id);
279*5113495bSYour Name 
280*5113495bSYour Name 	return ret;
281*5113495bSYour Name }
282*5113495bSYour Name 
283*5113495bSYour Name /**
284*5113495bSYour Name  * send_extscan_get_capabilities_cmd_tlv() - extscan get capabilities
285*5113495bSYour Name  * @wmi_handle: wmi handle
286*5113495bSYour Name  * @pgetcapab: get capabilities params
287*5113495bSYour Name  *
288*5113495bSYour Name  * This function send request to fw to get extscan capabilities.
289*5113495bSYour Name  *
290*5113495bSYour Name  * Return: QDF status
291*5113495bSYour Name  */
send_extscan_get_capabilities_cmd_tlv(wmi_unified_t wmi_handle,struct extscan_capabilities_params * pgetcapab)292*5113495bSYour Name static QDF_STATUS send_extscan_get_capabilities_cmd_tlv(wmi_unified_t wmi_handle,
293*5113495bSYour Name 		    struct extscan_capabilities_params *pgetcapab)
294*5113495bSYour Name {
295*5113495bSYour Name 	wmi_extscan_get_capabilities_cmd_fixed_param *cmd;
296*5113495bSYour Name 	wmi_buf_t wmi_buf;
297*5113495bSYour Name 	uint32_t len;
298*5113495bSYour Name 	uint8_t *buf_ptr;
299*5113495bSYour Name 
300*5113495bSYour Name 	len = sizeof(*cmd);
301*5113495bSYour Name 	wmi_buf = wmi_buf_alloc(wmi_handle, len);
302*5113495bSYour Name 	if (!wmi_buf) {
303*5113495bSYour Name 		wmi_err("wmi_buf_alloc failed");
304*5113495bSYour Name 		return QDF_STATUS_E_NOMEM;
305*5113495bSYour Name 	}
306*5113495bSYour Name 	buf_ptr = (uint8_t *) wmi_buf_data(wmi_buf);
307*5113495bSYour Name 
308*5113495bSYour Name 	cmd = (wmi_extscan_get_capabilities_cmd_fixed_param *) buf_ptr;
309*5113495bSYour Name 	WMITLV_SET_HDR(&cmd->tlv_header,
310*5113495bSYour Name 	       WMITLV_TAG_STRUC_wmi_extscan_get_capabilities_cmd_fixed_param,
311*5113495bSYour Name 	       WMITLV_GET_STRUCT_TLVLEN
312*5113495bSYour Name 	       (wmi_extscan_get_capabilities_cmd_fixed_param));
313*5113495bSYour Name 
314*5113495bSYour Name 	cmd->request_id = pgetcapab->request_id;
315*5113495bSYour Name 
316*5113495bSYour Name 	if (wmi_unified_cmd_send(wmi_handle, wmi_buf, len,
317*5113495bSYour Name 				 WMI_EXTSCAN_GET_CAPABILITIES_CMDID)) {
318*5113495bSYour Name 		wmi_err("Failed to send extscan get capabilities cmd");
319*5113495bSYour Name 		wmi_buf_free(wmi_buf);
320*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
321*5113495bSYour Name 	}
322*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
323*5113495bSYour Name }
324*5113495bSYour Name 
325*5113495bSYour Name /**
326*5113495bSYour Name  * send_extscan_get_cached_results_cmd_tlv() - extscan get cached results
327*5113495bSYour Name  * @wmi_handle: wmi handle
328*5113495bSYour Name  * @pcached_results: cached results parameters
329*5113495bSYour Name  *
330*5113495bSYour Name  * This function send request to fw to get cached results.
331*5113495bSYour Name  *
332*5113495bSYour Name  * Return: QDF status
333*5113495bSYour Name  */
send_extscan_get_cached_results_cmd_tlv(wmi_unified_t wmi_handle,struct extscan_cached_result_params * pcached_results)334*5113495bSYour Name static QDF_STATUS send_extscan_get_cached_results_cmd_tlv(wmi_unified_t wmi_handle,
335*5113495bSYour Name 		  struct extscan_cached_result_params *pcached_results)
336*5113495bSYour Name {
337*5113495bSYour Name 	wmi_extscan_get_cached_results_cmd_fixed_param *cmd;
338*5113495bSYour Name 	wmi_buf_t wmi_buf;
339*5113495bSYour Name 	uint32_t len;
340*5113495bSYour Name 	uint8_t *buf_ptr;
341*5113495bSYour Name 
342*5113495bSYour Name 	len = sizeof(*cmd);
343*5113495bSYour Name 	wmi_buf = wmi_buf_alloc(wmi_handle, len);
344*5113495bSYour Name 	if (!wmi_buf) {
345*5113495bSYour Name 		wmi_err("wmi_buf_alloc failed");
346*5113495bSYour Name 		return QDF_STATUS_E_NOMEM;
347*5113495bSYour Name 	}
348*5113495bSYour Name 	buf_ptr = (uint8_t *) wmi_buf_data(wmi_buf);
349*5113495bSYour Name 
350*5113495bSYour Name 	cmd = (wmi_extscan_get_cached_results_cmd_fixed_param *) buf_ptr;
351*5113495bSYour Name 	WMITLV_SET_HDR(&cmd->tlv_header,
352*5113495bSYour Name 		WMITLV_TAG_STRUC_wmi_extscan_get_cached_results_cmd_fixed_param,
353*5113495bSYour Name 		WMITLV_GET_STRUCT_TLVLEN
354*5113495bSYour Name 		(wmi_extscan_get_cached_results_cmd_fixed_param));
355*5113495bSYour Name 
356*5113495bSYour Name 	cmd->request_id = pcached_results->request_id;
357*5113495bSYour Name 	cmd->vdev_id = pcached_results->vdev_id;
358*5113495bSYour Name 	cmd->control_flags = pcached_results->flush;
359*5113495bSYour Name 
360*5113495bSYour Name 	if (wmi_unified_cmd_send(wmi_handle, wmi_buf, len,
361*5113495bSYour Name 				 WMI_EXTSCAN_GET_CACHED_RESULTS_CMDID)) {
362*5113495bSYour Name 		wmi_err("failed to  command", __func__);
363*5113495bSYour Name 		wmi_buf_free(wmi_buf);
364*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
365*5113495bSYour Name 	}
366*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
367*5113495bSYour Name }
368*5113495bSYour Name 
369*5113495bSYour Name /**
370*5113495bSYour Name  * send_extscan_stop_change_monitor_cmd_tlv() - send stop change monitor cmd
371*5113495bSYour Name  * @wmi_handle: wmi handle
372*5113495bSYour Name  * @reset_req: Reset change request params
373*5113495bSYour Name  *
374*5113495bSYour Name  * This function sends stop change monitor request to fw.
375*5113495bSYour Name  *
376*5113495bSYour Name  * Return: QDF status
377*5113495bSYour Name  */
send_extscan_stop_change_monitor_cmd_tlv(wmi_unified_t wmi_handle,struct extscan_capabilities_reset_params * reset_req)378*5113495bSYour Name static QDF_STATUS send_extscan_stop_change_monitor_cmd_tlv
379*5113495bSYour Name 			(wmi_unified_t wmi_handle,
380*5113495bSYour Name 			struct extscan_capabilities_reset_params *reset_req)
381*5113495bSYour Name {
382*5113495bSYour Name 	wmi_extscan_configure_wlan_change_monitor_cmd_fixed_param *cmd;
383*5113495bSYour Name 	wmi_buf_t wmi_buf;
384*5113495bSYour Name 	uint32_t len;
385*5113495bSYour Name 	uint8_t *buf_ptr;
386*5113495bSYour Name 	int change_list = 0;
387*5113495bSYour Name 
388*5113495bSYour Name 	len = sizeof(*cmd);
389*5113495bSYour Name 
390*5113495bSYour Name 	/* reset significant change tlv is set to 0 */
391*5113495bSYour Name 	len += WMI_TLV_HDR_SIZE;
392*5113495bSYour Name 	len += change_list * sizeof(wmi_extscan_wlan_change_bssid_param);
393*5113495bSYour Name 	wmi_buf = wmi_buf_alloc(wmi_handle, len);
394*5113495bSYour Name 	if (!wmi_buf) {
395*5113495bSYour Name 		wmi_err("wmi_buf_alloc failed");
396*5113495bSYour Name 		return QDF_STATUS_E_NOMEM;
397*5113495bSYour Name 	}
398*5113495bSYour Name 	buf_ptr = (uint8_t *) wmi_buf_data(wmi_buf);
399*5113495bSYour Name 
400*5113495bSYour Name 	cmd = (wmi_extscan_configure_wlan_change_monitor_cmd_fixed_param *)
401*5113495bSYour Name 		buf_ptr;
402*5113495bSYour Name 	WMITLV_SET_HDR(&cmd->tlv_header,
403*5113495bSYour Name 	WMITLV_TAG_STRUC_wmi_extscan_configure_wlan_change_monitor_cmd_fixed_param,
404*5113495bSYour Name 		WMITLV_GET_STRUCT_TLVLEN
405*5113495bSYour Name 		(wmi_extscan_configure_wlan_change_monitor_cmd_fixed_param));
406*5113495bSYour Name 
407*5113495bSYour Name 	cmd->request_id = reset_req->request_id;
408*5113495bSYour Name 	cmd->vdev_id = reset_req->vdev_id;
409*5113495bSYour Name 	cmd->mode = 0;
410*5113495bSYour Name 
411*5113495bSYour Name 	buf_ptr += sizeof(*cmd);
412*5113495bSYour Name 	WMITLV_SET_HDR(buf_ptr,
413*5113495bSYour Name 		       WMITLV_TAG_ARRAY_STRUC,
414*5113495bSYour Name 		       change_list *
415*5113495bSYour Name 		       sizeof(wmi_extscan_wlan_change_bssid_param));
416*5113495bSYour Name 	buf_ptr += WMI_TLV_HDR_SIZE + (change_list *
417*5113495bSYour Name 				       sizeof
418*5113495bSYour Name 				       (wmi_extscan_wlan_change_bssid_param));
419*5113495bSYour Name 
420*5113495bSYour Name 	if (wmi_unified_cmd_send(wmi_handle, wmi_buf, len,
421*5113495bSYour Name 			 WMI_EXTSCAN_CONFIGURE_WLAN_CHANGE_MONITOR_CMDID)) {
422*5113495bSYour Name 		wmi_err("Failed to send extscan change monitor cmd");
423*5113495bSYour Name 		wmi_buf_free(wmi_buf);
424*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
425*5113495bSYour Name 	}
426*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
427*5113495bSYour Name }
428*5113495bSYour Name 
429*5113495bSYour Name /**
430*5113495bSYour Name  * wmi_get_buf_extscan_change_monitor_cmd() - fill change monitor request
431*5113495bSYour Name  * @wmi_handle: wmi handle
432*5113495bSYour Name  * @psigchange: change monitor request params
433*5113495bSYour Name  * @buf: wmi buffer
434*5113495bSYour Name  * @buf_len: buffer length
435*5113495bSYour Name  *
436*5113495bSYour Name  * This function fills elements of change monitor request buffer.
437*5113495bSYour Name  *
438*5113495bSYour Name  * Return: QDF status
439*5113495bSYour Name  */
wmi_get_buf_extscan_change_monitor_cmd(wmi_unified_t wmi_handle,struct extscan_set_sig_changereq_params * psigchange,wmi_buf_t * buf,int * buf_len)440*5113495bSYour Name static QDF_STATUS wmi_get_buf_extscan_change_monitor_cmd
441*5113495bSYour Name 			(wmi_unified_t wmi_handle,
442*5113495bSYour Name 			struct extscan_set_sig_changereq_params
443*5113495bSYour Name 			*psigchange, wmi_buf_t *buf, int *buf_len)
444*5113495bSYour Name {
445*5113495bSYour Name 	wmi_extscan_configure_wlan_change_monitor_cmd_fixed_param *cmd;
446*5113495bSYour Name 	wmi_extscan_wlan_change_bssid_param *dest_chglist;
447*5113495bSYour Name 	uint8_t *buf_ptr;
448*5113495bSYour Name 	int j;
449*5113495bSYour Name 	int len = sizeof(*cmd);
450*5113495bSYour Name 	uint32_t numap = psigchange->num_ap;
451*5113495bSYour Name 	struct ap_threshold_params *src_ap = psigchange->ap;
452*5113495bSYour Name 
453*5113495bSYour Name 	if (!numap || (numap > WMI_WLAN_EXTSCAN_MAX_SIGNIFICANT_CHANGE_APS)) {
454*5113495bSYour Name 		wmi_err("Invalid number of bssid's");
455*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
456*5113495bSYour Name 	}
457*5113495bSYour Name 	len += WMI_TLV_HDR_SIZE;
458*5113495bSYour Name 	len += numap * sizeof(wmi_extscan_wlan_change_bssid_param);
459*5113495bSYour Name 
460*5113495bSYour Name 	*buf = wmi_buf_alloc(wmi_handle, len);
461*5113495bSYour Name 	if (!*buf) {
462*5113495bSYour Name 		wmi_err("Failed to allocate memory for change monitor cmd");
463*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
464*5113495bSYour Name 	}
465*5113495bSYour Name 	buf_ptr = (uint8_t *) wmi_buf_data(*buf);
466*5113495bSYour Name 	cmd =
467*5113495bSYour Name 		(wmi_extscan_configure_wlan_change_monitor_cmd_fixed_param *)
468*5113495bSYour Name 		buf_ptr;
469*5113495bSYour Name 	WMITLV_SET_HDR(&cmd->tlv_header,
470*5113495bSYour Name 	WMITLV_TAG_STRUC_wmi_extscan_configure_wlan_change_monitor_cmd_fixed_param,
471*5113495bSYour Name 	       WMITLV_GET_STRUCT_TLVLEN
472*5113495bSYour Name 	       (wmi_extscan_configure_wlan_change_monitor_cmd_fixed_param));
473*5113495bSYour Name 
474*5113495bSYour Name 	cmd->request_id = psigchange->request_id;
475*5113495bSYour Name 	cmd->vdev_id = psigchange->vdev_id;
476*5113495bSYour Name 	cmd->total_entries = numap;
477*5113495bSYour Name 	cmd->mode = 1;
478*5113495bSYour Name 	cmd->num_entries_in_page = numap;
479*5113495bSYour Name 	cmd->lost_ap_scan_count = psigchange->lostap_sample_size;
480*5113495bSYour Name 	cmd->max_rssi_samples = psigchange->rssi_sample_size;
481*5113495bSYour Name 	cmd->rssi_averaging_samples = psigchange->rssi_sample_size;
482*5113495bSYour Name 	cmd->max_out_of_range_count = psigchange->min_breaching;
483*5113495bSYour Name 
484*5113495bSYour Name 	buf_ptr += sizeof(*cmd);
485*5113495bSYour Name 	WMITLV_SET_HDR(buf_ptr,
486*5113495bSYour Name 		       WMITLV_TAG_ARRAY_STRUC,
487*5113495bSYour Name 		       numap * sizeof(wmi_extscan_wlan_change_bssid_param));
488*5113495bSYour Name 	dest_chglist = (wmi_extscan_wlan_change_bssid_param *)
489*5113495bSYour Name 		       (buf_ptr + WMI_TLV_HDR_SIZE);
490*5113495bSYour Name 
491*5113495bSYour Name 	for (j = 0; j < numap; j++) {
492*5113495bSYour Name 		WMITLV_SET_HDR(dest_chglist,
493*5113495bSYour Name 		       WMITLV_TAG_STRUC_wmi_extscan_bucket_cmd_fixed_param,
494*5113495bSYour Name 		       WMITLV_GET_STRUCT_TLVLEN
495*5113495bSYour Name 		       (wmi_extscan_wlan_change_bssid_param));
496*5113495bSYour Name 
497*5113495bSYour Name 		dest_chglist->lower_rssi_limit = src_ap->low;
498*5113495bSYour Name 		dest_chglist->upper_rssi_limit = src_ap->high;
499*5113495bSYour Name 		WMI_CHAR_ARRAY_TO_MAC_ADDR(src_ap->bssid.bytes,
500*5113495bSYour Name 					   &dest_chglist->bssid);
501*5113495bSYour Name 
502*5113495bSYour Name 		wmi_debug("min_rssi: %d", dest_chglist->lower_rssi_limit);
503*5113495bSYour Name 		dest_chglist++;
504*5113495bSYour Name 		src_ap++;
505*5113495bSYour Name 	}
506*5113495bSYour Name 	buf_ptr += WMI_TLV_HDR_SIZE +
507*5113495bSYour Name 		   (numap * sizeof(wmi_extscan_wlan_change_bssid_param));
508*5113495bSYour Name 	*buf_len = len;
509*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
510*5113495bSYour Name }
511*5113495bSYour Name 
512*5113495bSYour Name /**
513*5113495bSYour Name  * send_extscan_start_change_monitor_cmd_tlv() - send start change monitor cmd
514*5113495bSYour Name  * @wmi_handle: wmi handle
515*5113495bSYour Name  * @psigchange: change monitor request params
516*5113495bSYour Name  *
517*5113495bSYour Name  * This function sends start change monitor request to fw.
518*5113495bSYour Name  *
519*5113495bSYour Name  * Return: QDF status
520*5113495bSYour Name  */
send_extscan_start_change_monitor_cmd_tlv(wmi_unified_t wmi_handle,struct extscan_set_sig_changereq_params * psigchange)521*5113495bSYour Name static QDF_STATUS send_extscan_start_change_monitor_cmd_tlv
522*5113495bSYour Name 			(wmi_unified_t wmi_handle,
523*5113495bSYour Name 			struct extscan_set_sig_changereq_params *
524*5113495bSYour Name 			psigchange)
525*5113495bSYour Name {
526*5113495bSYour Name 	QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
527*5113495bSYour Name 	wmi_buf_t buf;
528*5113495bSYour Name 	int len;
529*5113495bSYour Name 
530*5113495bSYour Name 
531*5113495bSYour Name 	qdf_status = wmi_get_buf_extscan_change_monitor_cmd(wmi_handle,
532*5113495bSYour Name 			     psigchange, &buf,
533*5113495bSYour Name 			     &len);
534*5113495bSYour Name 	if (qdf_status != QDF_STATUS_SUCCESS) {
535*5113495bSYour Name 		wmi_err("Failed to get buffer for change monitor cmd");
536*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
537*5113495bSYour Name 	}
538*5113495bSYour Name 	if (!buf) {
539*5113495bSYour Name 		wmi_err("Failed to get buffer");
540*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
541*5113495bSYour Name 	}
542*5113495bSYour Name 	if (wmi_unified_cmd_send(wmi_handle, buf, len,
543*5113495bSYour Name 		 WMI_EXTSCAN_CONFIGURE_WLAN_CHANGE_MONITOR_CMDID)) {
544*5113495bSYour Name 		wmi_err("Failed to send command");
545*5113495bSYour Name 		wmi_buf_free(buf);
546*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
547*5113495bSYour Name 	}
548*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
549*5113495bSYour Name }
550*5113495bSYour Name 
551*5113495bSYour Name /**
552*5113495bSYour Name  * send_extscan_stop_hotlist_monitor_cmd_tlv() - stop hotlist monitor
553*5113495bSYour Name  * @wmi_handle: wmi handle
554*5113495bSYour Name  * @photlist_reset: hotlist reset params
555*5113495bSYour Name  *
556*5113495bSYour Name  * This function configures hotlist monitor to stop in fw.
557*5113495bSYour Name  *
558*5113495bSYour Name  * Return: QDF status
559*5113495bSYour Name  */
send_extscan_stop_hotlist_monitor_cmd_tlv(wmi_unified_t wmi_handle,struct extscan_bssid_hotlist_reset_params * photlist_reset)560*5113495bSYour Name static QDF_STATUS send_extscan_stop_hotlist_monitor_cmd_tlv
561*5113495bSYour Name 		(wmi_unified_t wmi_handle,
562*5113495bSYour Name 		struct extscan_bssid_hotlist_reset_params *photlist_reset)
563*5113495bSYour Name {
564*5113495bSYour Name 	wmi_extscan_configure_hotlist_monitor_cmd_fixed_param *cmd;
565*5113495bSYour Name 	wmi_buf_t wmi_buf;
566*5113495bSYour Name 	uint32_t len;
567*5113495bSYour Name 	uint8_t *buf_ptr;
568*5113495bSYour Name 	int hotlist_entries = 0;
569*5113495bSYour Name 
570*5113495bSYour Name 	len = sizeof(*cmd);
571*5113495bSYour Name 
572*5113495bSYour Name 	/* reset bssid hotlist with tlv set to 0 */
573*5113495bSYour Name 	len += WMI_TLV_HDR_SIZE;
574*5113495bSYour Name 	len += hotlist_entries * sizeof(wmi_extscan_hotlist_entry);
575*5113495bSYour Name 
576*5113495bSYour Name 	wmi_buf = wmi_buf_alloc(wmi_handle, len);
577*5113495bSYour Name 	if (!wmi_buf) {
578*5113495bSYour Name 		wmi_err("wmi_buf_alloc failed");
579*5113495bSYour Name 		return QDF_STATUS_E_NOMEM;
580*5113495bSYour Name 	}
581*5113495bSYour Name 
582*5113495bSYour Name 	buf_ptr = (uint8_t *) wmi_buf_data(wmi_buf);
583*5113495bSYour Name 	cmd = (wmi_extscan_configure_hotlist_monitor_cmd_fixed_param *)
584*5113495bSYour Name 	      buf_ptr;
585*5113495bSYour Name 	WMITLV_SET_HDR(&cmd->tlv_header,
586*5113495bSYour Name 	WMITLV_TAG_STRUC_wmi_extscan_configure_hotlist_monitor_cmd_fixed_param,
587*5113495bSYour Name 	WMITLV_GET_STRUCT_TLVLEN
588*5113495bSYour Name 	(wmi_extscan_configure_hotlist_monitor_cmd_fixed_param));
589*5113495bSYour Name 
590*5113495bSYour Name 	cmd->request_id = photlist_reset->request_id;
591*5113495bSYour Name 	cmd->vdev_id = photlist_reset->vdev_id;
592*5113495bSYour Name 	cmd->mode = 0;
593*5113495bSYour Name 
594*5113495bSYour Name 	buf_ptr += sizeof(*cmd);
595*5113495bSYour Name 	WMITLV_SET_HDR(buf_ptr,
596*5113495bSYour Name 		       WMITLV_TAG_ARRAY_STRUC,
597*5113495bSYour Name 		       hotlist_entries * sizeof(wmi_extscan_hotlist_entry));
598*5113495bSYour Name 	buf_ptr += WMI_TLV_HDR_SIZE +
599*5113495bSYour Name 		   (hotlist_entries * sizeof(wmi_extscan_hotlist_entry));
600*5113495bSYour Name 
601*5113495bSYour Name 	if (wmi_unified_cmd_send(wmi_handle, wmi_buf, len,
602*5113495bSYour Name 				WMI_EXTSCAN_CONFIGURE_HOTLIST_MONITOR_CMDID)) {
603*5113495bSYour Name 		wmi_err("Failed to send extscan cfg hotlist cmd");
604*5113495bSYour Name 		wmi_buf_free(wmi_buf);
605*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
606*5113495bSYour Name 	}
607*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
608*5113495bSYour Name }
609*5113495bSYour Name 
610*5113495bSYour Name /**
611*5113495bSYour Name  * send_stop_extscan_cmd_tlv() - stop extscan command to fw.
612*5113495bSYour Name  * @wmi_handle: wmi handle
613*5113495bSYour Name  * @pstopcmd: stop scan command request params
614*5113495bSYour Name  *
615*5113495bSYour Name  * This function sends stop extscan request to fw.
616*5113495bSYour Name  *
617*5113495bSYour Name  * Return: CDF Status.
618*5113495bSYour Name  */
send_stop_extscan_cmd_tlv(wmi_unified_t wmi_handle,struct extscan_stop_req_params * pstopcmd)619*5113495bSYour Name static QDF_STATUS send_stop_extscan_cmd_tlv(wmi_unified_t wmi_handle,
620*5113495bSYour Name 			  struct extscan_stop_req_params *pstopcmd)
621*5113495bSYour Name {
622*5113495bSYour Name 	wmi_extscan_stop_cmd_fixed_param *cmd;
623*5113495bSYour Name 	wmi_buf_t wmi_buf;
624*5113495bSYour Name 	uint32_t len;
625*5113495bSYour Name 	uint8_t *buf_ptr;
626*5113495bSYour Name 
627*5113495bSYour Name 	len = sizeof(*cmd);
628*5113495bSYour Name 	wmi_buf = wmi_buf_alloc(wmi_handle, len);
629*5113495bSYour Name 	if (!wmi_buf) {
630*5113495bSYour Name 		wmi_err("wmi_buf_alloc failed");
631*5113495bSYour Name 		return QDF_STATUS_E_NOMEM;
632*5113495bSYour Name 	}
633*5113495bSYour Name 	buf_ptr = (uint8_t *) wmi_buf_data(wmi_buf);
634*5113495bSYour Name 	cmd = (wmi_extscan_stop_cmd_fixed_param *) buf_ptr;
635*5113495bSYour Name 	WMITLV_SET_HDR(&cmd->tlv_header,
636*5113495bSYour Name 		       WMITLV_TAG_STRUC_wmi_extscan_stop_cmd_fixed_param,
637*5113495bSYour Name 		       WMITLV_GET_STRUCT_TLVLEN
638*5113495bSYour Name 			       (wmi_extscan_stop_cmd_fixed_param));
639*5113495bSYour Name 
640*5113495bSYour Name 	cmd->request_id = pstopcmd->request_id;
641*5113495bSYour Name 	cmd->vdev_id = pstopcmd->vdev_id;
642*5113495bSYour Name 
643*5113495bSYour Name 	if (wmi_unified_cmd_send(wmi_handle, wmi_buf, len,
644*5113495bSYour Name 				 WMI_EXTSCAN_STOP_CMDID)) {
645*5113495bSYour Name 		wmi_err("Failed to send extscan stop cmd");
646*5113495bSYour Name 		wmi_buf_free(wmi_buf);
647*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
648*5113495bSYour Name 	}
649*5113495bSYour Name 
650*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
651*5113495bSYour Name }
652*5113495bSYour Name 
653*5113495bSYour Name /**
654*5113495bSYour Name  * wmi_get_buf_extscan_start_cmd() - Fill extscan start request
655*5113495bSYour Name  * @wmi_handle: wmi handle
656*5113495bSYour Name  * @pstart: scan command request params
657*5113495bSYour Name  * @buf: event buffer
658*5113495bSYour Name  * @buf_len: length of buffer
659*5113495bSYour Name  *
660*5113495bSYour Name  * This function fills individual elements of extscan request and
661*5113495bSYour Name  * TLV for buckets, channel list.
662*5113495bSYour Name  *
663*5113495bSYour Name  * Return: CDF Status.
664*5113495bSYour Name  */
665*5113495bSYour Name static
wmi_get_buf_extscan_start_cmd(wmi_unified_t wmi_handle,struct wifi_scan_cmd_req_params * pstart,wmi_buf_t * buf,int * buf_len)666*5113495bSYour Name QDF_STATUS wmi_get_buf_extscan_start_cmd(wmi_unified_t wmi_handle,
667*5113495bSYour Name 			 struct wifi_scan_cmd_req_params *pstart,
668*5113495bSYour Name 			 wmi_buf_t *buf, int *buf_len)
669*5113495bSYour Name {
670*5113495bSYour Name 	wmi_extscan_start_cmd_fixed_param *cmd;
671*5113495bSYour Name 	wmi_extscan_bucket *dest_blist;
672*5113495bSYour Name 	wmi_extscan_bucket_channel *dest_clist;
673*5113495bSYour Name 	struct wifi_scan_bucket_params *src_bucket = pstart->buckets;
674*5113495bSYour Name 	struct wifi_scan_channelspec_params *src_channel = src_bucket->channels;
675*5113495bSYour Name 	struct wifi_scan_channelspec_params save_channel[WMI_WLAN_EXTSCAN_MAX_CHANNELS];
676*5113495bSYour Name 
677*5113495bSYour Name 	uint8_t *buf_ptr;
678*5113495bSYour Name 	int i, k, count = 0;
679*5113495bSYour Name 	int len = sizeof(*cmd);
680*5113495bSYour Name 	int nbuckets = pstart->num_buckets;
681*5113495bSYour Name 	int nchannels = 0;
682*5113495bSYour Name 
683*5113495bSYour Name 	/* These TLV's are are NULL by default */
684*5113495bSYour Name 	uint32_t ie_len_with_pad = 0;
685*5113495bSYour Name 	int num_ssid = 0;
686*5113495bSYour Name 	int num_bssid = 0;
687*5113495bSYour Name 	int ie_len = 0;
688*5113495bSYour Name 
689*5113495bSYour Name 	uint32_t base_period = pstart->base_period;
690*5113495bSYour Name 
691*5113495bSYour Name 	/* TLV placeholder for ssid_list (NULL) */
692*5113495bSYour Name 	len += WMI_TLV_HDR_SIZE;
693*5113495bSYour Name 	len += num_ssid * sizeof(wmi_ssid);
694*5113495bSYour Name 
695*5113495bSYour Name 	/* TLV placeholder for bssid_list (NULL) */
696*5113495bSYour Name 	len += WMI_TLV_HDR_SIZE;
697*5113495bSYour Name 	len += num_bssid * sizeof(wmi_mac_addr);
698*5113495bSYour Name 
699*5113495bSYour Name 	/* TLV placeholder for ie_data (NULL) */
700*5113495bSYour Name 	len += WMI_TLV_HDR_SIZE;
701*5113495bSYour Name 	len += ie_len * sizeof(uint32_t);
702*5113495bSYour Name 
703*5113495bSYour Name 	/* TLV placeholder for bucket */
704*5113495bSYour Name 	len += WMI_TLV_HDR_SIZE;
705*5113495bSYour Name 	len += nbuckets * sizeof(wmi_extscan_bucket);
706*5113495bSYour Name 
707*5113495bSYour Name 	/* TLV channel placeholder */
708*5113495bSYour Name 	len += WMI_TLV_HDR_SIZE;
709*5113495bSYour Name 	for (i = 0; i < nbuckets; i++) {
710*5113495bSYour Name 		nchannels += src_bucket->num_channels;
711*5113495bSYour Name 		src_bucket++;
712*5113495bSYour Name 	}
713*5113495bSYour Name 
714*5113495bSYour Name 	wmi_debug("Total buckets: %d total #of channels is %d",
715*5113495bSYour Name 		 nbuckets, nchannels);
716*5113495bSYour Name 	len += nchannels * sizeof(wmi_extscan_bucket_channel);
717*5113495bSYour Name 	/* Allocate the memory */
718*5113495bSYour Name 	*buf = wmi_buf_alloc(wmi_handle, len);
719*5113495bSYour Name 	if (!*buf) {
720*5113495bSYour Name 		wmi_err("Failed to allocate memory for start extscan cmd");
721*5113495bSYour Name 		return QDF_STATUS_E_NOMEM;
722*5113495bSYour Name 	}
723*5113495bSYour Name 	buf_ptr = (uint8_t *) wmi_buf_data(*buf);
724*5113495bSYour Name 	cmd = (wmi_extscan_start_cmd_fixed_param *) buf_ptr;
725*5113495bSYour Name 	WMITLV_SET_HDR(&cmd->tlv_header,
726*5113495bSYour Name 		       WMITLV_TAG_STRUC_wmi_extscan_start_cmd_fixed_param,
727*5113495bSYour Name 		       WMITLV_GET_STRUCT_TLVLEN
728*5113495bSYour Name 			       (wmi_extscan_start_cmd_fixed_param));
729*5113495bSYour Name 
730*5113495bSYour Name 	cmd->request_id = pstart->request_id;
731*5113495bSYour Name 	cmd->vdev_id = pstart->vdev_id;
732*5113495bSYour Name 	cmd->base_period = pstart->base_period;
733*5113495bSYour Name 	cmd->num_buckets = nbuckets;
734*5113495bSYour Name 	cmd->configuration_flags = 0;
735*5113495bSYour Name 	if (pstart->configuration_flags & WMI_EXTSCAN_LP_EXTENDED_BATCHING)
736*5113495bSYour Name 		cmd->configuration_flags |= WMI_EXTSCAN_EXTENDED_BATCHING_EN;
737*5113495bSYour Name 	wmi_debug("configuration_flags: 0x%x", cmd->configuration_flags);
738*5113495bSYour Name #ifdef FEATURE_WLAN_EXTSCAN
739*5113495bSYour Name 	cmd->min_rest_time = WMI_EXTSCAN_REST_TIME;
740*5113495bSYour Name 	cmd->max_rest_time = WMI_EXTSCAN_REST_TIME;
741*5113495bSYour Name 	cmd->max_scan_time = WMI_EXTSCAN_MAX_SCAN_TIME;
742*5113495bSYour Name 	cmd->burst_duration = WMI_EXTSCAN_BURST_DURATION;
743*5113495bSYour Name #endif
744*5113495bSYour Name 
745*5113495bSYour Name 	/* The max dwell time is retrieved from the first channel
746*5113495bSYour Name 	 * of the first bucket and kept common for all channels.
747*5113495bSYour Name 	 */
748*5113495bSYour Name 	cmd->min_dwell_time_active = pstart->min_dwell_time_active;
749*5113495bSYour Name 	cmd->max_dwell_time_active = pstart->max_dwell_time_active;
750*5113495bSYour Name 	cmd->min_dwell_time_passive = pstart->min_dwell_time_passive;
751*5113495bSYour Name 	cmd->max_dwell_time_passive = pstart->max_dwell_time_passive;
752*5113495bSYour Name 	cmd->max_bssids_per_scan_cycle = pstart->max_ap_per_scan;
753*5113495bSYour Name 	cmd->max_table_usage = pstart->report_threshold_percent;
754*5113495bSYour Name 	cmd->report_threshold_num_scans = pstart->report_threshold_num_scans;
755*5113495bSYour Name 
756*5113495bSYour Name 	cmd->repeat_probe_time = cmd->max_dwell_time_active /
757*5113495bSYour Name 					WMI_SCAN_NPROBES_DEFAULT;
758*5113495bSYour Name 	cmd->probe_delay = 0;
759*5113495bSYour Name 	cmd->probe_spacing_time = 0;
760*5113495bSYour Name 	cmd->idle_time = 0;
761*5113495bSYour Name 	cmd->scan_ctrl_flags = WMI_SCAN_ADD_BCAST_PROBE_REQ |
762*5113495bSYour Name 			       WMI_SCAN_ADD_CCK_RATES |
763*5113495bSYour Name 			       WMI_SCAN_ADD_OFDM_RATES |
764*5113495bSYour Name 			       WMI_SCAN_ADD_SPOOFED_MAC_IN_PROBE_REQ |
765*5113495bSYour Name 			       WMI_SCAN_ADD_DS_IE_IN_PROBE_REQ;
766*5113495bSYour Name 	WMI_SCAN_SET_DWELL_MODE(cmd->scan_ctrl_flags,
767*5113495bSYour Name 			pstart->extscan_adaptive_dwell_mode);
768*5113495bSYour Name 	cmd->scan_priority = WMI_SCAN_PRIORITY_VERY_LOW;
769*5113495bSYour Name 	cmd->num_ssids = 0;
770*5113495bSYour Name 	cmd->num_bssid = 0;
771*5113495bSYour Name 	cmd->ie_len = 0;
772*5113495bSYour Name 	cmd->n_probes = (cmd->repeat_probe_time > 0) ?
773*5113495bSYour Name 			cmd->max_dwell_time_active / cmd->repeat_probe_time : 0;
774*5113495bSYour Name 
775*5113495bSYour Name 	buf_ptr += sizeof(*cmd);
776*5113495bSYour Name 	WMITLV_SET_HDR(buf_ptr,
777*5113495bSYour Name 		       WMITLV_TAG_ARRAY_FIXED_STRUC,
778*5113495bSYour Name 		       num_ssid * sizeof(wmi_ssid));
779*5113495bSYour Name 	buf_ptr += WMI_TLV_HDR_SIZE + (num_ssid * sizeof(wmi_ssid));
780*5113495bSYour Name 
781*5113495bSYour Name 	WMITLV_SET_HDR(buf_ptr,
782*5113495bSYour Name 		       WMITLV_TAG_ARRAY_FIXED_STRUC,
783*5113495bSYour Name 		       num_bssid * sizeof(wmi_mac_addr));
784*5113495bSYour Name 	buf_ptr += WMI_TLV_HDR_SIZE + (num_bssid * sizeof(wmi_mac_addr));
785*5113495bSYour Name 
786*5113495bSYour Name 	ie_len_with_pad = 0;
787*5113495bSYour Name 	WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_ARRAY_BYTE,
788*5113495bSYour Name 			  ie_len_with_pad);
789*5113495bSYour Name 	buf_ptr += WMI_TLV_HDR_SIZE + ie_len_with_pad;
790*5113495bSYour Name 
791*5113495bSYour Name 	WMITLV_SET_HDR(buf_ptr,
792*5113495bSYour Name 		       WMITLV_TAG_ARRAY_STRUC,
793*5113495bSYour Name 		       nbuckets * sizeof(wmi_extscan_bucket));
794*5113495bSYour Name 	dest_blist = (wmi_extscan_bucket *)
795*5113495bSYour Name 		     (buf_ptr + WMI_TLV_HDR_SIZE);
796*5113495bSYour Name 	src_bucket = pstart->buckets;
797*5113495bSYour Name 
798*5113495bSYour Name 	/* Retrieve scanning information from each bucket and
799*5113495bSYour Name 	 * channels and send it to the target
800*5113495bSYour Name 	 */
801*5113495bSYour Name 	for (i = 0; i < nbuckets; i++) {
802*5113495bSYour Name 		WMITLV_SET_HDR(dest_blist,
803*5113495bSYour Name 		      WMITLV_TAG_STRUC_wmi_extscan_bucket_cmd_fixed_param,
804*5113495bSYour Name 		      WMITLV_GET_STRUCT_TLVLEN(wmi_extscan_bucket));
805*5113495bSYour Name 
806*5113495bSYour Name 		dest_blist->bucket_id = src_bucket->bucket;
807*5113495bSYour Name 		dest_blist->base_period_multiplier =
808*5113495bSYour Name 			src_bucket->period / base_period;
809*5113495bSYour Name 		dest_blist->min_period = src_bucket->period;
810*5113495bSYour Name 		dest_blist->max_period = src_bucket->max_period;
811*5113495bSYour Name 		dest_blist->exp_backoff = src_bucket->exponent;
812*5113495bSYour Name 		dest_blist->exp_max_step_count = src_bucket->step_count;
813*5113495bSYour Name 		dest_blist->channel_band = src_bucket->band;
814*5113495bSYour Name 		dest_blist->num_channels = src_bucket->num_channels;
815*5113495bSYour Name 		dest_blist->notify_extscan_events = 0;
816*5113495bSYour Name 
817*5113495bSYour Name 		if (src_bucket->report_events &
818*5113495bSYour Name 					WMI_EXTSCAN_REPORT_EVENTS_EACH_SCAN)
819*5113495bSYour Name 			dest_blist->notify_extscan_events =
820*5113495bSYour Name 					WMI_EXTSCAN_CYCLE_COMPLETED_EVENT |
821*5113495bSYour Name 					WMI_EXTSCAN_CYCLE_STARTED_EVENT;
822*5113495bSYour Name 
823*5113495bSYour Name 		if (src_bucket->report_events &
824*5113495bSYour Name 				WMI_EXTSCAN_REPORT_EVENTS_FULL_RESULTS) {
825*5113495bSYour Name 			dest_blist->forwarding_flags =
826*5113495bSYour Name 				WMI_EXTSCAN_FORWARD_FRAME_TO_HOST;
827*5113495bSYour Name 			dest_blist->notify_extscan_events |=
828*5113495bSYour Name 				WMI_EXTSCAN_BUCKET_COMPLETED_EVENT |
829*5113495bSYour Name 				WMI_EXTSCAN_CYCLE_STARTED_EVENT |
830*5113495bSYour Name 				WMI_EXTSCAN_CYCLE_COMPLETED_EVENT;
831*5113495bSYour Name 		} else {
832*5113495bSYour Name 			dest_blist->forwarding_flags =
833*5113495bSYour Name 				WMI_EXTSCAN_NO_FORWARDING;
834*5113495bSYour Name 		}
835*5113495bSYour Name 
836*5113495bSYour Name 		if (src_bucket->report_events &
837*5113495bSYour Name 					WMI_EXTSCAN_REPORT_EVENTS_NO_BATCH)
838*5113495bSYour Name 			dest_blist->configuration_flags = 0;
839*5113495bSYour Name 		else
840*5113495bSYour Name 			dest_blist->configuration_flags =
841*5113495bSYour Name 				WMI_EXTSCAN_BUCKET_CACHE_RESULTS;
842*5113495bSYour Name 
843*5113495bSYour Name 		wmi_debug("ntfy_extscan_events:%u cfg_flags:%u fwd_flags:%u",
844*5113495bSYour Name 			  dest_blist->notify_extscan_events,
845*5113495bSYour Name 			  dest_blist->configuration_flags,
846*5113495bSYour Name 			  dest_blist->forwarding_flags);
847*5113495bSYour Name 
848*5113495bSYour Name 		dest_blist->min_dwell_time_active =
849*5113495bSYour Name 				   src_bucket->min_dwell_time_active;
850*5113495bSYour Name 		dest_blist->max_dwell_time_active =
851*5113495bSYour Name 				   src_bucket->max_dwell_time_active;
852*5113495bSYour Name 		dest_blist->min_dwell_time_passive =
853*5113495bSYour Name 				   src_bucket->min_dwell_time_passive;
854*5113495bSYour Name 		dest_blist->max_dwell_time_passive =
855*5113495bSYour Name 				   src_bucket->max_dwell_time_passive;
856*5113495bSYour Name 		src_channel = src_bucket->channels;
857*5113495bSYour Name 
858*5113495bSYour Name 		/* save the channel info to later populate
859*5113495bSYour Name 		 * the  channel TLV
860*5113495bSYour Name 		 */
861*5113495bSYour Name 		for (k = 0; k < src_bucket->num_channels; k++) {
862*5113495bSYour Name 			save_channel[count++].channel = src_channel->channel;
863*5113495bSYour Name 			src_channel++;
864*5113495bSYour Name 		}
865*5113495bSYour Name 		dest_blist++;
866*5113495bSYour Name 		src_bucket++;
867*5113495bSYour Name 	}
868*5113495bSYour Name 	buf_ptr += WMI_TLV_HDR_SIZE + (nbuckets * sizeof(wmi_extscan_bucket));
869*5113495bSYour Name 	WMITLV_SET_HDR(buf_ptr,
870*5113495bSYour Name 		       WMITLV_TAG_ARRAY_STRUC,
871*5113495bSYour Name 		       nchannels * sizeof(wmi_extscan_bucket_channel));
872*5113495bSYour Name 	dest_clist = (wmi_extscan_bucket_channel *)
873*5113495bSYour Name 		     (buf_ptr + WMI_TLV_HDR_SIZE);
874*5113495bSYour Name 
875*5113495bSYour Name 	/* Active or passive scan is based on the bucket dwell time
876*5113495bSYour Name 	 * and channel specific active,passive scans are not
877*5113495bSYour Name 	 * supported yet
878*5113495bSYour Name 	 */
879*5113495bSYour Name 	for (i = 0; i < nchannels; i++) {
880*5113495bSYour Name 		WMITLV_SET_HDR(dest_clist,
881*5113495bSYour Name 		WMITLV_TAG_STRUC_wmi_extscan_bucket_channel_event_fixed_param,
882*5113495bSYour Name 			   WMITLV_GET_STRUCT_TLVLEN
883*5113495bSYour Name 			   (wmi_extscan_bucket_channel));
884*5113495bSYour Name 		dest_clist->channel = save_channel[i].channel;
885*5113495bSYour Name 		dest_clist++;
886*5113495bSYour Name 	}
887*5113495bSYour Name 	buf_ptr += WMI_TLV_HDR_SIZE +
888*5113495bSYour Name 		   (nchannels * sizeof(wmi_extscan_bucket_channel));
889*5113495bSYour Name 	*buf_len = len;
890*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
891*5113495bSYour Name }
892*5113495bSYour Name 
893*5113495bSYour Name /**
894*5113495bSYour Name  * send_start_extscan_cmd_tlv() - start extscan command to fw.
895*5113495bSYour Name  * @wmi_handle: wmi handle
896*5113495bSYour Name  * @pstart: scan command request params
897*5113495bSYour Name  *
898*5113495bSYour Name  * This function sends start extscan request to fw.
899*5113495bSYour Name  *
900*5113495bSYour Name  * Return: CDF Status.
901*5113495bSYour Name  */
send_start_extscan_cmd_tlv(wmi_unified_t wmi_handle,struct wifi_scan_cmd_req_params * pstart)902*5113495bSYour Name static QDF_STATUS send_start_extscan_cmd_tlv(wmi_unified_t wmi_handle,
903*5113495bSYour Name 			  struct wifi_scan_cmd_req_params *pstart)
904*5113495bSYour Name {
905*5113495bSYour Name 	QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
906*5113495bSYour Name 	wmi_buf_t buf;
907*5113495bSYour Name 	int len;
908*5113495bSYour Name 
909*5113495bSYour Name 	/* Fill individual elements of extscan request and
910*5113495bSYour Name 	 * TLV for buckets, channel list.
911*5113495bSYour Name 	 */
912*5113495bSYour Name 	qdf_status = wmi_get_buf_extscan_start_cmd(wmi_handle,
913*5113495bSYour Name 			     pstart, &buf, &len);
914*5113495bSYour Name 	if (qdf_status != QDF_STATUS_SUCCESS) {
915*5113495bSYour Name 		wmi_err("Failed to get buffer for ext scan cmd");
916*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
917*5113495bSYour Name 	}
918*5113495bSYour Name 	if (!buf) {
919*5113495bSYour Name 		wmi_err("Failed to get buffer for current extscan info");
920*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
921*5113495bSYour Name 	}
922*5113495bSYour Name 	if (wmi_unified_cmd_send(wmi_handle, buf,
923*5113495bSYour Name 				 len, WMI_EXTSCAN_START_CMDID)) {
924*5113495bSYour Name 		wmi_err("Failed to send extscan start cmd");
925*5113495bSYour Name 		wmi_buf_free(buf);
926*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
927*5113495bSYour Name 	}
928*5113495bSYour Name 
929*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
930*5113495bSYour Name }
931*5113495bSYour Name 
932*5113495bSYour Name /** wmi_get_hotlist_entries_per_page() - hotlist entries per page
933*5113495bSYour Name  * @wmi_handle: wmi handle.
934*5113495bSYour Name  * @cmd: size of command structure.
935*5113495bSYour Name  * @per_entry_size: per entry size.
936*5113495bSYour Name  *
937*5113495bSYour Name  * This utility function calculates how many hotlist entries can
938*5113495bSYour Name  * fit in one page.
939*5113495bSYour Name  *
940*5113495bSYour Name  * Return: number of entries
941*5113495bSYour Name  */
wmi_get_hotlist_entries_per_page(wmi_unified_t wmi_handle,size_t cmd_size,size_t per_entry_size)942*5113495bSYour Name static inline int wmi_get_hotlist_entries_per_page
943*5113495bSYour Name 				(wmi_unified_t wmi_handle,
944*5113495bSYour Name 				size_t cmd_size,
945*5113495bSYour Name 				size_t per_entry_size)
946*5113495bSYour Name {
947*5113495bSYour Name 	uint32_t avail_space = 0;
948*5113495bSYour Name 	int num_entries = 0;
949*5113495bSYour Name 	uint16_t max_msg_len = wmi_get_max_msg_len(wmi_handle);
950*5113495bSYour Name 
951*5113495bSYour Name 	/* Calculate number of hotlist entries that can
952*5113495bSYour Name 	 * be passed in wma message request.
953*5113495bSYour Name 	 */
954*5113495bSYour Name 	avail_space = max_msg_len - cmd_size;
955*5113495bSYour Name 	num_entries = avail_space / per_entry_size;
956*5113495bSYour Name 	return num_entries;
957*5113495bSYour Name }
958*5113495bSYour Name 
959*5113495bSYour Name /**
960*5113495bSYour Name  * send_extscan_start_hotlist_monitor_cmd_tlv() - start hotlist monitor
961*5113495bSYour Name  * @wmi_handle: wmi handle
962*5113495bSYour Name  * @params: hotlist params
963*5113495bSYour Name  *
964*5113495bSYour Name  * This function configures hotlist monitor to start in fw.
965*5113495bSYour Name  *
966*5113495bSYour Name  * Return: QDF status
967*5113495bSYour Name  */
send_extscan_start_hotlist_monitor_cmd_tlv(wmi_unified_t wmi_handle,struct extscan_bssid_hotlist_set_params * params)968*5113495bSYour Name static QDF_STATUS send_extscan_start_hotlist_monitor_cmd_tlv
969*5113495bSYour Name 			(wmi_unified_t wmi_handle,
970*5113495bSYour Name 			struct extscan_bssid_hotlist_set_params *params)
971*5113495bSYour Name {
972*5113495bSYour Name 	wmi_extscan_configure_hotlist_monitor_cmd_fixed_param *cmd = NULL;
973*5113495bSYour Name 	wmi_extscan_hotlist_entry *dest_hotlist;
974*5113495bSYour Name 	struct ap_threshold_params *src_ap = params->ap;
975*5113495bSYour Name 	wmi_buf_t buf;
976*5113495bSYour Name 	uint8_t *buf_ptr;
977*5113495bSYour Name 
978*5113495bSYour Name 	int j, index = 0;
979*5113495bSYour Name 	int cmd_len = 0;
980*5113495bSYour Name 	int num_entries;
981*5113495bSYour Name 	int min_entries = 0;
982*5113495bSYour Name 	uint32_t numap = params->num_ap;
983*5113495bSYour Name 	int len = sizeof(*cmd);
984*5113495bSYour Name 
985*5113495bSYour Name 	len += WMI_TLV_HDR_SIZE;
986*5113495bSYour Name 	cmd_len = len;
987*5113495bSYour Name 
988*5113495bSYour Name 	num_entries = wmi_get_hotlist_entries_per_page(wmi_handle,
989*5113495bSYour Name 							cmd_len,
990*5113495bSYour Name 							sizeof(*dest_hotlist));
991*5113495bSYour Name 	/* setbssid hotlist expects the bssid list
992*5113495bSYour Name 	 * to be non zero value
993*5113495bSYour Name 	 */
994*5113495bSYour Name 	if (!numap || (numap > WMI_WLAN_EXTSCAN_MAX_HOTLIST_APS)) {
995*5113495bSYour Name 		wmi_err("Invalid number of APs: %d", numap);
996*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
997*5113495bSYour Name 	}
998*5113495bSYour Name 
999*5113495bSYour Name 	/* Split the hot list entry pages and send multiple command
1000*5113495bSYour Name 	 * requests if the buffer reaches the maximum request size
1001*5113495bSYour Name 	 */
1002*5113495bSYour Name 	while (index < numap) {
1003*5113495bSYour Name 		min_entries = QDF_MIN(num_entries, numap);
1004*5113495bSYour Name 		len += min_entries * sizeof(wmi_extscan_hotlist_entry);
1005*5113495bSYour Name 		buf = wmi_buf_alloc(wmi_handle, len);
1006*5113495bSYour Name 		if (!buf) {
1007*5113495bSYour Name 			wmi_err("wmi_buf_alloc failed");
1008*5113495bSYour Name 			return QDF_STATUS_E_FAILURE;
1009*5113495bSYour Name 		}
1010*5113495bSYour Name 		buf_ptr = (uint8_t *) wmi_buf_data(buf);
1011*5113495bSYour Name 		cmd = (wmi_extscan_configure_hotlist_monitor_cmd_fixed_param *)
1012*5113495bSYour Name 		      buf_ptr;
1013*5113495bSYour Name 		WMITLV_SET_HDR(&cmd->tlv_header,
1014*5113495bSYour Name 			       WMITLV_TAG_STRUC_wmi_extscan_configure_hotlist_monitor_cmd_fixed_param,
1015*5113495bSYour Name 			       WMITLV_GET_STRUCT_TLVLEN
1016*5113495bSYour Name 				       (wmi_extscan_configure_hotlist_monitor_cmd_fixed_param));
1017*5113495bSYour Name 
1018*5113495bSYour Name 		/* Multiple requests are sent until the num_entries_in_page
1019*5113495bSYour Name 		 * matches the total_entries
1020*5113495bSYour Name 		 */
1021*5113495bSYour Name 		cmd->request_id = params->request_id;
1022*5113495bSYour Name 		cmd->vdev_id = params->vdev_id;
1023*5113495bSYour Name 		cmd->total_entries = numap;
1024*5113495bSYour Name 		cmd->mode = 1;
1025*5113495bSYour Name 		cmd->num_entries_in_page = min_entries;
1026*5113495bSYour Name 		cmd->lost_ap_scan_count = params->lost_ap_sample_size;
1027*5113495bSYour Name 		cmd->first_entry_index = index;
1028*5113495bSYour Name 
1029*5113495bSYour Name 		wmi_debug("vdev id:%d total_entries: %d num_entries: %d lost_ap_sample_size: %d",
1030*5113495bSYour Name 			 cmd->vdev_id, cmd->total_entries,
1031*5113495bSYour Name 			 cmd->num_entries_in_page,
1032*5113495bSYour Name 			 cmd->lost_ap_scan_count);
1033*5113495bSYour Name 
1034*5113495bSYour Name 		buf_ptr += sizeof(*cmd);
1035*5113495bSYour Name 		WMITLV_SET_HDR(buf_ptr,
1036*5113495bSYour Name 			       WMITLV_TAG_ARRAY_STRUC,
1037*5113495bSYour Name 			       min_entries * sizeof(wmi_extscan_hotlist_entry));
1038*5113495bSYour Name 		dest_hotlist = (wmi_extscan_hotlist_entry *)
1039*5113495bSYour Name 			       (buf_ptr + WMI_TLV_HDR_SIZE);
1040*5113495bSYour Name 
1041*5113495bSYour Name 		/* Populate bssid, channel info and rssi
1042*5113495bSYour Name 		 * for the bssid's that are sent as hotlists.
1043*5113495bSYour Name 		 */
1044*5113495bSYour Name 		for (j = 0; j < min_entries; j++) {
1045*5113495bSYour Name 			WMITLV_SET_HDR(dest_hotlist,
1046*5113495bSYour Name 				       WMITLV_TAG_STRUC_wmi_extscan_bucket_cmd_fixed_param,
1047*5113495bSYour Name 				       WMITLV_GET_STRUCT_TLVLEN
1048*5113495bSYour Name 					       (wmi_extscan_hotlist_entry));
1049*5113495bSYour Name 
1050*5113495bSYour Name 			dest_hotlist->min_rssi = src_ap->low;
1051*5113495bSYour Name 			WMI_CHAR_ARRAY_TO_MAC_ADDR(src_ap->bssid.bytes,
1052*5113495bSYour Name 						   &dest_hotlist->bssid);
1053*5113495bSYour Name 
1054*5113495bSYour Name 			wmi_debug("channel:%d min_rssi %d",
1055*5113495bSYour Name 				 dest_hotlist->channel,
1056*5113495bSYour Name 				 dest_hotlist->min_rssi);
1057*5113495bSYour Name 			wmi_debug("bssid mac_addr31to0: 0x%x, mac_addr47to32: 0x%x",
1058*5113495bSYour Name 				dest_hotlist->bssid.mac_addr31to0,
1059*5113495bSYour Name 				dest_hotlist->bssid.mac_addr47to32);
1060*5113495bSYour Name 			dest_hotlist++;
1061*5113495bSYour Name 			src_ap++;
1062*5113495bSYour Name 		}
1063*5113495bSYour Name 		buf_ptr += WMI_TLV_HDR_SIZE +
1064*5113495bSYour Name 			   (min_entries * sizeof(wmi_extscan_hotlist_entry));
1065*5113495bSYour Name 
1066*5113495bSYour Name 		if (wmi_unified_cmd_send(wmi_handle, buf, len,
1067*5113495bSYour Name 				WMI_EXTSCAN_CONFIGURE_HOTLIST_MONITOR_CMDID)) {
1068*5113495bSYour Name 			wmi_err("Failed to send extscan cfg hotlist monitor cmd");
1069*5113495bSYour Name 			wmi_buf_free(buf);
1070*5113495bSYour Name 			return QDF_STATUS_E_FAILURE;
1071*5113495bSYour Name 		}
1072*5113495bSYour Name 		index = index + min_entries;
1073*5113495bSYour Name 		num_entries = numap - min_entries;
1074*5113495bSYour Name 		len = cmd_len;
1075*5113495bSYour Name 	}
1076*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1077*5113495bSYour Name }
1078*5113495bSYour Name 
wmi_extscan_attach_tlv(wmi_unified_t wmi_handle)1079*5113495bSYour Name void wmi_extscan_attach_tlv(wmi_unified_t wmi_handle)
1080*5113495bSYour Name {
1081*5113495bSYour Name 	struct wmi_ops *ops = wmi_handle->ops;
1082*5113495bSYour Name 	ops->send_reset_passpoint_network_list_cmd =
1083*5113495bSYour Name 				send_reset_passpoint_network_list_cmd_tlv;
1084*5113495bSYour Name 	ops->send_set_passpoint_network_list_cmd =
1085*5113495bSYour Name 				send_set_passpoint_network_list_cmd_tlv;
1086*5113495bSYour Name 	ops->send_set_epno_network_list_cmd =
1087*5113495bSYour Name 				send_set_epno_network_list_cmd_tlv;
1088*5113495bSYour Name 	ops->send_extscan_get_capabilities_cmd =
1089*5113495bSYour Name 				 send_extscan_get_capabilities_cmd_tlv;
1090*5113495bSYour Name 	ops->send_extscan_get_cached_results_cmd =
1091*5113495bSYour Name 				send_extscan_get_cached_results_cmd_tlv;
1092*5113495bSYour Name 	ops->send_extscan_stop_change_monitor_cmd =
1093*5113495bSYour Name 				send_extscan_stop_change_monitor_cmd_tlv;
1094*5113495bSYour Name 	ops->send_extscan_start_change_monitor_cmd =
1095*5113495bSYour Name 				send_extscan_start_change_monitor_cmd_tlv;
1096*5113495bSYour Name 	ops->send_extscan_stop_hotlist_monitor_cmd =
1097*5113495bSYour Name 				send_extscan_stop_hotlist_monitor_cmd_tlv;
1098*5113495bSYour Name 	ops->send_extscan_start_hotlist_monitor_cmd =
1099*5113495bSYour Name 				send_extscan_start_hotlist_monitor_cmd_tlv;
1100*5113495bSYour Name 	ops->send_stop_extscan_cmd = send_stop_extscan_cmd_tlv;
1101*5113495bSYour Name 	ops->send_start_extscan_cmd = send_start_extscan_cmd_tlv;
1102*5113495bSYour Name }
1103