xref: /wlan-driver/qca-wifi-host-cmn/wmi/src/wmi_unified_sta_tlv.c (revision 5113495b16420b49004c444715d2daae2066e7dc)
1*5113495bSYour Name /*
2*5113495bSYour Name  * Copyright (c) 2013-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_version.h"
23*5113495bSYour Name #include "wmi_unified_priv.h"
24*5113495bSYour Name #include "wmi_unified_sta_param.h"
25*5113495bSYour Name #include "wmi_unified_sta_api.h"
26*5113495bSYour Name #ifdef FEATURE_WLAN_TDLS
27*5113495bSYour Name #include <wlan_tdls_public_structs.h>
28*5113495bSYour Name #endif
29*5113495bSYour Name 
30*5113495bSYour Name /**
31*5113495bSYour Name  * send_set_sta_sa_query_param_cmd_tlv() - set sta sa query parameters
32*5113495bSYour Name  * @wmi_handle: wmi handle
33*5113495bSYour Name  * @vdev_id: vdev id
34*5113495bSYour Name  * @max_retries: max retries
35*5113495bSYour Name  * @retry_interval: retry interval
36*5113495bSYour Name  * This function sets sta query related parameters in fw.
37*5113495bSYour Name  *
38*5113495bSYour Name  * Return: QDF_STATUS_SUCCESS for success otherwise failure
39*5113495bSYour Name  */
send_set_sta_sa_query_param_cmd_tlv(wmi_unified_t wmi_handle,uint8_t vdev_id,uint32_t max_retries,uint32_t retry_interval)40*5113495bSYour Name static QDF_STATUS send_set_sta_sa_query_param_cmd_tlv(wmi_unified_t wmi_handle,
41*5113495bSYour Name 						      uint8_t vdev_id,
42*5113495bSYour Name 						      uint32_t max_retries,
43*5113495bSYour Name 						      uint32_t retry_interval)
44*5113495bSYour Name {
45*5113495bSYour Name 	wmi_buf_t buf;
46*5113495bSYour Name 	WMI_PMF_OFFLOAD_SET_SA_QUERY_CMD_fixed_param *cmd;
47*5113495bSYour Name 	int len;
48*5113495bSYour Name 
49*5113495bSYour Name 	len = sizeof(*cmd);
50*5113495bSYour Name 	buf = wmi_buf_alloc(wmi_handle, len);
51*5113495bSYour Name 	if (!buf) {
52*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
53*5113495bSYour Name 	}
54*5113495bSYour Name 
55*5113495bSYour Name 	cmd = (WMI_PMF_OFFLOAD_SET_SA_QUERY_CMD_fixed_param *)wmi_buf_data(buf);
56*5113495bSYour Name 	WMITLV_SET_HDR(&cmd->tlv_header,
57*5113495bSYour Name 		WMITLV_TAG_STRUC_WMI_PMF_OFFLOAD_SET_SA_QUERY_CMD_fixed_param,
58*5113495bSYour Name 		WMITLV_GET_STRUCT_TLVLEN
59*5113495bSYour Name 			(WMI_PMF_OFFLOAD_SET_SA_QUERY_CMD_fixed_param));
60*5113495bSYour Name 
61*5113495bSYour Name 	cmd->vdev_id = vdev_id;
62*5113495bSYour Name 	cmd->sa_query_max_retry_count = max_retries;
63*5113495bSYour Name 	cmd->sa_query_retry_interval = retry_interval;
64*5113495bSYour Name 
65*5113495bSYour Name 	wmi_debug("STA sa query: vdev_id:%d interval:%u retry count:%d",
66*5113495bSYour Name 		 vdev_id, retry_interval, max_retries);
67*5113495bSYour Name 
68*5113495bSYour Name 	wmi_mtrace(WMI_PMF_OFFLOAD_SET_SA_QUERY_CMDID, cmd->vdev_id, 0);
69*5113495bSYour Name 	if (wmi_unified_cmd_send(wmi_handle, buf, len,
70*5113495bSYour Name 				 WMI_PMF_OFFLOAD_SET_SA_QUERY_CMDID)) {
71*5113495bSYour Name 		wmi_err("Failed to offload STA SA Query");
72*5113495bSYour Name 		wmi_buf_free(buf);
73*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
74*5113495bSYour Name 	}
75*5113495bSYour Name 
76*5113495bSYour Name 	wmi_debug("Exit");
77*5113495bSYour Name 	return 0;
78*5113495bSYour Name }
79*5113495bSYour Name 
80*5113495bSYour Name /**
81*5113495bSYour Name  * send_set_sta_keep_alive_cmd_tlv() - set sta keep alive parameters
82*5113495bSYour Name  * @wmi_handle: wmi handle
83*5113495bSYour Name  * @params: sta keep alive parameter
84*5113495bSYour Name  *
85*5113495bSYour Name  * This function sets keep alive related parameters in fw.
86*5113495bSYour Name  *
87*5113495bSYour Name  * Return: QDF status
88*5113495bSYour Name  */
89*5113495bSYour Name static QDF_STATUS
send_set_sta_keep_alive_cmd_tlv(wmi_unified_t wmi_handle,struct sta_keep_alive_params * params)90*5113495bSYour Name send_set_sta_keep_alive_cmd_tlv(wmi_unified_t wmi_handle,
91*5113495bSYour Name 				struct sta_keep_alive_params *params)
92*5113495bSYour Name {
93*5113495bSYour Name 	wmi_buf_t buf;
94*5113495bSYour Name 	WMI_STA_KEEPALIVE_CMD_fixed_param *cmd;
95*5113495bSYour Name 	WMI_STA_KEEPALVE_ARP_RESPONSE *arp_rsp;
96*5113495bSYour Name 	uint8_t *buf_ptr;
97*5113495bSYour Name 	int len;
98*5113495bSYour Name 	QDF_STATUS ret;
99*5113495bSYour Name 
100*5113495bSYour Name 	wmi_debug("Enter");
101*5113495bSYour Name 
102*5113495bSYour Name 	len = sizeof(*cmd) + sizeof(*arp_rsp);
103*5113495bSYour Name 	buf = wmi_buf_alloc(wmi_handle, len);
104*5113495bSYour Name 	if (!buf) {
105*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
106*5113495bSYour Name 	}
107*5113495bSYour Name 
108*5113495bSYour Name 	cmd = (WMI_STA_KEEPALIVE_CMD_fixed_param *) wmi_buf_data(buf);
109*5113495bSYour Name 	buf_ptr = (uint8_t *) cmd;
110*5113495bSYour Name 	WMITLV_SET_HDR(&cmd->tlv_header,
111*5113495bSYour Name 		       WMITLV_TAG_STRUC_WMI_STA_KEEPALIVE_CMD_fixed_param,
112*5113495bSYour Name 		       WMITLV_GET_STRUCT_TLVLEN
113*5113495bSYour Name 			       (WMI_STA_KEEPALIVE_CMD_fixed_param));
114*5113495bSYour Name 	cmd->interval = params->timeperiod;
115*5113495bSYour Name 	cmd->enable = (params->timeperiod) ? 1 : 0;
116*5113495bSYour Name 	cmd->vdev_id = params->vdev_id;
117*5113495bSYour Name 	wmi_debug("Keep Alive: vdev_id:%d interval:%u method:%d",
118*5113495bSYour Name 		 params->vdev_id, params->timeperiod, params->method);
119*5113495bSYour Name 	arp_rsp = (WMI_STA_KEEPALVE_ARP_RESPONSE *) (buf_ptr + sizeof(*cmd));
120*5113495bSYour Name 	WMITLV_SET_HDR(&arp_rsp->tlv_header,
121*5113495bSYour Name 		       WMITLV_TAG_STRUC_WMI_STA_KEEPALVE_ARP_RESPONSE,
122*5113495bSYour Name 		       WMITLV_GET_STRUCT_TLVLEN(WMI_STA_KEEPALVE_ARP_RESPONSE));
123*5113495bSYour Name 
124*5113495bSYour Name 	if ((params->method == WMI_KEEP_ALIVE_UNSOLICIT_ARP_RSP) ||
125*5113495bSYour Name 	    (params->method ==
126*5113495bSYour Name 	     WMI_STA_KEEPALIVE_METHOD_GRATUITOUS_ARP_REQUEST)) {
127*5113495bSYour Name 		cmd->method = params->method;
128*5113495bSYour Name 		qdf_mem_copy(&arp_rsp->sender_prot_addr, params->hostv4addr,
129*5113495bSYour Name 			     QDF_IPV4_ADDR_SIZE);
130*5113495bSYour Name 		qdf_mem_copy(&arp_rsp->target_prot_addr, params->destv4addr,
131*5113495bSYour Name 			     QDF_IPV4_ADDR_SIZE);
132*5113495bSYour Name 		WMI_CHAR_ARRAY_TO_MAC_ADDR(params->destmac,
133*5113495bSYour Name 					   &arp_rsp->dest_mac_addr);
134*5113495bSYour Name 	} else if (WMI_KEEP_ALIVE_MGMT_FRAME == params->method) {
135*5113495bSYour Name 		cmd->method = WMI_STA_KEEPALIVE_METHOD_MGMT_VENDOR_ACTION;
136*5113495bSYour Name 	} else {
137*5113495bSYour Name 		cmd->method = WMI_STA_KEEPALIVE_METHOD_NULL_FRAME;
138*5113495bSYour Name 	}
139*5113495bSYour Name 
140*5113495bSYour Name 	wmi_mtrace(WMI_STA_KEEPALIVE_CMDID, cmd->vdev_id, 0);
141*5113495bSYour Name 	ret = wmi_unified_cmd_send(wmi_handle, buf, len,
142*5113495bSYour Name 				   WMI_STA_KEEPALIVE_CMDID);
143*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(ret)) {
144*5113495bSYour Name 		wmi_err("Failed to set KeepAlive");
145*5113495bSYour Name 		wmi_buf_free(buf);
146*5113495bSYour Name 	}
147*5113495bSYour Name 
148*5113495bSYour Name 	wmi_debug("Exit");
149*5113495bSYour Name 	return ret;
150*5113495bSYour Name }
151*5113495bSYour Name 
152*5113495bSYour Name /**
153*5113495bSYour Name  * send_vdev_set_gtx_cfg_cmd_tlv() - set GTX params
154*5113495bSYour Name  * @wmi_handle: wmi handle
155*5113495bSYour Name  * @if_id: vdev id
156*5113495bSYour Name  * @gtx_info: GTX config params
157*5113495bSYour Name  *
158*5113495bSYour Name  * This function set GTX related params in firmware.
159*5113495bSYour Name  *
160*5113495bSYour Name  * Return: QDF_STATUS_SUCCESS for success or error code
161*5113495bSYour Name  */
send_vdev_set_gtx_cfg_cmd_tlv(wmi_unified_t wmi_handle,uint32_t if_id,struct wmi_gtx_config * gtx_info)162*5113495bSYour Name static QDF_STATUS send_vdev_set_gtx_cfg_cmd_tlv(wmi_unified_t wmi_handle, uint32_t if_id,
163*5113495bSYour Name 				  struct wmi_gtx_config *gtx_info)
164*5113495bSYour Name {
165*5113495bSYour Name 	wmi_vdev_set_gtx_params_cmd_fixed_param *cmd;
166*5113495bSYour Name 	wmi_buf_t buf;
167*5113495bSYour Name 	QDF_STATUS ret;
168*5113495bSYour Name 	int len = sizeof(wmi_vdev_set_gtx_params_cmd_fixed_param);
169*5113495bSYour Name 
170*5113495bSYour Name 	buf = wmi_buf_alloc(wmi_handle, len);
171*5113495bSYour Name 	if (!buf) {
172*5113495bSYour Name 		return QDF_STATUS_E_NOMEM;
173*5113495bSYour Name 	}
174*5113495bSYour Name 	cmd = (wmi_vdev_set_gtx_params_cmd_fixed_param *) wmi_buf_data(buf);
175*5113495bSYour Name 	WMITLV_SET_HDR(&cmd->tlv_header,
176*5113495bSYour Name 		       WMITLV_TAG_STRUC_wmi_vdev_set_gtx_params_cmd_fixed_param,
177*5113495bSYour Name 		       WMITLV_GET_STRUCT_TLVLEN
178*5113495bSYour Name 			       (wmi_vdev_set_gtx_params_cmd_fixed_param));
179*5113495bSYour Name 	cmd->vdev_id = if_id;
180*5113495bSYour Name 
181*5113495bSYour Name 	cmd->gtxRTMask[0] = gtx_info->gtx_rt_mask[0];
182*5113495bSYour Name 	cmd->gtxRTMask[1] = gtx_info->gtx_rt_mask[1];
183*5113495bSYour Name 	cmd->userGtxMask = gtx_info->gtx_usrcfg;
184*5113495bSYour Name 	cmd->gtxPERThreshold = gtx_info->gtx_threshold;
185*5113495bSYour Name 	cmd->gtxPERMargin = gtx_info->gtx_margin;
186*5113495bSYour Name 	cmd->gtxTPCstep = gtx_info->gtx_tpcstep;
187*5113495bSYour Name 	cmd->gtxTPCMin = gtx_info->gtx_tpcmin;
188*5113495bSYour Name 	cmd->gtxBWMask = gtx_info->gtx_bwmask;
189*5113495bSYour Name 
190*5113495bSYour Name 	wmi_debug("Setting vdev%d GTX values:htmcs 0x%x, vhtmcs 0x%x, usermask 0x%x, \
191*5113495bSYour Name 		 gtxPERThreshold %d, gtxPERMargin %d, gtxTPCstep %d, gtxTPCMin %d, \
192*5113495bSYour Name 		 gtxBWMask 0x%x.", if_id, cmd->gtxRTMask[0], cmd->gtxRTMask[1],
193*5113495bSYour Name 		 cmd->userGtxMask, cmd->gtxPERThreshold, cmd->gtxPERMargin,
194*5113495bSYour Name 		 cmd->gtxTPCstep, cmd->gtxTPCMin, cmd->gtxBWMask);
195*5113495bSYour Name 
196*5113495bSYour Name 	wmi_mtrace(WMI_VDEV_SET_GTX_PARAMS_CMDID, cmd->vdev_id, 0);
197*5113495bSYour Name 	ret = wmi_unified_cmd_send(wmi_handle, buf, len,
198*5113495bSYour Name 				   WMI_VDEV_SET_GTX_PARAMS_CMDID);
199*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(ret)) {
200*5113495bSYour Name 		wmi_err("Failed to set GTX PARAMS");
201*5113495bSYour Name 		wmi_buf_free(buf);
202*5113495bSYour Name 	}
203*5113495bSYour Name 	return ret;
204*5113495bSYour Name }
205*5113495bSYour Name 
206*5113495bSYour Name /**
207*5113495bSYour Name  * send_process_dhcp_ind_cmd_tlv() - process dhcp indication from SME
208*5113495bSYour Name  * @wmi_handle: wmi handle
209*5113495bSYour Name  * @ta_dhcp_ind: DHCP indication parameter
210*5113495bSYour Name  *
211*5113495bSYour Name  * Return: CDF Status
212*5113495bSYour Name  */
send_process_dhcp_ind_cmd_tlv(wmi_unified_t wmi_handle,wmi_peer_set_param_cmd_fixed_param * ta_dhcp_ind)213*5113495bSYour Name static QDF_STATUS send_process_dhcp_ind_cmd_tlv(wmi_unified_t wmi_handle,
214*5113495bSYour Name 				wmi_peer_set_param_cmd_fixed_param *ta_dhcp_ind)
215*5113495bSYour Name {
216*5113495bSYour Name 	QDF_STATUS status;
217*5113495bSYour Name 	wmi_buf_t buf = NULL;
218*5113495bSYour Name 	uint8_t *buf_ptr;
219*5113495bSYour Name 	wmi_peer_set_param_cmd_fixed_param *peer_set_param_fp;
220*5113495bSYour Name 	int len = sizeof(wmi_peer_set_param_cmd_fixed_param);
221*5113495bSYour Name 
222*5113495bSYour Name 	buf = wmi_buf_alloc(wmi_handle, len);
223*5113495bSYour Name 	if (!buf) {
224*5113495bSYour Name 		return QDF_STATUS_E_NOMEM;
225*5113495bSYour Name 	}
226*5113495bSYour Name 
227*5113495bSYour Name 	buf_ptr = (uint8_t *) wmi_buf_data(buf);
228*5113495bSYour Name 	peer_set_param_fp = (wmi_peer_set_param_cmd_fixed_param *) buf_ptr;
229*5113495bSYour Name 	WMITLV_SET_HDR(&peer_set_param_fp->tlv_header,
230*5113495bSYour Name 		       WMITLV_TAG_STRUC_wmi_peer_set_param_cmd_fixed_param,
231*5113495bSYour Name 		       WMITLV_GET_STRUCT_TLVLEN
232*5113495bSYour Name 			       (wmi_peer_set_param_cmd_fixed_param));
233*5113495bSYour Name 
234*5113495bSYour Name 	/* fill in values */
235*5113495bSYour Name 	peer_set_param_fp->vdev_id = ta_dhcp_ind->vdev_id;
236*5113495bSYour Name 	peer_set_param_fp->param_id = ta_dhcp_ind->param_id;
237*5113495bSYour Name 	peer_set_param_fp->param_value = ta_dhcp_ind->param_value;
238*5113495bSYour Name 	qdf_mem_copy(&peer_set_param_fp->peer_macaddr,
239*5113495bSYour Name 		     &ta_dhcp_ind->peer_macaddr,
240*5113495bSYour Name 		     sizeof(ta_dhcp_ind->peer_macaddr));
241*5113495bSYour Name 
242*5113495bSYour Name 	wmi_mtrace(WMI_PEER_SET_PARAM_CMDID, NO_SESSION, 0);
243*5113495bSYour Name 	status = wmi_unified_cmd_send(wmi_handle, buf,
244*5113495bSYour Name 				      len, WMI_PEER_SET_PARAM_CMDID);
245*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
246*5113495bSYour Name 		wmi_err("wmi_unified_cmd_send WMI_PEER_SET_PARAM_CMD"
247*5113495bSYour Name 			 " returned Error %d", status);
248*5113495bSYour Name 		wmi_buf_free(buf);
249*5113495bSYour Name 	}
250*5113495bSYour Name 
251*5113495bSYour Name 	return status;
252*5113495bSYour Name }
253*5113495bSYour Name 
254*5113495bSYour Name /**
255*5113495bSYour Name  * send_get_link_speed_cmd_tlv() -send command to get linkspeed
256*5113495bSYour Name  * @wmi_handle: wmi handle
257*5113495bSYour Name  * @peer_macaddr: peer address
258*5113495bSYour Name  *
259*5113495bSYour Name  * Return: QDF status
260*5113495bSYour Name  */
send_get_link_speed_cmd_tlv(wmi_unified_t wmi_handle,wmi_mac_addr peer_macaddr)261*5113495bSYour Name static QDF_STATUS send_get_link_speed_cmd_tlv(wmi_unified_t wmi_handle,
262*5113495bSYour Name 					      wmi_mac_addr peer_macaddr)
263*5113495bSYour Name {
264*5113495bSYour Name 	wmi_peer_get_estimated_linkspeed_cmd_fixed_param *cmd;
265*5113495bSYour Name 	wmi_buf_t wmi_buf;
266*5113495bSYour Name 	uint32_t len;
267*5113495bSYour Name 	uint8_t *buf_ptr;
268*5113495bSYour Name 
269*5113495bSYour Name 	len = sizeof(wmi_peer_get_estimated_linkspeed_cmd_fixed_param);
270*5113495bSYour Name 	wmi_buf = wmi_buf_alloc(wmi_handle, len);
271*5113495bSYour Name 	if (!wmi_buf) {
272*5113495bSYour Name 		return QDF_STATUS_E_NOMEM;
273*5113495bSYour Name 	}
274*5113495bSYour Name 	buf_ptr = (uint8_t *) wmi_buf_data(wmi_buf);
275*5113495bSYour Name 
276*5113495bSYour Name 	cmd = (wmi_peer_get_estimated_linkspeed_cmd_fixed_param *) buf_ptr;
277*5113495bSYour Name 	WMITLV_SET_HDR(&cmd->tlv_header,
278*5113495bSYour Name 	       WMITLV_TAG_STRUC_wmi_peer_get_estimated_linkspeed_cmd_fixed_param,
279*5113495bSYour Name 	       WMITLV_GET_STRUCT_TLVLEN
280*5113495bSYour Name 			(wmi_peer_get_estimated_linkspeed_cmd_fixed_param));
281*5113495bSYour Name 
282*5113495bSYour Name 	/* Copy the peer macaddress to the wma buffer */
283*5113495bSYour Name 	qdf_mem_copy(&cmd->peer_macaddr,
284*5113495bSYour Name 		     &peer_macaddr,
285*5113495bSYour Name 		     sizeof(peer_macaddr));
286*5113495bSYour Name 
287*5113495bSYour Name 	wmi_mtrace(WMI_PEER_GET_ESTIMATED_LINKSPEED_CMDID, cmd->vdev_id, 0);
288*5113495bSYour Name 	if (wmi_unified_cmd_send(wmi_handle, wmi_buf, len,
289*5113495bSYour Name 				 WMI_PEER_GET_ESTIMATED_LINKSPEED_CMDID)) {
290*5113495bSYour Name 		wmi_err("Failed to send link speed command");
291*5113495bSYour Name 		wmi_buf_free(wmi_buf);
292*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
293*5113495bSYour Name 	}
294*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
295*5113495bSYour Name }
296*5113495bSYour Name 
297*5113495bSYour Name /**
298*5113495bSYour Name  * send_fw_profiling_cmd_tlv() - send FW profiling cmd to WLAN FW
299*5113495bSYour Name  * @wmi_handle: wmi handle
300*5113495bSYour Name  * @cmd: Profiling command index
301*5113495bSYour Name  * @value1: parameter1 value
302*5113495bSYour Name  * @value2: parameter2 value
303*5113495bSYour Name  *
304*5113495bSYour Name  * Return: QDF_STATUS_SUCCESS for success else error code
305*5113495bSYour Name  */
send_fw_profiling_cmd_tlv(wmi_unified_t wmi_handle,uint32_t cmd,uint32_t value1,uint32_t value2)306*5113495bSYour Name static QDF_STATUS send_fw_profiling_cmd_tlv(wmi_unified_t wmi_handle,
307*5113495bSYour Name 			uint32_t cmd, uint32_t value1, uint32_t value2)
308*5113495bSYour Name {
309*5113495bSYour Name 	wmi_buf_t buf;
310*5113495bSYour Name 	int32_t len = 0;
311*5113495bSYour Name 	int ret;
312*5113495bSYour Name 	wmi_wlan_profile_trigger_cmd_fixed_param *prof_trig_cmd;
313*5113495bSYour Name 	wmi_wlan_profile_set_hist_intvl_cmd_fixed_param *hist_intvl_cmd;
314*5113495bSYour Name 	wmi_wlan_profile_enable_profile_id_cmd_fixed_param *profile_enable_cmd;
315*5113495bSYour Name 	wmi_wlan_profile_get_prof_data_cmd_fixed_param *profile_getdata_cmd;
316*5113495bSYour Name 
317*5113495bSYour Name 	switch (cmd) {
318*5113495bSYour Name 	case WMI_WLAN_PROFILE_TRIGGER_CMDID:
319*5113495bSYour Name 		len = sizeof(wmi_wlan_profile_trigger_cmd_fixed_param);
320*5113495bSYour Name 		buf = wmi_buf_alloc(wmi_handle, len);
321*5113495bSYour Name 		if (!buf) {
322*5113495bSYour Name 			return QDF_STATUS_E_NOMEM;
323*5113495bSYour Name 		}
324*5113495bSYour Name 		prof_trig_cmd =
325*5113495bSYour Name 			(wmi_wlan_profile_trigger_cmd_fixed_param *)
326*5113495bSYour Name 				wmi_buf_data(buf);
327*5113495bSYour Name 		WMITLV_SET_HDR(&prof_trig_cmd->tlv_header,
328*5113495bSYour Name 		     WMITLV_TAG_STRUC_wmi_wlan_profile_trigger_cmd_fixed_param,
329*5113495bSYour Name 		     WMITLV_GET_STRUCT_TLVLEN
330*5113495bSYour Name 				(wmi_wlan_profile_trigger_cmd_fixed_param));
331*5113495bSYour Name 		prof_trig_cmd->enable = value1;
332*5113495bSYour Name 		wmi_mtrace(WMI_WLAN_PROFILE_TRIGGER_CMDID, NO_SESSION, 0);
333*5113495bSYour Name 		ret = wmi_unified_cmd_send(wmi_handle, buf, len,
334*5113495bSYour Name 					   WMI_WLAN_PROFILE_TRIGGER_CMDID);
335*5113495bSYour Name 		if (ret) {
336*5113495bSYour Name 			wmi_err("PROFILE_TRIGGER cmd Failed with value %d",
337*5113495bSYour Name 				 value1);
338*5113495bSYour Name 			wmi_buf_free(buf);
339*5113495bSYour Name 			return ret;
340*5113495bSYour Name 		}
341*5113495bSYour Name 		break;
342*5113495bSYour Name 
343*5113495bSYour Name 	case WMI_WLAN_PROFILE_GET_PROFILE_DATA_CMDID:
344*5113495bSYour Name 		len = sizeof(wmi_wlan_profile_get_prof_data_cmd_fixed_param);
345*5113495bSYour Name 		buf = wmi_buf_alloc(wmi_handle, len);
346*5113495bSYour Name 		if (!buf) {
347*5113495bSYour Name 			return QDF_STATUS_E_NOMEM;
348*5113495bSYour Name 		}
349*5113495bSYour Name 		profile_getdata_cmd =
350*5113495bSYour Name 			(wmi_wlan_profile_get_prof_data_cmd_fixed_param *)
351*5113495bSYour Name 				wmi_buf_data(buf);
352*5113495bSYour Name 		WMITLV_SET_HDR(&profile_getdata_cmd->tlv_header,
353*5113495bSYour Name 		      WMITLV_TAG_STRUC_wmi_wlan_profile_get_prof_data_cmd_fixed_param,
354*5113495bSYour Name 		      WMITLV_GET_STRUCT_TLVLEN
355*5113495bSYour Name 		      (wmi_wlan_profile_get_prof_data_cmd_fixed_param));
356*5113495bSYour Name 		wmi_mtrace(WMI_WLAN_PROFILE_GET_PROFILE_DATA_CMDID,
357*5113495bSYour Name 			   NO_SESSION, 0);
358*5113495bSYour Name 		ret = wmi_unified_cmd_send(wmi_handle, buf, len,
359*5113495bSYour Name 				WMI_WLAN_PROFILE_GET_PROFILE_DATA_CMDID);
360*5113495bSYour Name 		if (ret) {
361*5113495bSYour Name 			wmi_err("PROFILE_DATA cmd Failed for id %d value %d",
362*5113495bSYour Name 				 value1, value2);
363*5113495bSYour Name 			wmi_buf_free(buf);
364*5113495bSYour Name 			return ret;
365*5113495bSYour Name 		}
366*5113495bSYour Name 		break;
367*5113495bSYour Name 
368*5113495bSYour Name 	case WMI_WLAN_PROFILE_SET_HIST_INTVL_CMDID:
369*5113495bSYour Name 		len = sizeof(wmi_wlan_profile_set_hist_intvl_cmd_fixed_param);
370*5113495bSYour Name 		buf = wmi_buf_alloc(wmi_handle, len);
371*5113495bSYour Name 		if (!buf) {
372*5113495bSYour Name 			return QDF_STATUS_E_NOMEM;
373*5113495bSYour Name 		}
374*5113495bSYour Name 		hist_intvl_cmd =
375*5113495bSYour Name 			(wmi_wlan_profile_set_hist_intvl_cmd_fixed_param *)
376*5113495bSYour Name 				wmi_buf_data(buf);
377*5113495bSYour Name 		WMITLV_SET_HDR(&hist_intvl_cmd->tlv_header,
378*5113495bSYour Name 		      WMITLV_TAG_STRUC_wmi_wlan_profile_set_hist_intvl_cmd_fixed_param,
379*5113495bSYour Name 		      WMITLV_GET_STRUCT_TLVLEN
380*5113495bSYour Name 		      (wmi_wlan_profile_set_hist_intvl_cmd_fixed_param));
381*5113495bSYour Name 		hist_intvl_cmd->profile_id = value1;
382*5113495bSYour Name 		hist_intvl_cmd->value = value2;
383*5113495bSYour Name 		wmi_mtrace(WMI_WLAN_PROFILE_SET_HIST_INTVL_CMDID,
384*5113495bSYour Name 			   NO_SESSION, 0);
385*5113495bSYour Name 		ret = wmi_unified_cmd_send(wmi_handle, buf, len,
386*5113495bSYour Name 				WMI_WLAN_PROFILE_SET_HIST_INTVL_CMDID);
387*5113495bSYour Name 		if (ret) {
388*5113495bSYour Name 			wmi_err("HIST_INTVL cmd Failed for id %d value %d",
389*5113495bSYour Name 				 value1, value2);
390*5113495bSYour Name 			wmi_buf_free(buf);
391*5113495bSYour Name 			return ret;
392*5113495bSYour Name 		}
393*5113495bSYour Name 		break;
394*5113495bSYour Name 
395*5113495bSYour Name 	case WMI_WLAN_PROFILE_ENABLE_PROFILE_ID_CMDID:
396*5113495bSYour Name 		len =
397*5113495bSYour Name 		sizeof(wmi_wlan_profile_enable_profile_id_cmd_fixed_param);
398*5113495bSYour Name 		buf = wmi_buf_alloc(wmi_handle, len);
399*5113495bSYour Name 		if (!buf) {
400*5113495bSYour Name 			return QDF_STATUS_E_NOMEM;
401*5113495bSYour Name 		}
402*5113495bSYour Name 		profile_enable_cmd =
403*5113495bSYour Name 			(wmi_wlan_profile_enable_profile_id_cmd_fixed_param *)
404*5113495bSYour Name 				wmi_buf_data(buf);
405*5113495bSYour Name 		WMITLV_SET_HDR(&profile_enable_cmd->tlv_header,
406*5113495bSYour Name 		      WMITLV_TAG_STRUC_wmi_wlan_profile_enable_profile_id_cmd_fixed_param,
407*5113495bSYour Name 		      WMITLV_GET_STRUCT_TLVLEN
408*5113495bSYour Name 		      (wmi_wlan_profile_enable_profile_id_cmd_fixed_param));
409*5113495bSYour Name 		profile_enable_cmd->profile_id = value1;
410*5113495bSYour Name 		profile_enable_cmd->enable = value2;
411*5113495bSYour Name 		wmi_mtrace(WMI_WLAN_PROFILE_ENABLE_PROFILE_ID_CMDID,
412*5113495bSYour Name 			   NO_SESSION, 0);
413*5113495bSYour Name 		ret = wmi_unified_cmd_send(wmi_handle, buf, len,
414*5113495bSYour Name 				WMI_WLAN_PROFILE_ENABLE_PROFILE_ID_CMDID);
415*5113495bSYour Name 		if (ret) {
416*5113495bSYour Name 			wmi_err("enable cmd Failed for id %d value %d",
417*5113495bSYour Name 				 value1, value2);
418*5113495bSYour Name 			wmi_buf_free(buf);
419*5113495bSYour Name 			return ret;
420*5113495bSYour Name 		}
421*5113495bSYour Name 		break;
422*5113495bSYour Name 
423*5113495bSYour Name 	default:
424*5113495bSYour Name 		wmi_debug("Invalid profiling command: %u", cmd);
425*5113495bSYour Name 		break;
426*5113495bSYour Name 	}
427*5113495bSYour Name 
428*5113495bSYour Name 	return 0;
429*5113495bSYour Name }
430*5113495bSYour Name 
431*5113495bSYour Name /**
432*5113495bSYour Name  * send_nat_keepalive_en_cmd_tlv() - enable NAT keepalive filter
433*5113495bSYour Name  * @wmi_handle: wmi handle
434*5113495bSYour Name  * @vdev_id: vdev id
435*5113495bSYour Name  *
436*5113495bSYour Name  * Return: QDF_STATUS_SUCCESS for success or error code
437*5113495bSYour Name  */
send_nat_keepalive_en_cmd_tlv(wmi_unified_t wmi_handle,uint8_t vdev_id)438*5113495bSYour Name static QDF_STATUS send_nat_keepalive_en_cmd_tlv(wmi_unified_t wmi_handle, uint8_t vdev_id)
439*5113495bSYour Name {
440*5113495bSYour Name 	WMI_VDEV_IPSEC_NATKEEPALIVE_FILTER_CMD_fixed_param *cmd;
441*5113495bSYour Name 	wmi_buf_t buf;
442*5113495bSYour Name 	int32_t len = sizeof(*cmd);
443*5113495bSYour Name 
444*5113495bSYour Name 	wmi_debug("vdev_id: %d", vdev_id);
445*5113495bSYour Name 	buf = wmi_buf_alloc(wmi_handle, len);
446*5113495bSYour Name 	if (!buf) {
447*5113495bSYour Name 		return QDF_STATUS_E_NOMEM;
448*5113495bSYour Name 	}
449*5113495bSYour Name 	cmd = (WMI_VDEV_IPSEC_NATKEEPALIVE_FILTER_CMD_fixed_param *)
450*5113495bSYour Name 		wmi_buf_data(buf);
451*5113495bSYour Name 	WMITLV_SET_HDR(&cmd->tlv_header,
452*5113495bSYour Name 	WMITLV_TAG_STRUC_WMI_VDEV_IPSEC_NATKEEPALIVE_FILTER_CMD_fixed_param,
453*5113495bSYour Name 		  WMITLV_GET_STRUCT_TLVLEN
454*5113495bSYour Name 		  (WMI_VDEV_IPSEC_NATKEEPALIVE_FILTER_CMD_fixed_param));
455*5113495bSYour Name 	cmd->vdev_id = vdev_id;
456*5113495bSYour Name 	cmd->action = IPSEC_NATKEEPALIVE_FILTER_ENABLE;
457*5113495bSYour Name 	wmi_mtrace(WMI_VDEV_IPSEC_NATKEEPALIVE_FILTER_CMDID, cmd->vdev_id, 0);
458*5113495bSYour Name 	if (wmi_unified_cmd_send(wmi_handle, buf, len,
459*5113495bSYour Name 				 WMI_VDEV_IPSEC_NATKEEPALIVE_FILTER_CMDID)) {
460*5113495bSYour Name 		wmi_err("Failed to send NAT keepalive enable command");
461*5113495bSYour Name 		wmi_buf_free(buf);
462*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
463*5113495bSYour Name 	}
464*5113495bSYour Name 
465*5113495bSYour Name 	return 0;
466*5113495bSYour Name }
467*5113495bSYour Name 
468*5113495bSYour Name #ifdef MULTI_CLIENT_LL_SUPPORT
469*5113495bSYour Name /**
470*5113495bSYour Name  * fill_multi_client_ll_info - Fill multi client low latency info to wlm cmd
471*5113495bSYour Name  * @cmd: wlm config command
472*5113495bSYour Name  * @params: wlm params
473*5113495bSYour Name  *
474*5113495bSYour Name  * Return: none
475*5113495bSYour Name  */
fill_multi_client_ll_info(wmi_wlm_config_cmd_fixed_param * cmd,struct wlm_latency_level_param * params)476*5113495bSYour Name static void fill_multi_client_ll_info(wmi_wlm_config_cmd_fixed_param *cmd,
477*5113495bSYour Name 				      struct wlm_latency_level_param *params)
478*5113495bSYour Name {
479*5113495bSYour Name 		cmd->client_id_bitmask = params->client_id_bitmask;
480*5113495bSYour Name 		WLM_FLAGS_SET_FORCE_DEFAULT_LATENCY(cmd->flags_ext,
481*5113495bSYour Name 						    params->force_reset);
482*5113495bSYour Name }
483*5113495bSYour Name #else
484*5113495bSYour Name static inline void
fill_multi_client_ll_info(wmi_wlm_config_cmd_fixed_param * cmd,struct wlm_latency_level_param * params)485*5113495bSYour Name fill_multi_client_ll_info(wmi_wlm_config_cmd_fixed_param *cmd,
486*5113495bSYour Name 			  struct wlm_latency_level_param *params)
487*5113495bSYour Name {
488*5113495bSYour Name }
489*5113495bSYour Name #endif
490*5113495bSYour Name 
send_wlm_latency_level_cmd_tlv(wmi_unified_t wmi_handle,struct wlm_latency_level_param * params)491*5113495bSYour Name static QDF_STATUS send_wlm_latency_level_cmd_tlv(wmi_unified_t wmi_handle,
492*5113495bSYour Name 				struct wlm_latency_level_param *params)
493*5113495bSYour Name {
494*5113495bSYour Name 	wmi_wlm_config_cmd_fixed_param *cmd;
495*5113495bSYour Name 	wmi_buf_t buf;
496*5113495bSYour Name 	uint32_t len = sizeof(*cmd);
497*5113495bSYour Name 	static uint32_t ll[4] = {100, 60, 40, 20};
498*5113495bSYour Name 
499*5113495bSYour Name 	buf = wmi_buf_alloc(wmi_handle, len);
500*5113495bSYour Name 	if (!buf) {
501*5113495bSYour Name 		return QDF_STATUS_E_NOMEM;
502*5113495bSYour Name 	}
503*5113495bSYour Name 	cmd = (wmi_wlm_config_cmd_fixed_param *)wmi_buf_data(buf);
504*5113495bSYour Name 	WMITLV_SET_HDR(&cmd->tlv_header,
505*5113495bSYour Name 		       WMITLV_TAG_STRUC_wmi_wlm_config_cmd_fixed_param,
506*5113495bSYour Name 		       WMITLV_GET_STRUCT_TLVLEN
507*5113495bSYour Name 		       (wmi_wlm_config_cmd_fixed_param));
508*5113495bSYour Name 	cmd->vdev_id = params->vdev_id;
509*5113495bSYour Name 	cmd->latency_level = params->wlm_latency_level;
510*5113495bSYour Name 	cmd->ul_latency = ll[params->wlm_latency_level];
511*5113495bSYour Name 	cmd->dl_latency = ll[params->wlm_latency_level];
512*5113495bSYour Name 	cmd->flags = params->wlm_latency_flags;
513*5113495bSYour Name 	fill_multi_client_ll_info(cmd, params);
514*5113495bSYour Name 
515*5113495bSYour Name 	wmi_mtrace(WMI_WLM_CONFIG_CMDID, cmd->vdev_id, 0);
516*5113495bSYour Name 	if (wmi_unified_cmd_send(wmi_handle, buf, len,
517*5113495bSYour Name 				 WMI_WLM_CONFIG_CMDID)) {
518*5113495bSYour Name 		wmi_err("Failed to send setting latency config command");
519*5113495bSYour Name 		wmi_buf_free(buf);
520*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
521*5113495bSYour Name 	}
522*5113495bSYour Name 
523*5113495bSYour Name 	return 0;
524*5113495bSYour Name }
525*5113495bSYour Name 
526*5113495bSYour Name #ifdef FEATURE_WLAN_TDLS
527*5113495bSYour Name /**
528*5113495bSYour Name  * tdls_get_wmi_offchannel_mode - Get WMI tdls off channel mode
529*5113495bSYour Name  * @tdls_sw_mode: tdls_sw_mode
530*5113495bSYour Name  *
531*5113495bSYour Name  * This function returns wmi tdls offchannel mode
532*5113495bSYour Name  *
533*5113495bSYour Name  * Return: enum value of wmi tdls offchannel mode
534*5113495bSYour Name  */
tdls_get_wmi_offchannel_mode(uint8_t tdls_sw_mode)535*5113495bSYour Name static uint8_t tdls_get_wmi_offchannel_mode(uint8_t tdls_sw_mode)
536*5113495bSYour Name {
537*5113495bSYour Name 	uint8_t off_chan_mode;
538*5113495bSYour Name 
539*5113495bSYour Name 	switch (tdls_sw_mode) {
540*5113495bSYour Name 	case ENABLE_CHANSWITCH:
541*5113495bSYour Name 		off_chan_mode = WMI_TDLS_ENABLE_OFFCHANNEL;
542*5113495bSYour Name 		break;
543*5113495bSYour Name 
544*5113495bSYour Name 	case DISABLE_CHANSWITCH:
545*5113495bSYour Name 		off_chan_mode = WMI_TDLS_DISABLE_OFFCHANNEL;
546*5113495bSYour Name 		break;
547*5113495bSYour Name 	case DISABLE_ACTIVE_CHANSWITCH:
548*5113495bSYour Name 		off_chan_mode = WMI_TDLS_ACTIVE_DISABLE_OFFCHANNEL;
549*5113495bSYour Name 		break;
550*5113495bSYour Name 	default:
551*5113495bSYour Name 		wmi_debug("unknown tdls_sw_mode: %d", tdls_sw_mode);
552*5113495bSYour Name 		off_chan_mode = WMI_TDLS_DISABLE_OFFCHANNEL;
553*5113495bSYour Name 	}
554*5113495bSYour Name 	return off_chan_mode;
555*5113495bSYour Name }
556*5113495bSYour Name 
557*5113495bSYour Name /**
558*5113495bSYour Name  * tdls_get_wmi_offchannel_bw - Get WMI tdls off channel Bandwidth
559*5113495bSYour Name  * @tdls_off_ch_bw_offset: bandwidth offset
560*5113495bSYour Name  *
561*5113495bSYour Name  * This function returns wmi tdls offchannel bandwidth
562*5113495bSYour Name  *
563*5113495bSYour Name  * Return: TDLS offchannel bandwidth
564*5113495bSYour Name  */
tdls_get_wmi_offchannel_bw(uint16_t tdls_off_ch_bw_offset)565*5113495bSYour Name static uint8_t tdls_get_wmi_offchannel_bw(uint16_t tdls_off_ch_bw_offset)
566*5113495bSYour Name {
567*5113495bSYour Name 	uint8_t off_chan_bw;
568*5113495bSYour Name 
569*5113495bSYour Name 	switch (tdls_off_ch_bw_offset) {
570*5113495bSYour Name 	case BW20:
571*5113495bSYour Name 		off_chan_bw = WMI_TDLS_OFFCHAN_20MHZ;
572*5113495bSYour Name 		break;
573*5113495bSYour Name 	case BW40_LOW_PRIMARY:
574*5113495bSYour Name 	case BW40_HIGH_PRIMARY:
575*5113495bSYour Name 		off_chan_bw = WMI_TDLS_OFFCHAN_40MHZ;
576*5113495bSYour Name 		break;
577*5113495bSYour Name 	case BW80:
578*5113495bSYour Name 		off_chan_bw = WMI_TDLS_OFFCHAN_80MHZ;
579*5113495bSYour Name 		break;
580*5113495bSYour Name 	case BWALL:
581*5113495bSYour Name 		off_chan_bw = WMI_TDLS_OFFCHAN_160MHZ;
582*5113495bSYour Name 		break;
583*5113495bSYour Name 	default:
584*5113495bSYour Name 		wmi_debug("unknown tdls offchannel bw offset: %d",
585*5113495bSYour Name 			 tdls_off_ch_bw_offset);
586*5113495bSYour Name 		off_chan_bw = WMI_TDLS_OFFCHAN_20MHZ;
587*5113495bSYour Name 	}
588*5113495bSYour Name 	return off_chan_bw;
589*5113495bSYour Name }
590*5113495bSYour Name 
591*5113495bSYour Name /**
592*5113495bSYour Name  * send_set_tdls_offchan_mode_cmd_tlv() - set tdls off channel mode
593*5113495bSYour Name  * @wmi_handle: wmi handle
594*5113495bSYour Name  * @chan_switch_params: Pointer to tdls channel switch parameter structure
595*5113495bSYour Name  *
596*5113495bSYour Name  * This function sets tdls off channel mode
597*5113495bSYour Name  *
598*5113495bSYour Name  * Return: 0 on success; Negative errno otherwise
599*5113495bSYour Name  */
send_set_tdls_offchan_mode_cmd_tlv(wmi_unified_t wmi_handle,struct tdls_channel_switch_params * chan_switch_params)600*5113495bSYour Name static QDF_STATUS send_set_tdls_offchan_mode_cmd_tlv(wmi_unified_t wmi_handle,
601*5113495bSYour Name 	      struct tdls_channel_switch_params *chan_switch_params)
602*5113495bSYour Name {
603*5113495bSYour Name 	wmi_tdls_set_offchan_mode_cmd_fixed_param *cmd;
604*5113495bSYour Name 	wmi_buf_t wmi_buf;
605*5113495bSYour Name 	uint8_t *buf_ptr;
606*5113495bSYour Name 	struct tdls_ch_params *src_chan_info;
607*5113495bSYour Name 	wmi_channel *chan_info;
608*5113495bSYour Name 	uint16_t i;
609*5113495bSYour Name 	u_int16_t len = sizeof(wmi_tdls_set_offchan_mode_cmd_fixed_param);
610*5113495bSYour Name 
611*5113495bSYour Name 	len += WMI_TLV_HDR_SIZE +
612*5113495bSYour Name 	       sizeof(wmi_channel) * chan_switch_params->num_off_channels;
613*5113495bSYour Name 
614*5113495bSYour Name 	wmi_buf = wmi_buf_alloc(wmi_handle, len);
615*5113495bSYour Name 	if (!wmi_buf) {
616*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
617*5113495bSYour Name 	}
618*5113495bSYour Name 
619*5113495bSYour Name 	buf_ptr = (uint8_t *)wmi_buf_data(wmi_buf);
620*5113495bSYour Name 	cmd = (wmi_tdls_set_offchan_mode_cmd_fixed_param *)
621*5113495bSYour Name 		wmi_buf_data(wmi_buf);
622*5113495bSYour Name 	WMITLV_SET_HDR(&cmd->tlv_header,
623*5113495bSYour Name 		WMITLV_TAG_STRUC_wmi_tdls_set_offchan_mode_cmd_fixed_param,
624*5113495bSYour Name 		WMITLV_GET_STRUCT_TLVLEN(
625*5113495bSYour Name 			wmi_tdls_set_offchan_mode_cmd_fixed_param));
626*5113495bSYour Name 
627*5113495bSYour Name 	WMI_CHAR_ARRAY_TO_MAC_ADDR(chan_switch_params->peer_mac_addr,
628*5113495bSYour Name 				&cmd->peer_macaddr);
629*5113495bSYour Name 	cmd->vdev_id = chan_switch_params->vdev_id;
630*5113495bSYour Name 	cmd->offchan_mode =
631*5113495bSYour Name 		tdls_get_wmi_offchannel_mode(chan_switch_params->tdls_sw_mode);
632*5113495bSYour Name 	cmd->is_peer_responder = chan_switch_params->is_responder;
633*5113495bSYour Name 	cmd->offchan_freq = chan_switch_params->tdls_off_chan_freq;
634*5113495bSYour Name 	cmd->offchan_num = chan_switch_params->tdls_off_ch;
635*5113495bSYour Name 	cmd->offchan_bw_bitmap =
636*5113495bSYour Name 		tdls_get_wmi_offchannel_bw(
637*5113495bSYour Name 			chan_switch_params->tdls_off_ch_bw_offset);
638*5113495bSYour Name 	cmd->offchan_oper_class = chan_switch_params->oper_class;
639*5113495bSYour Name 
640*5113495bSYour Name 	wmi_debug("Peer MAC Addr mac_addr31to0: 0x%x, mac_addr47to32: 0x%x",
641*5113495bSYour Name 		 cmd->peer_macaddr.mac_addr31to0,
642*5113495bSYour Name 		 cmd->peer_macaddr.mac_addr47to32);
643*5113495bSYour Name 
644*5113495bSYour Name 	wmi_debug("vdev_id: %d, off channel mode: %d, off channel Num: %d, "
645*5113495bSYour Name 		 "off channel frequency: %u off channel offset: 0x%x, "
646*5113495bSYour Name 		 "is_peer_responder: %d, operating class: %d",
647*5113495bSYour Name 		 cmd->vdev_id,
648*5113495bSYour Name 		 cmd->offchan_mode,
649*5113495bSYour Name 		 cmd->offchan_num,
650*5113495bSYour Name 		 cmd->offchan_freq,
651*5113495bSYour Name 		 cmd->offchan_bw_bitmap,
652*5113495bSYour Name 		 cmd->is_peer_responder,
653*5113495bSYour Name 		 cmd->offchan_oper_class);
654*5113495bSYour Name 
655*5113495bSYour Name 	buf_ptr += sizeof(*cmd);
656*5113495bSYour Name 	WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_ARRAY_STRUC,
657*5113495bSYour Name 		       sizeof(wmi_channel) *
658*5113495bSYour Name 		       chan_switch_params->num_off_channels);
659*5113495bSYour Name 	chan_info = (wmi_channel *)(buf_ptr + WMI_TLV_HDR_SIZE);
660*5113495bSYour Name 	for (i = 0; i < chan_switch_params->num_off_channels; i++) {
661*5113495bSYour Name 		WMITLV_SET_HDR(&chan_info->tlv_header,
662*5113495bSYour Name 			       WMITLV_TAG_STRUC_wmi_channel,
663*5113495bSYour Name 			       WMITLV_GET_STRUCT_TLVLEN(wmi_channel));
664*5113495bSYour Name 
665*5113495bSYour Name 		src_chan_info = &chan_switch_params->allowed_off_channels[i];
666*5113495bSYour Name 
667*5113495bSYour Name 		chan_info->mhz = src_chan_info->ch_freq;
668*5113495bSYour Name 		chan_info->band_center_freq1 = chan_info->mhz;
669*5113495bSYour Name 		chan_info->band_center_freq2 = 0;
670*5113495bSYour Name 		if (WLAN_REG_IS_24GHZ_CH_FREQ(chan_info->mhz))
671*5113495bSYour Name 			WMI_SET_CHANNEL_MODE(chan_info, MODE_11G);
672*5113495bSYour Name 		else
673*5113495bSYour Name 			WMI_SET_CHANNEL_MODE(chan_info, MODE_11A);
674*5113495bSYour Name 
675*5113495bSYour Name 		if (src_chan_info->dfs_set)
676*5113495bSYour Name 			WMI_SET_CHANNEL_FLAG(chan_info, WMI_CHAN_FLAG_PASSIVE);
677*5113495bSYour Name 
678*5113495bSYour Name 		WMI_SET_CHANNEL_MAX_TX_POWER(chan_info, src_chan_info->pwr);
679*5113495bSYour Name 		WMI_SET_CHANNEL_REG_POWER(chan_info, src_chan_info->pwr);
680*5113495bSYour Name 		wmi_debug("chan[%d] = %u TX power:%d DFS[%d]", i,
681*5113495bSYour Name 			  chan_info->mhz, src_chan_info->pwr,
682*5113495bSYour Name 			  src_chan_info->dfs_set);
683*5113495bSYour Name 
684*5113495bSYour Name 		chan_info++;
685*5113495bSYour Name 	}
686*5113495bSYour Name 
687*5113495bSYour Name 	wmi_mtrace(WMI_TDLS_SET_OFFCHAN_MODE_CMDID, cmd->vdev_id, 0);
688*5113495bSYour Name 	if (wmi_unified_cmd_send(wmi_handle, wmi_buf, len,
689*5113495bSYour Name 		WMI_TDLS_SET_OFFCHAN_MODE_CMDID)) {
690*5113495bSYour Name 		wmi_err("failed to send tdls off chan command");
691*5113495bSYour Name 		wmi_buf_free(wmi_buf);
692*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
693*5113495bSYour Name 	}
694*5113495bSYour Name 
695*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
696*5113495bSYour Name }
697*5113495bSYour Name 
698*5113495bSYour Name /**
699*5113495bSYour Name  * send_update_fw_tdls_state_cmd_tlv() - send enable/disable tdls for a vdev
700*5113495bSYour Name  * @wmi_handle: wmi handle
701*5113495bSYour Name  * @tdls_param: TDLS params
702*5113495bSYour Name  * @tdls_state: TDLS state
703*5113495bSYour Name  *
704*5113495bSYour Name  * Return: 0 for success or error code
705*5113495bSYour Name  */
706*5113495bSYour Name static QDF_STATUS
send_update_fw_tdls_state_cmd_tlv(wmi_unified_t wmi_handle,struct tdls_info * tdls_param,enum wmi_tdls_state tdls_state)707*5113495bSYour Name send_update_fw_tdls_state_cmd_tlv(wmi_unified_t wmi_handle,
708*5113495bSYour Name 				  struct tdls_info *tdls_param,
709*5113495bSYour Name 				  enum wmi_tdls_state tdls_state)
710*5113495bSYour Name {
711*5113495bSYour Name 	wmi_tdls_set_state_cmd_fixed_param *cmd;
712*5113495bSYour Name 	wmi_buf_t wmi_buf;
713*5113495bSYour Name 
714*5113495bSYour Name 	uint16_t len = sizeof(wmi_tdls_set_state_cmd_fixed_param);
715*5113495bSYour Name 
716*5113495bSYour Name 	wmi_buf = wmi_buf_alloc(wmi_handle, len);
717*5113495bSYour Name 	if (!wmi_buf) {
718*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
719*5113495bSYour Name 	}
720*5113495bSYour Name 	cmd = (wmi_tdls_set_state_cmd_fixed_param *) wmi_buf_data(wmi_buf);
721*5113495bSYour Name 	WMITLV_SET_HDR(&cmd->tlv_header,
722*5113495bSYour Name 		  WMITLV_TAG_STRUC_wmi_tdls_set_state_cmd_fixed_param,
723*5113495bSYour Name 		  WMITLV_GET_STRUCT_TLVLEN
724*5113495bSYour Name 			(wmi_tdls_set_state_cmd_fixed_param));
725*5113495bSYour Name 	cmd->vdev_id = tdls_param->vdev_id;
726*5113495bSYour Name 	cmd->state = (A_UINT32)tdls_state;
727*5113495bSYour Name 	cmd->notification_interval_ms = tdls_param->notification_interval_ms;
728*5113495bSYour Name 	cmd->tx_discovery_threshold = tdls_param->tx_discovery_threshold;
729*5113495bSYour Name 	cmd->tx_teardown_threshold = tdls_param->tx_teardown_threshold;
730*5113495bSYour Name 	cmd->rssi_teardown_threshold = tdls_param->rssi_teardown_threshold;
731*5113495bSYour Name 	cmd->rssi_delta = tdls_param->rssi_delta;
732*5113495bSYour Name 	cmd->tdls_options = tdls_param->tdls_options;
733*5113495bSYour Name 	cmd->tdls_peer_traffic_ind_window = tdls_param->peer_traffic_ind_window;
734*5113495bSYour Name 	cmd->tdls_peer_traffic_response_timeout_ms =
735*5113495bSYour Name 		tdls_param->peer_traffic_response_timeout;
736*5113495bSYour Name 	cmd->tdls_puapsd_mask = tdls_param->puapsd_mask;
737*5113495bSYour Name 	cmd->tdls_puapsd_inactivity_time_ms =
738*5113495bSYour Name 		tdls_param->puapsd_inactivity_time;
739*5113495bSYour Name 	cmd->tdls_puapsd_rx_frame_threshold =
740*5113495bSYour Name 		tdls_param->puapsd_rx_frame_threshold;
741*5113495bSYour Name 	cmd->teardown_notification_ms =
742*5113495bSYour Name 		tdls_param->teardown_notification_ms;
743*5113495bSYour Name 	cmd->tdls_peer_kickout_threshold =
744*5113495bSYour Name 		tdls_param->tdls_peer_kickout_threshold;
745*5113495bSYour Name 	cmd->tdls_discovery_wake_timeout =
746*5113495bSYour Name 		tdls_param->tdls_discovery_wake_timeout;
747*5113495bSYour Name 
748*5113495bSYour Name 	wmi_debug("vdev %d tdls_state: %d, state: %d, "
749*5113495bSYour Name 		 "notification_interval_ms: %d, "
750*5113495bSYour Name 		 "tx_discovery_threshold: %d, "
751*5113495bSYour Name 		 "tx_teardown_threshold: %d, "
752*5113495bSYour Name 		 "rssi_teardown_threshold: %d, "
753*5113495bSYour Name 		 "rssi_delta: %d, "
754*5113495bSYour Name 		 "tdls_options: 0x%x, "
755*5113495bSYour Name 		 "tdls_peer_traffic_ind_window: %d, "
756*5113495bSYour Name 		 "tdls_peer_traffic_response_timeout: %d, "
757*5113495bSYour Name 		 "tdls_puapsd_mask: 0x%x, "
758*5113495bSYour Name 		 "tdls_puapsd_inactivity_time: %d, "
759*5113495bSYour Name 		 "tdls_puapsd_rx_frame_threshold: %d, "
760*5113495bSYour Name 		 "teardown_notification_ms: %d, "
761*5113495bSYour Name 		 "tdls_peer_kickout_threshold: %d, "
762*5113495bSYour Name 		 "tdls_discovery_wake_timeout: %d",
763*5113495bSYour Name 		 tdls_param->vdev_id, tdls_state, cmd->state,
764*5113495bSYour Name 		 cmd->notification_interval_ms,
765*5113495bSYour Name 		 cmd->tx_discovery_threshold,
766*5113495bSYour Name 		 cmd->tx_teardown_threshold,
767*5113495bSYour Name 		 cmd->rssi_teardown_threshold,
768*5113495bSYour Name 		 cmd->rssi_delta,
769*5113495bSYour Name 		 cmd->tdls_options,
770*5113495bSYour Name 		 cmd->tdls_peer_traffic_ind_window,
771*5113495bSYour Name 		 cmd->tdls_peer_traffic_response_timeout_ms,
772*5113495bSYour Name 		 cmd->tdls_puapsd_mask,
773*5113495bSYour Name 		 cmd->tdls_puapsd_inactivity_time_ms,
774*5113495bSYour Name 		 cmd->tdls_puapsd_rx_frame_threshold,
775*5113495bSYour Name 		 cmd->teardown_notification_ms,
776*5113495bSYour Name 		 cmd->tdls_peer_kickout_threshold,
777*5113495bSYour Name 		 cmd->tdls_discovery_wake_timeout);
778*5113495bSYour Name 
779*5113495bSYour Name 	wmi_mtrace(WMI_TDLS_SET_STATE_CMDID, cmd->vdev_id, 0);
780*5113495bSYour Name 	if (wmi_unified_cmd_send(wmi_handle, wmi_buf, len,
781*5113495bSYour Name 				 WMI_TDLS_SET_STATE_CMDID)) {
782*5113495bSYour Name 		wmi_err("Failed to send tdls set state command");
783*5113495bSYour Name 		wmi_buf_free(wmi_buf);
784*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
785*5113495bSYour Name 	}
786*5113495bSYour Name 
787*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
788*5113495bSYour Name }
789*5113495bSYour Name 
790*5113495bSYour Name /**
791*5113495bSYour Name  * send_update_tdls_peer_state_cmd_tlv() - update TDLS peer state
792*5113495bSYour Name  * @wmi_handle: wmi handle
793*5113495bSYour Name  * @peer_state: TDLS peer state params
794*5113495bSYour Name  * @ch_mhz: peer channels
795*5113495bSYour Name  *
796*5113495bSYour Name  * Return: QDF_STATUS_SUCCESS for success or error code
797*5113495bSYour Name  */
798*5113495bSYour Name static QDF_STATUS
send_update_tdls_peer_state_cmd_tlv(wmi_unified_t wmi_handle,struct tdls_peer_update_state * peer_state,uint32_t * ch_mhz)799*5113495bSYour Name send_update_tdls_peer_state_cmd_tlv(wmi_unified_t wmi_handle,
800*5113495bSYour Name 				    struct tdls_peer_update_state *peer_state,
801*5113495bSYour Name 				    uint32_t *ch_mhz)
802*5113495bSYour Name {
803*5113495bSYour Name 	struct tdls_peer_params *in_peer_cap;
804*5113495bSYour Name 	struct tdls_ch_params *in_chan_info;
805*5113495bSYour Name 	wmi_tdls_peer_update_cmd_fixed_param *cmd;
806*5113495bSYour Name 	wmi_tdls_peer_capabilities *peer_cap;
807*5113495bSYour Name 	wmi_channel *chan_info;
808*5113495bSYour Name 	wmi_buf_t wmi_buf;
809*5113495bSYour Name 	uint8_t *buf_ptr;
810*5113495bSYour Name 	uint32_t i;
811*5113495bSYour Name 	int32_t len = sizeof(wmi_tdls_peer_update_cmd_fixed_param) +
812*5113495bSYour Name 		      sizeof(wmi_tdls_peer_capabilities);
813*5113495bSYour Name 
814*5113495bSYour Name 	in_peer_cap = &peer_state->peer_cap;
815*5113495bSYour Name 	len += WMI_TLV_HDR_SIZE +
816*5113495bSYour Name 	       sizeof(wmi_channel) * in_peer_cap->peer_chanlen;
817*5113495bSYour Name 
818*5113495bSYour Name 	wmi_buf = wmi_buf_alloc(wmi_handle, len);
819*5113495bSYour Name 	if (!wmi_buf) {
820*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
821*5113495bSYour Name 	}
822*5113495bSYour Name 
823*5113495bSYour Name 	buf_ptr = (uint8_t *) wmi_buf_data(wmi_buf);
824*5113495bSYour Name 	cmd = (wmi_tdls_peer_update_cmd_fixed_param *) buf_ptr;
825*5113495bSYour Name 	WMITLV_SET_HDR(&cmd->tlv_header,
826*5113495bSYour Name 		       WMITLV_TAG_STRUC_wmi_tdls_peer_update_cmd_fixed_param,
827*5113495bSYour Name 		       WMITLV_GET_STRUCT_TLVLEN
828*5113495bSYour Name 			       (wmi_tdls_peer_update_cmd_fixed_param));
829*5113495bSYour Name 
830*5113495bSYour Name 	cmd->vdev_id = peer_state->vdev_id;
831*5113495bSYour Name 	WMI_CHAR_ARRAY_TO_MAC_ADDR(peer_state->peer_macaddr,
832*5113495bSYour Name 				   &cmd->peer_macaddr);
833*5113495bSYour Name 
834*5113495bSYour Name 	cmd->peer_state = peer_state->peer_state;
835*5113495bSYour Name 
836*5113495bSYour Name 	wmi_debug("vdev_id: %d, peermac: "QDF_MAC_ADDR_FMT", "
837*5113495bSYour Name 		 "peer_macaddr.mac_addr31to0: 0x%x, "
838*5113495bSYour Name 		 "peer_macaddr.mac_addr47to32: 0x%x, peer_state: %d",
839*5113495bSYour Name 		 cmd->vdev_id,
840*5113495bSYour Name 		 QDF_MAC_ADDR_REF(peer_state->peer_macaddr),
841*5113495bSYour Name 		 cmd->peer_macaddr.mac_addr31to0,
842*5113495bSYour Name 		 cmd->peer_macaddr.mac_addr47to32, cmd->peer_state);
843*5113495bSYour Name 
844*5113495bSYour Name 	buf_ptr += sizeof(wmi_tdls_peer_update_cmd_fixed_param);
845*5113495bSYour Name 	peer_cap = (wmi_tdls_peer_capabilities *) buf_ptr;
846*5113495bSYour Name 	WMITLV_SET_HDR(&peer_cap->tlv_header,
847*5113495bSYour Name 		       WMITLV_TAG_STRUC_wmi_tdls_peer_capabilities,
848*5113495bSYour Name 		       WMITLV_GET_STRUCT_TLVLEN(wmi_tdls_peer_capabilities));
849*5113495bSYour Name 
850*5113495bSYour Name 	if ((in_peer_cap->peer_uapsd_queue & 0x08) >> 3)
851*5113495bSYour Name 		WMI_SET_TDLS_PEER_VO_UAPSD(peer_cap);
852*5113495bSYour Name 	if ((in_peer_cap->peer_uapsd_queue & 0x04) >> 2)
853*5113495bSYour Name 		WMI_SET_TDLS_PEER_VI_UAPSD(peer_cap);
854*5113495bSYour Name 	if ((in_peer_cap->peer_uapsd_queue & 0x02) >> 1)
855*5113495bSYour Name 		WMI_SET_TDLS_PEER_BK_UAPSD(peer_cap);
856*5113495bSYour Name 	if (in_peer_cap->peer_uapsd_queue & 0x01)
857*5113495bSYour Name 		WMI_SET_TDLS_PEER_BE_UAPSD(peer_cap);
858*5113495bSYour Name 
859*5113495bSYour Name 	/* Ack and More Data Ack are sent as 0, so no need to set
860*5113495bSYour Name 	 * but fill SP
861*5113495bSYour Name 	 */
862*5113495bSYour Name 	WMI_SET_TDLS_PEER_SP_UAPSD(peer_cap, in_peer_cap->peer_max_sp);
863*5113495bSYour Name 
864*5113495bSYour Name 	peer_cap->buff_sta_support = in_peer_cap->peer_buff_sta_support;
865*5113495bSYour Name 	peer_cap->off_chan_support = in_peer_cap->peer_off_chan_support;
866*5113495bSYour Name 	peer_cap->peer_curr_operclass = in_peer_cap->peer_curr_operclass;
867*5113495bSYour Name 	/* self curr operclass is not being used and so pass op class for
868*5113495bSYour Name 	 * preferred off chan in it.
869*5113495bSYour Name 	 */
870*5113495bSYour Name 	peer_cap->self_curr_operclass = in_peer_cap->opclass_for_prefoffchan;
871*5113495bSYour Name 	peer_cap->peer_chan_len = in_peer_cap->peer_chanlen;
872*5113495bSYour Name 	peer_cap->peer_operclass_len = in_peer_cap->peer_oper_classlen;
873*5113495bSYour Name 
874*5113495bSYour Name 	wmi_debug("peer_operclass_len: %d", peer_cap->peer_operclass_len);
875*5113495bSYour Name 	for (i = 0; i < WMI_TDLS_MAX_SUPP_OPER_CLASSES; i++) {
876*5113495bSYour Name 		peer_cap->peer_operclass[i] = in_peer_cap->peer_oper_class[i];
877*5113495bSYour Name 	}
878*5113495bSYour Name 	qdf_trace_hex_dump(QDF_MODULE_ID_WMI, QDF_TRACE_LEVEL_DEBUG,
879*5113495bSYour Name 			   (uint8_t *)peer_cap->peer_operclass,
880*5113495bSYour Name 			   WMI_TDLS_MAX_SUPP_OPER_CLASSES);
881*5113495bSYour Name 
882*5113495bSYour Name 	peer_cap->is_peer_responder = in_peer_cap->is_peer_responder;
883*5113495bSYour Name 	peer_cap->pref_offchan_freq = in_peer_cap->pref_offchan_freq;
884*5113495bSYour Name 	peer_cap->pref_offchan_num = in_peer_cap->pref_off_channum;
885*5113495bSYour Name 	peer_cap->pref_offchan_bw = in_peer_cap->pref_off_chan_bandwidth;
886*5113495bSYour Name 
887*5113495bSYour Name 	wmi_debug("peer_qos: 0x%x, buff_sta_support: %d, off_chan_support: %d, "
888*5113495bSYour Name 		 "peer_curr_operclass: %d, self_curr_operclass: %d, peer_chan_len: "
889*5113495bSYour Name 		 "%d, peer_operclass_len: %d, is_peer_responder: %d, pref_offchan_num:"
890*5113495bSYour Name 		 " %d, pref_offchan_bw: %d, pref_offchan_freq: %u",
891*5113495bSYour Name 		 peer_cap->peer_qos, peer_cap->buff_sta_support,
892*5113495bSYour Name 		 peer_cap->off_chan_support, peer_cap->peer_curr_operclass,
893*5113495bSYour Name 		 peer_cap->self_curr_operclass, peer_cap->peer_chan_len,
894*5113495bSYour Name 		 peer_cap->peer_operclass_len, peer_cap->is_peer_responder,
895*5113495bSYour Name 		 peer_cap->pref_offchan_num, peer_cap->pref_offchan_bw,
896*5113495bSYour Name 		 peer_cap->pref_offchan_freq);
897*5113495bSYour Name 
898*5113495bSYour Name 	/* next fill variable size array of peer chan info */
899*5113495bSYour Name 	buf_ptr += sizeof(wmi_tdls_peer_capabilities);
900*5113495bSYour Name 	WMITLV_SET_HDR(buf_ptr,
901*5113495bSYour Name 		       WMITLV_TAG_ARRAY_STRUC,
902*5113495bSYour Name 		       sizeof(wmi_channel) *
903*5113495bSYour Name 		       in_peer_cap->peer_chanlen);
904*5113495bSYour Name 
905*5113495bSYour Name 	chan_info = (wmi_channel *) (buf_ptr + WMI_TLV_HDR_SIZE);
906*5113495bSYour Name 	in_chan_info = in_peer_cap->peer_chan;
907*5113495bSYour Name 
908*5113495bSYour Name 	for (i = 0; i < in_peer_cap->peer_chanlen; ++i) {
909*5113495bSYour Name 		WMITLV_SET_HDR(&chan_info->tlv_header,
910*5113495bSYour Name 			       WMITLV_TAG_STRUC_wmi_channel,
911*5113495bSYour Name 			       WMITLV_GET_STRUCT_TLVLEN(wmi_channel));
912*5113495bSYour Name 		chan_info->mhz = ch_mhz[i];
913*5113495bSYour Name 		chan_info->band_center_freq1 = chan_info->mhz;
914*5113495bSYour Name 		chan_info->band_center_freq2 = 0;
915*5113495bSYour Name 
916*5113495bSYour Name 		wmi_debug("chan[%d] = %u", i, chan_info->mhz);
917*5113495bSYour Name 
918*5113495bSYour Name 		if (in_chan_info->dfs_set) {
919*5113495bSYour Name 			WMI_SET_CHANNEL_FLAG(chan_info, WMI_CHAN_FLAG_PASSIVE);
920*5113495bSYour Name 			wmi_debug("chan_freq[%d] DFS[%d]",
921*5113495bSYour Name 				  in_chan_info->ch_freq,
922*5113495bSYour Name 				  in_chan_info->dfs_set);
923*5113495bSYour Name 		}
924*5113495bSYour Name 
925*5113495bSYour Name 		if (chan_info->mhz < WMI_2_4_GHZ_MAX_FREQ)
926*5113495bSYour Name 			WMI_SET_CHANNEL_MODE(chan_info, MODE_11G);
927*5113495bSYour Name 		else
928*5113495bSYour Name 			WMI_SET_CHANNEL_MODE(chan_info, MODE_11A);
929*5113495bSYour Name 
930*5113495bSYour Name 		WMI_SET_CHANNEL_MAX_TX_POWER(chan_info, in_chan_info->pwr);
931*5113495bSYour Name 		WMI_SET_CHANNEL_REG_POWER(chan_info, in_chan_info->pwr);
932*5113495bSYour Name 		wmi_debug("Channel TX power[%d] = %u: %d", i, chan_info->mhz,
933*5113495bSYour Name 			 in_chan_info->pwr);
934*5113495bSYour Name 
935*5113495bSYour Name 		chan_info++;
936*5113495bSYour Name 		in_chan_info++;
937*5113495bSYour Name 	}
938*5113495bSYour Name 
939*5113495bSYour Name 	wmi_mtrace(WMI_TDLS_PEER_UPDATE_CMDID, cmd->vdev_id, 0);
940*5113495bSYour Name 	if (wmi_unified_cmd_send(wmi_handle, wmi_buf, len,
941*5113495bSYour Name 				 WMI_TDLS_PEER_UPDATE_CMDID)) {
942*5113495bSYour Name 		wmi_err("Failed to send tdls peer update state command");
943*5113495bSYour Name 		wmi_buf_free(wmi_buf);
944*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
945*5113495bSYour Name 	}
946*5113495bSYour Name 
947*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
948*5113495bSYour Name }
949*5113495bSYour Name 
950*5113495bSYour Name /**
951*5113495bSYour Name  * extract_vdev_tdls_ev_param_tlv() - extract vdev tdls param from event
952*5113495bSYour Name  * @wmi_handle: wmi handle
953*5113495bSYour Name  * @evt_buf: pointer to event buffer
954*5113495bSYour Name  * @param: Pointer to hold vdev tdls param
955*5113495bSYour Name  *
956*5113495bSYour Name  * Return: QDF_STATUS_SUCCESS for success or error code
957*5113495bSYour Name  */
extract_vdev_tdls_ev_param_tlv(wmi_unified_t wmi_handle,void * evt_buf,struct tdls_event_info * param)958*5113495bSYour Name static QDF_STATUS extract_vdev_tdls_ev_param_tlv(wmi_unified_t wmi_handle,
959*5113495bSYour Name 	void *evt_buf, struct tdls_event_info *param)
960*5113495bSYour Name {
961*5113495bSYour Name 	WMI_TDLS_PEER_EVENTID_param_tlvs *param_buf;
962*5113495bSYour Name 	wmi_tdls_peer_event_fixed_param *evt;
963*5113495bSYour Name 
964*5113495bSYour Name 	param_buf = (WMI_TDLS_PEER_EVENTID_param_tlvs *)evt_buf;
965*5113495bSYour Name 	if (!param_buf) {
966*5113495bSYour Name 		wmi_err("NULL param_buf");
967*5113495bSYour Name 		return QDF_STATUS_E_NULL_VALUE;
968*5113495bSYour Name 	}
969*5113495bSYour Name 
970*5113495bSYour Name 	evt = param_buf->fixed_param;
971*5113495bSYour Name 
972*5113495bSYour Name 	qdf_mem_zero(param, sizeof(*param));
973*5113495bSYour Name 
974*5113495bSYour Name 	param->vdev_id = evt->vdev_id;
975*5113495bSYour Name 	WMI_MAC_ADDR_TO_CHAR_ARRAY(&evt->peer_macaddr,
976*5113495bSYour Name 				   param->peermac.bytes);
977*5113495bSYour Name 	switch (evt->peer_status) {
978*5113495bSYour Name 	case WMI_TDLS_SHOULD_DISCOVER:
979*5113495bSYour Name 		param->message_type = TDLS_SHOULD_DISCOVER;
980*5113495bSYour Name 		break;
981*5113495bSYour Name 	case WMI_TDLS_SHOULD_TEARDOWN:
982*5113495bSYour Name 		param->message_type = TDLS_SHOULD_TEARDOWN;
983*5113495bSYour Name 		break;
984*5113495bSYour Name 	case WMI_TDLS_PEER_DISCONNECTED:
985*5113495bSYour Name 		param->message_type = TDLS_PEER_DISCONNECTED;
986*5113495bSYour Name 		break;
987*5113495bSYour Name 	case WMI_TDLS_CONNECTION_TRACKER_NOTIFICATION:
988*5113495bSYour Name 		param->message_type = TDLS_CONNECTION_TRACKER_NOTIFY;
989*5113495bSYour Name 		break;
990*5113495bSYour Name 	default:
991*5113495bSYour Name 		wmi_err("Discarding unknown tdls event %d from target",
992*5113495bSYour Name 			evt->peer_status);
993*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
994*5113495bSYour Name 	};
995*5113495bSYour Name 
996*5113495bSYour Name 	switch (evt->peer_reason) {
997*5113495bSYour Name 	case WMI_TDLS_TEARDOWN_REASON_TX:
998*5113495bSYour Name 		param->peer_reason = TDLS_TEARDOWN_TX;
999*5113495bSYour Name 		break;
1000*5113495bSYour Name 	case WMI_TDLS_TEARDOWN_REASON_RSSI:
1001*5113495bSYour Name 		param->peer_reason = TDLS_TEARDOWN_RSSI;
1002*5113495bSYour Name 		break;
1003*5113495bSYour Name 	case WMI_TDLS_TEARDOWN_REASON_SCAN:
1004*5113495bSYour Name 		param->peer_reason = TDLS_TEARDOWN_SCAN;
1005*5113495bSYour Name 		break;
1006*5113495bSYour Name 	case WMI_TDLS_DISCONNECTED_REASON_PEER_DELETE:
1007*5113495bSYour Name 		param->peer_reason = TDLS_DISCONNECTED_PEER_DELETE;
1008*5113495bSYour Name 		break;
1009*5113495bSYour Name 	case WMI_TDLS_TEARDOWN_REASON_PTR_TIMEOUT:
1010*5113495bSYour Name 		param->peer_reason = TDLS_TEARDOWN_PTR_TIMEOUT;
1011*5113495bSYour Name 		break;
1012*5113495bSYour Name 	case WMI_TDLS_TEARDOWN_REASON_BAD_PTR:
1013*5113495bSYour Name 		param->peer_reason = TDLS_TEARDOWN_BAD_PTR;
1014*5113495bSYour Name 		break;
1015*5113495bSYour Name 	case WMI_TDLS_TEARDOWN_REASON_NO_RESPONSE:
1016*5113495bSYour Name 		param->peer_reason = TDLS_TEARDOWN_NO_RSP;
1017*5113495bSYour Name 		break;
1018*5113495bSYour Name 	case WMI_TDLS_ENTER_BUF_STA:
1019*5113495bSYour Name 		param->peer_reason = TDLS_PEER_ENTER_BUF_STA;
1020*5113495bSYour Name 		break;
1021*5113495bSYour Name 	case WMI_TDLS_EXIT_BUF_STA:
1022*5113495bSYour Name 		param->peer_reason = TDLS_PEER_EXIT_BUF_STA;
1023*5113495bSYour Name 		break;
1024*5113495bSYour Name 	case WMI_TDLS_ENTER_BT_BUSY_MODE:
1025*5113495bSYour Name 		param->peer_reason = TDLS_ENTER_BT_BUSY;
1026*5113495bSYour Name 		break;
1027*5113495bSYour Name 	case WMI_TDLS_EXIT_BT_BUSY_MODE:
1028*5113495bSYour Name 		param->peer_reason = TDLS_EXIT_BT_BUSY;
1029*5113495bSYour Name 		break;
1030*5113495bSYour Name 	case WMI_TDLS_SCAN_STARTED_EVENT:
1031*5113495bSYour Name 		param->peer_reason = TDLS_SCAN_STARTED;
1032*5113495bSYour Name 		break;
1033*5113495bSYour Name 	case WMI_TDLS_SCAN_COMPLETED_EVENT:
1034*5113495bSYour Name 		param->peer_reason = TDLS_SCAN_COMPLETED;
1035*5113495bSYour Name 		break;
1036*5113495bSYour Name 
1037*5113495bSYour Name 	default:
1038*5113495bSYour Name 		wmi_err("Unknown reason %d in tdls event %d from target",
1039*5113495bSYour Name 			evt->peer_reason, evt->peer_status);
1040*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
1041*5113495bSYour Name 	};
1042*5113495bSYour Name 
1043*5113495bSYour Name 	wmi_debug("tdls event, peer: "QDF_MAC_ADDR_FMT", type: 0x%x, reason: %d, vdev: %d",
1044*5113495bSYour Name 		 QDF_MAC_ADDR_REF(param->peermac.bytes),
1045*5113495bSYour Name 		 param->message_type,
1046*5113495bSYour Name 		 param->peer_reason, param->vdev_id);
1047*5113495bSYour Name 
1048*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1049*5113495bSYour Name }
1050*5113495bSYour Name 
wmi_tdls_attach_tlv(struct wmi_unified * wmi_handle)1051*5113495bSYour Name void wmi_tdls_attach_tlv(struct wmi_unified *wmi_handle)
1052*5113495bSYour Name {
1053*5113495bSYour Name 	struct wmi_ops *ops = wmi_handle->ops;
1054*5113495bSYour Name 
1055*5113495bSYour Name 	ops->send_set_tdls_offchan_mode_cmd =
1056*5113495bSYour Name 		send_set_tdls_offchan_mode_cmd_tlv;
1057*5113495bSYour Name 	ops->send_update_fw_tdls_state_cmd =
1058*5113495bSYour Name 		send_update_fw_tdls_state_cmd_tlv;
1059*5113495bSYour Name 	ops->send_update_tdls_peer_state_cmd =
1060*5113495bSYour Name 		send_update_tdls_peer_state_cmd_tlv;
1061*5113495bSYour Name 	ops->extract_vdev_tdls_ev_param = extract_vdev_tdls_ev_param_tlv;
1062*5113495bSYour Name }
1063*5113495bSYour Name #endif /* FEATURE_WLAN_TDLS */
1064*5113495bSYour Name 
1065*5113495bSYour Name /*
1066*5113495bSYour Name  * send_process_set_ie_info_cmd_tlv() - Function to send IE info to firmware
1067*5113495bSYour Name  * @wmi_handle:    Pointer to WMi handle
1068*5113495bSYour Name  * @ie_data:       Pointer for ie data
1069*5113495bSYour Name  *
1070*5113495bSYour Name  * This function sends IE information to firmware
1071*5113495bSYour Name  *
1072*5113495bSYour Name  * Return: QDF_STATUS_SUCCESS for success otherwise failure
1073*5113495bSYour Name  *
1074*5113495bSYour Name  */
send_process_set_ie_info_cmd_tlv(wmi_unified_t wmi_handle,struct vdev_ie_info_param * ie_info)1075*5113495bSYour Name static QDF_STATUS send_process_set_ie_info_cmd_tlv(wmi_unified_t wmi_handle,
1076*5113495bSYour Name 				   struct vdev_ie_info_param *ie_info)
1077*5113495bSYour Name {
1078*5113495bSYour Name 	wmi_vdev_set_ie_cmd_fixed_param *cmd;
1079*5113495bSYour Name 	wmi_buf_t buf;
1080*5113495bSYour Name 	uint8_t *buf_ptr;
1081*5113495bSYour Name 	uint32_t len, ie_len_aligned;
1082*5113495bSYour Name 	QDF_STATUS ret;
1083*5113495bSYour Name 
1084*5113495bSYour Name 	ie_len_aligned = roundup(ie_info->length, sizeof(uint32_t));
1085*5113495bSYour Name 	/* Allocate memory for the WMI command */
1086*5113495bSYour Name 	len = sizeof(*cmd) + WMI_TLV_HDR_SIZE + ie_len_aligned;
1087*5113495bSYour Name 
1088*5113495bSYour Name 	buf = wmi_buf_alloc(wmi_handle, len);
1089*5113495bSYour Name 	if (!buf) {
1090*5113495bSYour Name 		return QDF_STATUS_E_NOMEM;
1091*5113495bSYour Name 	}
1092*5113495bSYour Name 
1093*5113495bSYour Name 	buf_ptr = wmi_buf_data(buf);
1094*5113495bSYour Name 	qdf_mem_zero(buf_ptr, len);
1095*5113495bSYour Name 
1096*5113495bSYour Name 	/* Populate the WMI command */
1097*5113495bSYour Name 	cmd = (wmi_vdev_set_ie_cmd_fixed_param *)buf_ptr;
1098*5113495bSYour Name 
1099*5113495bSYour Name 	WMITLV_SET_HDR(&cmd->tlv_header,
1100*5113495bSYour Name 		       WMITLV_TAG_STRUC_wmi_vdev_set_ie_cmd_fixed_param,
1101*5113495bSYour Name 		       WMITLV_GET_STRUCT_TLVLEN(
1102*5113495bSYour Name 				wmi_vdev_set_ie_cmd_fixed_param));
1103*5113495bSYour Name 	cmd->vdev_id = ie_info->vdev_id;
1104*5113495bSYour Name 	cmd->ie_id = ie_info->ie_id;
1105*5113495bSYour Name 	cmd->ie_len = ie_info->length;
1106*5113495bSYour Name 	cmd->band = ie_info->band;
1107*5113495bSYour Name 
1108*5113495bSYour Name 	wmi_debug("IE:%d of size:%d sent for vdev:%d", ie_info->ie_id,
1109*5113495bSYour Name 		 ie_info->length, ie_info->vdev_id);
1110*5113495bSYour Name 
1111*5113495bSYour Name 	buf_ptr += sizeof(*cmd);
1112*5113495bSYour Name 	WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_ARRAY_BYTE, ie_len_aligned);
1113*5113495bSYour Name 	buf_ptr += WMI_TLV_HDR_SIZE;
1114*5113495bSYour Name 
1115*5113495bSYour Name 	qdf_mem_copy(buf_ptr, ie_info->data, cmd->ie_len);
1116*5113495bSYour Name 
1117*5113495bSYour Name 	wmi_mtrace(WMI_VDEV_SET_IE_CMDID, cmd->vdev_id, 0);
1118*5113495bSYour Name 	ret = wmi_unified_cmd_send(wmi_handle, buf, len,
1119*5113495bSYour Name 				   WMI_VDEV_SET_IE_CMDID);
1120*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(ret)) {
1121*5113495bSYour Name 		wmi_err("Failed to send set IE command ret = %d", ret);
1122*5113495bSYour Name 		wmi_buf_free(buf);
1123*5113495bSYour Name 	}
1124*5113495bSYour Name 
1125*5113495bSYour Name 	return ret;
1126*5113495bSYour Name }
1127*5113495bSYour Name 
1128*5113495bSYour Name /**
1129*5113495bSYour Name  * send_set_base_macaddr_indicate_cmd_tlv() - set base mac address in fw
1130*5113495bSYour Name  * @wmi_handle: wmi handle
1131*5113495bSYour Name  * @custom_addr: base mac address
1132*5113495bSYour Name  *
1133*5113495bSYour Name  * Return: QDF_STATUS_SUCCESS for success or error code
1134*5113495bSYour Name  */
send_set_base_macaddr_indicate_cmd_tlv(wmi_unified_t wmi_handle,uint8_t * custom_addr)1135*5113495bSYour Name static QDF_STATUS send_set_base_macaddr_indicate_cmd_tlv(wmi_unified_t wmi_handle,
1136*5113495bSYour Name 					 uint8_t *custom_addr)
1137*5113495bSYour Name {
1138*5113495bSYour Name 	wmi_pdev_set_base_macaddr_cmd_fixed_param *cmd;
1139*5113495bSYour Name 	wmi_buf_t buf;
1140*5113495bSYour Name 	int err;
1141*5113495bSYour Name 
1142*5113495bSYour Name 	buf = wmi_buf_alloc(wmi_handle, sizeof(*cmd));
1143*5113495bSYour Name 	if (!buf) {
1144*5113495bSYour Name 		return QDF_STATUS_E_NOMEM;
1145*5113495bSYour Name 	}
1146*5113495bSYour Name 
1147*5113495bSYour Name 	cmd = (wmi_pdev_set_base_macaddr_cmd_fixed_param *) wmi_buf_data(buf);
1148*5113495bSYour Name 	qdf_mem_zero(cmd, sizeof(*cmd));
1149*5113495bSYour Name 
1150*5113495bSYour Name 	WMITLV_SET_HDR(&cmd->tlv_header,
1151*5113495bSYour Name 		WMITLV_TAG_STRUC_wmi_pdev_set_base_macaddr_cmd_fixed_param,
1152*5113495bSYour Name 		       WMITLV_GET_STRUCT_TLVLEN
1153*5113495bSYour Name 			       (wmi_pdev_set_base_macaddr_cmd_fixed_param));
1154*5113495bSYour Name 	WMI_CHAR_ARRAY_TO_MAC_ADDR(custom_addr, &cmd->base_macaddr);
1155*5113495bSYour Name 	cmd->pdev_id = wmi_handle->ops->convert_pdev_id_host_to_target(
1156*5113495bSYour Name 							wmi_handle,
1157*5113495bSYour Name 							WMI_HOST_PDEV_ID_SOC);
1158*5113495bSYour Name 	wmi_mtrace(WMI_PDEV_SET_BASE_MACADDR_CMDID, NO_SESSION, 0);
1159*5113495bSYour Name 	err = wmi_unified_cmd_send(wmi_handle, buf,
1160*5113495bSYour Name 				   sizeof(*cmd),
1161*5113495bSYour Name 				   WMI_PDEV_SET_BASE_MACADDR_CMDID);
1162*5113495bSYour Name 	if (err) {
1163*5113495bSYour Name 		wmi_err("Failed to send set_base_macaddr cmd");
1164*5113495bSYour Name 		wmi_buf_free(buf);
1165*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
1166*5113495bSYour Name 	}
1167*5113495bSYour Name 
1168*5113495bSYour Name 	return 0;
1169*5113495bSYour Name }
1170*5113495bSYour Name 
1171*5113495bSYour Name #if defined(WLAN_FEATURE_ROAM_OFFLOAD) && defined(FEATURE_DENYLIST_MGR)
1172*5113495bSYour Name 
1173*5113495bSYour Name static WMI_BSSID_DISALLOW_LIST_TYPE
wmi_get_wmi_reject_ap_type(enum dlm_reject_ap_type reject_ap_type)1174*5113495bSYour Name wmi_get_wmi_reject_ap_type(enum dlm_reject_ap_type reject_ap_type)
1175*5113495bSYour Name {
1176*5113495bSYour Name 	switch (reject_ap_type) {
1177*5113495bSYour Name 	case USERSPACE_AVOID_TYPE:
1178*5113495bSYour Name 		return WMI_BSSID_DISALLOW_USER_SPACE_AVOID_LIST;
1179*5113495bSYour Name 	case DRIVER_AVOID_TYPE:
1180*5113495bSYour Name 		return WMI_BSSID_DISALLOW_DRIVER_AVOID_LIST;
1181*5113495bSYour Name 	case USERSPACE_DENYLIST_TYPE:
1182*5113495bSYour Name 		return WMI_BSSID_DISALLOW_USER_SPACE_BLACK_LIST;
1183*5113495bSYour Name 	case DRIVER_DENYLIST_TYPE:
1184*5113495bSYour Name 		return WMI_BSSID_DISALLOW_DRIVER_BLACK_LIST;
1185*5113495bSYour Name 	case DRIVER_RSSI_REJECT_TYPE:
1186*5113495bSYour Name 		return WMI_BSSID_DISALLOW_RSSI_REJECT_LIST;
1187*5113495bSYour Name 	default:
1188*5113495bSYour Name 		return WMI_BSSID_DISALLOW_DRIVER_AVOID_LIST;
1189*5113495bSYour Name 	}
1190*5113495bSYour Name }
1191*5113495bSYour Name 
1192*5113495bSYour Name static WMI_BLACKLIST_REASON_ID
wmi_get_reject_reason(enum dlm_reject_ap_reason reject_reason)1193*5113495bSYour Name wmi_get_reject_reason(enum dlm_reject_ap_reason reject_reason)
1194*5113495bSYour Name {
1195*5113495bSYour Name 	switch(reject_reason) {
1196*5113495bSYour Name 	case REASON_NUD_FAILURE:
1197*5113495bSYour Name 		return WMI_BL_REASON_NUD_FAILURE;
1198*5113495bSYour Name 	case REASON_STA_KICKOUT:
1199*5113495bSYour Name 		return WMI_BL_REASON_STA_KICKOUT;
1200*5113495bSYour Name 	case REASON_ROAM_HO_FAILURE:
1201*5113495bSYour Name 		return WMI_BL_REASON_ROAM_HO_FAILURE;
1202*5113495bSYour Name 	case REASON_ASSOC_REJECT_POOR_RSSI:
1203*5113495bSYour Name 		return WMI_BL_REASON_ASSOC_REJECT_POOR_RSSI;
1204*5113495bSYour Name 	case REASON_ASSOC_REJECT_OCE:
1205*5113495bSYour Name 		return WMI_BL_REASON_ASSOC_REJECT_OCE;
1206*5113495bSYour Name 	case REASON_USERSPACE_BL:
1207*5113495bSYour Name 		return WMI_BL_REASON_USERSPACE_BL;
1208*5113495bSYour Name 	case REASON_USERSPACE_AVOID_LIST:
1209*5113495bSYour Name 		return WMI_BL_REASON_USERSPACE_AVOID_LIST;
1210*5113495bSYour Name 	case REASON_BTM_DISASSOC_IMMINENT:
1211*5113495bSYour Name 		return WMI_BL_REASON_BTM_DIASSOC_IMMINENT;
1212*5113495bSYour Name 	case REASON_BTM_BSS_TERMINATION:
1213*5113495bSYour Name 		return WMI_BL_REASON_BTM_BSS_TERMINATION;
1214*5113495bSYour Name 	case REASON_BTM_MBO_RETRY:
1215*5113495bSYour Name 		return WMI_BL_REASON_BTM_MBO_RETRY;
1216*5113495bSYour Name 	case REASON_REASSOC_RSSI_REJECT:
1217*5113495bSYour Name 		return WMI_BL_REASON_REASSOC_RSSI_REJECT;
1218*5113495bSYour Name 	case REASON_REASSOC_NO_MORE_STAS:
1219*5113495bSYour Name 		return WMI_BL_REASON_REASSOC_NO_MORE_STAS;
1220*5113495bSYour Name 	default:
1221*5113495bSYour Name 		return 0;
1222*5113495bSYour Name 	}
1223*5113495bSYour Name }
1224*5113495bSYour Name 
1225*5113495bSYour Name static QDF_STATUS
send_reject_ap_list_cmd_tlv(wmi_unified_t wmi_handle,struct reject_ap_params * reject_params)1226*5113495bSYour Name send_reject_ap_list_cmd_tlv(wmi_unified_t wmi_handle,
1227*5113495bSYour Name 			    struct reject_ap_params *reject_params)
1228*5113495bSYour Name {
1229*5113495bSYour Name 	wmi_buf_t buf;
1230*5113495bSYour Name 	QDF_STATUS status;
1231*5113495bSYour Name 	uint32_t len, list_tlv_len;
1232*5113495bSYour Name 	int i;
1233*5113495bSYour Name 	uint8_t *buf_ptr;
1234*5113495bSYour Name 	wmi_pdev_dsm_filter_fixed_param *chan_list_fp;
1235*5113495bSYour Name 	wmi_pdev_bssid_disallow_list_config_param *chan_list;
1236*5113495bSYour Name 	struct reject_ap_config_params *reject_list = reject_params->bssid_list;
1237*5113495bSYour Name 	uint8_t num_of_reject_bssid = reject_params->num_of_reject_bssid;
1238*5113495bSYour Name 
1239*5113495bSYour Name 	list_tlv_len = sizeof(*chan_list) * num_of_reject_bssid;
1240*5113495bSYour Name 
1241*5113495bSYour Name 	len = sizeof(*chan_list_fp) + list_tlv_len + WMI_TLV_HDR_SIZE;
1242*5113495bSYour Name 	buf = wmi_buf_alloc(wmi_handle, len);
1243*5113495bSYour Name 	if (!buf)
1244*5113495bSYour Name 		return QDF_STATUS_E_NOMEM;
1245*5113495bSYour Name 
1246*5113495bSYour Name 	wmi_debug("num of reject BSSIDs %d", num_of_reject_bssid);
1247*5113495bSYour Name 
1248*5113495bSYour Name 	buf_ptr = (uint8_t *)wmi_buf_data(buf);
1249*5113495bSYour Name 	chan_list_fp = (wmi_pdev_dsm_filter_fixed_param *)buf_ptr;
1250*5113495bSYour Name 	WMITLV_SET_HDR(&chan_list_fp->tlv_header,
1251*5113495bSYour Name 		       WMITLV_TAG_STRUC_wmi_pdev_dsm_filter_fixed_param,
1252*5113495bSYour Name 		       WMITLV_GET_STRUCT_TLVLEN
1253*5113495bSYour Name 			       (wmi_pdev_dsm_filter_fixed_param));
1254*5113495bSYour Name 
1255*5113495bSYour Name 	buf_ptr += sizeof(wmi_pdev_dsm_filter_fixed_param);
1256*5113495bSYour Name 	WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_ARRAY_STRUC, list_tlv_len);
1257*5113495bSYour Name 
1258*5113495bSYour Name 	buf_ptr += WMI_TLV_HDR_SIZE;
1259*5113495bSYour Name 	chan_list = (wmi_pdev_bssid_disallow_list_config_param *)buf_ptr;
1260*5113495bSYour Name 	for (i = 0; i < num_of_reject_bssid; i++) {
1261*5113495bSYour Name 
1262*5113495bSYour Name 		WMITLV_SET_HDR(&chan_list->tlv_header,
1263*5113495bSYour Name 		     WMITLV_TAG_STRUC_wmi_pdev_bssid_disallow_list_config_param,
1264*5113495bSYour Name 			       WMITLV_GET_STRUCT_TLVLEN
1265*5113495bSYour Name 				  (wmi_pdev_bssid_disallow_list_config_param));
1266*5113495bSYour Name 		WMI_CHAR_ARRAY_TO_MAC_ADDR(reject_list[i].bssid.bytes,
1267*5113495bSYour Name 					   &chan_list->bssid);
1268*5113495bSYour Name 		chan_list->bssid_type =
1269*5113495bSYour Name 		    wmi_get_wmi_reject_ap_type(reject_list[i].reject_ap_type);
1270*5113495bSYour Name 		chan_list->expected_rssi = reject_list[i].expected_rssi;
1271*5113495bSYour Name 		chan_list->remaining_disallow_duration =
1272*5113495bSYour Name 					reject_list[i].reject_duration;
1273*5113495bSYour Name 		chan_list->reason =
1274*5113495bSYour Name 			wmi_get_reject_reason(reject_list[i].reject_reason);
1275*5113495bSYour Name 		chan_list->original_timeout = reject_list[i].original_timeout;
1276*5113495bSYour Name 		chan_list->timestamp = reject_list[i].received_time;
1277*5113495bSYour Name 		chan_list->source = reject_list[i].source;
1278*5113495bSYour Name 		chan_list++;
1279*5113495bSYour Name 	}
1280*5113495bSYour Name 
1281*5113495bSYour Name 	wmi_mtrace(WMI_PDEV_DSM_FILTER_CMDID, NO_SESSION, 0);
1282*5113495bSYour Name 	status = wmi_unified_cmd_send(wmi_handle, buf,
1283*5113495bSYour Name 				      len, WMI_PDEV_DSM_FILTER_CMDID);
1284*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
1285*5113495bSYour Name 		wmi_err("wmi_unified_cmd_send WMI_PDEV_DSM_FILTER_CMDID returned Error %d",
1286*5113495bSYour Name 			 status);
1287*5113495bSYour Name 		goto error;
1288*5113495bSYour Name 	}
1289*5113495bSYour Name 
1290*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1291*5113495bSYour Name error:
1292*5113495bSYour Name 	wmi_buf_free(buf);
1293*5113495bSYour Name 	return status;
1294*5113495bSYour Name }
1295*5113495bSYour Name 
wmi_denylist_mgr_attach_tlv(struct wmi_unified * wmi_handle)1296*5113495bSYour Name void wmi_denylist_mgr_attach_tlv(struct wmi_unified *wmi_handle)
1297*5113495bSYour Name {
1298*5113495bSYour Name 	struct wmi_ops *ops = wmi_handle->ops;
1299*5113495bSYour Name 
1300*5113495bSYour Name 	ops->send_reject_ap_list_cmd = send_reject_ap_list_cmd_tlv;
1301*5113495bSYour Name }
1302*5113495bSYour Name #endif
1303*5113495bSYour Name 
1304*5113495bSYour Name /**
1305*5113495bSYour Name  * send_sar_limit_cmd_tlv() - send sar limit cmd to fw
1306*5113495bSYour Name  * @wmi_handle: wmi handle
1307*5113495bSYour Name  * @sar_limit_params: sar limit params
1308*5113495bSYour Name  *
1309*5113495bSYour Name  * Return: QDF_STATUS_SUCCESS for success or error code
1310*5113495bSYour Name  */
send_sar_limit_cmd_tlv(wmi_unified_t wmi_handle,struct sar_limit_cmd_params * sar_limit_params)1311*5113495bSYour Name static QDF_STATUS send_sar_limit_cmd_tlv(wmi_unified_t wmi_handle,
1312*5113495bSYour Name 		struct sar_limit_cmd_params *sar_limit_params)
1313*5113495bSYour Name {
1314*5113495bSYour Name 	wmi_buf_t buf;
1315*5113495bSYour Name 	QDF_STATUS qdf_status;
1316*5113495bSYour Name 	wmi_sar_limits_cmd_fixed_param *cmd;
1317*5113495bSYour Name 	int i;
1318*5113495bSYour Name 	uint8_t *buf_ptr;
1319*5113495bSYour Name 	wmi_sar_limit_cmd_row *wmi_sar_rows_list;
1320*5113495bSYour Name 	struct sar_limit_cmd_row *sar_rows_list;
1321*5113495bSYour Name 	uint32_t len = sizeof(*cmd) + WMI_TLV_HDR_SIZE;
1322*5113495bSYour Name 
1323*5113495bSYour Name 	len += sizeof(wmi_sar_limit_cmd_row) * sar_limit_params->num_limit_rows;
1324*5113495bSYour Name 	buf = wmi_buf_alloc(wmi_handle, len);
1325*5113495bSYour Name 	if (!buf) {
1326*5113495bSYour Name 		qdf_status = QDF_STATUS_E_NOMEM;
1327*5113495bSYour Name 		goto end;
1328*5113495bSYour Name 	}
1329*5113495bSYour Name 
1330*5113495bSYour Name 	buf_ptr = (uint8_t *) wmi_buf_data(buf);
1331*5113495bSYour Name 	cmd = (wmi_sar_limits_cmd_fixed_param *) buf_ptr;
1332*5113495bSYour Name 	WMITLV_SET_HDR(&cmd->tlv_header,
1333*5113495bSYour Name 		       WMITLV_TAG_STRUC_wmi_sar_limits_cmd_fixed_param,
1334*5113495bSYour Name 		       WMITLV_GET_STRUCT_TLVLEN
1335*5113495bSYour Name 				(wmi_sar_limits_cmd_fixed_param));
1336*5113495bSYour Name 	cmd->sar_enable = sar_limit_params->sar_enable;
1337*5113495bSYour Name 	cmd->commit_limits = sar_limit_params->commit_limits;
1338*5113495bSYour Name 	cmd->num_limit_rows = sar_limit_params->num_limit_rows;
1339*5113495bSYour Name 
1340*5113495bSYour Name 	wmi_debug("no of sar rows = %d, len = %d",
1341*5113495bSYour Name 		 sar_limit_params->num_limit_rows, len);
1342*5113495bSYour Name 	buf_ptr += sizeof(*cmd);
1343*5113495bSYour Name 	WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_ARRAY_STRUC,
1344*5113495bSYour Name 		       sizeof(wmi_sar_limit_cmd_row) *
1345*5113495bSYour Name 			      sar_limit_params->num_limit_rows);
1346*5113495bSYour Name 	if (cmd->num_limit_rows == 0)
1347*5113495bSYour Name 		goto send_sar_limits;
1348*5113495bSYour Name 
1349*5113495bSYour Name 	wmi_sar_rows_list = (wmi_sar_limit_cmd_row *)
1350*5113495bSYour Name 				(buf_ptr + WMI_TLV_HDR_SIZE);
1351*5113495bSYour Name 	sar_rows_list = sar_limit_params->sar_limit_row_list;
1352*5113495bSYour Name 
1353*5113495bSYour Name 	for (i = 0; i < sar_limit_params->num_limit_rows; i++) {
1354*5113495bSYour Name 		WMITLV_SET_HDR(&wmi_sar_rows_list->tlv_header,
1355*5113495bSYour Name 			       WMITLV_TAG_STRUC_wmi_sar_limit_cmd_row,
1356*5113495bSYour Name 			       WMITLV_GET_STRUCT_TLVLEN(wmi_sar_limit_cmd_row));
1357*5113495bSYour Name 		wmi_sar_rows_list->band_id = sar_rows_list->band_id;
1358*5113495bSYour Name 		wmi_sar_rows_list->chain_id = sar_rows_list->chain_id;
1359*5113495bSYour Name 		wmi_sar_rows_list->mod_id = sar_rows_list->mod_id;
1360*5113495bSYour Name 		wmi_sar_rows_list->limit_value = sar_rows_list->limit_value;
1361*5113495bSYour Name 		wmi_sar_rows_list->validity_bitmap =
1362*5113495bSYour Name 						sar_rows_list->validity_bitmap;
1363*5113495bSYour Name 		wmi_debug("row %d, band_id = %d, chain_id = %d, mod_id = %d, limit_value = %d, validity_bitmap = %d",
1364*5113495bSYour Name 			 i, wmi_sar_rows_list->band_id,
1365*5113495bSYour Name 			 wmi_sar_rows_list->chain_id,
1366*5113495bSYour Name 			 wmi_sar_rows_list->mod_id,
1367*5113495bSYour Name 			 wmi_sar_rows_list->limit_value,
1368*5113495bSYour Name 			 wmi_sar_rows_list->validity_bitmap);
1369*5113495bSYour Name 		sar_rows_list++;
1370*5113495bSYour Name 		wmi_sar_rows_list++;
1371*5113495bSYour Name 	}
1372*5113495bSYour Name send_sar_limits:
1373*5113495bSYour Name 	wmi_mtrace(WMI_SAR_LIMITS_CMDID, NO_SESSION, 0);
1374*5113495bSYour Name 	qdf_status = wmi_unified_cmd_send(wmi_handle, buf, len,
1375*5113495bSYour Name 					  WMI_SAR_LIMITS_CMDID);
1376*5113495bSYour Name 
1377*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(qdf_status)) {
1378*5113495bSYour Name 		wmi_err("Failed to send WMI_SAR_LIMITS_CMDID");
1379*5113495bSYour Name 		wmi_buf_free(buf);
1380*5113495bSYour Name 	}
1381*5113495bSYour Name 
1382*5113495bSYour Name end:
1383*5113495bSYour Name 	return qdf_status;
1384*5113495bSYour Name }
1385*5113495bSYour Name 
get_sar_limit_cmd_tlv(wmi_unified_t wmi_handle)1386*5113495bSYour Name static QDF_STATUS get_sar_limit_cmd_tlv(wmi_unified_t wmi_handle)
1387*5113495bSYour Name {
1388*5113495bSYour Name 	wmi_sar_get_limits_cmd_fixed_param *cmd;
1389*5113495bSYour Name 	wmi_buf_t wmi_buf;
1390*5113495bSYour Name 	uint32_t len;
1391*5113495bSYour Name 	QDF_STATUS status;
1392*5113495bSYour Name 
1393*5113495bSYour Name 	wmi_debug("Enter");
1394*5113495bSYour Name 
1395*5113495bSYour Name 	len = sizeof(*cmd);
1396*5113495bSYour Name 	wmi_buf = wmi_buf_alloc(wmi_handle, len);
1397*5113495bSYour Name 	if (!wmi_buf) {
1398*5113495bSYour Name 		return QDF_STATUS_E_NOMEM;
1399*5113495bSYour Name 	}
1400*5113495bSYour Name 
1401*5113495bSYour Name 	cmd = (wmi_sar_get_limits_cmd_fixed_param *)wmi_buf_data(wmi_buf);
1402*5113495bSYour Name 
1403*5113495bSYour Name 	WMITLV_SET_HDR(&cmd->tlv_header,
1404*5113495bSYour Name 		       WMITLV_TAG_STRUC_wmi_sar_get_limits_cmd_fixed_param,
1405*5113495bSYour Name 		       WMITLV_GET_STRUCT_TLVLEN
1406*5113495bSYour Name 				(wmi_sar_get_limits_cmd_fixed_param));
1407*5113495bSYour Name 
1408*5113495bSYour Name 	cmd->reserved = 0;
1409*5113495bSYour Name 
1410*5113495bSYour Name 	wmi_mtrace(WMI_SAR_GET_LIMITS_CMDID, NO_SESSION, 0);
1411*5113495bSYour Name 	status = wmi_unified_cmd_send(wmi_handle, wmi_buf, len,
1412*5113495bSYour Name 				      WMI_SAR_GET_LIMITS_CMDID);
1413*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
1414*5113495bSYour Name 		wmi_err("Failed to send get SAR limit cmd: %d", status);
1415*5113495bSYour Name 		wmi_buf_free(wmi_buf);
1416*5113495bSYour Name 	}
1417*5113495bSYour Name 
1418*5113495bSYour Name 	wmi_debug("Exit");
1419*5113495bSYour Name 
1420*5113495bSYour Name 	return status;
1421*5113495bSYour Name }
1422*5113495bSYour Name 
1423*5113495bSYour Name /**
1424*5113495bSYour Name  * wmi_sar2_result_string() - return string conversion of sar2 result
1425*5113495bSYour Name  * @result: sar2 result value
1426*5113495bSYour Name  *
1427*5113495bSYour Name  * This utility function helps log string conversion of sar2 result.
1428*5113495bSYour Name  *
1429*5113495bSYour Name  * Return: string conversion of sar 2 result, if match found;
1430*5113495bSYour Name  *	   "Unknown response" otherwise.
1431*5113495bSYour Name  */
wmi_sar2_result_string(uint32_t result)1432*5113495bSYour Name static const char *wmi_sar2_result_string(uint32_t result)
1433*5113495bSYour Name {
1434*5113495bSYour Name 	switch (result) {
1435*5113495bSYour Name 	CASE_RETURN_STRING(WMI_SAR2_SUCCESS);
1436*5113495bSYour Name 	CASE_RETURN_STRING(WMI_SAR2_INVALID_ANTENNA_INDEX);
1437*5113495bSYour Name 	CASE_RETURN_STRING(WMI_SAR2_INVALID_TABLE_INDEX);
1438*5113495bSYour Name 	CASE_RETURN_STRING(WMI_SAR2_STATE_ERROR);
1439*5113495bSYour Name 	CASE_RETURN_STRING(WMI_SAR2_BDF_NO_TABLE);
1440*5113495bSYour Name 	default:
1441*5113495bSYour Name 		return "Unknown response";
1442*5113495bSYour Name 	}
1443*5113495bSYour Name }
1444*5113495bSYour Name 
1445*5113495bSYour Name /**
1446*5113495bSYour Name  * extract_sar2_result_event_tlv() -  process sar response event from FW.
1447*5113495bSYour Name  * @handle: wma handle
1448*5113495bSYour Name  * @event: event buffer
1449*5113495bSYour Name  * @len: buffer length
1450*5113495bSYour Name  *
1451*5113495bSYour Name  * Return: 0 for success or error code
1452*5113495bSYour Name  */
extract_sar2_result_event_tlv(void * handle,uint8_t * event,uint32_t len)1453*5113495bSYour Name static QDF_STATUS extract_sar2_result_event_tlv(void *handle,
1454*5113495bSYour Name 						uint8_t *event,
1455*5113495bSYour Name 						uint32_t len)
1456*5113495bSYour Name {
1457*5113495bSYour Name 	wmi_sar2_result_event_fixed_param *sar2_fixed_param;
1458*5113495bSYour Name 
1459*5113495bSYour Name 	WMI_SAR2_RESULT_EVENTID_param_tlvs *param_buf =
1460*5113495bSYour Name 		(WMI_SAR2_RESULT_EVENTID_param_tlvs *)event;
1461*5113495bSYour Name 
1462*5113495bSYour Name 	if (!param_buf) {
1463*5113495bSYour Name 		wmi_err("Invalid sar2 result event buffer");
1464*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
1465*5113495bSYour Name 	}
1466*5113495bSYour Name 
1467*5113495bSYour Name 	sar2_fixed_param = param_buf->fixed_param;
1468*5113495bSYour Name 	if (!sar2_fixed_param) {
1469*5113495bSYour Name 		wmi_err("Invalid sar2 result event fixed param buffer");
1470*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
1471*5113495bSYour Name 	}
1472*5113495bSYour Name 
1473*5113495bSYour Name 	wmi_debug("SAR2 result: %s",
1474*5113495bSYour Name 		 wmi_sar2_result_string(sar2_fixed_param->result));
1475*5113495bSYour Name 
1476*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1477*5113495bSYour Name }
1478*5113495bSYour Name 
extract_sar_limit_event_tlv(wmi_unified_t wmi_handle,uint8_t * evt_buf,struct sar_limit_event * event)1479*5113495bSYour Name static QDF_STATUS extract_sar_limit_event_tlv(wmi_unified_t wmi_handle,
1480*5113495bSYour Name 					      uint8_t *evt_buf,
1481*5113495bSYour Name 					      struct sar_limit_event *event)
1482*5113495bSYour Name {
1483*5113495bSYour Name 	wmi_sar_get_limits_event_fixed_param *fixed_param;
1484*5113495bSYour Name 	WMI_SAR_GET_LIMITS_EVENTID_param_tlvs *param_buf;
1485*5113495bSYour Name 	wmi_sar_get_limit_event_row *row_in;
1486*5113495bSYour Name 	struct sar_limit_event_row *row_out;
1487*5113495bSYour Name 	uint32_t row;
1488*5113495bSYour Name 
1489*5113495bSYour Name 	if (!evt_buf) {
1490*5113495bSYour Name 		wmi_err("input event is NULL");
1491*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
1492*5113495bSYour Name 	}
1493*5113495bSYour Name 	if (!event) {
1494*5113495bSYour Name 		wmi_err("output event is NULL");
1495*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
1496*5113495bSYour Name 	}
1497*5113495bSYour Name 
1498*5113495bSYour Name 	param_buf = (WMI_SAR_GET_LIMITS_EVENTID_param_tlvs *)evt_buf;
1499*5113495bSYour Name 
1500*5113495bSYour Name 	fixed_param = param_buf->fixed_param;
1501*5113495bSYour Name 	if (!fixed_param) {
1502*5113495bSYour Name 		wmi_err("Invalid fixed param");
1503*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
1504*5113495bSYour Name 	}
1505*5113495bSYour Name 
1506*5113495bSYour Name 	event->sar_enable = fixed_param->sar_enable;
1507*5113495bSYour Name 	event->num_limit_rows = fixed_param->num_limit_rows;
1508*5113495bSYour Name 
1509*5113495bSYour Name 	if (event->num_limit_rows > param_buf->num_sar_get_limits) {
1510*5113495bSYour Name 		wmi_err("Num rows %d exceeds sar_get_limits rows len %d",
1511*5113495bSYour Name 			 event->num_limit_rows, param_buf->num_sar_get_limits);
1512*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
1513*5113495bSYour Name 	}
1514*5113495bSYour Name 
1515*5113495bSYour Name 	if (event->num_limit_rows > MAX_SAR_LIMIT_ROWS_SUPPORTED) {
1516*5113495bSYour Name 		QDF_ASSERT(0);
1517*5113495bSYour Name 		wmi_err("Num rows %d exceeds max of %d",
1518*5113495bSYour Name 			 event->num_limit_rows,
1519*5113495bSYour Name 			 MAX_SAR_LIMIT_ROWS_SUPPORTED);
1520*5113495bSYour Name 		event->num_limit_rows = MAX_SAR_LIMIT_ROWS_SUPPORTED;
1521*5113495bSYour Name 	}
1522*5113495bSYour Name 
1523*5113495bSYour Name 	row_in = param_buf->sar_get_limits;
1524*5113495bSYour Name 	if (!row_in) {
1525*5113495bSYour Name 		wmi_debug("sar_get_limits is NULL");
1526*5113495bSYour Name 	} else {
1527*5113495bSYour Name 		row_out = &event->sar_limit_row[0];
1528*5113495bSYour Name 		for (row = 0; row < event->num_limit_rows; row++) {
1529*5113495bSYour Name 			row_out->band_id = row_in->band_id;
1530*5113495bSYour Name 			row_out->chain_id = row_in->chain_id;
1531*5113495bSYour Name 			row_out->mod_id = row_in->mod_id;
1532*5113495bSYour Name 			row_out->limit_value = row_in->limit_value;
1533*5113495bSYour Name 			row_out++;
1534*5113495bSYour Name 			row_in++;
1535*5113495bSYour Name 		}
1536*5113495bSYour Name 	}
1537*5113495bSYour Name 
1538*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1539*5113495bSYour Name }
1540*5113495bSYour Name 
1541*5113495bSYour Name /**
1542*5113495bSYour Name  * send_set_del_pmkid_cache_cmd_tlv() - send wmi cmd of set del pmkid
1543*5113495bSYour Name  * @wmi_handle: wmi handler
1544*5113495bSYour Name  * @pmk_info: pointer to PMK cache entry
1545*5113495bSYour Name  *
1546*5113495bSYour Name  * Return: 0 for success and non zero for failure
1547*5113495bSYour Name  */
send_set_del_pmkid_cache_cmd_tlv(wmi_unified_t wmi_handle,struct wmi_unified_pmk_cache * pmk_info)1548*5113495bSYour Name static QDF_STATUS send_set_del_pmkid_cache_cmd_tlv(wmi_unified_t wmi_handle,
1549*5113495bSYour Name 				struct wmi_unified_pmk_cache *pmk_info)
1550*5113495bSYour Name {
1551*5113495bSYour Name 	wmi_pdev_update_pmk_cache_cmd_fixed_param *cmd;
1552*5113495bSYour Name 	wmi_buf_t buf;
1553*5113495bSYour Name 	QDF_STATUS status;
1554*5113495bSYour Name 	uint8_t *buf_ptr;
1555*5113495bSYour Name 	wmi_pmk_cache *pmksa;
1556*5113495bSYour Name 	uint32_t len = sizeof(*cmd);
1557*5113495bSYour Name 
1558*5113495bSYour Name 	if (!pmk_info)
1559*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
1560*5113495bSYour Name 
1561*5113495bSYour Name 	if (!pmk_info->is_flush_all)
1562*5113495bSYour Name 		len += WMI_TLV_HDR_SIZE + sizeof(*pmksa);
1563*5113495bSYour Name 
1564*5113495bSYour Name 	buf = wmi_buf_alloc(wmi_handle, len);
1565*5113495bSYour Name 	if (!buf) {
1566*5113495bSYour Name 		return QDF_STATUS_E_NOMEM;
1567*5113495bSYour Name 	}
1568*5113495bSYour Name 
1569*5113495bSYour Name 	buf_ptr = (uint8_t *) wmi_buf_data(buf);
1570*5113495bSYour Name 	cmd = (wmi_pdev_update_pmk_cache_cmd_fixed_param *) buf_ptr;
1571*5113495bSYour Name 
1572*5113495bSYour Name 	WMITLV_SET_HDR(&cmd->tlv_header,
1573*5113495bSYour Name 		 WMITLV_TAG_STRUC_wmi_pdev_update_pmk_cache_cmd_fixed_param,
1574*5113495bSYour Name 		 WMITLV_GET_STRUCT_TLVLEN(
1575*5113495bSYour Name 			wmi_pdev_update_pmk_cache_cmd_fixed_param));
1576*5113495bSYour Name 
1577*5113495bSYour Name 	cmd->vdev_id = pmk_info->vdev_id;
1578*5113495bSYour Name 
1579*5113495bSYour Name 	/* If pmk_info->is_flush_all is true, this is a flush request */
1580*5113495bSYour Name 	if (pmk_info->is_flush_all) {
1581*5113495bSYour Name 		cmd->op_flag = WMI_PMK_CACHE_OP_FLAG_FLUSH_ALL;
1582*5113495bSYour Name 		cmd->num_cache = 0;
1583*5113495bSYour Name 		goto send_cmd;
1584*5113495bSYour Name 	}
1585*5113495bSYour Name 
1586*5113495bSYour Name 	cmd->num_cache = 1;
1587*5113495bSYour Name 	buf_ptr += sizeof(*cmd);
1588*5113495bSYour Name 
1589*5113495bSYour Name 	WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_ARRAY_STRUC,
1590*5113495bSYour Name 			sizeof(*pmksa));
1591*5113495bSYour Name 	buf_ptr += WMI_TLV_HDR_SIZE;
1592*5113495bSYour Name 
1593*5113495bSYour Name 	pmksa = (wmi_pmk_cache *)buf_ptr;
1594*5113495bSYour Name 	WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_STRUC_wmi_pmk_cache,
1595*5113495bSYour Name 			WMITLV_GET_STRUCT_TLVLEN
1596*5113495bSYour Name 				(wmi_pmk_cache));
1597*5113495bSYour Name 	pmksa->pmk_len = pmk_info->pmk_len;
1598*5113495bSYour Name 	qdf_mem_copy(pmksa->pmk, pmk_info->pmk, pmksa->pmk_len);
1599*5113495bSYour Name 	pmksa->pmkid_len = pmk_info->pmkid_len;
1600*5113495bSYour Name 	qdf_mem_copy(pmksa->pmkid, pmk_info->pmkid, pmksa->pmkid_len);
1601*5113495bSYour Name 	qdf_mem_copy(&(pmksa->bssid), &(pmk_info->bssid), sizeof(wmi_mac_addr));
1602*5113495bSYour Name 	pmksa->ssid.ssid_len = pmk_info->ssid.length;
1603*5113495bSYour Name 	qdf_mem_copy(&(pmksa->ssid.ssid), &(pmk_info->ssid.ssid),
1604*5113495bSYour Name 		     pmksa->ssid.ssid_len);
1605*5113495bSYour Name 	pmksa->cache_id = pmk_info->cache_id;
1606*5113495bSYour Name 	pmksa->cat_flag = pmk_info->cat_flag;
1607*5113495bSYour Name 	pmksa->action_flag = pmk_info->action_flag;
1608*5113495bSYour Name 
1609*5113495bSYour Name send_cmd:
1610*5113495bSYour Name 	wmi_mtrace(WMI_PDEV_UPDATE_PMK_CACHE_CMDID, cmd->vdev_id, 0);
1611*5113495bSYour Name 	status = wmi_unified_cmd_send(wmi_handle, buf, len,
1612*5113495bSYour Name 				      WMI_PDEV_UPDATE_PMK_CACHE_CMDID);
1613*5113495bSYour Name 	if (status != QDF_STATUS_SUCCESS) {
1614*5113495bSYour Name 		wmi_err("Failed to send set del pmkid cache command %d",
1615*5113495bSYour Name 			status);
1616*5113495bSYour Name 		wmi_buf_free(buf);
1617*5113495bSYour Name 	}
1618*5113495bSYour Name 
1619*5113495bSYour Name 	return status;
1620*5113495bSYour Name }
1621*5113495bSYour Name 
1622*5113495bSYour Name /**
1623*5113495bSYour Name  * send_del_ts_cmd_tlv() - send DELTS request to fw
1624*5113495bSYour Name  * @wmi_handle: wmi handle
1625*5113495bSYour Name  * @vdev_id: vdev identifier
1626*5113495bSYour Name  * @ac: access category
1627*5113495bSYour Name  *
1628*5113495bSYour Name  * Return: QDF status
1629*5113495bSYour Name  */
send_del_ts_cmd_tlv(wmi_unified_t wmi_handle,uint8_t vdev_id,uint8_t ac)1630*5113495bSYour Name static QDF_STATUS send_del_ts_cmd_tlv(wmi_unified_t wmi_handle, uint8_t vdev_id,
1631*5113495bSYour Name 				uint8_t ac)
1632*5113495bSYour Name {
1633*5113495bSYour Name 	wmi_vdev_wmm_delts_cmd_fixed_param *cmd;
1634*5113495bSYour Name 	wmi_buf_t buf;
1635*5113495bSYour Name 	int32_t len = sizeof(*cmd);
1636*5113495bSYour Name 
1637*5113495bSYour Name 	buf = wmi_buf_alloc(wmi_handle, len);
1638*5113495bSYour Name 	if (!buf) {
1639*5113495bSYour Name 		return QDF_STATUS_E_NOMEM;
1640*5113495bSYour Name 	}
1641*5113495bSYour Name 	cmd = (wmi_vdev_wmm_delts_cmd_fixed_param *) wmi_buf_data(buf);
1642*5113495bSYour Name 	WMITLV_SET_HDR(&cmd->tlv_header,
1643*5113495bSYour Name 		       WMITLV_TAG_STRUC_wmi_vdev_wmm_delts_cmd_fixed_param,
1644*5113495bSYour Name 		       WMITLV_GET_STRUCT_TLVLEN
1645*5113495bSYour Name 			       (wmi_vdev_wmm_delts_cmd_fixed_param));
1646*5113495bSYour Name 	cmd->vdev_id = vdev_id;
1647*5113495bSYour Name 	cmd->ac = ac;
1648*5113495bSYour Name 
1649*5113495bSYour Name 	wmi_debug("Delts vdev:%d, ac:%d", cmd->vdev_id, cmd->ac);
1650*5113495bSYour Name 	wmi_mtrace(WMI_VDEV_WMM_DELTS_CMDID, cmd->vdev_id, 0);
1651*5113495bSYour Name 	if (wmi_unified_cmd_send(wmi_handle, buf, len,
1652*5113495bSYour Name 				 WMI_VDEV_WMM_DELTS_CMDID)) {
1653*5113495bSYour Name 		wmi_err("Failed to send vdev DELTS command");
1654*5113495bSYour Name 		wmi_buf_free(buf);
1655*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
1656*5113495bSYour Name 	}
1657*5113495bSYour Name 
1658*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1659*5113495bSYour Name }
1660*5113495bSYour Name 
1661*5113495bSYour Name /**
1662*5113495bSYour Name  * send_aggr_qos_cmd_tlv() - send aggr qos request to fw
1663*5113495bSYour Name  * @wmi_handle: handle to wmi
1664*5113495bSYour Name  * @aggr_qos_rsp_msg: combined struct for all ADD_TS requests.
1665*5113495bSYour Name  *
1666*5113495bSYour Name  * A function to handle WMI_AGGR_QOS_REQ. This will send out
1667*5113495bSYour Name  * ADD_TS requests to firmware in loop for all the ACs with
1668*5113495bSYour Name  * active flow.
1669*5113495bSYour Name  *
1670*5113495bSYour Name  * Return: QDF status
1671*5113495bSYour Name  */
send_aggr_qos_cmd_tlv(wmi_unified_t wmi_handle,struct aggr_add_ts_param * aggr_qos_rsp_msg)1672*5113495bSYour Name static QDF_STATUS send_aggr_qos_cmd_tlv(wmi_unified_t wmi_handle,
1673*5113495bSYour Name 		      struct aggr_add_ts_param *aggr_qos_rsp_msg)
1674*5113495bSYour Name {
1675*5113495bSYour Name 	int i = 0;
1676*5113495bSYour Name 	wmi_vdev_wmm_addts_cmd_fixed_param *cmd;
1677*5113495bSYour Name 	wmi_buf_t buf;
1678*5113495bSYour Name 	int32_t len = sizeof(*cmd);
1679*5113495bSYour Name 
1680*5113495bSYour Name 	for (i = 0; i < WMI_QOS_NUM_AC_MAX; i++) {
1681*5113495bSYour Name 		/* if flow in this AC is active */
1682*5113495bSYour Name 		if (((1 << i) & aggr_qos_rsp_msg->tspecIdx)) {
1683*5113495bSYour Name 			/*
1684*5113495bSYour Name 			 * as per implementation of wma_add_ts_req() we
1685*5113495bSYour Name 			 * are not waiting any response from firmware so
1686*5113495bSYour Name 			 * apart from sending ADDTS to firmware just send
1687*5113495bSYour Name 			 * success to upper layers
1688*5113495bSYour Name 			 */
1689*5113495bSYour Name 			aggr_qos_rsp_msg->status[i] = QDF_STATUS_SUCCESS;
1690*5113495bSYour Name 
1691*5113495bSYour Name 			buf = wmi_buf_alloc(wmi_handle, len);
1692*5113495bSYour Name 			if (!buf) {
1693*5113495bSYour Name 				return QDF_STATUS_E_NOMEM;
1694*5113495bSYour Name 			}
1695*5113495bSYour Name 			cmd = (wmi_vdev_wmm_addts_cmd_fixed_param *)
1696*5113495bSYour Name 				wmi_buf_data(buf);
1697*5113495bSYour Name 			WMITLV_SET_HDR(&cmd->tlv_header,
1698*5113495bSYour Name 			       WMITLV_TAG_STRUC_wmi_vdev_wmm_addts_cmd_fixed_param,
1699*5113495bSYour Name 			       WMITLV_GET_STRUCT_TLVLEN
1700*5113495bSYour Name 				       (wmi_vdev_wmm_addts_cmd_fixed_param));
1701*5113495bSYour Name 			cmd->vdev_id = aggr_qos_rsp_msg->vdev_id;
1702*5113495bSYour Name 			cmd->ac =
1703*5113495bSYour Name 				WMI_TID_TO_AC(aggr_qos_rsp_msg->tspec[i].tsinfo.
1704*5113495bSYour Name 					      traffic.userPrio);
1705*5113495bSYour Name 			cmd->medium_time_us =
1706*5113495bSYour Name 				aggr_qos_rsp_msg->tspec[i].mediumTime * 32;
1707*5113495bSYour Name 			cmd->downgrade_type = WMM_AC_DOWNGRADE_DEPRIO;
1708*5113495bSYour Name 			wmi_debug("Addts vdev:%d, ac:%d, mediumTime:%d downgrade_type:%d",
1709*5113495bSYour Name 				 cmd->vdev_id, cmd->ac,
1710*5113495bSYour Name 				 cmd->medium_time_us, cmd->downgrade_type);
1711*5113495bSYour Name 			wmi_mtrace(WMI_VDEV_WMM_ADDTS_CMDID, cmd->vdev_id, 0);
1712*5113495bSYour Name 			if (wmi_unified_cmd_send(wmi_handle, buf, len,
1713*5113495bSYour Name 						 WMI_VDEV_WMM_ADDTS_CMDID)) {
1714*5113495bSYour Name 				wmi_err("Failed to send vdev ADDTS command");
1715*5113495bSYour Name 				aggr_qos_rsp_msg->status[i] =
1716*5113495bSYour Name 							QDF_STATUS_E_FAILURE;
1717*5113495bSYour Name 				wmi_buf_free(buf);
1718*5113495bSYour Name 				return QDF_STATUS_E_FAILURE;
1719*5113495bSYour Name 			}
1720*5113495bSYour Name 		}
1721*5113495bSYour Name 	}
1722*5113495bSYour Name 
1723*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1724*5113495bSYour Name }
1725*5113495bSYour Name 
1726*5113495bSYour Name /**
1727*5113495bSYour Name  * send_add_ts_cmd_tlv() - send ADDTS request to fw
1728*5113495bSYour Name  * @wmi_handle: wmi handle
1729*5113495bSYour Name  * @msg: ADDTS params
1730*5113495bSYour Name  *
1731*5113495bSYour Name  * Return: QDF status
1732*5113495bSYour Name  */
send_add_ts_cmd_tlv(wmi_unified_t wmi_handle,struct add_ts_param * msg)1733*5113495bSYour Name static QDF_STATUS send_add_ts_cmd_tlv(wmi_unified_t wmi_handle,
1734*5113495bSYour Name 		 struct add_ts_param *msg)
1735*5113495bSYour Name {
1736*5113495bSYour Name 	wmi_vdev_wmm_addts_cmd_fixed_param *cmd;
1737*5113495bSYour Name 	wmi_buf_t buf;
1738*5113495bSYour Name 	int32_t len = sizeof(*cmd);
1739*5113495bSYour Name 
1740*5113495bSYour Name 	msg->status = QDF_STATUS_SUCCESS;
1741*5113495bSYour Name 
1742*5113495bSYour Name 	buf = wmi_buf_alloc(wmi_handle, len);
1743*5113495bSYour Name 	if (!buf) {
1744*5113495bSYour Name 		return QDF_STATUS_E_NOMEM;
1745*5113495bSYour Name 	}
1746*5113495bSYour Name 	cmd = (wmi_vdev_wmm_addts_cmd_fixed_param *) wmi_buf_data(buf);
1747*5113495bSYour Name 	WMITLV_SET_HDR(&cmd->tlv_header,
1748*5113495bSYour Name 		       WMITLV_TAG_STRUC_wmi_vdev_wmm_addts_cmd_fixed_param,
1749*5113495bSYour Name 		       WMITLV_GET_STRUCT_TLVLEN
1750*5113495bSYour Name 			       (wmi_vdev_wmm_addts_cmd_fixed_param));
1751*5113495bSYour Name 	cmd->vdev_id = msg->vdev_id;
1752*5113495bSYour Name 	cmd->ac = msg->tspec.tsinfo.traffic.userPrio;
1753*5113495bSYour Name 	cmd->medium_time_us = msg->tspec.mediumTime * 32;
1754*5113495bSYour Name 	cmd->downgrade_type = WMM_AC_DOWNGRADE_DROP;
1755*5113495bSYour Name 	wmi_debug("Addts vdev:%d, ac:%d, mediumTime:%d, downgrade_type:%d",
1756*5113495bSYour Name 		 cmd->vdev_id, cmd->ac, cmd->medium_time_us,
1757*5113495bSYour Name 		 cmd->downgrade_type);
1758*5113495bSYour Name 	wmi_mtrace(WMI_VDEV_WMM_ADDTS_CMDID, cmd->vdev_id, 0);
1759*5113495bSYour Name 	if (wmi_unified_cmd_send(wmi_handle, buf, len,
1760*5113495bSYour Name 				 WMI_VDEV_WMM_ADDTS_CMDID)) {
1761*5113495bSYour Name 		wmi_err("Failed to send vdev ADDTS command");
1762*5113495bSYour Name 		msg->status = QDF_STATUS_E_FAILURE;
1763*5113495bSYour Name 		wmi_buf_free(buf);
1764*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
1765*5113495bSYour Name 	}
1766*5113495bSYour Name 
1767*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1768*5113495bSYour Name }
1769*5113495bSYour Name 
1770*5113495bSYour Name /**
1771*5113495bSYour Name  * send_process_add_periodic_tx_ptrn_cmd_tlv() - add periodic tx pattern
1772*5113495bSYour Name  * @wmi_handle: wmi handle
1773*5113495bSYour Name  * @pattern: tx pattern params
1774*5113495bSYour Name  * @vdev_id: vdev id
1775*5113495bSYour Name  *
1776*5113495bSYour Name  * Return: QDF status
1777*5113495bSYour Name  */
send_process_add_periodic_tx_ptrn_cmd_tlv(wmi_unified_t wmi_handle,struct periodic_tx_pattern * pattern,uint8_t vdev_id)1778*5113495bSYour Name static QDF_STATUS send_process_add_periodic_tx_ptrn_cmd_tlv(
1779*5113495bSYour Name 					wmi_unified_t wmi_handle,
1780*5113495bSYour Name 					struct periodic_tx_pattern *pattern,
1781*5113495bSYour Name 					uint8_t vdev_id)
1782*5113495bSYour Name {
1783*5113495bSYour Name 	WMI_ADD_PROACTIVE_ARP_RSP_PATTERN_CMD_fixed_param *cmd;
1784*5113495bSYour Name 	wmi_buf_t wmi_buf;
1785*5113495bSYour Name 	uint32_t len;
1786*5113495bSYour Name 	uint8_t *buf_ptr;
1787*5113495bSYour Name 	uint32_t ptrn_len, ptrn_len_aligned;
1788*5113495bSYour Name 	int j;
1789*5113495bSYour Name 
1790*5113495bSYour Name 	ptrn_len = pattern->ucPtrnSize;
1791*5113495bSYour Name 	ptrn_len_aligned = roundup(ptrn_len, sizeof(uint32_t));
1792*5113495bSYour Name 	len = sizeof(WMI_ADD_PROACTIVE_ARP_RSP_PATTERN_CMD_fixed_param) +
1793*5113495bSYour Name 	      WMI_TLV_HDR_SIZE + ptrn_len_aligned;
1794*5113495bSYour Name 
1795*5113495bSYour Name 	wmi_buf = wmi_buf_alloc(wmi_handle, len);
1796*5113495bSYour Name 	if (!wmi_buf) {
1797*5113495bSYour Name 		return QDF_STATUS_E_NOMEM;
1798*5113495bSYour Name 	}
1799*5113495bSYour Name 
1800*5113495bSYour Name 	buf_ptr = (uint8_t *) wmi_buf_data(wmi_buf);
1801*5113495bSYour Name 
1802*5113495bSYour Name 	cmd = (WMI_ADD_PROACTIVE_ARP_RSP_PATTERN_CMD_fixed_param *) buf_ptr;
1803*5113495bSYour Name 	WMITLV_SET_HDR(&cmd->tlv_header,
1804*5113495bSYour Name 	       WMITLV_TAG_STRUC_WMI_ADD_PROACTIVE_ARP_RSP_PATTERN_CMD_fixed_param,
1805*5113495bSYour Name 	       WMITLV_GET_STRUCT_TLVLEN
1806*5113495bSYour Name 	       (WMI_ADD_PROACTIVE_ARP_RSP_PATTERN_CMD_fixed_param));
1807*5113495bSYour Name 
1808*5113495bSYour Name 	/* Pass the pattern id to delete for the corresponding vdev id */
1809*5113495bSYour Name 	cmd->vdev_id = vdev_id;
1810*5113495bSYour Name 	cmd->pattern_id = pattern->ucPtrnId;
1811*5113495bSYour Name 	cmd->timeout = pattern->usPtrnIntervalMs;
1812*5113495bSYour Name 	cmd->length = pattern->ucPtrnSize;
1813*5113495bSYour Name 
1814*5113495bSYour Name 	/* Pattern info */
1815*5113495bSYour Name 	buf_ptr += sizeof(WMI_ADD_PROACTIVE_ARP_RSP_PATTERN_CMD_fixed_param);
1816*5113495bSYour Name 	WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_ARRAY_BYTE, ptrn_len_aligned);
1817*5113495bSYour Name 	buf_ptr += WMI_TLV_HDR_SIZE;
1818*5113495bSYour Name 	qdf_mem_copy(buf_ptr, pattern->ucPattern, ptrn_len);
1819*5113495bSYour Name 	for (j = 0; j < pattern->ucPtrnSize; j++)
1820*5113495bSYour Name 		wmi_debug("Add Ptrn: %02x", buf_ptr[j] & 0xff);
1821*5113495bSYour Name 
1822*5113495bSYour Name 	wmi_debug("Add ptrn id: %d vdev_id: %d",
1823*5113495bSYour Name 		 cmd->pattern_id, cmd->vdev_id);
1824*5113495bSYour Name 
1825*5113495bSYour Name 	wmi_mtrace(WMI_ADD_PROACTIVE_ARP_RSP_PATTERN_CMDID, cmd->vdev_id, 0);
1826*5113495bSYour Name 	if (wmi_unified_cmd_send(wmi_handle, wmi_buf, len,
1827*5113495bSYour Name 				 WMI_ADD_PROACTIVE_ARP_RSP_PATTERN_CMDID)) {
1828*5113495bSYour Name 		wmi_err("Failed to add pattern set state command");
1829*5113495bSYour Name 		wmi_buf_free(wmi_buf);
1830*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
1831*5113495bSYour Name 	}
1832*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1833*5113495bSYour Name }
1834*5113495bSYour Name 
1835*5113495bSYour Name /**
1836*5113495bSYour Name  * send_process_del_periodic_tx_ptrn_cmd_tlv() - del periodic tx pattern
1837*5113495bSYour Name  * @wmi_handle: wmi handle
1838*5113495bSYour Name  * @vdev_id: vdev id
1839*5113495bSYour Name  * @pattern_id: pattern id
1840*5113495bSYour Name  *
1841*5113495bSYour Name  * Return: QDF status
1842*5113495bSYour Name  */
send_process_del_periodic_tx_ptrn_cmd_tlv(wmi_unified_t wmi_handle,uint8_t vdev_id,uint8_t pattern_id)1843*5113495bSYour Name static QDF_STATUS send_process_del_periodic_tx_ptrn_cmd_tlv(
1844*5113495bSYour Name 						wmi_unified_t wmi_handle,
1845*5113495bSYour Name 						uint8_t vdev_id,
1846*5113495bSYour Name 						uint8_t pattern_id)
1847*5113495bSYour Name {
1848*5113495bSYour Name 	WMI_DEL_PROACTIVE_ARP_RSP_PATTERN_CMD_fixed_param *cmd;
1849*5113495bSYour Name 	wmi_buf_t wmi_buf;
1850*5113495bSYour Name 	uint32_t len =
1851*5113495bSYour Name 		sizeof(WMI_DEL_PROACTIVE_ARP_RSP_PATTERN_CMD_fixed_param);
1852*5113495bSYour Name 
1853*5113495bSYour Name 	wmi_buf = wmi_buf_alloc(wmi_handle, len);
1854*5113495bSYour Name 	if (!wmi_buf) {
1855*5113495bSYour Name 		return QDF_STATUS_E_NOMEM;
1856*5113495bSYour Name 	}
1857*5113495bSYour Name 
1858*5113495bSYour Name 	cmd = (WMI_DEL_PROACTIVE_ARP_RSP_PATTERN_CMD_fixed_param *)
1859*5113495bSYour Name 		wmi_buf_data(wmi_buf);
1860*5113495bSYour Name 	WMITLV_SET_HDR(&cmd->tlv_header,
1861*5113495bSYour Name 	       WMITLV_TAG_STRUC_WMI_DEL_PROACTIVE_ARP_RSP_PATTERN_CMD_fixed_param,
1862*5113495bSYour Name 	       WMITLV_GET_STRUCT_TLVLEN
1863*5113495bSYour Name 	       (WMI_DEL_PROACTIVE_ARP_RSP_PATTERN_CMD_fixed_param));
1864*5113495bSYour Name 
1865*5113495bSYour Name 	/* Pass the pattern id to delete for the corresponding vdev id */
1866*5113495bSYour Name 	cmd->vdev_id = vdev_id;
1867*5113495bSYour Name 	cmd->pattern_id = pattern_id;
1868*5113495bSYour Name 	wmi_debug("Del ptrn id: %d vdev_id: %d",
1869*5113495bSYour Name 		 cmd->pattern_id, cmd->vdev_id);
1870*5113495bSYour Name 
1871*5113495bSYour Name 	wmi_mtrace(WMI_DEL_PROACTIVE_ARP_RSP_PATTERN_CMDID, cmd->vdev_id, 0);
1872*5113495bSYour Name 	if (wmi_unified_cmd_send(wmi_handle, wmi_buf, len,
1873*5113495bSYour Name 				 WMI_DEL_PROACTIVE_ARP_RSP_PATTERN_CMDID)) {
1874*5113495bSYour Name 		wmi_err("Failed to send del pattern command");
1875*5113495bSYour Name 		wmi_buf_free(wmi_buf);
1876*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
1877*5113495bSYour Name 	}
1878*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1879*5113495bSYour Name }
1880*5113495bSYour Name 
1881*5113495bSYour Name /**
1882*5113495bSYour Name  * send_set_auto_shutdown_timer_cmd_tlv() - sets auto shutdown timer in firmware
1883*5113495bSYour Name  * @wmi_handle: wmi handle
1884*5113495bSYour Name  * @timer_val: auto shutdown timer value
1885*5113495bSYour Name  *
1886*5113495bSYour Name  * Return: QDF status
1887*5113495bSYour Name  */
send_set_auto_shutdown_timer_cmd_tlv(wmi_unified_t wmi_handle,uint32_t timer_val)1888*5113495bSYour Name static QDF_STATUS send_set_auto_shutdown_timer_cmd_tlv(wmi_unified_t wmi_handle,
1889*5113495bSYour Name 						  uint32_t timer_val)
1890*5113495bSYour Name {
1891*5113495bSYour Name 	QDF_STATUS status;
1892*5113495bSYour Name 	wmi_buf_t buf = NULL;
1893*5113495bSYour Name 	uint8_t *buf_ptr;
1894*5113495bSYour Name 	wmi_host_auto_shutdown_cfg_cmd_fixed_param *wmi_auto_sh_cmd;
1895*5113495bSYour Name 	int len = sizeof(wmi_host_auto_shutdown_cfg_cmd_fixed_param);
1896*5113495bSYour Name 
1897*5113495bSYour Name 	wmi_debug("Set WMI_HOST_AUTO_SHUTDOWN_CFG_CMDID:TIMER_VAL=%d",
1898*5113495bSYour Name 		 timer_val);
1899*5113495bSYour Name 
1900*5113495bSYour Name 	buf = wmi_buf_alloc(wmi_handle, len);
1901*5113495bSYour Name 	if (!buf) {
1902*5113495bSYour Name 		return QDF_STATUS_E_NOMEM;
1903*5113495bSYour Name 	}
1904*5113495bSYour Name 
1905*5113495bSYour Name 	buf_ptr = (uint8_t *) wmi_buf_data(buf);
1906*5113495bSYour Name 	wmi_auto_sh_cmd =
1907*5113495bSYour Name 		(wmi_host_auto_shutdown_cfg_cmd_fixed_param *) buf_ptr;
1908*5113495bSYour Name 	wmi_auto_sh_cmd->timer_value = timer_val;
1909*5113495bSYour Name 
1910*5113495bSYour Name 	WMITLV_SET_HDR(&wmi_auto_sh_cmd->tlv_header,
1911*5113495bSYour Name 	       WMITLV_TAG_STRUC_wmi_host_auto_shutdown_cfg_cmd_fixed_param,
1912*5113495bSYour Name 	       WMITLV_GET_STRUCT_TLVLEN
1913*5113495bSYour Name 	       (wmi_host_auto_shutdown_cfg_cmd_fixed_param));
1914*5113495bSYour Name 
1915*5113495bSYour Name 	wmi_mtrace(WMI_HOST_AUTO_SHUTDOWN_CFG_CMDID, NO_SESSION, 0);
1916*5113495bSYour Name 	status = wmi_unified_cmd_send(wmi_handle, buf,
1917*5113495bSYour Name 				      len, WMI_HOST_AUTO_SHUTDOWN_CFG_CMDID);
1918*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
1919*5113495bSYour Name 		wmi_err("WMI_HOST_AUTO_SHUTDOWN_CFG_CMDID Err %d", status);
1920*5113495bSYour Name 		wmi_buf_free(buf);
1921*5113495bSYour Name 	}
1922*5113495bSYour Name 
1923*5113495bSYour Name 	return status;
1924*5113495bSYour Name }
1925*5113495bSYour Name 
1926*5113495bSYour Name /**
1927*5113495bSYour Name  * send_set_led_flashing_cmd_tlv() - set led flashing in fw
1928*5113495bSYour Name  * @wmi_handle: wmi handle
1929*5113495bSYour Name  * @flashing: flashing request
1930*5113495bSYour Name  *
1931*5113495bSYour Name  * Return: QDF status
1932*5113495bSYour Name  */
send_set_led_flashing_cmd_tlv(wmi_unified_t wmi_handle,struct flashing_req_params * flashing)1933*5113495bSYour Name static QDF_STATUS send_set_led_flashing_cmd_tlv(wmi_unified_t wmi_handle,
1934*5113495bSYour Name 				struct flashing_req_params *flashing)
1935*5113495bSYour Name {
1936*5113495bSYour Name 	wmi_set_led_flashing_cmd_fixed_param *cmd;
1937*5113495bSYour Name 	QDF_STATUS status;
1938*5113495bSYour Name 	wmi_buf_t buf;
1939*5113495bSYour Name 	uint8_t *buf_ptr;
1940*5113495bSYour Name 	int32_t len = sizeof(wmi_set_led_flashing_cmd_fixed_param);
1941*5113495bSYour Name 
1942*5113495bSYour Name 	buf = wmi_buf_alloc(wmi_handle, len);
1943*5113495bSYour Name 	if (!buf) {
1944*5113495bSYour Name 		return QDF_STATUS_E_NOMEM;
1945*5113495bSYour Name 	}
1946*5113495bSYour Name 	buf_ptr = (uint8_t *) wmi_buf_data(buf);
1947*5113495bSYour Name 	cmd = (wmi_set_led_flashing_cmd_fixed_param *) buf_ptr;
1948*5113495bSYour Name 	WMITLV_SET_HDR(&cmd->tlv_header,
1949*5113495bSYour Name 		       WMITLV_TAG_STRUC_wmi_set_led_flashing_cmd_fixed_param,
1950*5113495bSYour Name 		       WMITLV_GET_STRUCT_TLVLEN
1951*5113495bSYour Name 			       (wmi_set_led_flashing_cmd_fixed_param));
1952*5113495bSYour Name 	cmd->pattern_id = flashing->pattern_id;
1953*5113495bSYour Name 	cmd->led_x0 = flashing->led_x0;
1954*5113495bSYour Name 	cmd->led_x1 = flashing->led_x1;
1955*5113495bSYour Name 
1956*5113495bSYour Name 	wmi_mtrace(WMI_PDEV_SET_LED_FLASHING_CMDID, NO_SESSION, 0);
1957*5113495bSYour Name 	status = wmi_unified_cmd_send(wmi_handle, buf, len,
1958*5113495bSYour Name 				      WMI_PDEV_SET_LED_FLASHING_CMDID);
1959*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
1960*5113495bSYour Name 		wmi_err("wmi_unified_cmd_send WMI_PEER_SET_PARAM_CMD"
1961*5113495bSYour Name 			 " returned Error %d", status);
1962*5113495bSYour Name 		wmi_buf_free(buf);
1963*5113495bSYour Name 	}
1964*5113495bSYour Name 
1965*5113495bSYour Name 	return status;
1966*5113495bSYour Name }
1967*5113495bSYour Name 
1968*5113495bSYour Name /**
1969*5113495bSYour Name  * send_process_ch_avoid_update_cmd_tlv() - handles channel avoid update request
1970*5113495bSYour Name  * @wmi_handle: wmi handle
1971*5113495bSYour Name  *
1972*5113495bSYour Name  * Return: QDF status
1973*5113495bSYour Name  */
send_process_ch_avoid_update_cmd_tlv(wmi_unified_t wmi_handle)1974*5113495bSYour Name static QDF_STATUS send_process_ch_avoid_update_cmd_tlv(wmi_unified_t wmi_handle)
1975*5113495bSYour Name {
1976*5113495bSYour Name 	QDF_STATUS status;
1977*5113495bSYour Name 	wmi_buf_t buf = NULL;
1978*5113495bSYour Name 	uint8_t *buf_ptr;
1979*5113495bSYour Name 	wmi_chan_avoid_update_cmd_param *ch_avoid_update_fp;
1980*5113495bSYour Name 	int len = sizeof(wmi_chan_avoid_update_cmd_param);
1981*5113495bSYour Name 
1982*5113495bSYour Name 	buf = wmi_buf_alloc(wmi_handle, len);
1983*5113495bSYour Name 	if (!buf) {
1984*5113495bSYour Name 		return QDF_STATUS_E_NOMEM;
1985*5113495bSYour Name 	}
1986*5113495bSYour Name 
1987*5113495bSYour Name 	buf_ptr = (uint8_t *) wmi_buf_data(buf);
1988*5113495bSYour Name 	ch_avoid_update_fp = (wmi_chan_avoid_update_cmd_param *) buf_ptr;
1989*5113495bSYour Name 	WMITLV_SET_HDR(&ch_avoid_update_fp->tlv_header,
1990*5113495bSYour Name 		       WMITLV_TAG_STRUC_wmi_chan_avoid_update_cmd_param,
1991*5113495bSYour Name 		       WMITLV_GET_STRUCT_TLVLEN
1992*5113495bSYour Name 			       (wmi_chan_avoid_update_cmd_param));
1993*5113495bSYour Name 
1994*5113495bSYour Name 	wmi_mtrace(WMI_CHAN_AVOID_UPDATE_CMDID, NO_SESSION, 0);
1995*5113495bSYour Name 	status = wmi_unified_cmd_send(wmi_handle, buf,
1996*5113495bSYour Name 				      len, WMI_CHAN_AVOID_UPDATE_CMDID);
1997*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
1998*5113495bSYour Name 		wmi_err("wmi_unified_cmd_send"
1999*5113495bSYour Name 			" WMITLV_TABLE_WMI_CHAN_AVOID_UPDATE"
2000*5113495bSYour Name 			" returned Error %d", status);
2001*5113495bSYour Name 		wmi_buf_free(buf);
2002*5113495bSYour Name 	}
2003*5113495bSYour Name 
2004*5113495bSYour Name 	return status;
2005*5113495bSYour Name }
2006*5113495bSYour Name 
2007*5113495bSYour Name /**
2008*5113495bSYour Name  * send_pdev_set_pcl_cmd_tlv() - Send WMI_SOC_SET_PCL_CMDID to FW
2009*5113495bSYour Name  * @wmi_handle: wmi handle
2010*5113495bSYour Name  * @msg: PCL structure containing the PCL and the number of channels
2011*5113495bSYour Name  *
2012*5113495bSYour Name  * WMI_PDEV_SET_PCL_CMDID provides a Preferred Channel List (PCL) to the WLAN
2013*5113495bSYour Name  * firmware. The DBS Manager is the consumer of this information in the WLAN
2014*5113495bSYour Name  * firmware. The channel list will be used when a Virtual DEVice (VDEV) needs
2015*5113495bSYour Name  * to migrate to a new channel without host driver involvement. An example of
2016*5113495bSYour Name  * this behavior is Legacy Fast Roaming (LFR 3.0). Generally, the host will
2017*5113495bSYour Name  * manage the channel selection without firmware involvement.
2018*5113495bSYour Name  *
2019*5113495bSYour Name  * WMI_PDEV_SET_PCL_CMDID will carry only the weight list and not the actual
2020*5113495bSYour Name  * channel list. The weights corresponds to the channels sent in
2021*5113495bSYour Name  * WMI_SCAN_CHAN_LIST_CMDID. The channels from PCL would be having a higher
2022*5113495bSYour Name  * weightage compared to the non PCL channels.
2023*5113495bSYour Name  *
2024*5113495bSYour Name  * Return: Success if the cmd is sent successfully to the firmware
2025*5113495bSYour Name  */
send_pdev_set_pcl_cmd_tlv(wmi_unified_t wmi_handle,struct wmi_pcl_chan_weights * msg)2026*5113495bSYour Name static QDF_STATUS send_pdev_set_pcl_cmd_tlv(wmi_unified_t wmi_handle,
2027*5113495bSYour Name 				struct wmi_pcl_chan_weights *msg)
2028*5113495bSYour Name {
2029*5113495bSYour Name 	wmi_pdev_set_pcl_cmd_fixed_param *cmd;
2030*5113495bSYour Name 	wmi_buf_t buf;
2031*5113495bSYour Name 	uint8_t *buf_ptr;
2032*5113495bSYour Name 	uint32_t *cmd_args, i, len;
2033*5113495bSYour Name 	uint32_t chan_len;
2034*5113495bSYour Name 
2035*5113495bSYour Name 	chan_len = msg->saved_num_chan;
2036*5113495bSYour Name 
2037*5113495bSYour Name 	len = sizeof(*cmd) +
2038*5113495bSYour Name 		WMI_TLV_HDR_SIZE + (chan_len * sizeof(uint32_t));
2039*5113495bSYour Name 
2040*5113495bSYour Name 	buf = wmi_buf_alloc(wmi_handle, len);
2041*5113495bSYour Name 	if (!buf) {
2042*5113495bSYour Name 		return QDF_STATUS_E_NOMEM;
2043*5113495bSYour Name 	}
2044*5113495bSYour Name 
2045*5113495bSYour Name 	cmd = (wmi_pdev_set_pcl_cmd_fixed_param *) wmi_buf_data(buf);
2046*5113495bSYour Name 	buf_ptr = (uint8_t *) cmd;
2047*5113495bSYour Name 	WMITLV_SET_HDR(&cmd->tlv_header,
2048*5113495bSYour Name 		WMITLV_TAG_STRUC_wmi_pdev_set_pcl_cmd_fixed_param,
2049*5113495bSYour Name 		WMITLV_GET_STRUCT_TLVLEN(wmi_pdev_set_pcl_cmd_fixed_param));
2050*5113495bSYour Name 
2051*5113495bSYour Name 	cmd->pdev_id = wmi_handle->ops->convert_pdev_id_host_to_target(
2052*5113495bSYour Name 							wmi_handle,
2053*5113495bSYour Name 							WMI_HOST_PDEV_ID_SOC);
2054*5113495bSYour Name 	cmd->num_chan = chan_len;
2055*5113495bSYour Name 	buf_ptr += sizeof(wmi_pdev_set_pcl_cmd_fixed_param);
2056*5113495bSYour Name 	WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_ARRAY_UINT32,
2057*5113495bSYour Name 			(chan_len * sizeof(uint32_t)));
2058*5113495bSYour Name 	cmd_args = (uint32_t *) (buf_ptr + WMI_TLV_HDR_SIZE);
2059*5113495bSYour Name 	for (i = 0; i < chan_len ; i++)
2060*5113495bSYour Name 		cmd_args[i] = msg->weighed_valid_list[i];
2061*5113495bSYour Name 	wmi_mtrace(WMI_PDEV_SET_PCL_CMDID, NO_SESSION, 0);
2062*5113495bSYour Name 	if (wmi_unified_cmd_send(wmi_handle, buf, len,
2063*5113495bSYour Name 				 WMI_PDEV_SET_PCL_CMDID)) {
2064*5113495bSYour Name 		wmi_err("Failed to send WMI_PDEV_SET_PCL_CMDID");
2065*5113495bSYour Name 		wmi_buf_free(buf);
2066*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
2067*5113495bSYour Name 	}
2068*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
2069*5113495bSYour Name }
2070*5113495bSYour Name 
2071*5113495bSYour Name #ifdef WLAN_POLICY_MGR_ENABLE
2072*5113495bSYour Name /**
2073*5113495bSYour Name  * send_pdev_set_dual_mac_config_cmd_tlv() - Set dual mac config to FW
2074*5113495bSYour Name  * @wmi_handle: wmi handle
2075*5113495bSYour Name  * @msg: Dual MAC config parameters
2076*5113495bSYour Name  *
2077*5113495bSYour Name  * Configures WLAN firmware with the dual MAC features
2078*5113495bSYour Name  *
2079*5113495bSYour Name  * Return: QDF_STATUS. 0 on success.
2080*5113495bSYour Name  */
2081*5113495bSYour Name static
send_pdev_set_dual_mac_config_cmd_tlv(wmi_unified_t wmi_handle,struct policy_mgr_dual_mac_config * msg)2082*5113495bSYour Name QDF_STATUS send_pdev_set_dual_mac_config_cmd_tlv(wmi_unified_t wmi_handle,
2083*5113495bSYour Name 		struct policy_mgr_dual_mac_config *msg)
2084*5113495bSYour Name {
2085*5113495bSYour Name 	wmi_pdev_set_mac_config_cmd_fixed_param *cmd;
2086*5113495bSYour Name 	wmi_buf_t buf;
2087*5113495bSYour Name 	uint32_t len;
2088*5113495bSYour Name 
2089*5113495bSYour Name 	len = sizeof(*cmd);
2090*5113495bSYour Name 
2091*5113495bSYour Name 	buf = wmi_buf_alloc(wmi_handle, len);
2092*5113495bSYour Name 	if (!buf) {
2093*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
2094*5113495bSYour Name 	}
2095*5113495bSYour Name 
2096*5113495bSYour Name 	cmd = (wmi_pdev_set_mac_config_cmd_fixed_param *) wmi_buf_data(buf);
2097*5113495bSYour Name 	WMITLV_SET_HDR(&cmd->tlv_header,
2098*5113495bSYour Name 		WMITLV_TAG_STRUC_wmi_pdev_set_mac_config_cmd_fixed_param,
2099*5113495bSYour Name 		WMITLV_GET_STRUCT_TLVLEN(
2100*5113495bSYour Name 			wmi_pdev_set_mac_config_cmd_fixed_param));
2101*5113495bSYour Name 
2102*5113495bSYour Name 	cmd->pdev_id = wmi_handle->ops->convert_pdev_id_host_to_target(
2103*5113495bSYour Name 							wmi_handle,
2104*5113495bSYour Name 							WMI_HOST_PDEV_ID_SOC);
2105*5113495bSYour Name 	cmd->concurrent_scan_config_bits = msg->scan_config;
2106*5113495bSYour Name 	cmd->fw_mode_config_bits = msg->fw_mode_config;
2107*5113495bSYour Name 	wmi_debug("scan_config:%x fw_mode_config:%x",
2108*5113495bSYour Name 		 msg->scan_config, msg->fw_mode_config);
2109*5113495bSYour Name 
2110*5113495bSYour Name 	wmi_mtrace(WMI_PDEV_SET_MAC_CONFIG_CMDID, NO_SESSION, 0);
2111*5113495bSYour Name 	if (wmi_unified_cmd_send(wmi_handle, buf, len,
2112*5113495bSYour Name 				 WMI_PDEV_SET_MAC_CONFIG_CMDID)) {
2113*5113495bSYour Name 		wmi_err("Failed to send WMI_PDEV_SET_MAC_CONFIG_CMDID");
2114*5113495bSYour Name 		wmi_buf_free(buf);
2115*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
2116*5113495bSYour Name 	}
2117*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
2118*5113495bSYour Name }
2119*5113495bSYour Name 
wmi_policy_mgr_attach_tlv(struct wmi_unified * wmi_handle)2120*5113495bSYour Name void wmi_policy_mgr_attach_tlv(struct wmi_unified *wmi_handle)
2121*5113495bSYour Name {
2122*5113495bSYour Name 	struct wmi_ops *ops = wmi_handle->ops;
2123*5113495bSYour Name 
2124*5113495bSYour Name 	ops->send_pdev_set_dual_mac_config_cmd =
2125*5113495bSYour Name 		send_pdev_set_dual_mac_config_cmd_tlv;
2126*5113495bSYour Name }
2127*5113495bSYour Name #endif /* WLAN_POLICY_MGR_ENABLE */
2128*5113495bSYour Name 
2129*5113495bSYour Name /**
2130*5113495bSYour Name  * send_adapt_dwelltime_params_cmd_tlv() - send wmi cmd of adaptive dwelltime
2131*5113495bSYour Name  * configuration params
2132*5113495bSYour Name  * @wmi_handle:  wmi handler
2133*5113495bSYour Name  * @dwelltime_params: pointer to dwelltime_params
2134*5113495bSYour Name  *
2135*5113495bSYour Name  * Return: QDF_STATUS_SUCCESS on success and QDF failure reason code for failure
2136*5113495bSYour Name  */
2137*5113495bSYour Name static
send_adapt_dwelltime_params_cmd_tlv(wmi_unified_t wmi_handle,struct wmi_adaptive_dwelltime_params * dwelltime_params)2138*5113495bSYour Name QDF_STATUS send_adapt_dwelltime_params_cmd_tlv(wmi_unified_t wmi_handle,
2139*5113495bSYour Name 		struct wmi_adaptive_dwelltime_params *dwelltime_params)
2140*5113495bSYour Name {
2141*5113495bSYour Name 	wmi_scan_adaptive_dwell_config_fixed_param *dwell_param;
2142*5113495bSYour Name 	wmi_scan_adaptive_dwell_parameters_tlv *cmd;
2143*5113495bSYour Name 	wmi_buf_t buf;
2144*5113495bSYour Name 	uint8_t *buf_ptr;
2145*5113495bSYour Name 	int32_t err;
2146*5113495bSYour Name 	int len;
2147*5113495bSYour Name 
2148*5113495bSYour Name 	len = sizeof(wmi_scan_adaptive_dwell_config_fixed_param);
2149*5113495bSYour Name 	len += WMI_TLV_HDR_SIZE; /* TLV for ext_thresholds*/
2150*5113495bSYour Name 	len += sizeof(wmi_scan_adaptive_dwell_parameters_tlv);
2151*5113495bSYour Name 	buf = wmi_buf_alloc(wmi_handle, len);
2152*5113495bSYour Name 	if (!buf) {
2153*5113495bSYour Name 		return QDF_STATUS_E_NOMEM;
2154*5113495bSYour Name 	}
2155*5113495bSYour Name 	buf_ptr = (uint8_t *) wmi_buf_data(buf);
2156*5113495bSYour Name 	dwell_param = (wmi_scan_adaptive_dwell_config_fixed_param *) buf_ptr;
2157*5113495bSYour Name 	WMITLV_SET_HDR(&dwell_param->tlv_header,
2158*5113495bSYour Name 		WMITLV_TAG_STRUC_wmi_scan_adaptive_dwell_config_fixed_param,
2159*5113495bSYour Name 		WMITLV_GET_STRUCT_TLVLEN
2160*5113495bSYour Name 		(wmi_scan_adaptive_dwell_config_fixed_param));
2161*5113495bSYour Name 
2162*5113495bSYour Name 	dwell_param->enable = dwelltime_params->is_enabled;
2163*5113495bSYour Name 	buf_ptr += sizeof(wmi_scan_adaptive_dwell_config_fixed_param);
2164*5113495bSYour Name 	WMITLV_SET_HDR(buf_ptr,
2165*5113495bSYour Name 		       WMITLV_TAG_ARRAY_STRUC,
2166*5113495bSYour Name 		       sizeof(wmi_scan_adaptive_dwell_parameters_tlv));
2167*5113495bSYour Name 	buf_ptr += WMI_TLV_HDR_SIZE;
2168*5113495bSYour Name 
2169*5113495bSYour Name 	cmd = (wmi_scan_adaptive_dwell_parameters_tlv *) buf_ptr;
2170*5113495bSYour Name 	WMITLV_SET_HDR(&cmd->tlv_header,
2171*5113495bSYour Name 		       WMITLV_TAG_STRUC_wmi_scan_adaptive_dwell_parameters_tlv,
2172*5113495bSYour Name 		       WMITLV_GET_STRUCT_TLVLEN(
2173*5113495bSYour Name 		       wmi_scan_adaptive_dwell_parameters_tlv));
2174*5113495bSYour Name 
2175*5113495bSYour Name 	cmd->default_adaptive_dwell_mode = dwelltime_params->dwelltime_mode;
2176*5113495bSYour Name 	cmd->adapative_lpf_weight = dwelltime_params->lpf_weight;
2177*5113495bSYour Name 	cmd->passive_monitor_interval_ms = dwelltime_params->passive_mon_intval;
2178*5113495bSYour Name 	cmd->wifi_activity_threshold_pct = dwelltime_params->wifi_act_threshold;
2179*5113495bSYour Name 	wmi_mtrace(WMI_SCAN_ADAPTIVE_DWELL_CONFIG_CMDID, NO_SESSION, 0);
2180*5113495bSYour Name 	err = wmi_unified_cmd_send(wmi_handle, buf,
2181*5113495bSYour Name 				   len, WMI_SCAN_ADAPTIVE_DWELL_CONFIG_CMDID);
2182*5113495bSYour Name 	if (err) {
2183*5113495bSYour Name 		wmi_err("Failed to send adapt dwelltime cmd err=%d", err);
2184*5113495bSYour Name 		wmi_buf_free(buf);
2185*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
2186*5113495bSYour Name 	}
2187*5113495bSYour Name 
2188*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
2189*5113495bSYour Name }
2190*5113495bSYour Name 
2191*5113495bSYour Name /**
2192*5113495bSYour Name  * send_dbs_scan_sel_params_cmd_tlv() - send wmi cmd of DBS scan selection
2193*5113495bSYour Name  * configuration params
2194*5113495bSYour Name  * @wmi_handle: wmi handler
2195*5113495bSYour Name  * @dbs_scan_params: pointer to wmi_dbs_scan_sel_params
2196*5113495bSYour Name  *
2197*5113495bSYour Name  * Return: QDF_STATUS_SUCCESS on success and QDF failure reason code for failure
2198*5113495bSYour Name  */
send_dbs_scan_sel_params_cmd_tlv(wmi_unified_t wmi_handle,struct wmi_dbs_scan_sel_params * dbs_scan_params)2199*5113495bSYour Name static QDF_STATUS send_dbs_scan_sel_params_cmd_tlv(wmi_unified_t wmi_handle,
2200*5113495bSYour Name 			struct wmi_dbs_scan_sel_params *dbs_scan_params)
2201*5113495bSYour Name {
2202*5113495bSYour Name 	wmi_scan_dbs_duty_cycle_fixed_param *dbs_scan_param;
2203*5113495bSYour Name 	wmi_scan_dbs_duty_cycle_tlv_param *cmd;
2204*5113495bSYour Name 	wmi_buf_t buf;
2205*5113495bSYour Name 	uint8_t *buf_ptr;
2206*5113495bSYour Name 	QDF_STATUS err;
2207*5113495bSYour Name 	uint32_t i;
2208*5113495bSYour Name 	int len;
2209*5113495bSYour Name 
2210*5113495bSYour Name 	len = sizeof(*dbs_scan_param);
2211*5113495bSYour Name 	len += WMI_TLV_HDR_SIZE;
2212*5113495bSYour Name 	len += dbs_scan_params->num_clients * sizeof(*cmd);
2213*5113495bSYour Name 
2214*5113495bSYour Name 	buf = wmi_buf_alloc(wmi_handle, len);
2215*5113495bSYour Name 	if (!buf) {
2216*5113495bSYour Name 		return QDF_STATUS_E_NOMEM;
2217*5113495bSYour Name 	}
2218*5113495bSYour Name 
2219*5113495bSYour Name 	buf_ptr = (uint8_t *) wmi_buf_data(buf);
2220*5113495bSYour Name 	dbs_scan_param = (wmi_scan_dbs_duty_cycle_fixed_param *) buf_ptr;
2221*5113495bSYour Name 	WMITLV_SET_HDR(&dbs_scan_param->tlv_header,
2222*5113495bSYour Name 		       WMITLV_TAG_STRUC_wmi_scan_dbs_duty_cycle_fixed_param,
2223*5113495bSYour Name 		       WMITLV_GET_STRUCT_TLVLEN
2224*5113495bSYour Name 				(wmi_scan_dbs_duty_cycle_fixed_param));
2225*5113495bSYour Name 
2226*5113495bSYour Name 	dbs_scan_param->num_clients = dbs_scan_params->num_clients;
2227*5113495bSYour Name 	dbs_scan_param->pdev_id = dbs_scan_params->pdev_id;
2228*5113495bSYour Name 	buf_ptr += sizeof(*dbs_scan_param);
2229*5113495bSYour Name 	WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_ARRAY_STRUC,
2230*5113495bSYour Name 		       (sizeof(*cmd) * dbs_scan_params->num_clients));
2231*5113495bSYour Name 	buf_ptr = buf_ptr + (uint8_t) WMI_TLV_HDR_SIZE;
2232*5113495bSYour Name 
2233*5113495bSYour Name 	for (i = 0; i < dbs_scan_params->num_clients; i++) {
2234*5113495bSYour Name 		cmd = (wmi_scan_dbs_duty_cycle_tlv_param *) buf_ptr;
2235*5113495bSYour Name 		WMITLV_SET_HDR(&cmd->tlv_header,
2236*5113495bSYour Name 			WMITLV_TAG_STRUC_wmi_scan_dbs_duty_cycle_param_tlv,
2237*5113495bSYour Name 			WMITLV_GET_STRUCT_TLVLEN(
2238*5113495bSYour Name 					wmi_scan_dbs_duty_cycle_tlv_param));
2239*5113495bSYour Name 		cmd->module_id = dbs_scan_params->module_id[i];
2240*5113495bSYour Name 		cmd->num_dbs_scans = dbs_scan_params->num_dbs_scans[i];
2241*5113495bSYour Name 		cmd->num_non_dbs_scans = dbs_scan_params->num_non_dbs_scans[i];
2242*5113495bSYour Name 		buf_ptr = buf_ptr + (uint8_t) sizeof(*cmd);
2243*5113495bSYour Name 	}
2244*5113495bSYour Name 
2245*5113495bSYour Name 	wmi_mtrace(WMI_SET_SCAN_DBS_DUTY_CYCLE_CMDID, NO_SESSION, 0);
2246*5113495bSYour Name 	err = wmi_unified_cmd_send(wmi_handle, buf,
2247*5113495bSYour Name 				   len, WMI_SET_SCAN_DBS_DUTY_CYCLE_CMDID);
2248*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(err)) {
2249*5113495bSYour Name 		wmi_err("Failed to send dbs scan selection cmd err=%d", err);
2250*5113495bSYour Name 		wmi_buf_free(buf);
2251*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
2252*5113495bSYour Name 	}
2253*5113495bSYour Name 
2254*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
2255*5113495bSYour Name }
2256*5113495bSYour Name 
2257*5113495bSYour Name /**
2258*5113495bSYour Name  * send_set_arp_stats_req_cmd_tlv() - send wmi cmd to set arp stats request
2259*5113495bSYour Name  * @wmi_handle: wmi handler
2260*5113495bSYour Name  * @req_buf: set arp stats request buffer
2261*5113495bSYour Name  *
2262*5113495bSYour Name  * Return: 0 for success and non zero for failure
2263*5113495bSYour Name  */
send_set_arp_stats_req_cmd_tlv(wmi_unified_t wmi_handle,struct set_arp_stats * req_buf)2264*5113495bSYour Name static QDF_STATUS send_set_arp_stats_req_cmd_tlv(wmi_unified_t wmi_handle,
2265*5113495bSYour Name 					  struct set_arp_stats *req_buf)
2266*5113495bSYour Name {
2267*5113495bSYour Name 	wmi_buf_t buf = NULL;
2268*5113495bSYour Name 	QDF_STATUS status;
2269*5113495bSYour Name 	int len;
2270*5113495bSYour Name 	uint8_t *buf_ptr;
2271*5113495bSYour Name 	wmi_vdev_set_arp_stats_cmd_fixed_param *wmi_set_arp;
2272*5113495bSYour Name 
2273*5113495bSYour Name 	len = sizeof(wmi_vdev_set_arp_stats_cmd_fixed_param);
2274*5113495bSYour Name 	if (req_buf->pkt_type_bitmap) {
2275*5113495bSYour Name 		len += WMI_TLV_HDR_SIZE;
2276*5113495bSYour Name 		len += sizeof(wmi_vdev_set_connectivity_check_stats);
2277*5113495bSYour Name 	}
2278*5113495bSYour Name 	buf = wmi_buf_alloc(wmi_handle, len);
2279*5113495bSYour Name 	if (!buf) {
2280*5113495bSYour Name 		return QDF_STATUS_E_NOMEM;
2281*5113495bSYour Name 	}
2282*5113495bSYour Name 
2283*5113495bSYour Name 	buf_ptr = (uint8_t *) wmi_buf_data(buf);
2284*5113495bSYour Name 	wmi_set_arp =
2285*5113495bSYour Name 		(wmi_vdev_set_arp_stats_cmd_fixed_param *) buf_ptr;
2286*5113495bSYour Name 	WMITLV_SET_HDR(&wmi_set_arp->tlv_header,
2287*5113495bSYour Name 		       WMITLV_TAG_STRUC_wmi_vdev_set_arp_stats_cmd_fixed_param,
2288*5113495bSYour Name 		       WMITLV_GET_STRUCT_TLVLEN
2289*5113495bSYour Name 				(wmi_vdev_set_arp_stats_cmd_fixed_param));
2290*5113495bSYour Name 
2291*5113495bSYour Name 	/* fill in per roam config values */
2292*5113495bSYour Name 	wmi_set_arp->vdev_id = req_buf->vdev_id;
2293*5113495bSYour Name 
2294*5113495bSYour Name 	wmi_set_arp->set_clr = req_buf->flag;
2295*5113495bSYour Name 	wmi_set_arp->pkt_type = req_buf->pkt_type;
2296*5113495bSYour Name 	wmi_set_arp->ipv4 = req_buf->ip_addr;
2297*5113495bSYour Name 
2298*5113495bSYour Name 	wmi_debug("NUD Stats: vdev_id %u set_clr %u pkt_type:%u ipv4 %u",
2299*5113495bSYour Name 		 wmi_set_arp->vdev_id, wmi_set_arp->set_clr,
2300*5113495bSYour Name 		 wmi_set_arp->pkt_type, wmi_set_arp->ipv4);
2301*5113495bSYour Name 
2302*5113495bSYour Name 	/*
2303*5113495bSYour Name 	 * pkt_type_bitmap should be non-zero to ensure
2304*5113495bSYour Name 	 * presence of additional stats.
2305*5113495bSYour Name 	 */
2306*5113495bSYour Name 	if (req_buf->pkt_type_bitmap) {
2307*5113495bSYour Name 		wmi_vdev_set_connectivity_check_stats *wmi_set_connect_stats;
2308*5113495bSYour Name 
2309*5113495bSYour Name 		buf_ptr += sizeof(wmi_vdev_set_arp_stats_cmd_fixed_param);
2310*5113495bSYour Name 		WMITLV_SET_HDR(buf_ptr,
2311*5113495bSYour Name 			       WMITLV_TAG_ARRAY_STRUC,
2312*5113495bSYour Name 			       sizeof(wmi_vdev_set_connectivity_check_stats));
2313*5113495bSYour Name 		buf_ptr += WMI_TLV_HDR_SIZE;
2314*5113495bSYour Name 		wmi_set_connect_stats =
2315*5113495bSYour Name 			(wmi_vdev_set_connectivity_check_stats *)buf_ptr;
2316*5113495bSYour Name 		WMITLV_SET_HDR(&wmi_set_connect_stats->tlv_header,
2317*5113495bSYour Name 			WMITLV_TAG_STRUC_wmi_vdev_set_connectivity_check_stats,
2318*5113495bSYour Name 			WMITLV_GET_STRUCT_TLVLEN(
2319*5113495bSYour Name 					wmi_vdev_set_connectivity_check_stats));
2320*5113495bSYour Name 		wmi_set_connect_stats->pkt_type_bitmap =
2321*5113495bSYour Name 						req_buf->pkt_type_bitmap;
2322*5113495bSYour Name 		wmi_set_connect_stats->tcp_src_port = req_buf->tcp_src_port;
2323*5113495bSYour Name 		wmi_set_connect_stats->tcp_dst_port = req_buf->tcp_dst_port;
2324*5113495bSYour Name 		wmi_set_connect_stats->icmp_ipv4 = req_buf->icmp_ipv4;
2325*5113495bSYour Name 
2326*5113495bSYour Name 		wmi_debug("Connectivity Stats: pkt_type_bitmap %u tcp_src_port:%u tcp_dst_port %u icmp_ipv4 %u",
2327*5113495bSYour Name 			 wmi_set_connect_stats->pkt_type_bitmap,
2328*5113495bSYour Name 			 wmi_set_connect_stats->tcp_src_port,
2329*5113495bSYour Name 			 wmi_set_connect_stats->tcp_dst_port,
2330*5113495bSYour Name 			 wmi_set_connect_stats->icmp_ipv4);
2331*5113495bSYour Name 	}
2332*5113495bSYour Name 
2333*5113495bSYour Name 	/* Send per roam config parameters */
2334*5113495bSYour Name 	wmi_mtrace(WMI_VDEV_SET_ARP_STAT_CMDID, NO_SESSION, 0);
2335*5113495bSYour Name 	status = wmi_unified_cmd_send(wmi_handle, buf,
2336*5113495bSYour Name 				      len, WMI_VDEV_SET_ARP_STAT_CMDID);
2337*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
2338*5113495bSYour Name 		wmi_err("WMI_SET_ARP_STATS_CMDID failed, Error %d", status);
2339*5113495bSYour Name 		goto error;
2340*5113495bSYour Name 	}
2341*5113495bSYour Name 
2342*5113495bSYour Name 	wmi_debug("set arp stats flag=%d, vdev=%d",
2343*5113495bSYour Name 		 req_buf->flag, req_buf->vdev_id);
2344*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
2345*5113495bSYour Name error:
2346*5113495bSYour Name 	wmi_buf_free(buf);
2347*5113495bSYour Name 
2348*5113495bSYour Name 	return status;
2349*5113495bSYour Name }
2350*5113495bSYour Name 
2351*5113495bSYour Name /**
2352*5113495bSYour Name  * send_get_arp_stats_req_cmd_tlv() - send wmi cmd to get arp stats request
2353*5113495bSYour Name  * @wmi_handle: wmi handler
2354*5113495bSYour Name  * @req_buf: get arp stats request buffer
2355*5113495bSYour Name  *
2356*5113495bSYour Name  * Return: 0 for success and non zero for failure
2357*5113495bSYour Name  */
send_get_arp_stats_req_cmd_tlv(wmi_unified_t wmi_handle,struct get_arp_stats * req_buf)2358*5113495bSYour Name static QDF_STATUS send_get_arp_stats_req_cmd_tlv(wmi_unified_t wmi_handle,
2359*5113495bSYour Name 					  struct get_arp_stats *req_buf)
2360*5113495bSYour Name {
2361*5113495bSYour Name 	wmi_buf_t buf = NULL;
2362*5113495bSYour Name 	QDF_STATUS status;
2363*5113495bSYour Name 	int len;
2364*5113495bSYour Name 	uint8_t *buf_ptr;
2365*5113495bSYour Name 	wmi_vdev_get_arp_stats_cmd_fixed_param *get_arp_stats;
2366*5113495bSYour Name 
2367*5113495bSYour Name 	len = sizeof(wmi_vdev_get_arp_stats_cmd_fixed_param);
2368*5113495bSYour Name 	buf = wmi_buf_alloc(wmi_handle, len);
2369*5113495bSYour Name 	if (!buf) {
2370*5113495bSYour Name 		return QDF_STATUS_E_NOMEM;
2371*5113495bSYour Name 	}
2372*5113495bSYour Name 
2373*5113495bSYour Name 	buf_ptr = (uint8_t *) wmi_buf_data(buf);
2374*5113495bSYour Name 	get_arp_stats =
2375*5113495bSYour Name 		(wmi_vdev_get_arp_stats_cmd_fixed_param *) buf_ptr;
2376*5113495bSYour Name 	WMITLV_SET_HDR(&get_arp_stats->tlv_header,
2377*5113495bSYour Name 		       WMITLV_TAG_STRUC_wmi_vdev_get_arp_stats_cmd_fixed_param,
2378*5113495bSYour Name 		       WMITLV_GET_STRUCT_TLVLEN
2379*5113495bSYour Name 				(wmi_vdev_get_arp_stats_cmd_fixed_param));
2380*5113495bSYour Name 
2381*5113495bSYour Name 	/* fill in arp stats req cmd values */
2382*5113495bSYour Name 	get_arp_stats->vdev_id = req_buf->vdev_id;
2383*5113495bSYour Name 
2384*5113495bSYour Name 	wmi_debug("vdev=%d", req_buf->vdev_id);
2385*5113495bSYour Name 	/* Send per roam config parameters */
2386*5113495bSYour Name 	wmi_mtrace(WMI_VDEV_GET_ARP_STAT_CMDID, NO_SESSION, 0);
2387*5113495bSYour Name 	status = wmi_unified_cmd_send(wmi_handle, buf,
2388*5113495bSYour Name 				      len, WMI_VDEV_GET_ARP_STAT_CMDID);
2389*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
2390*5113495bSYour Name 		wmi_err("WMI_GET_ARP_STATS_CMDID failed, Error %d", status);
2391*5113495bSYour Name 		goto error;
2392*5113495bSYour Name 	}
2393*5113495bSYour Name 
2394*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
2395*5113495bSYour Name error:
2396*5113495bSYour Name 	wmi_buf_free(buf);
2397*5113495bSYour Name 
2398*5113495bSYour Name 	return status;
2399*5113495bSYour Name }
2400*5113495bSYour Name 
2401*5113495bSYour Name /**
2402*5113495bSYour Name  * send_peer_unmap_conf_cmd_tlv() - send PEER UNMAP conf command to fw
2403*5113495bSYour Name  * @wmi: wmi handle
2404*5113495bSYour Name  * @vdev_id: vdev id
2405*5113495bSYour Name  * @peer_id_cnt: no. of peer ids
2406*5113495bSYour Name  * @peer_id_list: list of peer ids
2407*5113495bSYour Name  *
2408*5113495bSYour Name  * Return: QDF_STATUS_SUCCESS for success or error code
2409*5113495bSYour Name  */
send_peer_unmap_conf_cmd_tlv(wmi_unified_t wmi,uint8_t vdev_id,uint32_t peer_id_cnt,uint16_t * peer_id_list)2410*5113495bSYour Name static QDF_STATUS send_peer_unmap_conf_cmd_tlv(wmi_unified_t wmi,
2411*5113495bSYour Name 					       uint8_t vdev_id,
2412*5113495bSYour Name 					       uint32_t peer_id_cnt,
2413*5113495bSYour Name 					       uint16_t *peer_id_list)
2414*5113495bSYour Name {
2415*5113495bSYour Name 	int i;
2416*5113495bSYour Name 	wmi_buf_t buf;
2417*5113495bSYour Name 	uint8_t *buf_ptr;
2418*5113495bSYour Name 	A_UINT32 *peer_ids;
2419*5113495bSYour Name 	wmi_peer_unmap_response_cmd_fixed_param *cmd;
2420*5113495bSYour Name 	uint32_t peer_id_list_len;
2421*5113495bSYour Name 	uint32_t len = sizeof(*cmd);
2422*5113495bSYour Name 	QDF_STATUS status;
2423*5113495bSYour Name 
2424*5113495bSYour Name 	if (!peer_id_cnt || !peer_id_list)
2425*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
2426*5113495bSYour Name 
2427*5113495bSYour Name 	len += WMI_TLV_HDR_SIZE;
2428*5113495bSYour Name 
2429*5113495bSYour Name 	peer_id_list_len = peer_id_cnt * sizeof(A_UINT32);
2430*5113495bSYour Name 
2431*5113495bSYour Name 	len += peer_id_list_len;
2432*5113495bSYour Name 
2433*5113495bSYour Name 	buf = wmi_buf_alloc(wmi, len);
2434*5113495bSYour Name 
2435*5113495bSYour Name 	if (!buf) {
2436*5113495bSYour Name 		wmi_err("wmi_buf_alloc failed");
2437*5113495bSYour Name 		return QDF_STATUS_E_NOMEM;
2438*5113495bSYour Name 	}
2439*5113495bSYour Name 
2440*5113495bSYour Name 	cmd = (wmi_peer_unmap_response_cmd_fixed_param *)wmi_buf_data(buf);
2441*5113495bSYour Name 	buf_ptr = (uint8_t *)wmi_buf_data(buf);
2442*5113495bSYour Name 
2443*5113495bSYour Name 	WMITLV_SET_HDR(&cmd->tlv_header,
2444*5113495bSYour Name 		       WMITLV_TAG_STRUC_wmi_peer_unmap_response_cmd_fixed_param,
2445*5113495bSYour Name 		       WMITLV_GET_STRUCT_TLVLEN
2446*5113495bSYour Name 			       (wmi_peer_unmap_response_cmd_fixed_param));
2447*5113495bSYour Name 
2448*5113495bSYour Name 	buf_ptr += sizeof(wmi_peer_unmap_response_cmd_fixed_param);
2449*5113495bSYour Name 
2450*5113495bSYour Name 	WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_ARRAY_UINT32,
2451*5113495bSYour Name 		       peer_id_list_len);
2452*5113495bSYour Name 
2453*5113495bSYour Name 	peer_ids = (A_UINT32 *)(buf_ptr + WMI_TLV_HDR_SIZE);
2454*5113495bSYour Name 
2455*5113495bSYour Name 	for (i = 0; i < peer_id_cnt; i++)
2456*5113495bSYour Name 		peer_ids[i] = peer_id_list[i];
2457*5113495bSYour Name 
2458*5113495bSYour Name 	wmi_debug("vdev_id %d peer_id_cnt %d", vdev_id, peer_id_cnt);
2459*5113495bSYour Name 	wmi_mtrace(WMI_PEER_UNMAP_RESPONSE_CMDID, vdev_id, 0);
2460*5113495bSYour Name 	status = wmi_unified_cmd_send(wmi, buf, len,
2461*5113495bSYour Name 				      WMI_PEER_UNMAP_RESPONSE_CMDID);
2462*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
2463*5113495bSYour Name 		wmi_err("Failed to send peer unmap conf command: Err[%d]",
2464*5113495bSYour Name 			 status);
2465*5113495bSYour Name 		wmi_buf_free(buf);
2466*5113495bSYour Name 		return status;
2467*5113495bSYour Name 	}
2468*5113495bSYour Name 
2469*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
2470*5113495bSYour Name }
2471*5113495bSYour Name 
wmi_sta_attach_tlv(wmi_unified_t wmi_handle)2472*5113495bSYour Name void wmi_sta_attach_tlv(wmi_unified_t wmi_handle)
2473*5113495bSYour Name {
2474*5113495bSYour Name 	struct wmi_ops *ops = wmi_handle->ops;
2475*5113495bSYour Name 
2476*5113495bSYour Name 	ops->send_set_sta_sa_query_param_cmd =
2477*5113495bSYour Name 		send_set_sta_sa_query_param_cmd_tlv;
2478*5113495bSYour Name 	ops->send_set_sta_keep_alive_cmd = send_set_sta_keep_alive_cmd_tlv;
2479*5113495bSYour Name 	ops->send_vdev_set_gtx_cfg_cmd = send_vdev_set_gtx_cfg_cmd_tlv;
2480*5113495bSYour Name 	ops->send_process_dhcp_ind_cmd = send_process_dhcp_ind_cmd_tlv;
2481*5113495bSYour Name 	ops->send_get_link_speed_cmd = send_get_link_speed_cmd_tlv;
2482*5113495bSYour Name 	ops->send_fw_profiling_cmd = send_fw_profiling_cmd_tlv;
2483*5113495bSYour Name 	ops->send_nat_keepalive_en_cmd = send_nat_keepalive_en_cmd_tlv;
2484*5113495bSYour Name 	ops->send_wlm_latency_level_cmd = send_wlm_latency_level_cmd_tlv;
2485*5113495bSYour Name 	ops->send_process_set_ie_info_cmd = send_process_set_ie_info_cmd_tlv;
2486*5113495bSYour Name 	ops->send_set_base_macaddr_indicate_cmd =
2487*5113495bSYour Name 		 send_set_base_macaddr_indicate_cmd_tlv;
2488*5113495bSYour Name 	ops->send_sar_limit_cmd = send_sar_limit_cmd_tlv;
2489*5113495bSYour Name 	ops->get_sar_limit_cmd = get_sar_limit_cmd_tlv;
2490*5113495bSYour Name 	ops->extract_sar_limit_event = extract_sar_limit_event_tlv;
2491*5113495bSYour Name 	ops->extract_sar2_result_event = extract_sar2_result_event_tlv;
2492*5113495bSYour Name 	ops->send_set_del_pmkid_cache_cmd = send_set_del_pmkid_cache_cmd_tlv;
2493*5113495bSYour Name 	ops->send_del_ts_cmd = send_del_ts_cmd_tlv;
2494*5113495bSYour Name 	ops->send_aggr_qos_cmd = send_aggr_qos_cmd_tlv;
2495*5113495bSYour Name 	ops->send_add_ts_cmd = send_add_ts_cmd_tlv;
2496*5113495bSYour Name 	ops->send_process_add_periodic_tx_ptrn_cmd =
2497*5113495bSYour Name 		send_process_add_periodic_tx_ptrn_cmd_tlv;
2498*5113495bSYour Name 	ops->send_process_del_periodic_tx_ptrn_cmd =
2499*5113495bSYour Name 		send_process_del_periodic_tx_ptrn_cmd_tlv;
2500*5113495bSYour Name 	ops->send_set_auto_shutdown_timer_cmd =
2501*5113495bSYour Name 		send_set_auto_shutdown_timer_cmd_tlv;
2502*5113495bSYour Name 	ops->send_set_led_flashing_cmd = send_set_led_flashing_cmd_tlv;
2503*5113495bSYour Name 	ops->send_process_ch_avoid_update_cmd =
2504*5113495bSYour Name 		send_process_ch_avoid_update_cmd_tlv;
2505*5113495bSYour Name 	ops->send_pdev_set_pcl_cmd = send_pdev_set_pcl_cmd_tlv;
2506*5113495bSYour Name 	ops->send_adapt_dwelltime_params_cmd =
2507*5113495bSYour Name 		send_adapt_dwelltime_params_cmd_tlv;
2508*5113495bSYour Name 	ops->send_dbs_scan_sel_params_cmd =
2509*5113495bSYour Name 		send_dbs_scan_sel_params_cmd_tlv;
2510*5113495bSYour Name 	ops->send_set_arp_stats_req_cmd = send_set_arp_stats_req_cmd_tlv;
2511*5113495bSYour Name 	ops->send_get_arp_stats_req_cmd = send_get_arp_stats_req_cmd_tlv;
2512*5113495bSYour Name 	ops->send_peer_unmap_conf_cmd = send_peer_unmap_conf_cmd_tlv;
2513*5113495bSYour Name 
2514*5113495bSYour Name 	wmi_tdls_attach_tlv(wmi_handle);
2515*5113495bSYour Name 	wmi_policy_mgr_attach_tlv(wmi_handle);
2516*5113495bSYour Name 	wmi_denylist_mgr_attach_tlv(wmi_handle);
2517*5113495bSYour Name }
2518*5113495bSYour Name 
2519