xref: /wlan-driver/qca-wifi-host-cmn/wmi/src/wmi_unified_twt_tlv.c (revision 5113495b16420b49004c444715d2daae2066e7dc)
1*5113495bSYour Name /*
2*5113495bSYour Name  * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved.
3*5113495bSYour Name  * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
4*5113495bSYour Name  *
5*5113495bSYour Name  * Permission to use, copy, modify, and/or distribute this software for
6*5113495bSYour Name  * any purpose with or without fee is hereby granted, provided that the
7*5113495bSYour Name  * above copyright notice and this permission notice appear in all
8*5113495bSYour Name  * copies.
9*5113495bSYour Name  *
10*5113495bSYour Name  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11*5113495bSYour Name  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12*5113495bSYour Name  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13*5113495bSYour Name  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14*5113495bSYour Name  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15*5113495bSYour Name  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16*5113495bSYour Name  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17*5113495bSYour Name  * PERFORMANCE OF THIS SOFTWARE.
18*5113495bSYour Name  */
19*5113495bSYour Name 
20*5113495bSYour Name #include <osdep.h>
21*5113495bSYour Name #include "wmi.h"
22*5113495bSYour Name #include "wmi_unified_priv.h"
23*5113495bSYour Name #include "wmi_unified_twt_param.h"
24*5113495bSYour Name #include "wmi_unified_twt_api.h"
25*5113495bSYour Name 
26*5113495bSYour Name #if defined(WLAN_SUPPORT_TWT) && defined(WLAN_TWT_CONV_SUPPORTED)
send_twt_enable_cmd_tlv(wmi_unified_t wmi_handle,struct twt_enable_param * params)27*5113495bSYour Name static QDF_STATUS send_twt_enable_cmd_tlv(wmi_unified_t wmi_handle,
28*5113495bSYour Name 			struct twt_enable_param *params)
29*5113495bSYour Name {
30*5113495bSYour Name 	wmi_twt_enable_cmd_fixed_param *cmd;
31*5113495bSYour Name 	wmi_buf_t buf;
32*5113495bSYour Name 	QDF_STATUS status;
33*5113495bSYour Name 
34*5113495bSYour Name 	buf = wmi_buf_alloc(wmi_handle, sizeof(*cmd));
35*5113495bSYour Name 	if (!buf) {
36*5113495bSYour Name 		wmi_err("Failed to allocate memory");
37*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
38*5113495bSYour Name 	}
39*5113495bSYour Name 
40*5113495bSYour Name 	cmd = (wmi_twt_enable_cmd_fixed_param *)wmi_buf_data(buf);
41*5113495bSYour Name 	WMITLV_SET_HDR(&cmd->tlv_header,
42*5113495bSYour Name 			WMITLV_TAG_STRUC_wmi_twt_enable_cmd_fixed_param,
43*5113495bSYour Name 			WMITLV_GET_STRUCT_TLVLEN
44*5113495bSYour Name 			(wmi_twt_enable_cmd_fixed_param));
45*5113495bSYour Name 
46*5113495bSYour Name 	cmd->pdev_id =
47*5113495bSYour Name 		wmi_handle->ops->convert_pdev_id_host_to_target(
48*5113495bSYour Name 						wmi_handle,
49*5113495bSYour Name 						params->pdev_id);
50*5113495bSYour Name 	cmd->sta_cong_timer_ms =            params->sta_cong_timer_ms;
51*5113495bSYour Name 	cmd->mbss_support =                 params->mbss_support;
52*5113495bSYour Name 	cmd->default_slot_size =            params->default_slot_size;
53*5113495bSYour Name 	cmd->congestion_thresh_setup =      params->congestion_thresh_setup;
54*5113495bSYour Name 	cmd->congestion_thresh_teardown =   params->congestion_thresh_teardown;
55*5113495bSYour Name 	cmd->congestion_thresh_critical =   params->congestion_thresh_critical;
56*5113495bSYour Name 	cmd->interference_thresh_teardown =
57*5113495bSYour Name 					params->interference_thresh_teardown;
58*5113495bSYour Name 	cmd->interference_thresh_setup =    params->interference_thresh_setup;
59*5113495bSYour Name 	cmd->min_no_sta_setup =             params->min_no_sta_setup;
60*5113495bSYour Name 	cmd->min_no_sta_teardown =          params->min_no_sta_teardown;
61*5113495bSYour Name 	cmd->no_of_bcast_mcast_slots =      params->no_of_bcast_mcast_slots;
62*5113495bSYour Name 	cmd->min_no_twt_slots =             params->min_no_twt_slots;
63*5113495bSYour Name 	cmd->max_no_sta_twt =               params->max_no_sta_twt;
64*5113495bSYour Name 	cmd->mode_check_interval =          params->mode_check_interval;
65*5113495bSYour Name 	cmd->add_sta_slot_interval =        params->add_sta_slot_interval;
66*5113495bSYour Name 	cmd->remove_sta_slot_interval =     params->remove_sta_slot_interval;
67*5113495bSYour Name 
68*5113495bSYour Name 	TWT_EN_DIS_FLAGS_SET_BTWT(cmd->flags, params->b_twt_enable);
69*5113495bSYour Name 	TWT_EN_DIS_FLAGS_SET_B_R_TWT(cmd->flags, params->r_twt_enable);
70*5113495bSYour Name 	TWT_EN_DIS_FLAGS_SET_L_MBSSID(cmd->flags,
71*5113495bSYour Name 				      params->b_twt_legacy_mbss_enable);
72*5113495bSYour Name 	TWT_EN_DIS_FLAGS_SET_AX_MBSSID(cmd->flags,
73*5113495bSYour Name 				       params->b_twt_ax_mbss_enable);
74*5113495bSYour Name 	if (params->ext_conf_present) {
75*5113495bSYour Name 		TWT_EN_DIS_FLAGS_SET_SPLIT_CONFIG(cmd->flags, 1);
76*5113495bSYour Name 		TWT_EN_DIS_FLAGS_SET_REQ_RESP(cmd->flags, params->twt_role);
77*5113495bSYour Name 		TWT_EN_DIS_FLAGS_SET_I_B_TWT(cmd->flags, params->twt_oper);
78*5113495bSYour Name 	}
79*5113495bSYour Name 
80*5113495bSYour Name 	status = wmi_unified_cmd_send(wmi_handle, buf, sizeof(*cmd),
81*5113495bSYour Name 				      WMI_TWT_ENABLE_CMDID);
82*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
83*5113495bSYour Name 		wmi_err("Failed to send WMI_TWT_ENABLE_CMDID");
84*5113495bSYour Name 		wmi_buf_free(buf);
85*5113495bSYour Name 	}
86*5113495bSYour Name 
87*5113495bSYour Name 	return status;
88*5113495bSYour Name }
89*5113495bSYour Name 
90*5113495bSYour Name static WMI_DISABLE_TWT_REASON_T
wmi_convert_dis_reason_code(enum HOST_TWT_DISABLE_REASON reason)91*5113495bSYour Name wmi_convert_dis_reason_code(enum HOST_TWT_DISABLE_REASON reason)
92*5113495bSYour Name {
93*5113495bSYour Name 	switch (reason) {
94*5113495bSYour Name 	case HOST_TWT_DISABLE_REASON_NONE:
95*5113495bSYour Name 		return WMI_DISABLE_TWT_REASON_NONE;
96*5113495bSYour Name 	case HOST_TWT_DISABLE_REASON_CONCURRENCY_SCC:
97*5113495bSYour Name 		return WMI_DISABLE_TWT_REASON_CONCURRENCY_SCC;
98*5113495bSYour Name 	case HOST_TWT_DISABLE_REASON_CONCURRENCY_MCC:
99*5113495bSYour Name 		return WMI_DISABLE_TWT_REASON_CONCURRENCY_MCC;
100*5113495bSYour Name 	case HOST_TWT_DISABLE_REASON_CHANGE_CONGESTION_TIMEOUT:
101*5113495bSYour Name 		return WMI_DISABLE_TWT_REASON_CHANGE_CONGESTION_TIMEOUT;
102*5113495bSYour Name 	case HOST_TWT_DISABLE_REASON_P2P_GO_NOA:
103*5113495bSYour Name 		return WMI_DISABLE_TWT_REASON_P2P_GO_NOA;
104*5113495bSYour Name 	default:
105*5113495bSYour Name 		return WMI_DISABLE_TWT_REASON_NONE;
106*5113495bSYour Name 	}
107*5113495bSYour Name }
108*5113495bSYour Name 
send_twt_disable_cmd_tlv(wmi_unified_t wmi_handle,struct twt_disable_param * params)109*5113495bSYour Name static QDF_STATUS send_twt_disable_cmd_tlv(wmi_unified_t wmi_handle,
110*5113495bSYour Name 			struct twt_disable_param *params)
111*5113495bSYour Name {
112*5113495bSYour Name 	wmi_twt_disable_cmd_fixed_param *cmd;
113*5113495bSYour Name 	wmi_buf_t buf;
114*5113495bSYour Name 	QDF_STATUS status;
115*5113495bSYour Name 
116*5113495bSYour Name 	buf = wmi_buf_alloc(wmi_handle, sizeof(*cmd));
117*5113495bSYour Name 	if (!buf) {
118*5113495bSYour Name 		wmi_err("Failed to allocate memory");
119*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
120*5113495bSYour Name 	}
121*5113495bSYour Name 
122*5113495bSYour Name 	cmd = (wmi_twt_disable_cmd_fixed_param *)wmi_buf_data(buf);
123*5113495bSYour Name 	WMITLV_SET_HDR(&cmd->tlv_header,
124*5113495bSYour Name 			WMITLV_TAG_STRUC_wmi_twt_disable_cmd_fixed_param,
125*5113495bSYour Name 			WMITLV_GET_STRUCT_TLVLEN
126*5113495bSYour Name 			(wmi_twt_disable_cmd_fixed_param));
127*5113495bSYour Name 
128*5113495bSYour Name 	cmd->pdev_id =
129*5113495bSYour Name 		wmi_handle->ops->convert_pdev_id_host_to_target(
130*5113495bSYour Name 						wmi_handle,
131*5113495bSYour Name 						params->pdev_id);
132*5113495bSYour Name 	if (params->ext_conf_present) {
133*5113495bSYour Name 		TWT_EN_DIS_FLAGS_SET_SPLIT_CONFIG(cmd->flags, 1);
134*5113495bSYour Name 		TWT_EN_DIS_FLAGS_SET_REQ_RESP(cmd->flags, params->twt_role);
135*5113495bSYour Name 		TWT_EN_DIS_FLAGS_SET_I_B_TWT(cmd->flags, params->twt_oper);
136*5113495bSYour Name 	}
137*5113495bSYour Name 
138*5113495bSYour Name 	cmd->reason_code = wmi_convert_dis_reason_code(
139*5113495bSYour Name 					params->dis_reason_code);
140*5113495bSYour Name 	status = wmi_unified_cmd_send(wmi_handle, buf, sizeof(*cmd),
141*5113495bSYour Name 				      WMI_TWT_DISABLE_CMDID);
142*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
143*5113495bSYour Name 		wmi_err("Failed to send WMI_TWT_DISABLE_CMDID");
144*5113495bSYour Name 		wmi_buf_free(buf);
145*5113495bSYour Name 	}
146*5113495bSYour Name 
147*5113495bSYour Name 	return status;
148*5113495bSYour Name }
149*5113495bSYour Name 
150*5113495bSYour Name #ifdef WLAN_SUPPORT_BCAST_TWT
151*5113495bSYour Name static void
twt_add_dialog_set_bcast_twt_params(struct twt_add_dialog_param * params,wmi_twt_add_dialog_cmd_fixed_param * cmd)152*5113495bSYour Name twt_add_dialog_set_bcast_twt_params(struct twt_add_dialog_param *params,
153*5113495bSYour Name 				    wmi_twt_add_dialog_cmd_fixed_param *cmd)
154*5113495bSYour Name {
155*5113495bSYour Name 	TWT_FLAGS_SET_BTWT_ID0(cmd->flags, params->flag_b_twt_id0);
156*5113495bSYour Name 	cmd->b_twt_persistence = params->b_twt_persistence;
157*5113495bSYour Name 	cmd->b_twt_recommendation = params->b_twt_recommendation;
158*5113495bSYour Name }
159*5113495bSYour Name #else
160*5113495bSYour Name static void
twt_add_dialog_set_bcast_twt_params(struct twt_add_dialog_param * params,wmi_twt_add_dialog_cmd_fixed_param * cmd)161*5113495bSYour Name twt_add_dialog_set_bcast_twt_params(struct twt_add_dialog_param *params,
162*5113495bSYour Name 				    wmi_twt_add_dialog_cmd_fixed_param *cmd)
163*5113495bSYour Name {
164*5113495bSYour Name }
165*5113495bSYour Name #endif
166*5113495bSYour Name 
167*5113495bSYour Name static QDF_STATUS
send_twt_add_dialog_cmd_tlv(wmi_unified_t wmi_handle,struct twt_add_dialog_param * params)168*5113495bSYour Name send_twt_add_dialog_cmd_tlv(wmi_unified_t wmi_handle,
169*5113495bSYour Name 			    struct twt_add_dialog_param *params)
170*5113495bSYour Name {
171*5113495bSYour Name 	wmi_twt_add_dialog_cmd_fixed_param *cmd;
172*5113495bSYour Name 	wmi_buf_t buf;
173*5113495bSYour Name 	QDF_STATUS status;
174*5113495bSYour Name 
175*5113495bSYour Name 	buf = wmi_buf_alloc(wmi_handle, sizeof(*cmd));
176*5113495bSYour Name 	if (!buf) {
177*5113495bSYour Name 		wmi_err("Failed to allocate memory");
178*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
179*5113495bSYour Name 	}
180*5113495bSYour Name 
181*5113495bSYour Name 	cmd = (wmi_twt_add_dialog_cmd_fixed_param *)wmi_buf_data(buf);
182*5113495bSYour Name 	WMITLV_SET_HDR(&cmd->tlv_header,
183*5113495bSYour Name 		       WMITLV_TAG_STRUC_wmi_twt_add_dialog_cmd_fixed_param,
184*5113495bSYour Name 		       WMITLV_GET_STRUCT_TLVLEN
185*5113495bSYour Name 		       (wmi_twt_add_dialog_cmd_fixed_param));
186*5113495bSYour Name 
187*5113495bSYour Name 	cmd->vdev_id = params->vdev_id;
188*5113495bSYour Name 	WMI_CHAR_ARRAY_TO_MAC_ADDR(params->peer_macaddr.bytes,
189*5113495bSYour Name 				   &cmd->peer_macaddr);
190*5113495bSYour Name 	cmd->dialog_id =         params->dialog_id;
191*5113495bSYour Name 	cmd->wake_intvl_us =     params->wake_intvl_us;
192*5113495bSYour Name 	cmd->wake_intvl_mantis = params->wake_intvl_mantis;
193*5113495bSYour Name 	cmd->wake_dura_us =      params->wake_dura_us;
194*5113495bSYour Name 	cmd->sp_offset_us =      params->sp_offset_us;
195*5113495bSYour Name 	cmd->min_wake_intvl_us = params->min_wake_intvl_us;
196*5113495bSYour Name 	cmd->max_wake_intvl_us = params->max_wake_intvl_us;
197*5113495bSYour Name 	cmd->min_wake_dura_us = params->min_wake_dura_us;
198*5113495bSYour Name 	cmd->max_wake_dura_us = params->max_wake_dura_us;
199*5113495bSYour Name 	cmd->sp_start_tsf_lo = (uint32_t)(params->wake_time_tsf & 0xFFFFFFFF);
200*5113495bSYour Name 	cmd->sp_start_tsf_hi = (uint32_t)(params->wake_time_tsf >> 32);
201*5113495bSYour Name 	cmd->announce_timeout_us = params->announce_timeout_us;
202*5113495bSYour Name 	cmd->link_id_bitmap = params->link_id_bitmap;
203*5113495bSYour Name 	cmd->r_twt_dl_tid_bitmap = params->r_twt_dl_tid_bitmap;
204*5113495bSYour Name 	cmd->r_twt_ul_tid_bitmap = params->r_twt_ul_tid_bitmap;
205*5113495bSYour Name 	TWT_FLAGS_SET_CMD(cmd->flags, params->twt_cmd);
206*5113495bSYour Name 	TWT_FLAGS_SET_BROADCAST(cmd->flags, params->flag_bcast);
207*5113495bSYour Name 	TWT_FLAGS_SET_TRIGGER(cmd->flags, params->flag_trigger);
208*5113495bSYour Name 	TWT_FLAGS_SET_FLOW_TYPE(cmd->flags, params->flag_flow_type);
209*5113495bSYour Name 	TWT_FLAGS_SET_PROTECTION(cmd->flags, params->flag_protection);
210*5113495bSYour Name 
211*5113495bSYour Name 	twt_add_dialog_set_bcast_twt_params(params, cmd);
212*5113495bSYour Name 
213*5113495bSYour Name 	status = wmi_unified_cmd_send(wmi_handle, buf, sizeof(*cmd),
214*5113495bSYour Name 				      WMI_TWT_ADD_DIALOG_CMDID);
215*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
216*5113495bSYour Name 		wmi_err("Failed to send WMI_TWT_ADD_DIALOG_CMDID");
217*5113495bSYour Name 		wmi_buf_free(buf);
218*5113495bSYour Name 	}
219*5113495bSYour Name 
220*5113495bSYour Name 	return status;
221*5113495bSYour Name }
222*5113495bSYour Name 
223*5113495bSYour Name #ifdef WLAN_SUPPORT_BCAST_TWT
224*5113495bSYour Name static void
twt_del_dialog_set_bcast_twt_params(struct twt_del_dialog_param * params,wmi_twt_del_dialog_cmd_fixed_param * cmd)225*5113495bSYour Name twt_del_dialog_set_bcast_twt_params(struct twt_del_dialog_param *params,
226*5113495bSYour Name 				    wmi_twt_del_dialog_cmd_fixed_param *cmd)
227*5113495bSYour Name {
228*5113495bSYour Name 	cmd->b_twt_persistence = params->b_twt_persistence;
229*5113495bSYour Name }
230*5113495bSYour Name #else
231*5113495bSYour Name static void
twt_del_dialog_set_bcast_twt_params(struct twt_del_dialog_param * params,wmi_twt_del_dialog_cmd_fixed_param * cmd)232*5113495bSYour Name twt_del_dialog_set_bcast_twt_params(struct twt_del_dialog_param *params,
233*5113495bSYour Name 				    wmi_twt_del_dialog_cmd_fixed_param *cmd)
234*5113495bSYour Name {
235*5113495bSYour Name }
236*5113495bSYour Name #endif
237*5113495bSYour Name 
238*5113495bSYour Name static QDF_STATUS
send_twt_del_dialog_cmd_tlv(wmi_unified_t wmi_handle,struct twt_del_dialog_param * params)239*5113495bSYour Name send_twt_del_dialog_cmd_tlv(wmi_unified_t wmi_handle,
240*5113495bSYour Name 			    struct twt_del_dialog_param *params)
241*5113495bSYour Name {
242*5113495bSYour Name 	wmi_twt_del_dialog_cmd_fixed_param *cmd;
243*5113495bSYour Name 	wmi_buf_t buf;
244*5113495bSYour Name 	QDF_STATUS status;
245*5113495bSYour Name 
246*5113495bSYour Name 	buf = wmi_buf_alloc(wmi_handle, sizeof(*cmd));
247*5113495bSYour Name 	if (!buf) {
248*5113495bSYour Name 		wmi_err("Failed to allocate memory");
249*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
250*5113495bSYour Name 	}
251*5113495bSYour Name 
252*5113495bSYour Name 	cmd = (wmi_twt_del_dialog_cmd_fixed_param *)wmi_buf_data(buf);
253*5113495bSYour Name 	WMITLV_SET_HDR(&cmd->tlv_header,
254*5113495bSYour Name 		       WMITLV_TAG_STRUC_wmi_twt_del_dialog_cmd_fixed_param,
255*5113495bSYour Name 		       WMITLV_GET_STRUCT_TLVLEN
256*5113495bSYour Name 		       (wmi_twt_del_dialog_cmd_fixed_param));
257*5113495bSYour Name 
258*5113495bSYour Name 	cmd->vdev_id = params->vdev_id;
259*5113495bSYour Name 	WMI_CHAR_ARRAY_TO_MAC_ADDR(params->peer_macaddr.bytes,
260*5113495bSYour Name 				   &cmd->peer_macaddr);
261*5113495bSYour Name 	cmd->dialog_id = params->dialog_id;
262*5113495bSYour Name 
263*5113495bSYour Name 	twt_del_dialog_set_bcast_twt_params(params, cmd);
264*5113495bSYour Name 
265*5113495bSYour Name 	status = wmi_unified_cmd_send(wmi_handle, buf, sizeof(*cmd),
266*5113495bSYour Name 				      WMI_TWT_DEL_DIALOG_CMDID);
267*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
268*5113495bSYour Name 		wmi_err("Failed to send WMI_TWT_DEL_DIALOG_CMDID");
269*5113495bSYour Name 		wmi_buf_free(buf);
270*5113495bSYour Name 	}
271*5113495bSYour Name 
272*5113495bSYour Name 	return status;
273*5113495bSYour Name }
274*5113495bSYour Name 
275*5113495bSYour Name static QDF_STATUS
send_twt_pause_dialog_cmd_tlv(wmi_unified_t wmi_handle,struct twt_pause_dialog_cmd_param * params)276*5113495bSYour Name send_twt_pause_dialog_cmd_tlv(wmi_unified_t wmi_handle,
277*5113495bSYour Name 			      struct twt_pause_dialog_cmd_param *params)
278*5113495bSYour Name {
279*5113495bSYour Name 	wmi_twt_pause_dialog_cmd_fixed_param *cmd;
280*5113495bSYour Name 	wmi_buf_t buf;
281*5113495bSYour Name 	QDF_STATUS status;
282*5113495bSYour Name 
283*5113495bSYour Name 	buf = wmi_buf_alloc(wmi_handle, sizeof(*cmd));
284*5113495bSYour Name 	if (!buf) {
285*5113495bSYour Name 		wmi_err("Failed to allocate memory");
286*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
287*5113495bSYour Name 	}
288*5113495bSYour Name 
289*5113495bSYour Name 	cmd = (wmi_twt_pause_dialog_cmd_fixed_param *)wmi_buf_data(buf);
290*5113495bSYour Name 	WMITLV_SET_HDR(&cmd->tlv_header,
291*5113495bSYour Name 		       WMITLV_TAG_STRUC_wmi_twt_pause_dialog_cmd_fixed_param,
292*5113495bSYour Name 		       WMITLV_GET_STRUCT_TLVLEN
293*5113495bSYour Name 		       (wmi_twt_pause_dialog_cmd_fixed_param));
294*5113495bSYour Name 
295*5113495bSYour Name 	cmd->vdev_id = params->vdev_id;
296*5113495bSYour Name 	WMI_CHAR_ARRAY_TO_MAC_ADDR(params->peer_macaddr.bytes,
297*5113495bSYour Name 				   &cmd->peer_macaddr);
298*5113495bSYour Name 	cmd->dialog_id = params->dialog_id;
299*5113495bSYour Name 
300*5113495bSYour Name 	status = wmi_unified_cmd_send(wmi_handle, buf, sizeof(*cmd),
301*5113495bSYour Name 				      WMI_TWT_PAUSE_DIALOG_CMDID);
302*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
303*5113495bSYour Name 		wmi_err("Failed to send WMI_TWT_PAUSE_DIALOG_CMDID");
304*5113495bSYour Name 		wmi_buf_free(buf);
305*5113495bSYour Name 	}
306*5113495bSYour Name 
307*5113495bSYour Name 	return status;
308*5113495bSYour Name }
309*5113495bSYour Name 
310*5113495bSYour Name static QDF_STATUS
send_twt_nudge_dialog_cmd_tlv(wmi_unified_t wmi_handle,struct twt_nudge_dialog_cmd_param * params)311*5113495bSYour Name send_twt_nudge_dialog_cmd_tlv(wmi_unified_t wmi_handle,
312*5113495bSYour Name 			      struct twt_nudge_dialog_cmd_param *params)
313*5113495bSYour Name {
314*5113495bSYour Name 	wmi_twt_nudge_dialog_cmd_fixed_param *cmd;
315*5113495bSYour Name 	wmi_buf_t buf;
316*5113495bSYour Name 	QDF_STATUS status;
317*5113495bSYour Name 
318*5113495bSYour Name 	buf = wmi_buf_alloc(wmi_handle, sizeof(*cmd));
319*5113495bSYour Name 	if (!buf)
320*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
321*5113495bSYour Name 
322*5113495bSYour Name 	cmd = (wmi_twt_nudge_dialog_cmd_fixed_param *)wmi_buf_data(buf);
323*5113495bSYour Name 	WMITLV_SET_HDR(&cmd->tlv_header,
324*5113495bSYour Name 		       WMITLV_TAG_STRUC_wmi_twt_nudge_dialog_cmd_fixed_param,
325*5113495bSYour Name 		       WMITLV_GET_STRUCT_TLVLEN
326*5113495bSYour Name 		       (wmi_twt_nudge_dialog_cmd_fixed_param));
327*5113495bSYour Name 
328*5113495bSYour Name 	cmd->vdev_id = params->vdev_id;
329*5113495bSYour Name 	WMI_CHAR_ARRAY_TO_MAC_ADDR(params->peer_macaddr.bytes,
330*5113495bSYour Name 				   &cmd->peer_macaddr);
331*5113495bSYour Name 	cmd->dialog_id = params->dialog_id;
332*5113495bSYour Name 	cmd->suspend_duration_ms = params->suspend_duration / 1000;
333*5113495bSYour Name 	cmd->next_twt_size = params->next_twt_size;
334*5113495bSYour Name 	cmd->sp_start_offset = params->sp_start_offset;
335*5113495bSYour Name 
336*5113495bSYour Name 	wmi_debug("vdev_id: %d dialog_id: %d duration(in ms): %u next_twt_size: %d "
337*5113495bSYour Name 		  "peer_macaddr: " QDF_MAC_ADDR_FMT " sp_start_offset: %d",
338*5113495bSYour Name 		  cmd->vdev_id, cmd->dialog_id, cmd->suspend_duration_ms,
339*5113495bSYour Name 		  cmd->next_twt_size,
340*5113495bSYour Name 		  QDF_MAC_ADDR_REF(params->peer_macaddr.bytes),
341*5113495bSYour Name 		  cmd->sp_start_offset);
342*5113495bSYour Name 
343*5113495bSYour Name 	status = wmi_unified_cmd_send(wmi_handle, buf, sizeof(*cmd),
344*5113495bSYour Name 				      WMI_TWT_NUDGE_DIALOG_CMDID);
345*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status))
346*5113495bSYour Name 		wmi_buf_free(buf);
347*5113495bSYour Name 
348*5113495bSYour Name 	return status;
349*5113495bSYour Name }
350*5113495bSYour Name 
send_twt_resume_dialog_cmd_tlv(wmi_unified_t wmi_handle,struct twt_resume_dialog_cmd_param * params)351*5113495bSYour Name static QDF_STATUS send_twt_resume_dialog_cmd_tlv(wmi_unified_t wmi_handle,
352*5113495bSYour Name 			struct twt_resume_dialog_cmd_param *params)
353*5113495bSYour Name {
354*5113495bSYour Name 	wmi_twt_resume_dialog_cmd_fixed_param *cmd;
355*5113495bSYour Name 	wmi_buf_t buf;
356*5113495bSYour Name 	QDF_STATUS status;
357*5113495bSYour Name 
358*5113495bSYour Name 	buf = wmi_buf_alloc(wmi_handle, sizeof(*cmd));
359*5113495bSYour Name 	if (!buf) {
360*5113495bSYour Name 		wmi_err("Failed to allocate memory");
361*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
362*5113495bSYour Name 	}
363*5113495bSYour Name 
364*5113495bSYour Name 	cmd = (wmi_twt_resume_dialog_cmd_fixed_param *)wmi_buf_data(buf);
365*5113495bSYour Name 	WMITLV_SET_HDR(&cmd->tlv_header,
366*5113495bSYour Name 			WMITLV_TAG_STRUC_wmi_twt_resume_dialog_cmd_fixed_param,
367*5113495bSYour Name 			WMITLV_GET_STRUCT_TLVLEN
368*5113495bSYour Name 			(wmi_twt_resume_dialog_cmd_fixed_param));
369*5113495bSYour Name 
370*5113495bSYour Name 	cmd->vdev_id = params->vdev_id;
371*5113495bSYour Name 	WMI_CHAR_ARRAY_TO_MAC_ADDR(params->peer_macaddr.bytes,
372*5113495bSYour Name 				   &cmd->peer_macaddr);
373*5113495bSYour Name 	cmd->dialog_id = params->dialog_id;
374*5113495bSYour Name 	cmd->sp_offset_us = params->sp_offset_us;
375*5113495bSYour Name 	cmd->next_twt_size = params->next_twt_size;
376*5113495bSYour Name 
377*5113495bSYour Name 	status = wmi_unified_cmd_send(wmi_handle, buf, sizeof(*cmd),
378*5113495bSYour Name 						WMI_TWT_RESUME_DIALOG_CMDID);
379*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
380*5113495bSYour Name 		wmi_err("Failed to send WMI_TWT_RESUME_DIALOG_CMDID");
381*5113495bSYour Name 		wmi_buf_free(buf);
382*5113495bSYour Name 	}
383*5113495bSYour Name 
384*5113495bSYour Name 	return status;
385*5113495bSYour Name }
386*5113495bSYour Name 
387*5113495bSYour Name #ifdef WLAN_SUPPORT_BCAST_TWT
388*5113495bSYour Name static QDF_STATUS
send_twt_btwt_invite_sta_cmd_tlv(wmi_unified_t wmi_handle,struct twt_btwt_invite_sta_cmd_param * params)389*5113495bSYour Name send_twt_btwt_invite_sta_cmd_tlv(wmi_unified_t wmi_handle,
390*5113495bSYour Name 				 struct twt_btwt_invite_sta_cmd_param *params)
391*5113495bSYour Name {
392*5113495bSYour Name 	wmi_twt_btwt_invite_sta_cmd_fixed_param *cmd;
393*5113495bSYour Name 	wmi_buf_t buf;
394*5113495bSYour Name 	QDF_STATUS status;
395*5113495bSYour Name 
396*5113495bSYour Name 	buf = wmi_buf_alloc(wmi_handle, sizeof(*cmd));
397*5113495bSYour Name 	if (!buf) {
398*5113495bSYour Name 		wmi_err("Failed to allocate memory");
399*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
400*5113495bSYour Name 	}
401*5113495bSYour Name 
402*5113495bSYour Name 	cmd = (wmi_twt_btwt_invite_sta_cmd_fixed_param *)wmi_buf_data(buf);
403*5113495bSYour Name 	WMITLV_SET_HDR(&cmd->tlv_header,
404*5113495bSYour Name 		       WMITLV_TAG_STRUC_wmi_twt_btwt_invite_sta_cmd_fixed_param,
405*5113495bSYour Name 		       WMITLV_GET_STRUCT_TLVLEN
406*5113495bSYour Name 		       (wmi_twt_btwt_invite_sta_cmd_fixed_param));
407*5113495bSYour Name 
408*5113495bSYour Name 	cmd->vdev_id = params->vdev_id;
409*5113495bSYour Name 	WMI_CHAR_ARRAY_TO_MAC_ADDR(params->peer_macaddr.bytes,
410*5113495bSYour Name 				   &cmd->peer_macaddr);
411*5113495bSYour Name 	cmd->dialog_id = params->dialog_id;
412*5113495bSYour Name 	cmd->r_twt_dl_tid_bitmap = params->r_twt_dl_tid_bitmap;
413*5113495bSYour Name 	cmd->r_twt_ul_tid_bitmap = params->r_twt_ul_tid_bitmap;
414*5113495bSYour Name 
415*5113495bSYour Name 	status = wmi_unified_cmd_send(wmi_handle, buf, sizeof(*cmd),
416*5113495bSYour Name 				      WMI_TWT_BTWT_INVITE_STA_CMDID);
417*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
418*5113495bSYour Name 		wmi_buf_free(buf);
419*5113495bSYour Name 		wmi_err("Failed to send WMI_TWT_BTWT_INVITE_STA_CMDID");
420*5113495bSYour Name 	}
421*5113495bSYour Name 
422*5113495bSYour Name 	return status;
423*5113495bSYour Name }
424*5113495bSYour Name 
425*5113495bSYour Name static QDF_STATUS
send_twt_btwt_remove_sta_cmd_tlv(wmi_unified_t wmi_handle,struct twt_btwt_remove_sta_cmd_param * params)426*5113495bSYour Name send_twt_btwt_remove_sta_cmd_tlv(wmi_unified_t wmi_handle,
427*5113495bSYour Name 				 struct twt_btwt_remove_sta_cmd_param
428*5113495bSYour Name 				 *params)
429*5113495bSYour Name {
430*5113495bSYour Name 	wmi_twt_btwt_remove_sta_cmd_fixed_param *cmd;
431*5113495bSYour Name 	wmi_buf_t buf;
432*5113495bSYour Name 	QDF_STATUS status;
433*5113495bSYour Name 
434*5113495bSYour Name 	buf = wmi_buf_alloc(wmi_handle, sizeof(*cmd));
435*5113495bSYour Name 	if (!buf) {
436*5113495bSYour Name 		wmi_err("Failed to allocate memory");
437*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
438*5113495bSYour Name 	}
439*5113495bSYour Name 
440*5113495bSYour Name 	cmd = (wmi_twt_btwt_remove_sta_cmd_fixed_param *)wmi_buf_data(buf);
441*5113495bSYour Name 	WMITLV_SET_HDR(&cmd->tlv_header,
442*5113495bSYour Name 		       WMITLV_TAG_STRUC_wmi_twt_btwt_remove_sta_cmd_fixed_param,
443*5113495bSYour Name 		       WMITLV_GET_STRUCT_TLVLEN
444*5113495bSYour Name 		       (wmi_twt_btwt_remove_sta_cmd_fixed_param));
445*5113495bSYour Name 
446*5113495bSYour Name 	cmd->vdev_id = params->vdev_id;
447*5113495bSYour Name 	WMI_CHAR_ARRAY_TO_MAC_ADDR(params->peer_macaddr.bytes,
448*5113495bSYour Name 				   &cmd->peer_macaddr);
449*5113495bSYour Name 	cmd->dialog_id = params->dialog_id;
450*5113495bSYour Name 	cmd->r_twt_dl_tid_bitmap = params->r_twt_dl_tid_bitmap;
451*5113495bSYour Name 	cmd->r_twt_ul_tid_bitmap = params->r_twt_ul_tid_bitmap;
452*5113495bSYour Name 
453*5113495bSYour Name 	status = wmi_unified_cmd_send(wmi_handle, buf, sizeof(*cmd),
454*5113495bSYour Name 				      WMI_TWT_BTWT_REMOVE_STA_CMDID);
455*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
456*5113495bSYour Name 		wmi_buf_free(buf);
457*5113495bSYour Name 		wmi_err("Failed to send WMI_TWT_BTWT_REMOVE_STA_CMDID");
458*5113495bSYour Name 	}
459*5113495bSYour Name 
460*5113495bSYour Name 	return status;
461*5113495bSYour Name }
462*5113495bSYour Name #endif
463*5113495bSYour Name 
464*5113495bSYour Name static enum HOST_TWT_ENABLE_STATUS
wmi_twt_enable_status_to_host_twt_status(WMI_ENABLE_TWT_STATUS_T status)465*5113495bSYour Name wmi_twt_enable_status_to_host_twt_status(WMI_ENABLE_TWT_STATUS_T status)
466*5113495bSYour Name {
467*5113495bSYour Name 	switch (status) {
468*5113495bSYour Name 	case WMI_ENABLE_TWT_STATUS_OK:
469*5113495bSYour Name 		return HOST_TWT_ENABLE_STATUS_OK;
470*5113495bSYour Name 	case WMI_ENABLE_TWT_STATUS_ALREADY_ENABLED:
471*5113495bSYour Name 		return HOST_TWT_ENABLE_STATUS_ALREADY_ENABLED;
472*5113495bSYour Name 	case WMI_ENABLE_TWT_STATUS_NOT_READY:
473*5113495bSYour Name 		return HOST_TWT_ENABLE_STATUS_NOT_READY;
474*5113495bSYour Name 	case WMI_ENABLE_TWT_INVALID_PARAM:
475*5113495bSYour Name 		return HOST_TWT_ENABLE_INVALID_PARAM;
476*5113495bSYour Name 	default:
477*5113495bSYour Name 		return HOST_TWT_ENABLE_STATUS_UNKNOWN_ERROR;
478*5113495bSYour Name 	}
479*5113495bSYour Name }
480*5113495bSYour Name 
extract_twt_enable_comp_event_tlv(wmi_unified_t wmi_handle,uint8_t * evt_buf,struct twt_enable_complete_event_param * params)481*5113495bSYour Name static QDF_STATUS extract_twt_enable_comp_event_tlv(wmi_unified_t wmi_handle,
482*5113495bSYour Name 		uint8_t *evt_buf,
483*5113495bSYour Name 		struct twt_enable_complete_event_param *params)
484*5113495bSYour Name {
485*5113495bSYour Name 	WMI_TWT_ENABLE_COMPLETE_EVENTID_param_tlvs *param_buf;
486*5113495bSYour Name 	wmi_twt_enable_complete_event_fixed_param *ev;
487*5113495bSYour Name 
488*5113495bSYour Name 	param_buf = (WMI_TWT_ENABLE_COMPLETE_EVENTID_param_tlvs *)evt_buf;
489*5113495bSYour Name 	if (!param_buf) {
490*5113495bSYour Name 		wmi_err("evt_buf is NULL");
491*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
492*5113495bSYour Name 	}
493*5113495bSYour Name 
494*5113495bSYour Name 	ev = param_buf->fixed_param;
495*5113495bSYour Name 
496*5113495bSYour Name 	params->pdev_id =
497*5113495bSYour Name 		wmi_handle->ops->convert_pdev_id_target_to_host(wmi_handle,
498*5113495bSYour Name 								ev->pdev_id);
499*5113495bSYour Name 	params->status = wmi_twt_enable_status_to_host_twt_status(ev->status);
500*5113495bSYour Name 
501*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
502*5113495bSYour Name }
503*5113495bSYour Name 
504*5113495bSYour Name static enum HOST_TWT_DISABLE_STATUS
wmi_twt_disable_status_to_host_twt_status(WMI_DISABLE_TWT_STATUS_T status)505*5113495bSYour Name wmi_twt_disable_status_to_host_twt_status(WMI_DISABLE_TWT_STATUS_T status)
506*5113495bSYour Name {
507*5113495bSYour Name 	switch (status) {
508*5113495bSYour Name 	case WMI_DISABLE_TWT_STATUS_OK:
509*5113495bSYour Name 		return HOST_TWT_DISABLE_STATUS_OK;
510*5113495bSYour Name 	case WMI_DISABLE_TWT_STATUS_ROAM_IN_PROGRESS:
511*5113495bSYour Name 		return HOST_TWT_DISABLE_STATUS_ROAM_IN_PROGRESS;
512*5113495bSYour Name 	case WMI_DISABLE_TWT_STATUS_CHAN_SW_IN_PROGRESS:
513*5113495bSYour Name 		return HOST_TWT_DISABLE_STATUS_CHAN_SW_IN_PROGRESS;
514*5113495bSYour Name 	case WMI_DISABLE_TWT_STATUS_SCAN_IN_PROGRESS:
515*5113495bSYour Name 		return HOST_TWT_DISABLE_STATUS_SCAN_IN_PROGRESS;
516*5113495bSYour Name 	default:
517*5113495bSYour Name 		return HOST_TWT_DISABLE_STATUS_UNKNOWN_ERROR;
518*5113495bSYour Name 	}
519*5113495bSYour Name }
520*5113495bSYour Name 
extract_twt_disable_comp_event_tlv(wmi_unified_t wmi_handle,uint8_t * evt_buf,struct twt_disable_complete_event_param * params)521*5113495bSYour Name static QDF_STATUS extract_twt_disable_comp_event_tlv(wmi_unified_t wmi_handle,
522*5113495bSYour Name 		uint8_t *evt_buf,
523*5113495bSYour Name 		struct twt_disable_complete_event_param *params)
524*5113495bSYour Name {
525*5113495bSYour Name 	WMI_TWT_DISABLE_COMPLETE_EVENTID_param_tlvs *param_buf;
526*5113495bSYour Name 	wmi_twt_disable_complete_event_fixed_param *ev;
527*5113495bSYour Name 
528*5113495bSYour Name 	param_buf = (WMI_TWT_DISABLE_COMPLETE_EVENTID_param_tlvs *)evt_buf;
529*5113495bSYour Name 	if (!param_buf) {
530*5113495bSYour Name 		wmi_err("evt_buf is NULL");
531*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
532*5113495bSYour Name 	}
533*5113495bSYour Name 
534*5113495bSYour Name 	ev = param_buf->fixed_param;
535*5113495bSYour Name 
536*5113495bSYour Name 	params->pdev_id =
537*5113495bSYour Name 		wmi_handle->ops->convert_pdev_id_target_to_host(wmi_handle,
538*5113495bSYour Name 								ev->pdev_id);
539*5113495bSYour Name 	params->status = wmi_twt_disable_status_to_host_twt_status(ev->status);
540*5113495bSYour Name 
541*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
542*5113495bSYour Name }
543*5113495bSYour Name 
544*5113495bSYour Name static enum HOST_TWT_ADD_STATUS
wmi_get_converted_twt_add_dialog_status(WMI_ADD_TWT_STATUS_T tgt_status)545*5113495bSYour Name wmi_get_converted_twt_add_dialog_status(WMI_ADD_TWT_STATUS_T tgt_status)
546*5113495bSYour Name {
547*5113495bSYour Name 	switch (tgt_status) {
548*5113495bSYour Name 	case WMI_ADD_TWT_STATUS_OK:
549*5113495bSYour Name 		return HOST_TWT_ADD_STATUS_OK;
550*5113495bSYour Name 	case WMI_ADD_TWT_STATUS_TWT_NOT_ENABLED:
551*5113495bSYour Name 		return HOST_TWT_ADD_STATUS_TWT_NOT_ENABLED;
552*5113495bSYour Name 	case WMI_ADD_TWT_STATUS_USED_DIALOG_ID:
553*5113495bSYour Name 		return HOST_TWT_ADD_STATUS_USED_DIALOG_ID;
554*5113495bSYour Name 	case WMI_ADD_TWT_STATUS_INVALID_PARAM:
555*5113495bSYour Name 		return HOST_TWT_ADD_STATUS_INVALID_PARAM;
556*5113495bSYour Name 	case WMI_ADD_TWT_STATUS_NOT_READY:
557*5113495bSYour Name 		return HOST_TWT_ADD_STATUS_NOT_READY;
558*5113495bSYour Name 	case WMI_ADD_TWT_STATUS_NO_RESOURCE:
559*5113495bSYour Name 		return HOST_TWT_ADD_STATUS_NO_RESOURCE;
560*5113495bSYour Name 	case WMI_ADD_TWT_STATUS_NO_ACK:
561*5113495bSYour Name 		return HOST_TWT_ADD_STATUS_NO_ACK;
562*5113495bSYour Name 	case WMI_ADD_TWT_STATUS_NO_RESPONSE:
563*5113495bSYour Name 		return HOST_TWT_ADD_STATUS_NO_RESPONSE;
564*5113495bSYour Name 	case WMI_ADD_TWT_STATUS_DENIED:
565*5113495bSYour Name 		return HOST_TWT_ADD_STATUS_DENIED;
566*5113495bSYour Name 	case WMI_ADD_TWT_STATUS_AP_PARAMS_NOT_IN_RANGE:
567*5113495bSYour Name 		return HOST_TWT_ADD_STATUS_AP_PARAMS_NOT_IN_RANGE;
568*5113495bSYour Name 	case WMI_ADD_TWT_STATUS_AP_IE_VALIDATION_FAILED:
569*5113495bSYour Name 		return HOST_TWT_ADD_STATUS_AP_IE_VALIDATION_FAILED;
570*5113495bSYour Name 	case WMI_ADD_TWT_STATUS_ROAM_IN_PROGRESS:
571*5113495bSYour Name 		return HOST_TWT_ADD_STATUS_ROAM_IN_PROGRESS;
572*5113495bSYour Name 	case WMI_ADD_TWT_STATUS_CHAN_SW_IN_PROGRESS:
573*5113495bSYour Name 		return HOST_TWT_ADD_STATUS_CHAN_SW_IN_PROGRESS;
574*5113495bSYour Name 	case WMI_ADD_TWT_STATUS_SCAN_IN_PROGRESS:
575*5113495bSYour Name 		return HOST_TWT_ADD_STATUS_SCAN_IN_PROGRESS;
576*5113495bSYour Name 	case WMI_ADD_TWT_STATUS_LINK_SWITCH_IN_PROGRESS:
577*5113495bSYour Name 		return HOST_TWT_ADD_STATUS_LINK_SWITCH_IN_PROGRESS;
578*5113495bSYour Name 	case WMI_ADD_TWT_STATUS_UNSUPPORTED_MODE_MLMR:
579*5113495bSYour Name 		return HOST_TWT_ADD_STATUS_UNSUPPORTED_MODE_MLMR;
580*5113495bSYour Name 	default:
581*5113495bSYour Name 		return HOST_TWT_ADD_STATUS_UNKNOWN_ERROR;
582*5113495bSYour Name 	}
583*5113495bSYour Name }
584*5113495bSYour Name 
585*5113495bSYour Name /**
586*5113495bSYour Name  * extract_twt_add_dialog_comp_event_tlv - Extacts twt add dialog complete wmi
587*5113495bSYour Name  * event from firmware
588*5113495bSYour Name  * @wmi_handle: WMI handle
589*5113495bSYour Name  * @evt_buf: Pointer to wmi event buf of twt add dialog complete event
590*5113495bSYour Name  * @params: Pointer to store the extracted parameters
591*5113495bSYour Name  *
592*5113495bSYour Name  * Return: QDF_STATUS_SUCCESS on success or QDF STATUS error values on failure
593*5113495bSYour Name  */
extract_twt_add_dialog_comp_event_tlv(wmi_unified_t wmi_handle,uint8_t * evt_buf,struct twt_add_dialog_complete_event_param * params)594*5113495bSYour Name static QDF_STATUS extract_twt_add_dialog_comp_event_tlv(
595*5113495bSYour Name 		wmi_unified_t wmi_handle,
596*5113495bSYour Name 		uint8_t *evt_buf,
597*5113495bSYour Name 		struct twt_add_dialog_complete_event_param *params)
598*5113495bSYour Name {
599*5113495bSYour Name 	WMI_TWT_ADD_DIALOG_COMPLETE_EVENTID_param_tlvs *param_buf;
600*5113495bSYour Name 	wmi_twt_add_dialog_complete_event_fixed_param *ev;
601*5113495bSYour Name 
602*5113495bSYour Name 	param_buf = (WMI_TWT_ADD_DIALOG_COMPLETE_EVENTID_param_tlvs *)evt_buf;
603*5113495bSYour Name 	if (!param_buf) {
604*5113495bSYour Name 		wmi_err("evt_buf is NULL");
605*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
606*5113495bSYour Name 	}
607*5113495bSYour Name 
608*5113495bSYour Name 	ev = param_buf->fixed_param;
609*5113495bSYour Name 
610*5113495bSYour Name 	params->vdev_id = ev->vdev_id;
611*5113495bSYour Name 	WMI_MAC_ADDR_TO_CHAR_ARRAY(&ev->peer_macaddr,
612*5113495bSYour Name 				   params->peer_macaddr.bytes);
613*5113495bSYour Name 	params->status = wmi_get_converted_twt_add_dialog_status(ev->status);
614*5113495bSYour Name 	params->dialog_id = ev->dialog_id;
615*5113495bSYour Name 	params->num_additional_twt_params = param_buf->num_twt_params;
616*5113495bSYour Name 
617*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
618*5113495bSYour Name }
619*5113495bSYour Name 
620*5113495bSYour Name /**
621*5113495bSYour Name  * extract_twt_add_dialog_comp_additional_parameters() - Extracts additional twt
622*5113495bSYour Name  * twt parameters, as part of add dialog completion event
623*5113495bSYour Name  * @wmi_handle: wmi handle
624*5113495bSYour Name  * @evt_buf: Pointer event buffer
625*5113495bSYour Name  * @evt_buf_len: length of the add dialog event buffer
626*5113495bSYour Name  * @idx: index of num_twt_params
627*5113495bSYour Name  * @additional_params: twt additional parameters to extract
628*5113495bSYour Name  *
629*5113495bSYour Name  * Return: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_INVAL for failure
630*5113495bSYour Name  */
extract_twt_add_dialog_comp_additional_parameters(wmi_unified_t wmi_handle,uint8_t * evt_buf,uint32_t evt_buf_len,uint32_t idx,struct twt_add_dialog_additional_params * additional_params)631*5113495bSYour Name static QDF_STATUS extract_twt_add_dialog_comp_additional_parameters
632*5113495bSYour Name (
633*5113495bSYour Name 	wmi_unified_t wmi_handle, uint8_t *evt_buf,
634*5113495bSYour Name 	uint32_t evt_buf_len, uint32_t idx,
635*5113495bSYour Name 	struct twt_add_dialog_additional_params *additional_params
636*5113495bSYour Name )
637*5113495bSYour Name {
638*5113495bSYour Name 	WMI_TWT_ADD_DIALOG_COMPLETE_EVENTID_param_tlvs *param_buf;
639*5113495bSYour Name 	wmi_twt_add_dialog_complete_event_fixed_param *ev;
640*5113495bSYour Name 	uint32_t flags = 0;
641*5113495bSYour Name 	uint32_t expected_len;
642*5113495bSYour Name 
643*5113495bSYour Name 	param_buf = (WMI_TWT_ADD_DIALOG_COMPLETE_EVENTID_param_tlvs *)evt_buf;
644*5113495bSYour Name 	if (!param_buf) {
645*5113495bSYour Name 		wmi_err("evt_buf is NULL");
646*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
647*5113495bSYour Name 	}
648*5113495bSYour Name 
649*5113495bSYour Name 	ev = param_buf->fixed_param;
650*5113495bSYour Name 
651*5113495bSYour Name 	if (idx >= param_buf->num_twt_params) {
652*5113495bSYour Name 		wmi_err("Invalid idx %d while num_twt_params = %d",
653*5113495bSYour Name 			 idx, param_buf->num_twt_params);
654*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
655*5113495bSYour Name 	}
656*5113495bSYour Name 
657*5113495bSYour Name 	if (!param_buf->twt_params) {
658*5113495bSYour Name 		wmi_err("Unable to extract additional twt parameters");
659*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
660*5113495bSYour Name 	}
661*5113495bSYour Name 
662*5113495bSYour Name 	expected_len = (sizeof(wmi_twt_add_dialog_complete_event_fixed_param) +
663*5113495bSYour Name 			WMI_TLV_HDR_SIZE + (param_buf->num_twt_params *
664*5113495bSYour Name 			sizeof(wmi_twt_add_dialog_additional_params)));
665*5113495bSYour Name 
666*5113495bSYour Name 	if (evt_buf_len != expected_len) {
667*5113495bSYour Name 		wmi_err("Got invalid len data from FW %d expected %d",
668*5113495bSYour Name 			 evt_buf_len, expected_len);
669*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
670*5113495bSYour Name 	}
671*5113495bSYour Name 
672*5113495bSYour Name 	flags = param_buf->twt_params[idx].flags;
673*5113495bSYour Name 	additional_params->twt_cmd = TWT_FLAGS_GET_CMD(flags);
674*5113495bSYour Name 	additional_params->bcast = TWT_FLAGS_GET_BROADCAST(flags);
675*5113495bSYour Name 	additional_params->trig_en = TWT_FLAGS_GET_TRIGGER(flags);
676*5113495bSYour Name 	additional_params->announce = TWT_FLAGS_GET_FLOW_TYPE(flags);
677*5113495bSYour Name 	additional_params->protection = TWT_FLAGS_GET_PROTECTION(flags);
678*5113495bSYour Name 	additional_params->b_twt_id0 = TWT_FLAGS_GET_BTWT_ID0(flags);
679*5113495bSYour Name 	additional_params->info_frame_disabled =
680*5113495bSYour Name 				TWT_FLAGS_GET_TWT_INFO_FRAME_DISABLED(flags);
681*5113495bSYour Name 	additional_params->wake_dur_us = param_buf->twt_params[idx].wake_dur_us;
682*5113495bSYour Name 	additional_params->wake_intvl_us =
683*5113495bSYour Name 				param_buf->twt_params[idx].wake_intvl_us;
684*5113495bSYour Name 	additional_params->sp_offset_us =
685*5113495bSYour Name 				param_buf->twt_params[idx].sp_offset_us;
686*5113495bSYour Name 	additional_params->sp_tsf_us_lo =
687*5113495bSYour Name 				param_buf->twt_params[idx].sp_tsf_us_lo;
688*5113495bSYour Name 	additional_params->sp_tsf_us_hi =
689*5113495bSYour Name 				param_buf->twt_params[idx].sp_tsf_us_hi;
690*5113495bSYour Name 	additional_params->pm_responder_bit_valid =
691*5113495bSYour Name 				TWT_FLAGS_GET_PM_RESPONDER_MODE_VALID(flags);
692*5113495bSYour Name 	additional_params->pm_responder_bit =
693*5113495bSYour Name 				TWT_FLAGS_GET_PM_RESPONDER_MODE(flags);
694*5113495bSYour Name 
695*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
696*5113495bSYour Name }
697*5113495bSYour Name 
698*5113495bSYour Name static enum HOST_TWT_DEL_STATUS
wmi_get_converted_twt_del_dialog_status(WMI_DEL_TWT_STATUS_T tgt_status)699*5113495bSYour Name wmi_get_converted_twt_del_dialog_status(WMI_DEL_TWT_STATUS_T tgt_status)
700*5113495bSYour Name {
701*5113495bSYour Name 	switch (tgt_status) {
702*5113495bSYour Name 	case WMI_DEL_TWT_STATUS_OK:
703*5113495bSYour Name 		return HOST_TWT_DEL_STATUS_OK;
704*5113495bSYour Name 	case WMI_DEL_TWT_STATUS_DIALOG_ID_NOT_EXIST:
705*5113495bSYour Name 		return HOST_TWT_DEL_STATUS_DIALOG_ID_NOT_EXIST;
706*5113495bSYour Name 	case WMI_DEL_TWT_STATUS_INVALID_PARAM:
707*5113495bSYour Name 		return HOST_TWT_DEL_STATUS_INVALID_PARAM;
708*5113495bSYour Name 	case WMI_DEL_TWT_STATUS_DIALOG_ID_BUSY:
709*5113495bSYour Name 		return HOST_TWT_DEL_STATUS_DIALOG_ID_BUSY;
710*5113495bSYour Name 	case WMI_DEL_TWT_STATUS_NO_RESOURCE:
711*5113495bSYour Name 		return HOST_TWT_DEL_STATUS_NO_RESOURCE;
712*5113495bSYour Name 	case WMI_DEL_TWT_STATUS_NO_ACK:
713*5113495bSYour Name 		return HOST_TWT_DEL_STATUS_NO_ACK;
714*5113495bSYour Name 	case WMI_DEL_TWT_STATUS_PEER_INIT_TEARDOWN:
715*5113495bSYour Name 		return HOST_TWT_DEL_STATUS_PEER_INIT_TEARDOWN;
716*5113495bSYour Name 	case WMI_DEL_TWT_STATUS_ROAMING:
717*5113495bSYour Name 		return HOST_TWT_DEL_STATUS_ROAMING;
718*5113495bSYour Name 	case WMI_DEL_TWT_STATUS_CONCURRENCY:
719*5113495bSYour Name 		return HOST_TWT_DEL_STATUS_CONCURRENCY;
720*5113495bSYour Name 	case WMI_DEL_TWT_STATUS_CHAN_SW_IN_PROGRESS:
721*5113495bSYour Name 		return HOST_TWT_DEL_STATUS_CHAN_SW_IN_PROGRESS;
722*5113495bSYour Name 	case WMI_DEL_TWT_STATUS_SCAN_IN_PROGRESS:
723*5113495bSYour Name 		return HOST_TWT_DEL_STATUS_SCAN_IN_PROGRESS;
724*5113495bSYour Name 	default:
725*5113495bSYour Name 		return HOST_TWT_DEL_STATUS_UNKNOWN_ERROR;
726*5113495bSYour Name 	}
727*5113495bSYour Name }
728*5113495bSYour Name 
extract_twt_del_dialog_comp_event_tlv(wmi_unified_t wmi_handle,uint8_t * evt_buf,struct twt_del_dialog_complete_event_param * params)729*5113495bSYour Name static QDF_STATUS extract_twt_del_dialog_comp_event_tlv(
730*5113495bSYour Name 		wmi_unified_t wmi_handle,
731*5113495bSYour Name 		uint8_t *evt_buf,
732*5113495bSYour Name 		struct twt_del_dialog_complete_event_param *params)
733*5113495bSYour Name {
734*5113495bSYour Name 	WMI_TWT_DEL_DIALOG_COMPLETE_EVENTID_param_tlvs *param_buf;
735*5113495bSYour Name 	wmi_twt_del_dialog_complete_event_fixed_param *ev;
736*5113495bSYour Name 
737*5113495bSYour Name 	param_buf = (WMI_TWT_DEL_DIALOG_COMPLETE_EVENTID_param_tlvs *)evt_buf;
738*5113495bSYour Name 	if (!param_buf) {
739*5113495bSYour Name 		wmi_err("evt_buf is NULL");
740*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
741*5113495bSYour Name 	}
742*5113495bSYour Name 
743*5113495bSYour Name 	ev = param_buf->fixed_param;
744*5113495bSYour Name 
745*5113495bSYour Name 	params->vdev_id = ev->vdev_id;
746*5113495bSYour Name 	WMI_MAC_ADDR_TO_CHAR_ARRAY(&ev->peer_macaddr,
747*5113495bSYour Name 				   params->peer_macaddr.bytes);
748*5113495bSYour Name 	params->dialog_id = ev->dialog_id;
749*5113495bSYour Name 	params->status = wmi_get_converted_twt_del_dialog_status(ev->status);
750*5113495bSYour Name 
751*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
752*5113495bSYour Name }
753*5113495bSYour Name 
754*5113495bSYour Name static enum HOST_TWT_PAUSE_STATUS
wmi_twt_pause_status_to_host_twt_status(WMI_PAUSE_TWT_STATUS_T status)755*5113495bSYour Name wmi_twt_pause_status_to_host_twt_status(WMI_PAUSE_TWT_STATUS_T status)
756*5113495bSYour Name {
757*5113495bSYour Name 	switch (status) {
758*5113495bSYour Name 	case WMI_PAUSE_TWT_STATUS_OK:
759*5113495bSYour Name 		return HOST_TWT_PAUSE_STATUS_OK;
760*5113495bSYour Name 	case WMI_PAUSE_TWT_STATUS_DIALOG_ID_NOT_EXIST:
761*5113495bSYour Name 		return HOST_TWT_PAUSE_STATUS_DIALOG_ID_NOT_EXIST;
762*5113495bSYour Name 	case WMI_PAUSE_TWT_STATUS_INVALID_PARAM:
763*5113495bSYour Name 		return HOST_TWT_PAUSE_STATUS_INVALID_PARAM;
764*5113495bSYour Name 	case WMI_PAUSE_TWT_STATUS_DIALOG_ID_BUSY:
765*5113495bSYour Name 		return HOST_TWT_PAUSE_STATUS_DIALOG_ID_BUSY;
766*5113495bSYour Name 	case WMI_PAUSE_TWT_STATUS_NO_RESOURCE:
767*5113495bSYour Name 		return HOST_TWT_PAUSE_STATUS_NO_RESOURCE;
768*5113495bSYour Name 	case WMI_PAUSE_TWT_STATUS_NO_ACK:
769*5113495bSYour Name 		return HOST_TWT_PAUSE_STATUS_NO_ACK;
770*5113495bSYour Name 	case WMI_PAUSE_TWT_STATUS_ALREADY_PAUSED:
771*5113495bSYour Name 		return HOST_TWT_PAUSE_STATUS_ALREADY_PAUSED;
772*5113495bSYour Name 	case WMI_PAUSE_TWT_STATUS_CHAN_SW_IN_PROGRESS:
773*5113495bSYour Name 		return HOST_TWT_PAUSE_STATUS_CHAN_SW_IN_PROGRESS;
774*5113495bSYour Name 	case WMI_PAUSE_TWT_STATUS_ROAM_IN_PROGRESS:
775*5113495bSYour Name 		return HOST_TWT_PAUSE_STATUS_ROAM_IN_PROGRESS;
776*5113495bSYour Name 	case WMI_PAUSE_TWT_STATUS_SCAN_IN_PROGRESS:
777*5113495bSYour Name 		return HOST_TWT_PAUSE_STATUS_SCAN_IN_PROGRESS;
778*5113495bSYour Name 	default:
779*5113495bSYour Name 		return HOST_TWT_PAUSE_STATUS_UNKNOWN_ERROR;
780*5113495bSYour Name 	}
781*5113495bSYour Name }
782*5113495bSYour Name 
extract_twt_pause_dialog_comp_event_tlv(wmi_unified_t wmi_handle,uint8_t * evt_buf,struct twt_pause_dialog_complete_event_param * params)783*5113495bSYour Name static QDF_STATUS extract_twt_pause_dialog_comp_event_tlv(
784*5113495bSYour Name 		wmi_unified_t wmi_handle,
785*5113495bSYour Name 		uint8_t *evt_buf,
786*5113495bSYour Name 		struct twt_pause_dialog_complete_event_param *params)
787*5113495bSYour Name {
788*5113495bSYour Name 	WMI_TWT_PAUSE_DIALOG_COMPLETE_EVENTID_param_tlvs *param_buf;
789*5113495bSYour Name 	wmi_twt_pause_dialog_complete_event_fixed_param *ev;
790*5113495bSYour Name 
791*5113495bSYour Name 	param_buf = (WMI_TWT_PAUSE_DIALOG_COMPLETE_EVENTID_param_tlvs *)evt_buf;
792*5113495bSYour Name 	if (!param_buf) {
793*5113495bSYour Name 		wmi_err("evt_buf is NULL");
794*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
795*5113495bSYour Name 	}
796*5113495bSYour Name 
797*5113495bSYour Name 	ev = param_buf->fixed_param;
798*5113495bSYour Name 
799*5113495bSYour Name 	params->vdev_id = ev->vdev_id;
800*5113495bSYour Name 	WMI_MAC_ADDR_TO_CHAR_ARRAY(&ev->peer_macaddr,
801*5113495bSYour Name 				   params->peer_macaddr.bytes);
802*5113495bSYour Name 	params->status = wmi_twt_pause_status_to_host_twt_status(ev->status);
803*5113495bSYour Name 	params->dialog_id = ev->dialog_id;
804*5113495bSYour Name 
805*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
806*5113495bSYour Name }
807*5113495bSYour Name 
808*5113495bSYour Name static enum HOST_TWT_NUDGE_STATUS
wmi_twt_nudge_status_to_host_twt_status(WMI_TWT_NUDGE_STATUS_T status)809*5113495bSYour Name wmi_twt_nudge_status_to_host_twt_status(WMI_TWT_NUDGE_STATUS_T status)
810*5113495bSYour Name {
811*5113495bSYour Name 	switch (status) {
812*5113495bSYour Name 	case WMI_NUDGE_TWT_STATUS_OK:
813*5113495bSYour Name 		return HOST_TWT_NUDGE_STATUS_OK;
814*5113495bSYour Name 	case WMI_NUDGE_TWT_STATUS_DIALOG_ID_NOT_EXIST:
815*5113495bSYour Name 		return HOST_TWT_NUDGE_STATUS_DIALOG_ID_NOT_EXIST;
816*5113495bSYour Name 	case WMI_NUDGE_TWT_STATUS_INVALID_PARAM:
817*5113495bSYour Name 		return HOST_TWT_NUDGE_STATUS_INVALID_PARAM;
818*5113495bSYour Name 	case WMI_NUDGE_TWT_STATUS_DIALOG_ID_BUSY:
819*5113495bSYour Name 		return HOST_TWT_NUDGE_STATUS_DIALOG_ID_BUSY;
820*5113495bSYour Name 	case WMI_NUDGE_TWT_STATUS_NO_RESOURCE:
821*5113495bSYour Name 		return HOST_TWT_NUDGE_STATUS_NO_RESOURCE;
822*5113495bSYour Name 	case WMI_NUDGE_TWT_STATUS_NO_ACK:
823*5113495bSYour Name 		return HOST_TWT_NUDGE_STATUS_NO_ACK;
824*5113495bSYour Name 	case WMI_NUDGE_TWT_STATUS_ALREADY_PAUSED:
825*5113495bSYour Name 		return HOST_TWT_NUDGE_STATUS_ALREADY_PAUSED;
826*5113495bSYour Name 	case WMI_NUDGE_TWT_STATUS_CHAN_SW_IN_PROGRESS:
827*5113495bSYour Name 		return HOST_TWT_NUDGE_STATUS_CHAN_SW_IN_PROGRESS;
828*5113495bSYour Name 	case WMI_NUDGE_TWT_STATUS_ROAM_IN_PROGRESS:
829*5113495bSYour Name 		return HOST_TWT_NUDGE_STATUS_ROAM_IN_PROGRESS;
830*5113495bSYour Name 	case WMI_NUDGE_TWT_STATUS_SCAN_IN_PROGRESS:
831*5113495bSYour Name 		return HOST_TWT_NUDGE_STATUS_SCAN_IN_PROGRESS;
832*5113495bSYour Name 	default:
833*5113495bSYour Name 		return HOST_TWT_NUDGE_STATUS_UNKNOWN_ERROR;
834*5113495bSYour Name 	}
835*5113495bSYour Name }
836*5113495bSYour Name 
extract_twt_nudge_dialog_comp_event_tlv(wmi_unified_t wmi_handle,uint8_t * evt_buf,struct twt_nudge_dialog_complete_event_param * params)837*5113495bSYour Name static QDF_STATUS extract_twt_nudge_dialog_comp_event_tlv(
838*5113495bSYour Name 		wmi_unified_t wmi_handle,
839*5113495bSYour Name 		uint8_t *evt_buf,
840*5113495bSYour Name 		struct twt_nudge_dialog_complete_event_param *params)
841*5113495bSYour Name {
842*5113495bSYour Name 	WMI_TWT_NUDGE_DIALOG_COMPLETE_EVENTID_param_tlvs *param_buf;
843*5113495bSYour Name 	wmi_twt_nudge_dialog_complete_event_fixed_param *ev;
844*5113495bSYour Name 
845*5113495bSYour Name 	param_buf = (WMI_TWT_NUDGE_DIALOG_COMPLETE_EVENTID_param_tlvs *)evt_buf;
846*5113495bSYour Name 	if (!param_buf) {
847*5113495bSYour Name 		wmi_err("evt_buf is NULL");
848*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
849*5113495bSYour Name 	}
850*5113495bSYour Name 
851*5113495bSYour Name 	ev = param_buf->fixed_param;
852*5113495bSYour Name 
853*5113495bSYour Name 	params->vdev_id = ev->vdev_id;
854*5113495bSYour Name 	WMI_MAC_ADDR_TO_CHAR_ARRAY(&ev->peer_macaddr,
855*5113495bSYour Name 				   params->peer_macaddr.bytes);
856*5113495bSYour Name 	params->status = wmi_twt_nudge_status_to_host_twt_status(ev->status);
857*5113495bSYour Name 	params->dialog_id = ev->dialog_id;
858*5113495bSYour Name 	params->next_twt_tsf_us_lo = ev->sp_tsf_us_lo;
859*5113495bSYour Name 	params->next_twt_tsf_us_hi = ev->sp_tsf_us_hi;
860*5113495bSYour Name 
861*5113495bSYour Name 	wmi_debug("vdev_id: %d dialog_id: %d tsf hi : %x tsf lo: %x",
862*5113495bSYour Name 		  params->vdev_id, params->dialog_id,
863*5113495bSYour Name 		  params->next_twt_tsf_us_hi, params->next_twt_tsf_us_lo);
864*5113495bSYour Name 
865*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
866*5113495bSYour Name }
867*5113495bSYour Name 
868*5113495bSYour Name static enum HOST_TWT_RESUME_STATUS
wmi_get_converted_twt_resume_dialog_status(WMI_RESUME_TWT_STATUS_T tgt_status)869*5113495bSYour Name wmi_get_converted_twt_resume_dialog_status(WMI_RESUME_TWT_STATUS_T tgt_status)
870*5113495bSYour Name {
871*5113495bSYour Name 	switch (tgt_status) {
872*5113495bSYour Name 	case WMI_RESUME_TWT_STATUS_OK:
873*5113495bSYour Name 		return HOST_TWT_RESUME_STATUS_OK;
874*5113495bSYour Name 	case WMI_RESUME_TWT_STATUS_DIALOG_ID_NOT_EXIST:
875*5113495bSYour Name 		return HOST_TWT_RESUME_STATUS_DIALOG_ID_NOT_EXIST;
876*5113495bSYour Name 	case WMI_RESUME_TWT_STATUS_INVALID_PARAM:
877*5113495bSYour Name 		return HOST_TWT_RESUME_STATUS_INVALID_PARAM;
878*5113495bSYour Name 	case WMI_RESUME_TWT_STATUS_DIALOG_ID_BUSY:
879*5113495bSYour Name 		return HOST_TWT_RESUME_STATUS_DIALOG_ID_BUSY;
880*5113495bSYour Name 	case WMI_RESUME_TWT_STATUS_NOT_PAUSED:
881*5113495bSYour Name 		return HOST_TWT_RESUME_STATUS_NOT_PAUSED;
882*5113495bSYour Name 	case WMI_RESUME_TWT_STATUS_NO_RESOURCE:
883*5113495bSYour Name 		return HOST_TWT_RESUME_STATUS_NO_RESOURCE;
884*5113495bSYour Name 	case WMI_RESUME_TWT_STATUS_NO_ACK:
885*5113495bSYour Name 		return HOST_TWT_RESUME_STATUS_NO_ACK;
886*5113495bSYour Name 	case WMI_RESUME_TWT_STATUS_CHAN_SW_IN_PROGRESS:
887*5113495bSYour Name 		return HOST_TWT_RESUME_STATUS_CHAN_SW_IN_PROGRESS;
888*5113495bSYour Name 	case WMI_RESUME_TWT_STATUS_ROAM_IN_PROGRESS:
889*5113495bSYour Name 		return HOST_TWT_RESUME_STATUS_ROAM_IN_PROGRESS;
890*5113495bSYour Name 	case WMI_RESUME_TWT_STATUS_SCAN_IN_PROGRESS:
891*5113495bSYour Name 		return HOST_TWT_RESUME_STATUS_SCAN_IN_PROGRESS;
892*5113495bSYour Name 	default:
893*5113495bSYour Name 		return HOST_TWT_RESUME_STATUS_UNKNOWN_ERROR;
894*5113495bSYour Name 	}
895*5113495bSYour Name }
896*5113495bSYour Name 
extract_twt_resume_dialog_comp_event_tlv(wmi_unified_t wmi_handle,uint8_t * evt_buf,struct twt_resume_dialog_complete_event_param * params)897*5113495bSYour Name static QDF_STATUS extract_twt_resume_dialog_comp_event_tlv(
898*5113495bSYour Name 		wmi_unified_t wmi_handle,
899*5113495bSYour Name 		uint8_t *evt_buf,
900*5113495bSYour Name 		struct twt_resume_dialog_complete_event_param *params)
901*5113495bSYour Name {
902*5113495bSYour Name 	WMI_TWT_RESUME_DIALOG_COMPLETE_EVENTID_param_tlvs *param_buf;
903*5113495bSYour Name 	wmi_twt_resume_dialog_complete_event_fixed_param *ev;
904*5113495bSYour Name 
905*5113495bSYour Name 	param_buf =
906*5113495bSYour Name 		(WMI_TWT_RESUME_DIALOG_COMPLETE_EVENTID_param_tlvs *)evt_buf;
907*5113495bSYour Name 	if (!param_buf) {
908*5113495bSYour Name 		wmi_err("evt_buf is NULL");
909*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
910*5113495bSYour Name 	}
911*5113495bSYour Name 
912*5113495bSYour Name 	ev = param_buf->fixed_param;
913*5113495bSYour Name 
914*5113495bSYour Name 	params->vdev_id = ev->vdev_id;
915*5113495bSYour Name 	WMI_MAC_ADDR_TO_CHAR_ARRAY(&ev->peer_macaddr,
916*5113495bSYour Name 				   params->peer_macaddr.bytes);
917*5113495bSYour Name 	params->status = wmi_get_converted_twt_resume_dialog_status(ev->status);
918*5113495bSYour Name 	params->dialog_id = ev->dialog_id;
919*5113495bSYour Name 
920*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
921*5113495bSYour Name }
922*5113495bSYour Name 
923*5113495bSYour Name static enum HOST_TWT_NOTIFY_STATUS
wmi_get_converted_twt_notify_status(WMI_TWT_NOTIFICATION_ID_T tgt_status)924*5113495bSYour Name wmi_get_converted_twt_notify_status(WMI_TWT_NOTIFICATION_ID_T tgt_status)
925*5113495bSYour Name {
926*5113495bSYour Name 	switch (tgt_status) {
927*5113495bSYour Name 	case WMI_TWT_NOTIFY_EVENT_AP_TWT_REQ_BIT_SET:
928*5113495bSYour Name 		return HOST_TWT_NOTIFY_EVENT_AP_TWT_REQ_BIT_SET;
929*5113495bSYour Name 	case WMI_TWT_NOTIFY_EVENT_AP_TWT_REQ_BIT_CLEAR:
930*5113495bSYour Name 		return HOST_TWT_NOTIFY_EVENT_AP_TWT_REQ_BIT_CLEAR;
931*5113495bSYour Name 	default:
932*5113495bSYour Name 		return HOST_TWT_NOTIFY_EVENT_READY;
933*5113495bSYour Name 	}
934*5113495bSYour Name }
935*5113495bSYour Name 
extract_twt_notify_event_tlv(wmi_unified_t wmi_handle,uint8_t * evt_buf,struct twt_notify_event_param * params)936*5113495bSYour Name static QDF_STATUS extract_twt_notify_event_tlv(
937*5113495bSYour Name 		wmi_unified_t wmi_handle,
938*5113495bSYour Name 		uint8_t *evt_buf,
939*5113495bSYour Name 		struct twt_notify_event_param *params)
940*5113495bSYour Name {
941*5113495bSYour Name 	WMI_TWT_NOTIFY_EVENTID_param_tlvs *param_buf;
942*5113495bSYour Name 	wmi_twt_notify_event_fixed_param *ev;
943*5113495bSYour Name 
944*5113495bSYour Name 	param_buf =
945*5113495bSYour Name 		(WMI_TWT_NOTIFY_EVENTID_param_tlvs *)evt_buf;
946*5113495bSYour Name 	if (!param_buf) {
947*5113495bSYour Name 		wmi_err("evt_buf is NULL");
948*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
949*5113495bSYour Name 	}
950*5113495bSYour Name 
951*5113495bSYour Name 	ev = param_buf->fixed_param;
952*5113495bSYour Name 
953*5113495bSYour Name 	if (ev->event_id > WMI_TWT_NOTIFY_EVENT_AP_TWT_REQ_BIT_CLEAR) {
954*5113495bSYour Name 		wmi_debug("Incorrect TWT notify event vdev_id: %d, status: %d",
955*5113495bSYour Name 			  ev->vdev_id, ev->event_id);
956*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
957*5113495bSYour Name 	}
958*5113495bSYour Name 
959*5113495bSYour Name 	params->vdev_id = ev->vdev_id;
960*5113495bSYour Name 	params->status = wmi_get_converted_twt_notify_status(ev->event_id);
961*5113495bSYour Name 
962*5113495bSYour Name 	wmi_debug("Extract notify event vdev_id: %d, status: %d",
963*5113495bSYour Name 		  params->vdev_id, params->status);
964*5113495bSYour Name 
965*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
966*5113495bSYour Name }
967*5113495bSYour Name 
968*5113495bSYour Name #ifdef WLAN_SUPPORT_BCAST_TWT
969*5113495bSYour Name static QDF_STATUS
extract_twt_btwt_invite_sta_comp_event_tlv(wmi_unified_t wmi_handle,uint8_t * evt_buf,struct twt_btwt_invite_sta_complete_event_param * params)970*5113495bSYour Name extract_twt_btwt_invite_sta_comp_event_tlv(
971*5113495bSYour Name 				   wmi_unified_t wmi_handle,
972*5113495bSYour Name 				   uint8_t *evt_buf,
973*5113495bSYour Name 				   struct
974*5113495bSYour Name 				   twt_btwt_invite_sta_complete_event_param
975*5113495bSYour Name 				   *params)
976*5113495bSYour Name {
977*5113495bSYour Name 	WMI_TWT_BTWT_INVITE_STA_COMPLETE_EVENTID_param_tlvs *param_buf;
978*5113495bSYour Name 	wmi_twt_btwt_invite_sta_complete_event_fixed_param *ev;
979*5113495bSYour Name 
980*5113495bSYour Name 	param_buf =
981*5113495bSYour Name 		(WMI_TWT_BTWT_INVITE_STA_COMPLETE_EVENTID_param_tlvs *)evt_buf;
982*5113495bSYour Name 	if (!param_buf) {
983*5113495bSYour Name 		wmi_err("evt_buf is NULL");
984*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
985*5113495bSYour Name 	}
986*5113495bSYour Name 
987*5113495bSYour Name 	ev = param_buf->fixed_param;
988*5113495bSYour Name 
989*5113495bSYour Name 	params->vdev_id = ev->vdev_id;
990*5113495bSYour Name 	WMI_MAC_ADDR_TO_CHAR_ARRAY(&ev->peer_macaddr,
991*5113495bSYour Name 				   params->peer_macaddr.bytes);
992*5113495bSYour Name 	params->status = ev->status;
993*5113495bSYour Name 	params->dialog_id = ev->dialog_id;
994*5113495bSYour Name 
995*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
996*5113495bSYour Name }
997*5113495bSYour Name 
998*5113495bSYour Name static QDF_STATUS
extract_twt_btwt_remove_sta_comp_event_tlv(wmi_unified_t wmi_handle,uint8_t * evt_buf,struct twt_btwt_remove_sta_complete_event_param * params)999*5113495bSYour Name extract_twt_btwt_remove_sta_comp_event_tlv(
1000*5113495bSYour Name 				   wmi_unified_t wmi_handle,
1001*5113495bSYour Name 				   uint8_t *evt_buf,
1002*5113495bSYour Name 				   struct
1003*5113495bSYour Name 				   twt_btwt_remove_sta_complete_event_param
1004*5113495bSYour Name 				   *params)
1005*5113495bSYour Name {
1006*5113495bSYour Name 	WMI_TWT_BTWT_REMOVE_STA_COMPLETE_EVENTID_param_tlvs *param_buf;
1007*5113495bSYour Name 	wmi_twt_btwt_remove_sta_complete_event_fixed_param *ev;
1008*5113495bSYour Name 
1009*5113495bSYour Name 	param_buf =
1010*5113495bSYour Name 		(WMI_TWT_BTWT_REMOVE_STA_COMPLETE_EVENTID_param_tlvs *)evt_buf;
1011*5113495bSYour Name 	if (!param_buf) {
1012*5113495bSYour Name 		wmi_err("evt_buf is NULL");
1013*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
1014*5113495bSYour Name 	}
1015*5113495bSYour Name 
1016*5113495bSYour Name 	ev = param_buf->fixed_param;
1017*5113495bSYour Name 
1018*5113495bSYour Name 	params->vdev_id = ev->vdev_id;
1019*5113495bSYour Name 	WMI_MAC_ADDR_TO_CHAR_ARRAY(&ev->peer_macaddr,
1020*5113495bSYour Name 				   params->peer_macaddr.bytes);
1021*5113495bSYour Name 	params->status = ev->status;
1022*5113495bSYour Name 	params->dialog_id = ev->dialog_id;
1023*5113495bSYour Name 
1024*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1025*5113495bSYour Name }
1026*5113495bSYour Name #endif
1027*5113495bSYour Name 
1028*5113495bSYour Name #ifdef WLAN_SUPPORT_BCAST_TWT
1029*5113495bSYour Name static void
wmi_twt_attach_bcast_twt_tlv(struct wmi_ops * ops)1030*5113495bSYour Name wmi_twt_attach_bcast_twt_tlv(struct wmi_ops *ops)
1031*5113495bSYour Name {
1032*5113495bSYour Name 	ops->send_twt_btwt_invite_sta_cmd = send_twt_btwt_invite_sta_cmd_tlv;
1033*5113495bSYour Name 	ops->send_twt_btwt_remove_sta_cmd = send_twt_btwt_remove_sta_cmd_tlv;
1034*5113495bSYour Name 	ops->extract_twt_btwt_invite_sta_comp_event =
1035*5113495bSYour Name 				extract_twt_btwt_invite_sta_comp_event_tlv;
1036*5113495bSYour Name 	ops->extract_twt_btwt_remove_sta_comp_event =
1037*5113495bSYour Name 				extract_twt_btwt_remove_sta_comp_event_tlv;
1038*5113495bSYour Name }
1039*5113495bSYour Name #else
1040*5113495bSYour Name static void
wmi_twt_attach_bcast_twt_tlv(struct wmi_ops * ops)1041*5113495bSYour Name wmi_twt_attach_bcast_twt_tlv(struct wmi_ops *ops)
1042*5113495bSYour Name {
1043*5113495bSYour Name }
1044*5113495bSYour Name #endif
1045*5113495bSYour Name 
1046*5113495bSYour Name static QDF_STATUS
extract_twt_session_stats_event_tlv(wmi_unified_t wmi_handle,uint8_t * evt_buf,struct twt_session_stats_event_param * params)1047*5113495bSYour Name extract_twt_session_stats_event_tlv(wmi_unified_t wmi_handle,
1048*5113495bSYour Name 				    uint8_t *evt_buf,
1049*5113495bSYour Name 				    struct twt_session_stats_event_param
1050*5113495bSYour Name 				    *params)
1051*5113495bSYour Name {
1052*5113495bSYour Name 	WMI_TWT_SESSION_STATS_EVENTID_param_tlvs *param_buf;
1053*5113495bSYour Name 	wmi_pdev_twt_session_stats_event_fixed_param *ev;
1054*5113495bSYour Name 
1055*5113495bSYour Name 	param_buf =
1056*5113495bSYour Name 		(WMI_TWT_SESSION_STATS_EVENTID_param_tlvs *)evt_buf;
1057*5113495bSYour Name 	if (!param_buf) {
1058*5113495bSYour Name 		wmi_err("evt_buf is NULL");
1059*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
1060*5113495bSYour Name 	}
1061*5113495bSYour Name 
1062*5113495bSYour Name 	ev = param_buf->fixed_param;
1063*5113495bSYour Name 	params->pdev_id = wmi_handle->ops->convert_pdev_id_target_to_host(
1064*5113495bSYour Name 							wmi_handle,
1065*5113495bSYour Name 							ev->pdev_id);
1066*5113495bSYour Name 	params->num_sessions = param_buf->num_twt_sessions;
1067*5113495bSYour Name 
1068*5113495bSYour Name 	wmi_debug("pdev_id=%d, num of TWT sessions=%d",
1069*5113495bSYour Name 		 params->pdev_id, params->num_sessions);
1070*5113495bSYour Name 
1071*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1072*5113495bSYour Name }
1073*5113495bSYour Name 
1074*5113495bSYour Name static QDF_STATUS
extract_twt_session_stats_event_data(wmi_unified_t wmi_handle,uint8_t * evt_buf,struct twt_session_stats_event_param * params,struct twt_session_stats_info * session,uint32_t idx)1075*5113495bSYour Name extract_twt_session_stats_event_data(wmi_unified_t wmi_handle,
1076*5113495bSYour Name 				     uint8_t *evt_buf,
1077*5113495bSYour Name 				     struct twt_session_stats_event_param
1078*5113495bSYour Name 				     *params,
1079*5113495bSYour Name 				     struct twt_session_stats_info
1080*5113495bSYour Name 				     *session,
1081*5113495bSYour Name 				     uint32_t idx)
1082*5113495bSYour Name {
1083*5113495bSYour Name 	WMI_TWT_SESSION_STATS_EVENTID_param_tlvs *param_buf;
1084*5113495bSYour Name 	wmi_twt_session_stats_info *twt_session;
1085*5113495bSYour Name 	uint32_t flags;
1086*5113495bSYour Name 	wmi_mac_addr *m1;
1087*5113495bSYour Name 	uint8_t *m2;
1088*5113495bSYour Name 
1089*5113495bSYour Name 	param_buf =
1090*5113495bSYour Name 		(WMI_TWT_SESSION_STATS_EVENTID_param_tlvs *)evt_buf;
1091*5113495bSYour Name 	if (!param_buf) {
1092*5113495bSYour Name 		wmi_err("evt_buf is NULL");
1093*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
1094*5113495bSYour Name 	}
1095*5113495bSYour Name 
1096*5113495bSYour Name 	if (idx >= param_buf->num_twt_sessions) {
1097*5113495bSYour Name 		wmi_err("wrong idx, idx=%d, num_sessions=%d",
1098*5113495bSYour Name 			 idx, param_buf->num_twt_sessions);
1099*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
1100*5113495bSYour Name 	}
1101*5113495bSYour Name 
1102*5113495bSYour Name 	twt_session = &param_buf->twt_sessions[idx];
1103*5113495bSYour Name 
1104*5113495bSYour Name 	session->vdev_id = twt_session->vdev_id;
1105*5113495bSYour Name 	m1 = &twt_session->peer_mac;
1106*5113495bSYour Name 	m2 = session->peer_mac.bytes;
1107*5113495bSYour Name 	WMI_MAC_ADDR_TO_CHAR_ARRAY(m1, m2);
1108*5113495bSYour Name 	session->event_type = twt_session->event_type;
1109*5113495bSYour Name 	flags = twt_session->flow_id_flags;
1110*5113495bSYour Name 	session->flow_id = WMI_TWT_SESSION_FLAG_FLOW_ID_GET(flags);
1111*5113495bSYour Name 	session->bcast = WMI_TWT_SESSION_FLAG_BCAST_TWT_GET(flags);
1112*5113495bSYour Name 	session->trig = WMI_TWT_SESSION_FLAG_TRIGGER_TWT_GET(flags);
1113*5113495bSYour Name 	session->announ = WMI_TWT_SESSION_FLAG_ANNOUN_TWT_GET(flags);
1114*5113495bSYour Name 	session->protection = WMI_TWT_SESSION_FLAG_TWT_PROTECTION_GET(flags);
1115*5113495bSYour Name 	session->info_frame_disabled =
1116*5113495bSYour Name 			WMI_TWT_SESSION_FLAG_TWT_INFO_FRAME_DISABLED_GET(flags);
1117*5113495bSYour Name 	session->pm_responder_bit =
1118*5113495bSYour Name 			WMI_TWT_SESSION_FLAG_TWT_PM_RESPONDER_MODE_GET(flags);
1119*5113495bSYour Name 	session->pm_responder_bit_valid =
1120*5113495bSYour Name 		WMI_TWT_SESSION_FLAG_TWT_PM_RESPONDER_MODE_VALID_GET(flags);
1121*5113495bSYour Name 	session->dialog_id = twt_session->dialog_id;
1122*5113495bSYour Name 	session->wake_dura_us = twt_session->wake_dura_us;
1123*5113495bSYour Name 	session->wake_intvl_us = twt_session->wake_intvl_us;
1124*5113495bSYour Name 	session->sp_offset_us = twt_session->sp_offset_us;
1125*5113495bSYour Name 	session->sp_tsf_us_lo = twt_session->sp_tsf_us_lo;
1126*5113495bSYour Name 	session->sp_tsf_us_hi = twt_session->sp_tsf_us_hi;
1127*5113495bSYour Name 	wmi_debug("type=%d id=%d bcast=%d trig=%d announ=%d diagid=%d wake_dur=%ul wake_int=%ul offset=%ul",
1128*5113495bSYour Name 		 session->event_type, session->flow_id,
1129*5113495bSYour Name 		 session->bcast, session->trig,
1130*5113495bSYour Name 		 session->announ, session->dialog_id, session->wake_dura_us,
1131*5113495bSYour Name 		 session->wake_intvl_us, session->sp_offset_us);
1132*5113495bSYour Name 	wmi_debug("resp_pm_valid=%d resp_pm=%d",
1133*5113495bSYour Name 		  session->pm_responder_bit_valid, session->pm_responder_bit);
1134*5113495bSYour Name 
1135*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1136*5113495bSYour Name }
1137*5113495bSYour Name 
extract_twt_cap_service_ready_ext2_tlv(wmi_unified_t wmi_handle,uint8_t * event,struct wmi_twt_cap_bitmap_params * var)1138*5113495bSYour Name static QDF_STATUS extract_twt_cap_service_ready_ext2_tlv(
1139*5113495bSYour Name 				wmi_unified_t wmi_handle, uint8_t *event,
1140*5113495bSYour Name 				struct wmi_twt_cap_bitmap_params *var)
1141*5113495bSYour Name {
1142*5113495bSYour Name 	WMI_SERVICE_READY_EXT2_EVENTID_param_tlvs *param_buf;
1143*5113495bSYour Name 	wmi_twt_caps_params *twt_caps;
1144*5113495bSYour Name 
1145*5113495bSYour Name 	param_buf = (WMI_SERVICE_READY_EXT2_EVENTID_param_tlvs *)event;
1146*5113495bSYour Name 	if (!param_buf)
1147*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
1148*5113495bSYour Name 
1149*5113495bSYour Name 	twt_caps = param_buf->twt_caps;
1150*5113495bSYour Name 	if (!twt_caps)
1151*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
1152*5113495bSYour Name 
1153*5113495bSYour Name 	var->twt_ack_support_cap = WMI_GET_BITS(twt_caps->twt_capability_bitmap,
1154*5113495bSYour Name 						0, 1);
1155*5113495bSYour Name 
1156*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1157*5113495bSYour Name }
1158*5113495bSYour Name 
1159*5113495bSYour Name static enum WMI_HOST_TWT_CMD_FOR_ACK_EVENT
wmi_get_converted_twt_command_for_ack_event(WMI_CMD_ID tgt_cmd)1160*5113495bSYour Name wmi_get_converted_twt_command_for_ack_event(WMI_CMD_ID tgt_cmd)
1161*5113495bSYour Name {
1162*5113495bSYour Name 	switch (tgt_cmd) {
1163*5113495bSYour Name 	case WMI_TWT_ADD_DIALOG_CMDID:
1164*5113495bSYour Name 		return WMI_HOST_TWT_ADD_DIALOG_CMDID;
1165*5113495bSYour Name 	case WMI_TWT_DEL_DIALOG_CMDID:
1166*5113495bSYour Name 		return WMI_HOST_TWT_DEL_DIALOG_CMDID;
1167*5113495bSYour Name 	case WMI_TWT_PAUSE_DIALOG_CMDID:
1168*5113495bSYour Name 		return WMI_HOST_TWT_PAUSE_DIALOG_CMDID;
1169*5113495bSYour Name 	case WMI_TWT_RESUME_DIALOG_CMDID:
1170*5113495bSYour Name 		return WMI_HOST_TWT_RESUME_DIALOG_CMDID;
1171*5113495bSYour Name 	case WMI_TWT_NUDGE_DIALOG_CMDID:
1172*5113495bSYour Name 		return WMI_HOST_TWT_NUDGE_DIALOG_CMDID;
1173*5113495bSYour Name 	default:
1174*5113495bSYour Name 		return WMI_HOST_TWT_UNKNOWN_CMDID;
1175*5113495bSYour Name 	}
1176*5113495bSYour Name }
1177*5113495bSYour Name 
1178*5113495bSYour Name static QDF_STATUS
extract_twt_ack_comp_event_tlv(wmi_unified_t wmi_handle,uint8_t * evt_buf,struct twt_ack_complete_event_param * var)1179*5113495bSYour Name extract_twt_ack_comp_event_tlv(wmi_unified_t wmi_handle,
1180*5113495bSYour Name 			       uint8_t *evt_buf,
1181*5113495bSYour Name 			       struct twt_ack_complete_event_param *var)
1182*5113495bSYour Name {
1183*5113495bSYour Name 	WMI_TWT_ACK_EVENTID_param_tlvs *param_buf;
1184*5113495bSYour Name 	wmi_twt_ack_event_fixed_param *ack_event;
1185*5113495bSYour Name 
1186*5113495bSYour Name 	param_buf = (WMI_TWT_ACK_EVENTID_param_tlvs *)evt_buf;
1187*5113495bSYour Name 	if (!param_buf) {
1188*5113495bSYour Name 		wmi_err("evt_buf is NULL");
1189*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
1190*5113495bSYour Name 	}
1191*5113495bSYour Name 
1192*5113495bSYour Name 	ack_event = param_buf->fixed_param;
1193*5113495bSYour Name 
1194*5113495bSYour Name 	var->vdev_id = ack_event->vdev_id;
1195*5113495bSYour Name 	WMI_MAC_ADDR_TO_CHAR_ARRAY(&ack_event->peer_macaddr,
1196*5113495bSYour Name 				   var->peer_macaddr.bytes);
1197*5113495bSYour Name 	var->dialog_id = ack_event->dialog_id;
1198*5113495bSYour Name 	var->twt_cmd_ack = wmi_get_converted_twt_command_for_ack_event(
1199*5113495bSYour Name 						ack_event->twt_cmd);
1200*5113495bSYour Name 
1201*5113495bSYour Name 	switch (ack_event->twt_cmd) {
1202*5113495bSYour Name 	case WMI_TWT_ADD_DIALOG_CMDID:
1203*5113495bSYour Name 		var->status = wmi_get_converted_twt_add_dialog_status(
1204*5113495bSYour Name 						ack_event->status);
1205*5113495bSYour Name 		break;
1206*5113495bSYour Name 	case WMI_TWT_DEL_DIALOG_CMDID:
1207*5113495bSYour Name 		var->status = wmi_get_converted_twt_del_dialog_status(
1208*5113495bSYour Name 						ack_event->status);
1209*5113495bSYour Name 		break;
1210*5113495bSYour Name 	case WMI_TWT_PAUSE_DIALOG_CMDID:
1211*5113495bSYour Name 		var->status = wmi_twt_pause_status_to_host_twt_status(
1212*5113495bSYour Name 						ack_event->status);
1213*5113495bSYour Name 		break;
1214*5113495bSYour Name 	case WMI_TWT_RESUME_DIALOG_CMDID:
1215*5113495bSYour Name 		var->status = wmi_get_converted_twt_resume_dialog_status(
1216*5113495bSYour Name 						ack_event->status);
1217*5113495bSYour Name 		break;
1218*5113495bSYour Name 	case WMI_TWT_NUDGE_DIALOG_CMDID:
1219*5113495bSYour Name 		var->status = wmi_twt_nudge_status_to_host_twt_status(
1220*5113495bSYour Name 						ack_event->status);
1221*5113495bSYour Name 		break;
1222*5113495bSYour Name 	default:
1223*5113495bSYour Name 		break;
1224*5113495bSYour Name 	}
1225*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1226*5113495bSYour Name }
1227*5113495bSYour Name #elif WLAN_SUPPORT_TWT
send_twt_enable_cmd_tlv(wmi_unified_t wmi_handle,struct wmi_twt_enable_param * params)1228*5113495bSYour Name static QDF_STATUS send_twt_enable_cmd_tlv(wmi_unified_t wmi_handle,
1229*5113495bSYour Name 			struct wmi_twt_enable_param *params)
1230*5113495bSYour Name {
1231*5113495bSYour Name 	wmi_twt_enable_cmd_fixed_param *cmd;
1232*5113495bSYour Name 	wmi_buf_t buf;
1233*5113495bSYour Name 	QDF_STATUS status;
1234*5113495bSYour Name 
1235*5113495bSYour Name 	buf = wmi_buf_alloc(wmi_handle, sizeof(*cmd));
1236*5113495bSYour Name 	if (!buf) {
1237*5113495bSYour Name 		wmi_err("Failed to allocate memory");
1238*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
1239*5113495bSYour Name 	}
1240*5113495bSYour Name 
1241*5113495bSYour Name 	cmd = (wmi_twt_enable_cmd_fixed_param *) wmi_buf_data(buf);
1242*5113495bSYour Name 	WMITLV_SET_HDR(&cmd->tlv_header,
1243*5113495bSYour Name 			WMITLV_TAG_STRUC_wmi_twt_enable_cmd_fixed_param,
1244*5113495bSYour Name 			WMITLV_GET_STRUCT_TLVLEN
1245*5113495bSYour Name 			(wmi_twt_enable_cmd_fixed_param));
1246*5113495bSYour Name 
1247*5113495bSYour Name 	cmd->pdev_id =
1248*5113495bSYour Name 		wmi_handle->ops->convert_pdev_id_host_to_target(
1249*5113495bSYour Name 						wmi_handle,
1250*5113495bSYour Name 						params->pdev_id);
1251*5113495bSYour Name 	cmd->sta_cong_timer_ms =            params->sta_cong_timer_ms;
1252*5113495bSYour Name 	cmd->mbss_support =                 params->mbss_support;
1253*5113495bSYour Name 	cmd->default_slot_size =            params->default_slot_size;
1254*5113495bSYour Name 	cmd->congestion_thresh_setup =      params->congestion_thresh_setup;
1255*5113495bSYour Name 	cmd->congestion_thresh_teardown =   params->congestion_thresh_teardown;
1256*5113495bSYour Name 	cmd->congestion_thresh_critical =   params->congestion_thresh_critical;
1257*5113495bSYour Name 	cmd->interference_thresh_teardown =
1258*5113495bSYour Name 					params->interference_thresh_teardown;
1259*5113495bSYour Name 	cmd->interference_thresh_setup =    params->interference_thresh_setup;
1260*5113495bSYour Name 	cmd->min_no_sta_setup =             params->min_no_sta_setup;
1261*5113495bSYour Name 	cmd->min_no_sta_teardown =          params->min_no_sta_teardown;
1262*5113495bSYour Name 	cmd->no_of_bcast_mcast_slots =      params->no_of_bcast_mcast_slots;
1263*5113495bSYour Name 	cmd->min_no_twt_slots =             params->min_no_twt_slots;
1264*5113495bSYour Name 	cmd->max_no_sta_twt =               params->max_no_sta_twt;
1265*5113495bSYour Name 	cmd->mode_check_interval =          params->mode_check_interval;
1266*5113495bSYour Name 	cmd->add_sta_slot_interval =        params->add_sta_slot_interval;
1267*5113495bSYour Name 	cmd->remove_sta_slot_interval =     params->remove_sta_slot_interval;
1268*5113495bSYour Name 
1269*5113495bSYour Name 	TWT_EN_DIS_FLAGS_SET_BTWT(cmd->flags, params->b_twt_enable);
1270*5113495bSYour Name 	TWT_EN_DIS_FLAGS_SET_B_R_TWT(cmd->flags, params->r_twt_enable);
1271*5113495bSYour Name 	TWT_EN_DIS_FLAGS_SET_L_MBSSID(cmd->flags,
1272*5113495bSYour Name 				      params->b_twt_legacy_mbss_enable);
1273*5113495bSYour Name 	TWT_EN_DIS_FLAGS_SET_AX_MBSSID(cmd->flags,
1274*5113495bSYour Name 				       params->b_twt_ax_mbss_enable);
1275*5113495bSYour Name 	if (params->ext_conf_present) {
1276*5113495bSYour Name 		TWT_EN_DIS_FLAGS_SET_SPLIT_CONFIG(cmd->flags, 1);
1277*5113495bSYour Name 		TWT_EN_DIS_FLAGS_SET_REQ_RESP(cmd->flags, params->twt_role);
1278*5113495bSYour Name 		TWT_EN_DIS_FLAGS_SET_I_B_TWT(cmd->flags, params->twt_oper);
1279*5113495bSYour Name 	}
1280*5113495bSYour Name 
1281*5113495bSYour Name 	status = wmi_unified_cmd_send(wmi_handle, buf, sizeof(*cmd),
1282*5113495bSYour Name 				      WMI_TWT_ENABLE_CMDID);
1283*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
1284*5113495bSYour Name 		wmi_err("Failed to send WMI_TWT_ENABLE_CMDID");
1285*5113495bSYour Name 		wmi_buf_free(buf);
1286*5113495bSYour Name 	}
1287*5113495bSYour Name 
1288*5113495bSYour Name 	return status;
1289*5113495bSYour Name }
1290*5113495bSYour Name 
send_twt_disable_cmd_tlv(wmi_unified_t wmi_handle,struct wmi_twt_disable_param * params)1291*5113495bSYour Name static QDF_STATUS send_twt_disable_cmd_tlv(wmi_unified_t wmi_handle,
1292*5113495bSYour Name 			struct wmi_twt_disable_param *params)
1293*5113495bSYour Name {
1294*5113495bSYour Name 	wmi_twt_disable_cmd_fixed_param *cmd;
1295*5113495bSYour Name 	wmi_buf_t buf;
1296*5113495bSYour Name 	QDF_STATUS status;
1297*5113495bSYour Name 
1298*5113495bSYour Name 	buf = wmi_buf_alloc(wmi_handle, sizeof(*cmd));
1299*5113495bSYour Name 	if (!buf) {
1300*5113495bSYour Name 		wmi_err("Failed to allocate memory");
1301*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
1302*5113495bSYour Name 	}
1303*5113495bSYour Name 
1304*5113495bSYour Name 	cmd = (wmi_twt_disable_cmd_fixed_param *) wmi_buf_data(buf);
1305*5113495bSYour Name 	WMITLV_SET_HDR(&cmd->tlv_header,
1306*5113495bSYour Name 			WMITLV_TAG_STRUC_wmi_twt_disable_cmd_fixed_param,
1307*5113495bSYour Name 			WMITLV_GET_STRUCT_TLVLEN
1308*5113495bSYour Name 			(wmi_twt_disable_cmd_fixed_param));
1309*5113495bSYour Name 
1310*5113495bSYour Name 	cmd->pdev_id =
1311*5113495bSYour Name 		wmi_handle->ops->convert_pdev_id_host_to_target(
1312*5113495bSYour Name 						wmi_handle,
1313*5113495bSYour Name 						params->pdev_id);
1314*5113495bSYour Name 	if (params->ext_conf_present) {
1315*5113495bSYour Name 		TWT_EN_DIS_FLAGS_SET_SPLIT_CONFIG(cmd->flags, 1);
1316*5113495bSYour Name 		TWT_EN_DIS_FLAGS_SET_REQ_RESP(cmd->flags, params->twt_role);
1317*5113495bSYour Name 		TWT_EN_DIS_FLAGS_SET_I_B_TWT(cmd->flags, params->twt_oper);
1318*5113495bSYour Name 	}
1319*5113495bSYour Name 
1320*5113495bSYour Name 	status = wmi_unified_cmd_send(wmi_handle, buf, sizeof(*cmd),
1321*5113495bSYour Name 				      WMI_TWT_DISABLE_CMDID);
1322*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
1323*5113495bSYour Name 		wmi_err("Failed to send WMI_TWT_DISABLE_CMDID");
1324*5113495bSYour Name 		wmi_buf_free(buf);
1325*5113495bSYour Name 	}
1326*5113495bSYour Name 
1327*5113495bSYour Name 	return status;
1328*5113495bSYour Name }
1329*5113495bSYour Name 
1330*5113495bSYour Name #ifdef WLAN_SUPPORT_BCAST_TWT
1331*5113495bSYour Name static void
twt_add_dialog_set_bcast_twt_params(struct wmi_twt_add_dialog_param * params,wmi_twt_add_dialog_cmd_fixed_param * cmd)1332*5113495bSYour Name twt_add_dialog_set_bcast_twt_params(struct wmi_twt_add_dialog_param *params,
1333*5113495bSYour Name                 wmi_twt_add_dialog_cmd_fixed_param *cmd)
1334*5113495bSYour Name {
1335*5113495bSYour Name 	TWT_FLAGS_SET_BTWT_ID0(cmd->flags, params->flag_b_twt_id0);
1336*5113495bSYour Name 	cmd->b_twt_persistence = params->b_twt_persistence;
1337*5113495bSYour Name 	cmd->b_twt_recommendation = params->b_twt_recommendation;
1338*5113495bSYour Name }
1339*5113495bSYour Name #else
1340*5113495bSYour Name static void
twt_add_dialog_set_bcast_twt_params(struct wmi_twt_add_dialog_param * params,wmi_twt_add_dialog_cmd_fixed_param * cmd)1341*5113495bSYour Name twt_add_dialog_set_bcast_twt_params(struct wmi_twt_add_dialog_param *params,
1342*5113495bSYour Name                 wmi_twt_add_dialog_cmd_fixed_param *cmd)
1343*5113495bSYour Name {
1344*5113495bSYour Name }
1345*5113495bSYour Name #endif
1346*5113495bSYour Name 
1347*5113495bSYour Name static QDF_STATUS
send_twt_add_dialog_cmd_tlv(wmi_unified_t wmi_handle,struct wmi_twt_add_dialog_param * params)1348*5113495bSYour Name send_twt_add_dialog_cmd_tlv(wmi_unified_t wmi_handle,
1349*5113495bSYour Name 			    struct wmi_twt_add_dialog_param *params)
1350*5113495bSYour Name {
1351*5113495bSYour Name 	wmi_twt_add_dialog_cmd_fixed_param *cmd;
1352*5113495bSYour Name 	wmi_buf_t buf;
1353*5113495bSYour Name 	QDF_STATUS status;
1354*5113495bSYour Name 
1355*5113495bSYour Name 	buf = wmi_buf_alloc(wmi_handle, sizeof(*cmd));
1356*5113495bSYour Name 	if (!buf) {
1357*5113495bSYour Name 		wmi_err("Failed to allocate memory");
1358*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
1359*5113495bSYour Name 	}
1360*5113495bSYour Name 
1361*5113495bSYour Name 	cmd = (wmi_twt_add_dialog_cmd_fixed_param *) wmi_buf_data(buf);
1362*5113495bSYour Name 	WMITLV_SET_HDR(&cmd->tlv_header,
1363*5113495bSYour Name 		       WMITLV_TAG_STRUC_wmi_twt_add_dialog_cmd_fixed_param,
1364*5113495bSYour Name 		       WMITLV_GET_STRUCT_TLVLEN
1365*5113495bSYour Name 		       (wmi_twt_add_dialog_cmd_fixed_param));
1366*5113495bSYour Name 
1367*5113495bSYour Name 	cmd->vdev_id = params->vdev_id;
1368*5113495bSYour Name 	WMI_CHAR_ARRAY_TO_MAC_ADDR(params->peer_macaddr, &cmd->peer_macaddr);
1369*5113495bSYour Name 	cmd->dialog_id =         params->dialog_id;
1370*5113495bSYour Name 	cmd->wake_intvl_us =     params->wake_intvl_us;
1371*5113495bSYour Name 	cmd->wake_intvl_mantis = params->wake_intvl_mantis;
1372*5113495bSYour Name 	cmd->wake_dura_us =      params->wake_dura_us;
1373*5113495bSYour Name 	cmd->sp_offset_us =      params->sp_offset_us;
1374*5113495bSYour Name 	cmd->min_wake_intvl_us = params->min_wake_intvl_us;
1375*5113495bSYour Name 	cmd->max_wake_intvl_us = params->max_wake_intvl_us;
1376*5113495bSYour Name 	cmd->min_wake_dura_us = params->min_wake_dura_us;
1377*5113495bSYour Name 	cmd->max_wake_dura_us = params->max_wake_dura_us;
1378*5113495bSYour Name 	cmd->sp_start_tsf_lo = (uint32_t)(params->wake_time_tsf & 0xFFFFFFFF);
1379*5113495bSYour Name 	cmd->sp_start_tsf_hi = (uint32_t)(params->wake_time_tsf >> 32);
1380*5113495bSYour Name 	cmd->announce_timeout_us = params->announce_timeout_us;
1381*5113495bSYour Name 	cmd->link_id_bitmap = params->link_id_bitmap;
1382*5113495bSYour Name 	cmd->r_twt_dl_tid_bitmap = params->r_twt_dl_tid_bitmap;
1383*5113495bSYour Name 	cmd->r_twt_ul_tid_bitmap = params->r_twt_ul_tid_bitmap;
1384*5113495bSYour Name 	TWT_FLAGS_SET_CMD(cmd->flags, params->twt_cmd);
1385*5113495bSYour Name 	TWT_FLAGS_SET_BROADCAST(cmd->flags, params->flag_bcast);
1386*5113495bSYour Name 	TWT_FLAGS_SET_TRIGGER(cmd->flags, params->flag_trigger);
1387*5113495bSYour Name 	TWT_FLAGS_SET_FLOW_TYPE(cmd->flags, params->flag_flow_type);
1388*5113495bSYour Name 	TWT_FLAGS_SET_PROTECTION(cmd->flags, params->flag_protection);
1389*5113495bSYour Name 
1390*5113495bSYour Name 	twt_add_dialog_set_bcast_twt_params(params, cmd);
1391*5113495bSYour Name 
1392*5113495bSYour Name 	status = wmi_unified_cmd_send(wmi_handle, buf, sizeof(*cmd),
1393*5113495bSYour Name 				      WMI_TWT_ADD_DIALOG_CMDID);
1394*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
1395*5113495bSYour Name 		wmi_err("Failed to send WMI_TWT_ADD_DIALOG_CMDID");
1396*5113495bSYour Name 		wmi_buf_free(buf);
1397*5113495bSYour Name 	}
1398*5113495bSYour Name 
1399*5113495bSYour Name 	return status;
1400*5113495bSYour Name }
1401*5113495bSYour Name 
1402*5113495bSYour Name #ifdef WLAN_SUPPORT_BCAST_TWT
1403*5113495bSYour Name static void
twt_del_dialog_set_bcast_twt_params(struct wmi_twt_del_dialog_param * params,wmi_twt_del_dialog_cmd_fixed_param * cmd)1404*5113495bSYour Name twt_del_dialog_set_bcast_twt_params(struct wmi_twt_del_dialog_param *params,
1405*5113495bSYour Name                 wmi_twt_del_dialog_cmd_fixed_param *cmd)
1406*5113495bSYour Name {
1407*5113495bSYour Name 	cmd->b_twt_persistence = params->b_twt_persistence;
1408*5113495bSYour Name }
1409*5113495bSYour Name #else
1410*5113495bSYour Name static void
twt_del_dialog_set_bcast_twt_params(struct wmi_twt_del_dialog_param * params,wmi_twt_del_dialog_cmd_fixed_param * cmd)1411*5113495bSYour Name twt_del_dialog_set_bcast_twt_params(struct wmi_twt_del_dialog_param *params,
1412*5113495bSYour Name                 wmi_twt_del_dialog_cmd_fixed_param *cmd)
1413*5113495bSYour Name {
1414*5113495bSYour Name }
1415*5113495bSYour Name #endif
1416*5113495bSYour Name 
1417*5113495bSYour Name static QDF_STATUS
send_twt_del_dialog_cmd_tlv(wmi_unified_t wmi_handle,struct wmi_twt_del_dialog_param * params)1418*5113495bSYour Name send_twt_del_dialog_cmd_tlv(wmi_unified_t wmi_handle,
1419*5113495bSYour Name 			    struct wmi_twt_del_dialog_param *params)
1420*5113495bSYour Name {
1421*5113495bSYour Name 	wmi_twt_del_dialog_cmd_fixed_param *cmd;
1422*5113495bSYour Name 	wmi_buf_t buf;
1423*5113495bSYour Name 	QDF_STATUS status;
1424*5113495bSYour Name 
1425*5113495bSYour Name 	buf = wmi_buf_alloc(wmi_handle, sizeof(*cmd));
1426*5113495bSYour Name 	if (!buf) {
1427*5113495bSYour Name 		wmi_err("Failed to allocate memory");
1428*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
1429*5113495bSYour Name 	}
1430*5113495bSYour Name 
1431*5113495bSYour Name 	cmd = (wmi_twt_del_dialog_cmd_fixed_param *) wmi_buf_data(buf);
1432*5113495bSYour Name 	WMITLV_SET_HDR(&cmd->tlv_header,
1433*5113495bSYour Name 		       WMITLV_TAG_STRUC_wmi_twt_del_dialog_cmd_fixed_param,
1434*5113495bSYour Name 		       WMITLV_GET_STRUCT_TLVLEN
1435*5113495bSYour Name 		       (wmi_twt_del_dialog_cmd_fixed_param));
1436*5113495bSYour Name 
1437*5113495bSYour Name 	cmd->vdev_id = params->vdev_id;
1438*5113495bSYour Name 	WMI_CHAR_ARRAY_TO_MAC_ADDR(params->peer_macaddr, &cmd->peer_macaddr);
1439*5113495bSYour Name 	cmd->dialog_id = params->dialog_id;
1440*5113495bSYour Name 
1441*5113495bSYour Name 	twt_del_dialog_set_bcast_twt_params(params, cmd);
1442*5113495bSYour Name 
1443*5113495bSYour Name 	status = wmi_unified_cmd_send(wmi_handle, buf, sizeof(*cmd),
1444*5113495bSYour Name 				      WMI_TWT_DEL_DIALOG_CMDID);
1445*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
1446*5113495bSYour Name 		wmi_err("Failed to send WMI_TWT_DEL_DIALOG_CMDID");
1447*5113495bSYour Name 		wmi_buf_free(buf);
1448*5113495bSYour Name 	}
1449*5113495bSYour Name 
1450*5113495bSYour Name 	return status;
1451*5113495bSYour Name }
1452*5113495bSYour Name 
1453*5113495bSYour Name static QDF_STATUS
send_twt_pause_dialog_cmd_tlv(wmi_unified_t wmi_handle,struct wmi_twt_pause_dialog_cmd_param * params)1454*5113495bSYour Name send_twt_pause_dialog_cmd_tlv(wmi_unified_t wmi_handle,
1455*5113495bSYour Name 			      struct wmi_twt_pause_dialog_cmd_param *params)
1456*5113495bSYour Name {
1457*5113495bSYour Name 	wmi_twt_pause_dialog_cmd_fixed_param *cmd;
1458*5113495bSYour Name 	wmi_buf_t buf;
1459*5113495bSYour Name 	QDF_STATUS status;
1460*5113495bSYour Name 
1461*5113495bSYour Name 	buf = wmi_buf_alloc(wmi_handle, sizeof(*cmd));
1462*5113495bSYour Name 	if (!buf) {
1463*5113495bSYour Name 		wmi_err("Failed to allocate memory");
1464*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
1465*5113495bSYour Name 	}
1466*5113495bSYour Name 
1467*5113495bSYour Name 	cmd = (wmi_twt_pause_dialog_cmd_fixed_param *) wmi_buf_data(buf);
1468*5113495bSYour Name 	WMITLV_SET_HDR(&cmd->tlv_header,
1469*5113495bSYour Name 		       WMITLV_TAG_STRUC_wmi_twt_pause_dialog_cmd_fixed_param,
1470*5113495bSYour Name 		       WMITLV_GET_STRUCT_TLVLEN
1471*5113495bSYour Name 		       (wmi_twt_pause_dialog_cmd_fixed_param));
1472*5113495bSYour Name 
1473*5113495bSYour Name 	cmd->vdev_id = params->vdev_id;
1474*5113495bSYour Name 	WMI_CHAR_ARRAY_TO_MAC_ADDR(params->peer_macaddr, &cmd->peer_macaddr);
1475*5113495bSYour Name 	cmd->dialog_id = params->dialog_id;
1476*5113495bSYour Name 
1477*5113495bSYour Name 	status = wmi_unified_cmd_send(wmi_handle, buf, sizeof(*cmd),
1478*5113495bSYour Name 				      WMI_TWT_PAUSE_DIALOG_CMDID);
1479*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
1480*5113495bSYour Name 		wmi_err("Failed to send WMI_TWT_PAUSE_DIALOG_CMDID");
1481*5113495bSYour Name 		wmi_buf_free(buf);
1482*5113495bSYour Name 	}
1483*5113495bSYour Name 
1484*5113495bSYour Name 	return status;
1485*5113495bSYour Name }
1486*5113495bSYour Name 
1487*5113495bSYour Name static QDF_STATUS
send_twt_nudge_dialog_cmd_tlv(wmi_unified_t wmi_handle,struct wmi_twt_nudge_dialog_cmd_param * params)1488*5113495bSYour Name send_twt_nudge_dialog_cmd_tlv(wmi_unified_t wmi_handle,
1489*5113495bSYour Name 			      struct wmi_twt_nudge_dialog_cmd_param *params)
1490*5113495bSYour Name {
1491*5113495bSYour Name 	wmi_twt_nudge_dialog_cmd_fixed_param *cmd;
1492*5113495bSYour Name 	wmi_buf_t buf;
1493*5113495bSYour Name 	QDF_STATUS status;
1494*5113495bSYour Name 
1495*5113495bSYour Name 	buf = wmi_buf_alloc(wmi_handle, sizeof(*cmd));
1496*5113495bSYour Name 	if (!buf)
1497*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
1498*5113495bSYour Name 
1499*5113495bSYour Name 	cmd = (wmi_twt_nudge_dialog_cmd_fixed_param *) wmi_buf_data(buf);
1500*5113495bSYour Name 	WMITLV_SET_HDR(&cmd->tlv_header,
1501*5113495bSYour Name 		       WMITLV_TAG_STRUC_wmi_twt_nudge_dialog_cmd_fixed_param,
1502*5113495bSYour Name 		       WMITLV_GET_STRUCT_TLVLEN
1503*5113495bSYour Name 		       (wmi_twt_nudge_dialog_cmd_fixed_param));
1504*5113495bSYour Name 
1505*5113495bSYour Name 	cmd->vdev_id = params->vdev_id;
1506*5113495bSYour Name 	WMI_CHAR_ARRAY_TO_MAC_ADDR(params->peer_macaddr, &cmd->peer_macaddr);
1507*5113495bSYour Name 	cmd->dialog_id = params->dialog_id;
1508*5113495bSYour Name 	cmd->suspend_duration_ms = params->suspend_duration / 1000;
1509*5113495bSYour Name 	cmd->next_twt_size = params->next_twt_size;
1510*5113495bSYour Name 
1511*5113495bSYour Name 	wmi_debug("vdev_id: %d dialog_id: %d duration(in ms): %u next_twt_size: %d "
1512*5113495bSYour Name 		  "peer_macaddr: "QDF_MAC_ADDR_FMT, cmd->vdev_id,
1513*5113495bSYour Name 		  cmd->dialog_id, cmd->suspend_duration_ms, cmd->next_twt_size,
1514*5113495bSYour Name 		  QDF_MAC_ADDR_REF(params->peer_macaddr));
1515*5113495bSYour Name 
1516*5113495bSYour Name 	status = wmi_unified_cmd_send(wmi_handle, buf, sizeof(*cmd),
1517*5113495bSYour Name 				      WMI_TWT_NUDGE_DIALOG_CMDID);
1518*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status))
1519*5113495bSYour Name 		wmi_buf_free(buf);
1520*5113495bSYour Name 
1521*5113495bSYour Name 	return status;
1522*5113495bSYour Name }
1523*5113495bSYour Name 
send_twt_resume_dialog_cmd_tlv(wmi_unified_t wmi_handle,struct wmi_twt_resume_dialog_cmd_param * params)1524*5113495bSYour Name static QDF_STATUS send_twt_resume_dialog_cmd_tlv(wmi_unified_t wmi_handle,
1525*5113495bSYour Name 			struct wmi_twt_resume_dialog_cmd_param *params)
1526*5113495bSYour Name {
1527*5113495bSYour Name 	wmi_twt_resume_dialog_cmd_fixed_param *cmd;
1528*5113495bSYour Name 	wmi_buf_t buf;
1529*5113495bSYour Name 	QDF_STATUS status;
1530*5113495bSYour Name 
1531*5113495bSYour Name 	buf = wmi_buf_alloc(wmi_handle, sizeof(*cmd));
1532*5113495bSYour Name 	if (!buf) {
1533*5113495bSYour Name 		wmi_err("Failed to allocate memory");
1534*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
1535*5113495bSYour Name 	}
1536*5113495bSYour Name 
1537*5113495bSYour Name 	cmd = (wmi_twt_resume_dialog_cmd_fixed_param *) wmi_buf_data(buf);
1538*5113495bSYour Name 	WMITLV_SET_HDR(&cmd->tlv_header,
1539*5113495bSYour Name 			WMITLV_TAG_STRUC_wmi_twt_resume_dialog_cmd_fixed_param,
1540*5113495bSYour Name 			WMITLV_GET_STRUCT_TLVLEN
1541*5113495bSYour Name 			(wmi_twt_resume_dialog_cmd_fixed_param));
1542*5113495bSYour Name 
1543*5113495bSYour Name 	cmd->vdev_id = params->vdev_id;
1544*5113495bSYour Name 	WMI_CHAR_ARRAY_TO_MAC_ADDR(params->peer_macaddr, &cmd->peer_macaddr);
1545*5113495bSYour Name 	cmd->dialog_id = params->dialog_id;
1546*5113495bSYour Name 	cmd->sp_offset_us = params->sp_offset_us;
1547*5113495bSYour Name 	cmd->next_twt_size = params->next_twt_size;
1548*5113495bSYour Name 
1549*5113495bSYour Name 	status = wmi_unified_cmd_send(wmi_handle, buf, sizeof(*cmd),
1550*5113495bSYour Name 						WMI_TWT_RESUME_DIALOG_CMDID);
1551*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
1552*5113495bSYour Name 		wmi_err("Failed to send WMI_TWT_RESUME_DIALOG_CMDID");
1553*5113495bSYour Name 		wmi_buf_free(buf);
1554*5113495bSYour Name 	}
1555*5113495bSYour Name 
1556*5113495bSYour Name 	return status;
1557*5113495bSYour Name }
1558*5113495bSYour Name 
1559*5113495bSYour Name #ifdef WLAN_SUPPORT_BCAST_TWT
1560*5113495bSYour Name static QDF_STATUS
send_twt_btwt_invite_sta_cmd_tlv(wmi_unified_t wmi_handle,struct wmi_twt_btwt_invite_sta_cmd_param * params)1561*5113495bSYour Name send_twt_btwt_invite_sta_cmd_tlv(wmi_unified_t wmi_handle,
1562*5113495bSYour Name 				 struct wmi_twt_btwt_invite_sta_cmd_param
1563*5113495bSYour Name 				 *params)
1564*5113495bSYour Name {
1565*5113495bSYour Name 	wmi_twt_btwt_invite_sta_cmd_fixed_param *cmd;
1566*5113495bSYour Name 	wmi_buf_t buf;
1567*5113495bSYour Name 	QDF_STATUS status;
1568*5113495bSYour Name 
1569*5113495bSYour Name 	buf = wmi_buf_alloc(wmi_handle, sizeof(*cmd));
1570*5113495bSYour Name 	if (!buf) {
1571*5113495bSYour Name 		wmi_err("Failed to allocate memory");
1572*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
1573*5113495bSYour Name 	}
1574*5113495bSYour Name 
1575*5113495bSYour Name 	cmd = (wmi_twt_btwt_invite_sta_cmd_fixed_param *)wmi_buf_data(buf);
1576*5113495bSYour Name 	WMITLV_SET_HDR(&cmd->tlv_header,
1577*5113495bSYour Name 		       WMITLV_TAG_STRUC_wmi_twt_btwt_invite_sta_cmd_fixed_param,
1578*5113495bSYour Name 		       WMITLV_GET_STRUCT_TLVLEN
1579*5113495bSYour Name 		       (wmi_twt_btwt_invite_sta_cmd_fixed_param));
1580*5113495bSYour Name 
1581*5113495bSYour Name 	cmd->vdev_id = params->vdev_id;
1582*5113495bSYour Name 	WMI_CHAR_ARRAY_TO_MAC_ADDR(params->peer_macaddr, &cmd->peer_macaddr);
1583*5113495bSYour Name 	cmd->dialog_id = params->dialog_id;
1584*5113495bSYour Name 
1585*5113495bSYour Name 	status = wmi_unified_cmd_send(wmi_handle, buf, sizeof(*cmd),
1586*5113495bSYour Name 				      WMI_TWT_BTWT_INVITE_STA_CMDID);
1587*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
1588*5113495bSYour Name 		wmi_buf_free(buf);
1589*5113495bSYour Name 	}
1590*5113495bSYour Name 
1591*5113495bSYour Name 	return status;
1592*5113495bSYour Name }
1593*5113495bSYour Name 
1594*5113495bSYour Name static QDF_STATUS
send_twt_btwt_remove_sta_cmd_tlv(wmi_unified_t wmi_handle,struct wmi_twt_btwt_remove_sta_cmd_param * params)1595*5113495bSYour Name send_twt_btwt_remove_sta_cmd_tlv(wmi_unified_t wmi_handle,
1596*5113495bSYour Name 				 struct wmi_twt_btwt_remove_sta_cmd_param
1597*5113495bSYour Name 				 *params)
1598*5113495bSYour Name {
1599*5113495bSYour Name 	wmi_twt_btwt_remove_sta_cmd_fixed_param *cmd;
1600*5113495bSYour Name 	wmi_buf_t buf;
1601*5113495bSYour Name 	QDF_STATUS status;
1602*5113495bSYour Name 
1603*5113495bSYour Name 	buf = wmi_buf_alloc(wmi_handle, sizeof(*cmd));
1604*5113495bSYour Name 	if (!buf) {
1605*5113495bSYour Name 		wmi_err("Failed to allocate memory");
1606*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
1607*5113495bSYour Name 	}
1608*5113495bSYour Name 
1609*5113495bSYour Name 	cmd = (wmi_twt_btwt_remove_sta_cmd_fixed_param *)wmi_buf_data(buf);
1610*5113495bSYour Name 	WMITLV_SET_HDR(&cmd->tlv_header,
1611*5113495bSYour Name 		       WMITLV_TAG_STRUC_wmi_twt_btwt_remove_sta_cmd_fixed_param,
1612*5113495bSYour Name 		       WMITLV_GET_STRUCT_TLVLEN
1613*5113495bSYour Name 		       (wmi_twt_btwt_remove_sta_cmd_fixed_param));
1614*5113495bSYour Name 
1615*5113495bSYour Name 	cmd->vdev_id = params->vdev_id;
1616*5113495bSYour Name 	WMI_CHAR_ARRAY_TO_MAC_ADDR(params->peer_macaddr, &cmd->peer_macaddr);
1617*5113495bSYour Name 	cmd->dialog_id = params->dialog_id;
1618*5113495bSYour Name 
1619*5113495bSYour Name 	status = wmi_unified_cmd_send(wmi_handle, buf, sizeof(*cmd),
1620*5113495bSYour Name 				      WMI_TWT_BTWT_REMOVE_STA_CMDID);
1621*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
1622*5113495bSYour Name 		wmi_buf_free(buf);
1623*5113495bSYour Name 	}
1624*5113495bSYour Name 
1625*5113495bSYour Name 	return status;
1626*5113495bSYour Name }
1627*5113495bSYour Name #endif
1628*5113495bSYour Name 
extract_twt_enable_comp_event_tlv(wmi_unified_t wmi_handle,uint8_t * evt_buf,struct wmi_twt_enable_complete_event_param * params)1629*5113495bSYour Name static QDF_STATUS extract_twt_enable_comp_event_tlv(wmi_unified_t wmi_handle,
1630*5113495bSYour Name 		uint8_t *evt_buf,
1631*5113495bSYour Name 		struct wmi_twt_enable_complete_event_param *params)
1632*5113495bSYour Name {
1633*5113495bSYour Name 	WMI_TWT_ENABLE_COMPLETE_EVENTID_param_tlvs *param_buf;
1634*5113495bSYour Name 	wmi_twt_enable_complete_event_fixed_param *ev;
1635*5113495bSYour Name 
1636*5113495bSYour Name 	param_buf = (WMI_TWT_ENABLE_COMPLETE_EVENTID_param_tlvs *)evt_buf;
1637*5113495bSYour Name 	if (!param_buf) {
1638*5113495bSYour Name 		wmi_err("evt_buf is NULL");
1639*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
1640*5113495bSYour Name 	}
1641*5113495bSYour Name 
1642*5113495bSYour Name 	ev = param_buf->fixed_param;
1643*5113495bSYour Name 
1644*5113495bSYour Name 	params->pdev_id =
1645*5113495bSYour Name 		wmi_handle->ops->convert_pdev_id_target_to_host(wmi_handle,
1646*5113495bSYour Name 								ev->pdev_id);
1647*5113495bSYour Name 	params->status = ev->status;
1648*5113495bSYour Name 
1649*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1650*5113495bSYour Name }
1651*5113495bSYour Name 
extract_twt_disable_comp_event_tlv(wmi_unified_t wmi_handle,uint8_t * evt_buf,struct wmi_twt_disable_complete_event * params)1652*5113495bSYour Name static QDF_STATUS extract_twt_disable_comp_event_tlv(wmi_unified_t wmi_handle,
1653*5113495bSYour Name 		uint8_t *evt_buf,
1654*5113495bSYour Name 		struct wmi_twt_disable_complete_event *params)
1655*5113495bSYour Name {
1656*5113495bSYour Name 	WMI_TWT_DISABLE_COMPLETE_EVENTID_param_tlvs *param_buf;
1657*5113495bSYour Name 	wmi_twt_disable_complete_event_fixed_param *ev;
1658*5113495bSYour Name 
1659*5113495bSYour Name 	param_buf = (WMI_TWT_DISABLE_COMPLETE_EVENTID_param_tlvs *)evt_buf;
1660*5113495bSYour Name 	if (!param_buf) {
1661*5113495bSYour Name 		wmi_err("evt_buf is NULL");
1662*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
1663*5113495bSYour Name 	}
1664*5113495bSYour Name 
1665*5113495bSYour Name 	ev = param_buf->fixed_param;
1666*5113495bSYour Name 
1667*5113495bSYour Name #if 0
1668*5113495bSYour Name 	params->pdev_id =
1669*5113495bSYour Name 		wmi_handle->ops->convert_pdev_id_target_to_host(wmi_handle,
1670*5113495bSYour Name 								ev->pdev_id);
1671*5113495bSYour Name 	params->status = ev->status;
1672*5113495bSYour Name #endif
1673*5113495bSYour Name 
1674*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1675*5113495bSYour Name }
1676*5113495bSYour Name 
1677*5113495bSYour Name static enum WMI_HOST_ADD_TWT_STATUS
wmi_get_converted_twt_add_dialog_status(WMI_ADD_TWT_STATUS_T tgt_status)1678*5113495bSYour Name wmi_get_converted_twt_add_dialog_status(WMI_ADD_TWT_STATUS_T tgt_status)
1679*5113495bSYour Name {
1680*5113495bSYour Name 	switch (tgt_status) {
1681*5113495bSYour Name 	case WMI_ADD_TWT_STATUS_OK:
1682*5113495bSYour Name 		return WMI_HOST_ADD_TWT_STATUS_OK;
1683*5113495bSYour Name 	case WMI_ADD_TWT_STATUS_TWT_NOT_ENABLED:
1684*5113495bSYour Name 		return WMI_HOST_ADD_TWT_STATUS_TWT_NOT_ENABLED;
1685*5113495bSYour Name 	case WMI_ADD_TWT_STATUS_USED_DIALOG_ID:
1686*5113495bSYour Name 		return WMI_HOST_ADD_TWT_STATUS_USED_DIALOG_ID;
1687*5113495bSYour Name 	case WMI_ADD_TWT_STATUS_INVALID_PARAM:
1688*5113495bSYour Name 		return WMI_HOST_ADD_TWT_STATUS_INVALID_PARAM;
1689*5113495bSYour Name 	case WMI_ADD_TWT_STATUS_NOT_READY:
1690*5113495bSYour Name 		return WMI_HOST_ADD_TWT_STATUS_NOT_READY;
1691*5113495bSYour Name 	case WMI_ADD_TWT_STATUS_NO_RESOURCE:
1692*5113495bSYour Name 		return WMI_HOST_ADD_TWT_STATUS_NO_RESOURCE;
1693*5113495bSYour Name 	case WMI_ADD_TWT_STATUS_NO_ACK:
1694*5113495bSYour Name 		return WMI_HOST_ADD_TWT_STATUS_NO_ACK;
1695*5113495bSYour Name 	case WMI_ADD_TWT_STATUS_NO_RESPONSE:
1696*5113495bSYour Name 		return WMI_HOST_ADD_TWT_STATUS_NO_RESPONSE;
1697*5113495bSYour Name 	case WMI_ADD_TWT_STATUS_DENIED:
1698*5113495bSYour Name 		return WMI_HOST_ADD_TWT_STATUS_DENIED;
1699*5113495bSYour Name 	case WMI_ADD_TWT_STATUS_AP_PARAMS_NOT_IN_RANGE:
1700*5113495bSYour Name 		return WMI_HOST_ADD_TWT_STATUS_AP_PARAMS_NOT_IN_RANGE;
1701*5113495bSYour Name 	case WMI_ADD_TWT_STATUS_AP_IE_VALIDATION_FAILED:
1702*5113495bSYour Name 		return WMI_HOST_ADD_TWT_STATUS_AP_IE_VALIDATION_FAILED;
1703*5113495bSYour Name 	case WMI_ADD_TWT_STATUS_ROAM_IN_PROGRESS:
1704*5113495bSYour Name 		return WMI_HOST_ADD_TWT_STATUS_ROAM_IN_PROGRESS;
1705*5113495bSYour Name 	case WMI_ADD_TWT_STATUS_CHAN_SW_IN_PROGRESS:
1706*5113495bSYour Name 		return WMI_HOST_ADD_TWT_STATUS_CHAN_SW_IN_PROGRESS;
1707*5113495bSYour Name 	case WMI_ADD_TWT_STATUS_SCAN_IN_PROGRESS:
1708*5113495bSYour Name 		return WMI_HOST_ADD_TWT_STATUS_SCAN_IN_PROGRESS;
1709*5113495bSYour Name 	case WMI_ADD_TWT_STATUS_LINK_SWITCH_IN_PROGRESS:
1710*5113495bSYour Name 		return WMI_HOST_ADD_TWT_STATUS_LINK_SWITCH_IN_PROGRESS;
1711*5113495bSYour Name 	case WMI_ADD_TWT_STATUS_UNSUPPORTED_MODE_MLMR:
1712*5113495bSYour Name 		return WMI_HOST_ADD_TWT_STATUS_UNSUPPORTED_MODE_MLMR;
1713*5113495bSYour Name 	default:
1714*5113495bSYour Name 		return WMI_HOST_ADD_TWT_STATUS_UNKNOWN_ERROR;
1715*5113495bSYour Name 	}
1716*5113495bSYour Name }
1717*5113495bSYour Name 
1718*5113495bSYour Name /**
1719*5113495bSYour Name  * extract_twt_add_dialog_comp_event_tlv - Extacts twt add dialog complete wmi
1720*5113495bSYour Name  * event from firmware
1721*5113495bSYour Name  * @wmi_handle: WMI handle
1722*5113495bSYour Name  * @evt_buf: Pointer to wmi event buf of twt add dialog complete event
1723*5113495bSYour Name  * @params: Pointer to store the extracted parameters
1724*5113495bSYour Name  *
1725*5113495bSYour Name  * Return: QDF_STATUS_SUCCESS on success or QDF STATUS error values on failure
1726*5113495bSYour Name  */
extract_twt_add_dialog_comp_event_tlv(wmi_unified_t wmi_handle,uint8_t * evt_buf,struct wmi_twt_add_dialog_complete_event_param * params)1727*5113495bSYour Name static QDF_STATUS extract_twt_add_dialog_comp_event_tlv(
1728*5113495bSYour Name 		wmi_unified_t wmi_handle,
1729*5113495bSYour Name 		uint8_t *evt_buf,
1730*5113495bSYour Name 		struct wmi_twt_add_dialog_complete_event_param *params)
1731*5113495bSYour Name {
1732*5113495bSYour Name 	WMI_TWT_ADD_DIALOG_COMPLETE_EVENTID_param_tlvs *param_buf;
1733*5113495bSYour Name 	wmi_twt_add_dialog_complete_event_fixed_param *ev;
1734*5113495bSYour Name 
1735*5113495bSYour Name 	param_buf = (WMI_TWT_ADD_DIALOG_COMPLETE_EVENTID_param_tlvs *)evt_buf;
1736*5113495bSYour Name 	if (!param_buf) {
1737*5113495bSYour Name 		wmi_err("evt_buf is NULL");
1738*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
1739*5113495bSYour Name 	}
1740*5113495bSYour Name 
1741*5113495bSYour Name 	ev = param_buf->fixed_param;
1742*5113495bSYour Name 
1743*5113495bSYour Name 	params->vdev_id = ev->vdev_id;
1744*5113495bSYour Name 	WMI_MAC_ADDR_TO_CHAR_ARRAY(&ev->peer_macaddr, params->peer_macaddr);
1745*5113495bSYour Name 	params->status = wmi_get_converted_twt_add_dialog_status(ev->status);
1746*5113495bSYour Name 	params->dialog_id = ev->dialog_id;
1747*5113495bSYour Name 	params->num_additional_twt_params = param_buf->num_twt_params;
1748*5113495bSYour Name 
1749*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1750*5113495bSYour Name }
1751*5113495bSYour Name 
1752*5113495bSYour Name /**
1753*5113495bSYour Name  * extract_twt_add_dialog_comp_additional_parameters() - Extracts additional twt
1754*5113495bSYour Name  * twt parameters, as part of add dialog completion event
1755*5113495bSYour Name  * @wmi_handle: wmi handle
1756*5113495bSYour Name  * @evt_buf: Pointer event buffer
1757*5113495bSYour Name  * @evt_buf_len: length of the add dialog event buffer
1758*5113495bSYour Name  * @idx: index of num_twt_params
1759*5113495bSYour Name  * @additional_params: twt additional parameters to extract
1760*5113495bSYour Name  *
1761*5113495bSYour Name  * Return: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_INVAL for failure
1762*5113495bSYour Name  */
extract_twt_add_dialog_comp_additional_parameters(wmi_unified_t wmi_handle,uint8_t * evt_buf,uint32_t evt_buf_len,uint32_t idx,struct wmi_twt_add_dialog_additional_params * additional_params)1763*5113495bSYour Name static QDF_STATUS extract_twt_add_dialog_comp_additional_parameters
1764*5113495bSYour Name (
1765*5113495bSYour Name 	wmi_unified_t wmi_handle, uint8_t *evt_buf,
1766*5113495bSYour Name 	uint32_t evt_buf_len, uint32_t idx,
1767*5113495bSYour Name 	struct wmi_twt_add_dialog_additional_params *additional_params
1768*5113495bSYour Name )
1769*5113495bSYour Name {
1770*5113495bSYour Name 	WMI_TWT_ADD_DIALOG_COMPLETE_EVENTID_param_tlvs *param_buf;
1771*5113495bSYour Name 	wmi_twt_add_dialog_complete_event_fixed_param *ev;
1772*5113495bSYour Name 	uint32_t flags = 0;
1773*5113495bSYour Name 	uint32_t expected_len;
1774*5113495bSYour Name 
1775*5113495bSYour Name 	param_buf = (WMI_TWT_ADD_DIALOG_COMPLETE_EVENTID_param_tlvs *)evt_buf;
1776*5113495bSYour Name 	if (!param_buf) {
1777*5113495bSYour Name 		wmi_err("evt_buf is NULL");
1778*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
1779*5113495bSYour Name 	}
1780*5113495bSYour Name 
1781*5113495bSYour Name 	ev = param_buf->fixed_param;
1782*5113495bSYour Name 
1783*5113495bSYour Name 	if (idx >= param_buf->num_twt_params) {
1784*5113495bSYour Name 		wmi_err("Invalid idx %d while num_twt_params = %d",
1785*5113495bSYour Name 			 idx, param_buf->num_twt_params);
1786*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
1787*5113495bSYour Name 	}
1788*5113495bSYour Name 
1789*5113495bSYour Name 	if (!param_buf->twt_params) {
1790*5113495bSYour Name 		wmi_err("Unable to extract additional twt parameters");
1791*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
1792*5113495bSYour Name 	}
1793*5113495bSYour Name 
1794*5113495bSYour Name 	expected_len = (sizeof(wmi_twt_add_dialog_complete_event_fixed_param) +
1795*5113495bSYour Name 			WMI_TLV_HDR_SIZE + (param_buf->num_twt_params *
1796*5113495bSYour Name 			sizeof(wmi_twt_add_dialog_additional_params)));
1797*5113495bSYour Name 
1798*5113495bSYour Name 	if (evt_buf_len != expected_len) {
1799*5113495bSYour Name 		wmi_err("Got invalid len data from FW %d expected %d",
1800*5113495bSYour Name 			 evt_buf_len, expected_len);
1801*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
1802*5113495bSYour Name 	}
1803*5113495bSYour Name 
1804*5113495bSYour Name 	flags = param_buf->twt_params[idx].flags;
1805*5113495bSYour Name 	additional_params->twt_cmd = TWT_FLAGS_GET_CMD(flags);
1806*5113495bSYour Name 	additional_params->bcast = TWT_FLAGS_GET_BROADCAST(flags);
1807*5113495bSYour Name 	additional_params->trig_en = TWT_FLAGS_GET_TRIGGER(flags);
1808*5113495bSYour Name 	additional_params->announce = TWT_FLAGS_GET_FLOW_TYPE(flags);
1809*5113495bSYour Name 	additional_params->protection = TWT_FLAGS_GET_PROTECTION(flags);
1810*5113495bSYour Name 	additional_params->b_twt_id0 = TWT_FLAGS_GET_BTWT_ID0(flags);
1811*5113495bSYour Name 	additional_params->info_frame_disabled =
1812*5113495bSYour Name 				TWT_FLAGS_GET_TWT_INFO_FRAME_DISABLED(flags);
1813*5113495bSYour Name 	additional_params->wake_dur_us = param_buf->twt_params[idx].wake_dur_us;
1814*5113495bSYour Name 	additional_params->wake_intvl_us =
1815*5113495bSYour Name 				param_buf->twt_params[idx].wake_intvl_us;
1816*5113495bSYour Name 	additional_params->sp_offset_us =
1817*5113495bSYour Name 				param_buf->twt_params[idx].sp_offset_us;
1818*5113495bSYour Name 	additional_params->sp_tsf_us_lo =
1819*5113495bSYour Name 				param_buf->twt_params[idx].sp_tsf_us_lo;
1820*5113495bSYour Name 	additional_params->sp_tsf_us_hi =
1821*5113495bSYour Name 				param_buf->twt_params[idx].sp_tsf_us_hi;
1822*5113495bSYour Name 	additional_params->pm_responder_bit_valid =
1823*5113495bSYour Name 				TWT_FLAGS_GET_PM_RESPONDER_MODE_VALID(flags);
1824*5113495bSYour Name 	additional_params->pm_responder_bit =
1825*5113495bSYour Name 				TWT_FLAGS_GET_PM_RESPONDER_MODE(flags);
1826*5113495bSYour Name 
1827*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1828*5113495bSYour Name }
1829*5113495bSYour Name 
1830*5113495bSYour Name static enum WMI_HOST_DEL_TWT_STATUS
wmi_get_converted_twt_del_dialog_status(WMI_DEL_TWT_STATUS_T tgt_status)1831*5113495bSYour Name wmi_get_converted_twt_del_dialog_status(WMI_DEL_TWT_STATUS_T tgt_status)
1832*5113495bSYour Name {
1833*5113495bSYour Name 	switch (tgt_status) {
1834*5113495bSYour Name 	case WMI_DEL_TWT_STATUS_OK:
1835*5113495bSYour Name 		return WMI_HOST_DEL_TWT_STATUS_OK;
1836*5113495bSYour Name 	case WMI_DEL_TWT_STATUS_DIALOG_ID_NOT_EXIST:
1837*5113495bSYour Name 		return WMI_HOST_DEL_TWT_STATUS_DIALOG_ID_NOT_EXIST;
1838*5113495bSYour Name 	case WMI_DEL_TWT_STATUS_INVALID_PARAM:
1839*5113495bSYour Name 		return WMI_HOST_DEL_TWT_STATUS_INVALID_PARAM;
1840*5113495bSYour Name 	case WMI_DEL_TWT_STATUS_DIALOG_ID_BUSY:
1841*5113495bSYour Name 		return WMI_HOST_DEL_TWT_STATUS_DIALOG_ID_BUSY;
1842*5113495bSYour Name 	case WMI_DEL_TWT_STATUS_NO_RESOURCE:
1843*5113495bSYour Name 		return WMI_HOST_DEL_TWT_STATUS_NO_RESOURCE;
1844*5113495bSYour Name 	case WMI_DEL_TWT_STATUS_NO_ACK:
1845*5113495bSYour Name 		return WMI_HOST_DEL_TWT_STATUS_NO_ACK;
1846*5113495bSYour Name 	case WMI_DEL_TWT_STATUS_UNKNOWN_ERROR:
1847*5113495bSYour Name 		return WMI_HOST_DEL_TWT_STATUS_UNKNOWN_ERROR;
1848*5113495bSYour Name 	case WMI_DEL_TWT_STATUS_PEER_INIT_TEARDOWN:
1849*5113495bSYour Name 		return WMI_HOST_DEL_TWT_STATUS_PEER_INIT_TEARDOWN;
1850*5113495bSYour Name 	case WMI_DEL_TWT_STATUS_ROAMING:
1851*5113495bSYour Name 		return WMI_HOST_DEL_TWT_STATUS_ROAMING;
1852*5113495bSYour Name 	case WMI_DEL_TWT_STATUS_CONCURRENCY:
1853*5113495bSYour Name 		return WMI_HOST_DEL_TWT_STATUS_CONCURRENCY;
1854*5113495bSYour Name 	case WMI_DEL_TWT_STATUS_CHAN_SW_IN_PROGRESS:
1855*5113495bSYour Name 		return WMI_HOST_DEL_TWT_STATUS_CHAN_SW_IN_PROGRESS;
1856*5113495bSYour Name 	case WMI_DEL_TWT_STATUS_SCAN_IN_PROGRESS:
1857*5113495bSYour Name 		return WMI_HOST_DEL_TWT_STATUS_SCAN_IN_PROGRESS;
1858*5113495bSYour Name 	default:
1859*5113495bSYour Name 		return WMI_HOST_DEL_TWT_STATUS_UNKNOWN_ERROR;
1860*5113495bSYour Name 	}
1861*5113495bSYour Name 
1862*5113495bSYour Name 	return WMI_HOST_DEL_TWT_STATUS_UNKNOWN_ERROR;
1863*5113495bSYour Name }
1864*5113495bSYour Name 
extract_twt_del_dialog_comp_event_tlv(wmi_unified_t wmi_handle,uint8_t * evt_buf,struct wmi_twt_del_dialog_complete_event_param * params)1865*5113495bSYour Name static QDF_STATUS extract_twt_del_dialog_comp_event_tlv(
1866*5113495bSYour Name 		wmi_unified_t wmi_handle,
1867*5113495bSYour Name 		uint8_t *evt_buf,
1868*5113495bSYour Name 		struct wmi_twt_del_dialog_complete_event_param *params)
1869*5113495bSYour Name {
1870*5113495bSYour Name 	WMI_TWT_DEL_DIALOG_COMPLETE_EVENTID_param_tlvs *param_buf;
1871*5113495bSYour Name 	wmi_twt_del_dialog_complete_event_fixed_param *ev;
1872*5113495bSYour Name 
1873*5113495bSYour Name 	param_buf = (WMI_TWT_DEL_DIALOG_COMPLETE_EVENTID_param_tlvs *)evt_buf;
1874*5113495bSYour Name 	if (!param_buf) {
1875*5113495bSYour Name 		wmi_err("evt_buf is NULL");
1876*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
1877*5113495bSYour Name 	}
1878*5113495bSYour Name 
1879*5113495bSYour Name 	ev = param_buf->fixed_param;
1880*5113495bSYour Name 
1881*5113495bSYour Name 	params->vdev_id = ev->vdev_id;
1882*5113495bSYour Name 	WMI_MAC_ADDR_TO_CHAR_ARRAY(&ev->peer_macaddr, params->peer_macaddr);
1883*5113495bSYour Name 	params->dialog_id = ev->dialog_id;
1884*5113495bSYour Name 	params->status = wmi_get_converted_twt_del_dialog_status(ev->status);
1885*5113495bSYour Name 
1886*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1887*5113495bSYour Name }
1888*5113495bSYour Name 
1889*5113495bSYour Name static enum WMI_HOST_PAUSE_TWT_STATUS
wmi_twt_pause_status_to_host_twt_status(WMI_PAUSE_TWT_STATUS_T status)1890*5113495bSYour Name wmi_twt_pause_status_to_host_twt_status(WMI_PAUSE_TWT_STATUS_T status)
1891*5113495bSYour Name {
1892*5113495bSYour Name 	switch (status) {
1893*5113495bSYour Name 	case WMI_PAUSE_TWT_STATUS_OK:
1894*5113495bSYour Name 		return WMI_HOST_PAUSE_TWT_STATUS_OK;
1895*5113495bSYour Name 	case WMI_PAUSE_TWT_STATUS_DIALOG_ID_NOT_EXIST:
1896*5113495bSYour Name 		return WMI_HOST_PAUSE_TWT_STATUS_DIALOG_ID_NOT_EXIST;
1897*5113495bSYour Name 	case WMI_PAUSE_TWT_STATUS_INVALID_PARAM:
1898*5113495bSYour Name 		return WMI_HOST_PAUSE_TWT_STATUS_INVALID_PARAM;
1899*5113495bSYour Name 	case WMI_PAUSE_TWT_STATUS_DIALOG_ID_BUSY:
1900*5113495bSYour Name 		return WMI_HOST_PAUSE_TWT_STATUS_DIALOG_ID_BUSY;
1901*5113495bSYour Name 	case WMI_PAUSE_TWT_STATUS_NO_RESOURCE:
1902*5113495bSYour Name 		return WMI_HOST_PAUSE_TWT_STATUS_NO_RESOURCE;
1903*5113495bSYour Name 	case WMI_PAUSE_TWT_STATUS_NO_ACK:
1904*5113495bSYour Name 		return WMI_HOST_PAUSE_TWT_STATUS_NO_ACK;
1905*5113495bSYour Name 	case WMI_PAUSE_TWT_STATUS_UNKNOWN_ERROR:
1906*5113495bSYour Name 		return WMI_HOST_PAUSE_TWT_STATUS_UNKNOWN_ERROR;
1907*5113495bSYour Name 	case WMI_PAUSE_TWT_STATUS_ALREADY_PAUSED:
1908*5113495bSYour Name 		return WMI_HOST_PAUSE_TWT_STATUS_ALREADY_PAUSED;
1909*5113495bSYour Name 	case WMI_PAUSE_TWT_STATUS_CHAN_SW_IN_PROGRESS:
1910*5113495bSYour Name 		return WMI_HOST_PAUSE_TWT_STATUS_CHAN_SW_IN_PROGRESS;
1911*5113495bSYour Name 	case WMI_PAUSE_TWT_STATUS_ROAM_IN_PROGRESS:
1912*5113495bSYour Name 		return WMI_HOST_PAUSE_TWT_STATUS_ROAM_IN_PROGRESS;
1913*5113495bSYour Name 	case WMI_PAUSE_TWT_STATUS_SCAN_IN_PROGRESS:
1914*5113495bSYour Name 		return WMI_HOST_PAUSE_TWT_STATUS_SCAN_IN_PROGRESS;
1915*5113495bSYour Name 	default:
1916*5113495bSYour Name 		return WMI_HOST_PAUSE_TWT_STATUS_UNKNOWN_ERROR;
1917*5113495bSYour Name 	}
1918*5113495bSYour Name }
1919*5113495bSYour Name 
extract_twt_pause_dialog_comp_event_tlv(wmi_unified_t wmi_handle,uint8_t * evt_buf,struct wmi_twt_pause_dialog_complete_event_param * params)1920*5113495bSYour Name static QDF_STATUS extract_twt_pause_dialog_comp_event_tlv(
1921*5113495bSYour Name 		wmi_unified_t wmi_handle,
1922*5113495bSYour Name 		uint8_t *evt_buf,
1923*5113495bSYour Name 		struct wmi_twt_pause_dialog_complete_event_param *params)
1924*5113495bSYour Name {
1925*5113495bSYour Name 	WMI_TWT_PAUSE_DIALOG_COMPLETE_EVENTID_param_tlvs *param_buf;
1926*5113495bSYour Name 	wmi_twt_pause_dialog_complete_event_fixed_param *ev;
1927*5113495bSYour Name 
1928*5113495bSYour Name 	param_buf = (WMI_TWT_PAUSE_DIALOG_COMPLETE_EVENTID_param_tlvs *)evt_buf;
1929*5113495bSYour Name 	if (!param_buf) {
1930*5113495bSYour Name 		wmi_err("evt_buf is NULL");
1931*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
1932*5113495bSYour Name 	}
1933*5113495bSYour Name 
1934*5113495bSYour Name 	ev = param_buf->fixed_param;
1935*5113495bSYour Name 
1936*5113495bSYour Name 	params->vdev_id = ev->vdev_id;
1937*5113495bSYour Name 	WMI_MAC_ADDR_TO_CHAR_ARRAY(&ev->peer_macaddr, params->peer_macaddr);
1938*5113495bSYour Name 	params->status = wmi_twt_pause_status_to_host_twt_status(ev->status);
1939*5113495bSYour Name 	params->dialog_id = ev->dialog_id;
1940*5113495bSYour Name 
1941*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1942*5113495bSYour Name }
1943*5113495bSYour Name 
1944*5113495bSYour Name static enum WMI_HOST_NUDGE_TWT_STATUS
wmi_twt_nudge_status_to_host_twt_status(WMI_TWT_NUDGE_STATUS_T status)1945*5113495bSYour Name wmi_twt_nudge_status_to_host_twt_status(WMI_TWT_NUDGE_STATUS_T status)
1946*5113495bSYour Name {
1947*5113495bSYour Name 	switch (status) {
1948*5113495bSYour Name 	case WMI_NUDGE_TWT_STATUS_OK:
1949*5113495bSYour Name 		return WMI_HOST_NUDGE_TWT_STATUS_OK;
1950*5113495bSYour Name 	case WMI_NUDGE_TWT_STATUS_DIALOG_ID_NOT_EXIST:
1951*5113495bSYour Name 		return WMI_HOST_NUDGE_TWT_STATUS_DIALOG_ID_NOT_EXIST;
1952*5113495bSYour Name 	case WMI_NUDGE_TWT_STATUS_INVALID_PARAM:
1953*5113495bSYour Name 		return WMI_HOST_NUDGE_TWT_STATUS_INVALID_PARAM;
1954*5113495bSYour Name 	case WMI_NUDGE_TWT_STATUS_DIALOG_ID_BUSY:
1955*5113495bSYour Name 		return WMI_HOST_NUDGE_TWT_STATUS_DIALOG_ID_BUSY;
1956*5113495bSYour Name 	case WMI_NUDGE_TWT_STATUS_NO_RESOURCE:
1957*5113495bSYour Name 		return WMI_HOST_NUDGE_TWT_STATUS_NO_RESOURCE;
1958*5113495bSYour Name 	case WMI_NUDGE_TWT_STATUS_NO_ACK:
1959*5113495bSYour Name 		return WMI_HOST_NUDGE_TWT_STATUS_NO_ACK;
1960*5113495bSYour Name 	case WMI_NUDGE_TWT_STATUS_UNKNOWN_ERROR:
1961*5113495bSYour Name 		return WMI_HOST_NUDGE_TWT_STATUS_UNKNOWN_ERROR;
1962*5113495bSYour Name 	case WMI_NUDGE_TWT_STATUS_ALREADY_PAUSED:
1963*5113495bSYour Name 		return WMI_HOST_NUDGE_TWT_STATUS_ALREADY_PAUSED;
1964*5113495bSYour Name 	case WMI_NUDGE_TWT_STATUS_CHAN_SW_IN_PROGRESS:
1965*5113495bSYour Name 		return WMI_HOST_NUDGE_TWT_STATUS_CHAN_SW_IN_PROGRESS;
1966*5113495bSYour Name 	case WMI_NUDGE_TWT_STATUS_ROAM_IN_PROGRESS:
1967*5113495bSYour Name 		return WMI_HOST_NUDGE_TWT_STATUS_ROAM_IN_PROGRESS;
1968*5113495bSYour Name 	case WMI_NUDGE_TWT_STATUS_SCAN_IN_PROGRESS:
1969*5113495bSYour Name 		return WMI_HOST_NUDGE_TWT_STATUS_SCAN_IN_PROGRESS;
1970*5113495bSYour Name 	default:
1971*5113495bSYour Name 		return WMI_HOST_NUDGE_TWT_STATUS_UNKNOWN_ERROR;
1972*5113495bSYour Name 	}
1973*5113495bSYour Name }
1974*5113495bSYour Name 
extract_twt_nudge_dialog_comp_event_tlv(wmi_unified_t wmi_handle,uint8_t * evt_buf,struct wmi_twt_nudge_dialog_complete_event_param * params)1975*5113495bSYour Name static QDF_STATUS extract_twt_nudge_dialog_comp_event_tlv(
1976*5113495bSYour Name 		wmi_unified_t wmi_handle,
1977*5113495bSYour Name 		uint8_t *evt_buf,
1978*5113495bSYour Name 		struct wmi_twt_nudge_dialog_complete_event_param *params)
1979*5113495bSYour Name {
1980*5113495bSYour Name 	WMI_TWT_NUDGE_DIALOG_COMPLETE_EVENTID_param_tlvs *param_buf;
1981*5113495bSYour Name 	wmi_twt_nudge_dialog_complete_event_fixed_param *ev;
1982*5113495bSYour Name 
1983*5113495bSYour Name 	param_buf = (WMI_TWT_NUDGE_DIALOG_COMPLETE_EVENTID_param_tlvs *)evt_buf;
1984*5113495bSYour Name 	if (!param_buf) {
1985*5113495bSYour Name 		wmi_err("evt_buf is NULL");
1986*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
1987*5113495bSYour Name 	}
1988*5113495bSYour Name 
1989*5113495bSYour Name 	ev = param_buf->fixed_param;
1990*5113495bSYour Name 
1991*5113495bSYour Name 	params->vdev_id = ev->vdev_id;
1992*5113495bSYour Name 	WMI_MAC_ADDR_TO_CHAR_ARRAY(&ev->peer_macaddr, params->peer_macaddr);
1993*5113495bSYour Name 	params->status = wmi_twt_nudge_status_to_host_twt_status(ev->status);
1994*5113495bSYour Name 	params->dialog_id = ev->dialog_id;
1995*5113495bSYour Name 	params->next_twt_tsf_us_lo = ev->sp_tsf_us_lo;
1996*5113495bSYour Name 	params->next_twt_tsf_us_hi = ev->sp_tsf_us_hi;
1997*5113495bSYour Name 
1998*5113495bSYour Name 	wmi_debug("vdev_id: %d dialog_id: %d tsf hi : %x tsf lo: %x",
1999*5113495bSYour Name 		  params->vdev_id, params->dialog_id,
2000*5113495bSYour Name 		  params->next_twt_tsf_us_hi, params->next_twt_tsf_us_lo);
2001*5113495bSYour Name 
2002*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
2003*5113495bSYour Name }
2004*5113495bSYour Name 
2005*5113495bSYour Name static enum WMI_HOST_RESUME_TWT_STATUS
wmi_get_converted_twt_resume_dialog_status(WMI_RESUME_TWT_STATUS_T tgt_status)2006*5113495bSYour Name wmi_get_converted_twt_resume_dialog_status(WMI_RESUME_TWT_STATUS_T tgt_status)
2007*5113495bSYour Name {
2008*5113495bSYour Name 	switch (tgt_status) {
2009*5113495bSYour Name 	case WMI_RESUME_TWT_STATUS_OK:
2010*5113495bSYour Name 		return WMI_HOST_RESUME_TWT_STATUS_OK;
2011*5113495bSYour Name 	case WMI_RESUME_TWT_STATUS_DIALOG_ID_NOT_EXIST:
2012*5113495bSYour Name 		return WMI_HOST_RESUME_TWT_STATUS_DIALOG_ID_NOT_EXIST;
2013*5113495bSYour Name 	case WMI_RESUME_TWT_STATUS_INVALID_PARAM:
2014*5113495bSYour Name 		return WMI_HOST_RESUME_TWT_STATUS_INVALID_PARAM;
2015*5113495bSYour Name 	case WMI_RESUME_TWT_STATUS_DIALOG_ID_BUSY:
2016*5113495bSYour Name 		return WMI_HOST_RESUME_TWT_STATUS_DIALOG_ID_BUSY;
2017*5113495bSYour Name 	case WMI_RESUME_TWT_STATUS_NOT_PAUSED:
2018*5113495bSYour Name 		return WMI_HOST_RESUME_TWT_STATUS_NOT_PAUSED;
2019*5113495bSYour Name 	case WMI_RESUME_TWT_STATUS_NO_RESOURCE:
2020*5113495bSYour Name 		return WMI_HOST_RESUME_TWT_STATUS_NO_RESOURCE;
2021*5113495bSYour Name 	case WMI_RESUME_TWT_STATUS_NO_ACK:
2022*5113495bSYour Name 		return WMI_HOST_RESUME_TWT_STATUS_NO_ACK;
2023*5113495bSYour Name 	case WMI_RESUME_TWT_STATUS_CHAN_SW_IN_PROGRESS:
2024*5113495bSYour Name 		return WMI_HOST_RESUME_TWT_STATUS_CHAN_SW_IN_PROGRESS;
2025*5113495bSYour Name 	case WMI_RESUME_TWT_STATUS_ROAM_IN_PROGRESS:
2026*5113495bSYour Name 		return WMI_HOST_RESUME_TWT_STATUS_ROAM_IN_PROGRESS;
2027*5113495bSYour Name 	case WMI_RESUME_TWT_STATUS_SCAN_IN_PROGRESS:
2028*5113495bSYour Name 		return WMI_HOST_RESUME_TWT_STATUS_SCAN_IN_PROGRESS;
2029*5113495bSYour Name 	default:
2030*5113495bSYour Name 		return WMI_HOST_RESUME_TWT_STATUS_UNKNOWN_ERROR;
2031*5113495bSYour Name 	}
2032*5113495bSYour Name }
2033*5113495bSYour Name 
extract_twt_resume_dialog_comp_event_tlv(wmi_unified_t wmi_handle,uint8_t * evt_buf,struct wmi_twt_resume_dialog_complete_event_param * params)2034*5113495bSYour Name static QDF_STATUS extract_twt_resume_dialog_comp_event_tlv(
2035*5113495bSYour Name 		wmi_unified_t wmi_handle,
2036*5113495bSYour Name 		uint8_t *evt_buf,
2037*5113495bSYour Name 		struct wmi_twt_resume_dialog_complete_event_param *params)
2038*5113495bSYour Name {
2039*5113495bSYour Name 	WMI_TWT_RESUME_DIALOG_COMPLETE_EVENTID_param_tlvs *param_buf;
2040*5113495bSYour Name 	wmi_twt_resume_dialog_complete_event_fixed_param *ev;
2041*5113495bSYour Name 
2042*5113495bSYour Name 	param_buf =
2043*5113495bSYour Name 		(WMI_TWT_RESUME_DIALOG_COMPLETE_EVENTID_param_tlvs *)evt_buf;
2044*5113495bSYour Name 	if (!param_buf) {
2045*5113495bSYour Name 		wmi_err("evt_buf is NULL");
2046*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
2047*5113495bSYour Name 	}
2048*5113495bSYour Name 
2049*5113495bSYour Name 	ev = param_buf->fixed_param;
2050*5113495bSYour Name 
2051*5113495bSYour Name 	params->vdev_id = ev->vdev_id;
2052*5113495bSYour Name 	WMI_MAC_ADDR_TO_CHAR_ARRAY(&ev->peer_macaddr, params->peer_macaddr);
2053*5113495bSYour Name 	params->status = wmi_get_converted_twt_resume_dialog_status(ev->status);
2054*5113495bSYour Name 	params->dialog_id = ev->dialog_id;
2055*5113495bSYour Name 
2056*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
2057*5113495bSYour Name }
2058*5113495bSYour Name 
extract_twt_notify_event_tlv(wmi_unified_t wmi_handle,uint8_t * evt_buf,struct wmi_twt_notify_event_param * params)2059*5113495bSYour Name static QDF_STATUS extract_twt_notify_event_tlv(
2060*5113495bSYour Name 		wmi_unified_t wmi_handle,
2061*5113495bSYour Name 		uint8_t *evt_buf,
2062*5113495bSYour Name 		struct wmi_twt_notify_event_param *params)
2063*5113495bSYour Name {
2064*5113495bSYour Name 	WMI_TWT_NOTIFY_EVENTID_param_tlvs *param_buf;
2065*5113495bSYour Name 	wmi_twt_notify_event_fixed_param *ev;
2066*5113495bSYour Name 
2067*5113495bSYour Name 	param_buf =
2068*5113495bSYour Name 		(WMI_TWT_NOTIFY_EVENTID_param_tlvs *)evt_buf;
2069*5113495bSYour Name 	if (!param_buf) {
2070*5113495bSYour Name 		wmi_err("evt_buf is NULL");
2071*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
2072*5113495bSYour Name 	}
2073*5113495bSYour Name 
2074*5113495bSYour Name 	ev = param_buf->fixed_param;
2075*5113495bSYour Name 
2076*5113495bSYour Name 	params->vdev_id = ev->vdev_id;
2077*5113495bSYour Name 
2078*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
2079*5113495bSYour Name }
2080*5113495bSYour Name 
2081*5113495bSYour Name #ifdef WLAN_SUPPORT_BCAST_TWT
2082*5113495bSYour Name static QDF_STATUS
extract_twt_btwt_invite_sta_comp_event_tlv(wmi_unified_t wmi_handle,uint8_t * evt_buf,struct wmi_twt_btwt_invite_sta_complete_event_param * params)2083*5113495bSYour Name extract_twt_btwt_invite_sta_comp_event_tlv(
2084*5113495bSYour Name 					   wmi_unified_t wmi_handle,
2085*5113495bSYour Name 					   uint8_t *evt_buf,
2086*5113495bSYour Name 					   struct
2087*5113495bSYour Name 					   wmi_twt_btwt_invite_sta_complete_event_param
2088*5113495bSYour Name 					   *params)
2089*5113495bSYour Name {
2090*5113495bSYour Name 	WMI_TWT_BTWT_INVITE_STA_COMPLETE_EVENTID_param_tlvs *param_buf;
2091*5113495bSYour Name 	wmi_twt_btwt_invite_sta_complete_event_fixed_param *ev;
2092*5113495bSYour Name 
2093*5113495bSYour Name 	param_buf =
2094*5113495bSYour Name 		(WMI_TWT_BTWT_INVITE_STA_COMPLETE_EVENTID_param_tlvs *)evt_buf;
2095*5113495bSYour Name 	if (!param_buf) {
2096*5113495bSYour Name 		wmi_err("evt_buf is NULL");
2097*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
2098*5113495bSYour Name 	}
2099*5113495bSYour Name 
2100*5113495bSYour Name 	ev = param_buf->fixed_param;
2101*5113495bSYour Name 
2102*5113495bSYour Name 	params->vdev_id = ev->vdev_id;
2103*5113495bSYour Name 	WMI_MAC_ADDR_TO_CHAR_ARRAY(&ev->peer_macaddr, params->peer_macaddr);
2104*5113495bSYour Name 	params->status = ev->status;
2105*5113495bSYour Name 	params->dialog_id = ev->dialog_id;
2106*5113495bSYour Name 
2107*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
2108*5113495bSYour Name }
2109*5113495bSYour Name 
2110*5113495bSYour Name static QDF_STATUS
extract_twt_btwt_remove_sta_comp_event_tlv(wmi_unified_t wmi_handle,uint8_t * evt_buf,struct wmi_twt_btwt_remove_sta_complete_event_param * params)2111*5113495bSYour Name extract_twt_btwt_remove_sta_comp_event_tlv(
2112*5113495bSYour Name 					   wmi_unified_t wmi_handle,
2113*5113495bSYour Name 					   uint8_t *evt_buf,
2114*5113495bSYour Name 					   struct
2115*5113495bSYour Name 					   wmi_twt_btwt_remove_sta_complete_event_param
2116*5113495bSYour Name 					   *params)
2117*5113495bSYour Name {
2118*5113495bSYour Name 	WMI_TWT_BTWT_REMOVE_STA_COMPLETE_EVENTID_param_tlvs *param_buf;
2119*5113495bSYour Name 	wmi_twt_btwt_remove_sta_complete_event_fixed_param *ev;
2120*5113495bSYour Name 
2121*5113495bSYour Name 	param_buf =
2122*5113495bSYour Name 		(WMI_TWT_BTWT_REMOVE_STA_COMPLETE_EVENTID_param_tlvs *)evt_buf;
2123*5113495bSYour Name 	if (!param_buf) {
2124*5113495bSYour Name 		wmi_err("evt_buf is NULL");
2125*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
2126*5113495bSYour Name 	}
2127*5113495bSYour Name 
2128*5113495bSYour Name 	ev = param_buf->fixed_param;
2129*5113495bSYour Name 
2130*5113495bSYour Name 	params->vdev_id = ev->vdev_id;
2131*5113495bSYour Name 	WMI_MAC_ADDR_TO_CHAR_ARRAY(&ev->peer_macaddr, params->peer_macaddr);
2132*5113495bSYour Name 	params->status = ev->status;
2133*5113495bSYour Name 	params->dialog_id = ev->dialog_id;
2134*5113495bSYour Name 
2135*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
2136*5113495bSYour Name }
2137*5113495bSYour Name #endif
2138*5113495bSYour Name 
2139*5113495bSYour Name #ifdef WLAN_SUPPORT_BCAST_TWT
2140*5113495bSYour Name static void
wmi_twt_attach_bcast_twt_tlv(struct wmi_ops * ops)2141*5113495bSYour Name wmi_twt_attach_bcast_twt_tlv(struct wmi_ops *ops)
2142*5113495bSYour Name {
2143*5113495bSYour Name 	ops->send_twt_btwt_invite_sta_cmd = send_twt_btwt_invite_sta_cmd_tlv;
2144*5113495bSYour Name 	ops->send_twt_btwt_remove_sta_cmd = send_twt_btwt_remove_sta_cmd_tlv;
2145*5113495bSYour Name 	ops->extract_twt_btwt_invite_sta_comp_event =
2146*5113495bSYour Name 				extract_twt_btwt_invite_sta_comp_event_tlv;
2147*5113495bSYour Name 	ops->extract_twt_btwt_remove_sta_comp_event =
2148*5113495bSYour Name 				extract_twt_btwt_remove_sta_comp_event_tlv;
2149*5113495bSYour Name }
2150*5113495bSYour Name #else
2151*5113495bSYour Name static void
wmi_twt_attach_bcast_twt_tlv(struct wmi_ops * ops)2152*5113495bSYour Name wmi_twt_attach_bcast_twt_tlv(struct wmi_ops *ops)
2153*5113495bSYour Name {
2154*5113495bSYour Name }
2155*5113495bSYour Name #endif
2156*5113495bSYour Name 
2157*5113495bSYour Name static QDF_STATUS
extract_twt_session_stats_event_tlv(wmi_unified_t wmi_handle,uint8_t * evt_buf,struct wmi_twt_session_stats_event_param * params)2158*5113495bSYour Name extract_twt_session_stats_event_tlv(wmi_unified_t wmi_handle,
2159*5113495bSYour Name 				    uint8_t *evt_buf,
2160*5113495bSYour Name 				    struct wmi_twt_session_stats_event_param
2161*5113495bSYour Name 				    *params)
2162*5113495bSYour Name {
2163*5113495bSYour Name 	WMI_TWT_SESSION_STATS_EVENTID_param_tlvs *param_buf;
2164*5113495bSYour Name 	wmi_pdev_twt_session_stats_event_fixed_param *ev;
2165*5113495bSYour Name 
2166*5113495bSYour Name 	param_buf =
2167*5113495bSYour Name 		(WMI_TWT_SESSION_STATS_EVENTID_param_tlvs *)evt_buf;
2168*5113495bSYour Name 	if (!param_buf) {
2169*5113495bSYour Name 		wmi_err("evt_buf is NULL");
2170*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
2171*5113495bSYour Name 	}
2172*5113495bSYour Name 
2173*5113495bSYour Name 	ev = param_buf->fixed_param;
2174*5113495bSYour Name 	params->pdev_id = wmi_handle->ops->convert_pdev_id_target_to_host(
2175*5113495bSYour Name 							wmi_handle,
2176*5113495bSYour Name 							ev->pdev_id);
2177*5113495bSYour Name 	params->num_sessions = param_buf->num_twt_sessions;
2178*5113495bSYour Name 
2179*5113495bSYour Name 	wmi_debug("pdev_id=%d, num of TWT sessions=%d",
2180*5113495bSYour Name 		 params->pdev_id, params->num_sessions);
2181*5113495bSYour Name 
2182*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
2183*5113495bSYour Name }
2184*5113495bSYour Name 
2185*5113495bSYour Name static QDF_STATUS
extract_twt_session_stats_event_data(wmi_unified_t wmi_handle,uint8_t * evt_buf,struct wmi_twt_session_stats_event_param * params,struct wmi_host_twt_session_stats_info * session,uint32_t idx)2186*5113495bSYour Name extract_twt_session_stats_event_data(wmi_unified_t wmi_handle,
2187*5113495bSYour Name 				     uint8_t *evt_buf,
2188*5113495bSYour Name 				     struct wmi_twt_session_stats_event_param
2189*5113495bSYour Name 				     *params,
2190*5113495bSYour Name 				     struct wmi_host_twt_session_stats_info
2191*5113495bSYour Name 				     *session,
2192*5113495bSYour Name 				     uint32_t idx)
2193*5113495bSYour Name {
2194*5113495bSYour Name 	WMI_TWT_SESSION_STATS_EVENTID_param_tlvs *param_buf;
2195*5113495bSYour Name 	wmi_twt_session_stats_info *twt_session;
2196*5113495bSYour Name 	uint32_t flags;
2197*5113495bSYour Name 	wmi_mac_addr *m1;
2198*5113495bSYour Name 	uint8_t *m2;
2199*5113495bSYour Name 
2200*5113495bSYour Name 	param_buf =
2201*5113495bSYour Name 		(WMI_TWT_SESSION_STATS_EVENTID_param_tlvs *)evt_buf;
2202*5113495bSYour Name 	if (!param_buf) {
2203*5113495bSYour Name 		wmi_err("evt_buf is NULL");
2204*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
2205*5113495bSYour Name 	}
2206*5113495bSYour Name 
2207*5113495bSYour Name 	if (idx >= param_buf->num_twt_sessions) {
2208*5113495bSYour Name 		wmi_err("wrong idx, idx=%d, num_sessions=%d",
2209*5113495bSYour Name 			 idx, param_buf->num_twt_sessions);
2210*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
2211*5113495bSYour Name 	}
2212*5113495bSYour Name 
2213*5113495bSYour Name 	twt_session = &param_buf->twt_sessions[idx];
2214*5113495bSYour Name 
2215*5113495bSYour Name 	session->vdev_id = twt_session->vdev_id;
2216*5113495bSYour Name 	m1 = &twt_session->peer_mac;
2217*5113495bSYour Name 	m2 = session->peer_mac;
2218*5113495bSYour Name 	WMI_MAC_ADDR_TO_CHAR_ARRAY(m1, m2);
2219*5113495bSYour Name 	session->event_type = twt_session->event_type;
2220*5113495bSYour Name 	flags = twt_session->flow_id_flags;
2221*5113495bSYour Name 	session->flow_id = WMI_TWT_SESSION_FLAG_FLOW_ID_GET(flags);
2222*5113495bSYour Name 	session->bcast = WMI_TWT_SESSION_FLAG_BCAST_TWT_GET(flags);
2223*5113495bSYour Name 	session->trig = WMI_TWT_SESSION_FLAG_TRIGGER_TWT_GET(flags);
2224*5113495bSYour Name 	session->announ = WMI_TWT_SESSION_FLAG_ANNOUN_TWT_GET(flags);
2225*5113495bSYour Name 	session->protection = WMI_TWT_SESSION_FLAG_TWT_PROTECTION_GET(flags);
2226*5113495bSYour Name 	session->info_frame_disabled =
2227*5113495bSYour Name 			WMI_TWT_SESSION_FLAG_TWT_INFO_FRAME_DISABLED_GET(flags);
2228*5113495bSYour Name 	session->pm_responder_bit =
2229*5113495bSYour Name 			WMI_TWT_SESSION_FLAG_TWT_PM_RESPONDER_MODE_GET(flags);
2230*5113495bSYour Name 	session->pm_responder_bit_valid =
2231*5113495bSYour Name 		WMI_TWT_SESSION_FLAG_TWT_PM_RESPONDER_MODE_VALID_GET(flags);
2232*5113495bSYour Name 	session->dialog_id = twt_session->dialog_id;
2233*5113495bSYour Name 	session->wake_dura_us = twt_session->wake_dura_us;
2234*5113495bSYour Name 	session->wake_intvl_us = twt_session->wake_intvl_us;
2235*5113495bSYour Name 	session->sp_offset_us = twt_session->sp_offset_us;
2236*5113495bSYour Name 	session->sp_tsf_us_lo = twt_session->sp_tsf_us_lo;
2237*5113495bSYour Name 	session->sp_tsf_us_hi = twt_session->sp_tsf_us_hi;
2238*5113495bSYour Name 	wmi_debug("type=%d id=%d bcast=%d trig=%d announ=%d diagid=%d wake_dur=%ul wake_int=%ul offset=%ul",
2239*5113495bSYour Name 		 session->event_type, session->flow_id,
2240*5113495bSYour Name 		 session->bcast, session->trig,
2241*5113495bSYour Name 		 session->announ, session->dialog_id, session->wake_dura_us,
2242*5113495bSYour Name 		 session->wake_intvl_us, session->sp_offset_us);
2243*5113495bSYour Name 	wmi_debug("resp_pm_valid=%d resp_pm=%d",
2244*5113495bSYour Name 		  session->pm_responder_bit_valid, session->pm_responder_bit);
2245*5113495bSYour Name 
2246*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
2247*5113495bSYour Name }
2248*5113495bSYour Name 
extract_twt_cap_service_ready_ext2_tlv(wmi_unified_t wmi_handle,uint8_t * event,struct wmi_twt_cap_bitmap_params * var)2249*5113495bSYour Name static QDF_STATUS extract_twt_cap_service_ready_ext2_tlv(
2250*5113495bSYour Name 				wmi_unified_t wmi_handle, uint8_t *event,
2251*5113495bSYour Name 				struct wmi_twt_cap_bitmap_params *var)
2252*5113495bSYour Name {
2253*5113495bSYour Name 	WMI_SERVICE_READY_EXT2_EVENTID_param_tlvs *param_buf;
2254*5113495bSYour Name 	wmi_twt_caps_params *twt_caps;
2255*5113495bSYour Name 
2256*5113495bSYour Name 	param_buf = (WMI_SERVICE_READY_EXT2_EVENTID_param_tlvs *)event;
2257*5113495bSYour Name 	if (!param_buf)
2258*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
2259*5113495bSYour Name 
2260*5113495bSYour Name 	twt_caps = param_buf->twt_caps;
2261*5113495bSYour Name 	if (!twt_caps)
2262*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
2263*5113495bSYour Name 
2264*5113495bSYour Name 	var->twt_ack_support_cap = WMI_GET_BITS(twt_caps->twt_capability_bitmap,
2265*5113495bSYour Name 						0, 1);
2266*5113495bSYour Name 
2267*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
2268*5113495bSYour Name }
2269*5113495bSYour Name 
2270*5113495bSYour Name static enum WMI_HOST_TWT_CMD_FOR_ACK_EVENT
wmi_get_converted_twt_command_for_ack_event(WMI_CMD_ID tgt_cmd)2271*5113495bSYour Name wmi_get_converted_twt_command_for_ack_event(WMI_CMD_ID tgt_cmd)
2272*5113495bSYour Name {
2273*5113495bSYour Name 	switch (tgt_cmd) {
2274*5113495bSYour Name 	case WMI_TWT_ADD_DIALOG_CMDID:
2275*5113495bSYour Name 		return WMI_HOST_TWT_ADD_DIALOG_CMDID;
2276*5113495bSYour Name 	case WMI_TWT_DEL_DIALOG_CMDID:
2277*5113495bSYour Name 		return WMI_HOST_TWT_DEL_DIALOG_CMDID;
2278*5113495bSYour Name 	case WMI_TWT_PAUSE_DIALOG_CMDID:
2279*5113495bSYour Name 		return WMI_HOST_TWT_PAUSE_DIALOG_CMDID;
2280*5113495bSYour Name 	case WMI_TWT_RESUME_DIALOG_CMDID:
2281*5113495bSYour Name 		return WMI_HOST_TWT_RESUME_DIALOG_CMDID;
2282*5113495bSYour Name 	case WMI_TWT_NUDGE_DIALOG_CMDID:
2283*5113495bSYour Name 		return WMI_HOST_TWT_NUDGE_DIALOG_CMDID;
2284*5113495bSYour Name 	default:
2285*5113495bSYour Name 		return WMI_HOST_TWT_UNKNOWN_CMDID;
2286*5113495bSYour Name 	}
2287*5113495bSYour Name }
2288*5113495bSYour Name 
2289*5113495bSYour Name static QDF_STATUS
extract_twt_ack_comp_event_tlv(wmi_unified_t wmi_handle,uint8_t * evt_buf,struct wmi_twt_ack_complete_event_param * var)2290*5113495bSYour Name extract_twt_ack_comp_event_tlv(wmi_unified_t wmi_handle,
2291*5113495bSYour Name 			       uint8_t *evt_buf,
2292*5113495bSYour Name 			       struct wmi_twt_ack_complete_event_param *var)
2293*5113495bSYour Name {
2294*5113495bSYour Name 	WMI_TWT_ACK_EVENTID_param_tlvs *param_buf;
2295*5113495bSYour Name 	wmi_twt_ack_event_fixed_param *ack_event;
2296*5113495bSYour Name 
2297*5113495bSYour Name 	param_buf = (WMI_TWT_ACK_EVENTID_param_tlvs *)evt_buf;
2298*5113495bSYour Name 	if (!param_buf) {
2299*5113495bSYour Name 		wmi_err("evt_buf is NULL");
2300*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
2301*5113495bSYour Name 	}
2302*5113495bSYour Name 
2303*5113495bSYour Name 	ack_event = param_buf->fixed_param;
2304*5113495bSYour Name 
2305*5113495bSYour Name 	var->vdev_id = ack_event->vdev_id;
2306*5113495bSYour Name 	WMI_MAC_ADDR_TO_CHAR_ARRAY(&ack_event->peer_macaddr,
2307*5113495bSYour Name 				   var->peer_macaddr.bytes);
2308*5113495bSYour Name 	var->dialog_id = ack_event->dialog_id;
2309*5113495bSYour Name 	var->twt_cmd_ack = wmi_get_converted_twt_command_for_ack_event(
2310*5113495bSYour Name 						ack_event->twt_cmd);
2311*5113495bSYour Name 
2312*5113495bSYour Name 	switch (ack_event->twt_cmd) {
2313*5113495bSYour Name 	case WMI_TWT_ADD_DIALOG_CMDID:
2314*5113495bSYour Name 		var->status = wmi_get_converted_twt_add_dialog_status(
2315*5113495bSYour Name 						ack_event->status);
2316*5113495bSYour Name 		break;
2317*5113495bSYour Name 	case WMI_TWT_DEL_DIALOG_CMDID:
2318*5113495bSYour Name 		var->status = wmi_get_converted_twt_del_dialog_status(
2319*5113495bSYour Name 						ack_event->status);
2320*5113495bSYour Name 		break;
2321*5113495bSYour Name 	case WMI_TWT_PAUSE_DIALOG_CMDID:
2322*5113495bSYour Name 		var->status = wmi_twt_pause_status_to_host_twt_status(
2323*5113495bSYour Name 						ack_event->status);
2324*5113495bSYour Name 		break;
2325*5113495bSYour Name 	case WMI_TWT_RESUME_DIALOG_CMDID:
2326*5113495bSYour Name 		var->status = wmi_get_converted_twt_resume_dialog_status(
2327*5113495bSYour Name 						ack_event->status);
2328*5113495bSYour Name 		break;
2329*5113495bSYour Name 	case WMI_TWT_NUDGE_DIALOG_CMDID:
2330*5113495bSYour Name 		var->status = wmi_twt_nudge_status_to_host_twt_status(
2331*5113495bSYour Name 						ack_event->status);
2332*5113495bSYour Name 		break;
2333*5113495bSYour Name 	default:
2334*5113495bSYour Name 		break;
2335*5113495bSYour Name 	}
2336*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
2337*5113495bSYour Name }
2338*5113495bSYour Name #endif
2339*5113495bSYour Name 
wmi_twt_attach_tlv(wmi_unified_t wmi_handle)2340*5113495bSYour Name void wmi_twt_attach_tlv(wmi_unified_t wmi_handle)
2341*5113495bSYour Name {
2342*5113495bSYour Name 	struct wmi_ops *ops = wmi_handle->ops;
2343*5113495bSYour Name 
2344*5113495bSYour Name 	ops->send_twt_enable_cmd = send_twt_enable_cmd_tlv;
2345*5113495bSYour Name 	ops->send_twt_disable_cmd = send_twt_disable_cmd_tlv;
2346*5113495bSYour Name 	ops->send_twt_add_dialog_cmd = send_twt_add_dialog_cmd_tlv;
2347*5113495bSYour Name 	ops->send_twt_del_dialog_cmd = send_twt_del_dialog_cmd_tlv;
2348*5113495bSYour Name 	ops->send_twt_pause_dialog_cmd = send_twt_pause_dialog_cmd_tlv;
2349*5113495bSYour Name 	ops->send_twt_nudge_dialog_cmd = send_twt_nudge_dialog_cmd_tlv;
2350*5113495bSYour Name 	ops->send_twt_resume_dialog_cmd = send_twt_resume_dialog_cmd_tlv;
2351*5113495bSYour Name 	ops->extract_twt_enable_comp_event = extract_twt_enable_comp_event_tlv;
2352*5113495bSYour Name 	ops->extract_twt_disable_comp_event =
2353*5113495bSYour Name 				extract_twt_disable_comp_event_tlv;
2354*5113495bSYour Name 	ops->extract_twt_add_dialog_comp_event =
2355*5113495bSYour Name 				extract_twt_add_dialog_comp_event_tlv;
2356*5113495bSYour Name 	ops->extract_twt_add_dialog_comp_additional_params =
2357*5113495bSYour Name 			extract_twt_add_dialog_comp_additional_parameters;
2358*5113495bSYour Name 	ops->extract_twt_del_dialog_comp_event =
2359*5113495bSYour Name 				extract_twt_del_dialog_comp_event_tlv;
2360*5113495bSYour Name 	ops->extract_twt_pause_dialog_comp_event =
2361*5113495bSYour Name 				extract_twt_pause_dialog_comp_event_tlv;
2362*5113495bSYour Name 	ops->extract_twt_nudge_dialog_comp_event =
2363*5113495bSYour Name 				extract_twt_nudge_dialog_comp_event_tlv;
2364*5113495bSYour Name 	ops->extract_twt_resume_dialog_comp_event =
2365*5113495bSYour Name 				extract_twt_resume_dialog_comp_event_tlv;
2366*5113495bSYour Name 	ops->extract_twt_session_stats_event =
2367*5113495bSYour Name 				extract_twt_session_stats_event_tlv;
2368*5113495bSYour Name 	ops->extract_twt_session_stats_data =
2369*5113495bSYour Name 				extract_twt_session_stats_event_data;
2370*5113495bSYour Name 	ops->extract_twt_notify_event =
2371*5113495bSYour Name 				extract_twt_notify_event_tlv;
2372*5113495bSYour Name 	ops->extract_twt_cap_service_ready_ext2 =
2373*5113495bSYour Name 				extract_twt_cap_service_ready_ext2_tlv,
2374*5113495bSYour Name 	ops->extract_twt_ack_comp_event = extract_twt_ack_comp_event_tlv;
2375*5113495bSYour Name 	wmi_twt_attach_bcast_twt_tlv(ops);
2376*5113495bSYour Name }
2377