xref: /wlan-driver/qcacld-3.0/core/wma/src/wma_twt.c (revision 5113495b16420b49004c444715d2daae2066e7dc)
1*5113495bSYour Name /*
2*5113495bSYour Name  * Copyright (c) 2019-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 /**
21*5113495bSYour Name  * DOC: wma_twt.c
22*5113495bSYour Name  *
23*5113495bSYour Name  * WLAN Host Device Driver TWT - Target Wake Time Implementation
24*5113495bSYour Name  */
25*5113495bSYour Name #include "wma_twt.h"
26*5113495bSYour Name #include "wmi_unified_twt_api.h"
27*5113495bSYour Name #include "wma_internal.h"
28*5113495bSYour Name #include "wmi_unified_priv.h"
29*5113495bSYour Name 
30*5113495bSYour Name #if defined(WLAN_SUPPORT_TWT) && defined(WLAN_TWT_CONV_SUPPORTED)
31*5113495bSYour Name 
wma_update_bcast_twt_support(tp_wma_handle wh,struct wma_tgt_cfg * tgt_cfg)32*5113495bSYour Name void wma_update_bcast_twt_support(tp_wma_handle wh,
33*5113495bSYour Name 				  struct wma_tgt_cfg *tgt_cfg)
34*5113495bSYour Name {
35*5113495bSYour Name }
36*5113495bSYour Name 
wma_register_twt_events(tp_wma_handle wma_handle)37*5113495bSYour Name void wma_register_twt_events(tp_wma_handle wma_handle)
38*5113495bSYour Name {
39*5113495bSYour Name }
40*5113495bSYour Name 
wma_set_twt_peer_caps(tpAddStaParams params,struct peer_assoc_params * cmd)41*5113495bSYour Name void wma_set_twt_peer_caps(tpAddStaParams params, struct peer_assoc_params *cmd)
42*5113495bSYour Name {
43*5113495bSYour Name 	cmd->twt_requester = params->twt_requestor;
44*5113495bSYour Name 	cmd->twt_responder = params->twt_responder;
45*5113495bSYour Name }
46*5113495bSYour Name 
wma_update_twt_tgt_cap(tp_wma_handle wh,struct wma_tgt_cfg * tgt_cfg)47*5113495bSYour Name void wma_update_twt_tgt_cap(tp_wma_handle wh, struct wma_tgt_cfg *tgt_cfg)
48*5113495bSYour Name {
49*5113495bSYour Name }
50*5113495bSYour Name 
wma_send_twt_enable_cmd(uint32_t pdev_id,struct twt_enable_disable_conf * conf)51*5113495bSYour Name void wma_send_twt_enable_cmd(uint32_t pdev_id,
52*5113495bSYour Name 			     struct twt_enable_disable_conf *conf)
53*5113495bSYour Name {
54*5113495bSYour Name }
55*5113495bSYour Name 
wma_send_twt_disable_cmd(uint32_t pdev_id,struct twt_enable_disable_conf * conf)56*5113495bSYour Name void wma_send_twt_disable_cmd(uint32_t pdev_id,
57*5113495bSYour Name 			      struct twt_enable_disable_conf *conf)
58*5113495bSYour Name {
59*5113495bSYour Name }
60*5113495bSYour Name 
wma_twt_process_add_dialog(t_wma_handle * wma_handle,struct wmi_twt_add_dialog_param * params)61*5113495bSYour Name QDF_STATUS wma_twt_process_add_dialog(t_wma_handle *wma_handle,
62*5113495bSYour Name 				      struct wmi_twt_add_dialog_param *params)
63*5113495bSYour Name {
64*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
65*5113495bSYour Name }
66*5113495bSYour Name 
67*5113495bSYour Name QDF_STATUS
wma_twt_process_del_dialog(t_wma_handle * wma_handle,struct wmi_twt_del_dialog_param * params)68*5113495bSYour Name wma_twt_process_del_dialog(t_wma_handle *wma_handle,
69*5113495bSYour Name 			   struct wmi_twt_del_dialog_param *params)
70*5113495bSYour Name {
71*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
72*5113495bSYour Name }
73*5113495bSYour Name 
74*5113495bSYour Name QDF_STATUS
wma_twt_process_pause_dialog(t_wma_handle * wma_handle,struct wmi_twt_pause_dialog_cmd_param * params)75*5113495bSYour Name wma_twt_process_pause_dialog(t_wma_handle *wma_handle,
76*5113495bSYour Name 			     struct wmi_twt_pause_dialog_cmd_param *params)
77*5113495bSYour Name {
78*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
79*5113495bSYour Name }
80*5113495bSYour Name 
81*5113495bSYour Name QDF_STATUS
wma_twt_process_nudge_dialog(t_wma_handle * wma_handle,struct wmi_twt_nudge_dialog_cmd_param * params)82*5113495bSYour Name wma_twt_process_nudge_dialog(t_wma_handle *wma_handle,
83*5113495bSYour Name 			     struct wmi_twt_nudge_dialog_cmd_param *params)
84*5113495bSYour Name {
85*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
86*5113495bSYour Name }
87*5113495bSYour Name 
88*5113495bSYour Name QDF_STATUS
wma_twt_process_resume_dialog(t_wma_handle * wma_handle,struct wmi_twt_resume_dialog_cmd_param * params)89*5113495bSYour Name wma_twt_process_resume_dialog(t_wma_handle *wma_handle,
90*5113495bSYour Name 			      struct wmi_twt_resume_dialog_cmd_param *params)
91*5113495bSYour Name {
92*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
93*5113495bSYour Name }
94*5113495bSYour Name 
95*5113495bSYour Name #elif WLAN_SUPPORT_TWT
wma_send_twt_enable_cmd(uint32_t pdev_id,struct twt_enable_disable_conf * conf)96*5113495bSYour Name void wma_send_twt_enable_cmd(uint32_t pdev_id,
97*5113495bSYour Name 			     struct twt_enable_disable_conf *conf)
98*5113495bSYour Name {
99*5113495bSYour Name 	t_wma_handle *wma = cds_get_context(QDF_MODULE_ID_WMA);
100*5113495bSYour Name 	struct wmi_twt_enable_param twt_enable_params = {0};
101*5113495bSYour Name 	int32_t ret;
102*5113495bSYour Name 
103*5113495bSYour Name 	if (!wma)
104*5113495bSYour Name 		return;
105*5113495bSYour Name 
106*5113495bSYour Name 	twt_enable_params.pdev_id = pdev_id;
107*5113495bSYour Name 	twt_enable_params.sta_cong_timer_ms = conf->congestion_timeout;
108*5113495bSYour Name 	twt_enable_params.b_twt_enable = conf->bcast_en;
109*5113495bSYour Name 	twt_enable_params.ext_conf_present = conf->ext_conf_present;
110*5113495bSYour Name 	twt_enable_params.twt_role = conf->role;
111*5113495bSYour Name 	twt_enable_params.twt_oper = conf->oper;
112*5113495bSYour Name 	ret = wmi_unified_twt_enable_cmd(wma->wmi_handle, &twt_enable_params);
113*5113495bSYour Name 
114*5113495bSYour Name 	if (ret)
115*5113495bSYour Name 		wma_err("Failed to enable TWT");
116*5113495bSYour Name }
117*5113495bSYour Name 
118*5113495bSYour Name /**
119*5113495bSYour Name  * wma_twt_en_complete_event_handler - TWT enable complete event handler
120*5113495bSYour Name  * @handle: wma handle
121*5113495bSYour Name  * @event: buffer with event
122*5113495bSYour Name  * @len: buffer length
123*5113495bSYour Name  *
124*5113495bSYour Name  * Return: 0 on success, negative value on failure
125*5113495bSYour Name  */
126*5113495bSYour Name static
wma_twt_en_complete_event_handler(void * handle,uint8_t * event,uint32_t len)127*5113495bSYour Name int wma_twt_en_complete_event_handler(void *handle,
128*5113495bSYour Name 				      uint8_t *event, uint32_t len)
129*5113495bSYour Name {
130*5113495bSYour Name 	struct wmi_twt_enable_complete_event_param param;
131*5113495bSYour Name 	tp_wma_handle wma_handle = handle;
132*5113495bSYour Name 	wmi_unified_t wmi_handle;
133*5113495bSYour Name 	struct mac_context *mac = cds_get_context(QDF_MODULE_ID_PE);
134*5113495bSYour Name 	int status = -EINVAL;
135*5113495bSYour Name 
136*5113495bSYour Name 	if (wma_validate_handle(wma_handle))
137*5113495bSYour Name 		return status;
138*5113495bSYour Name 
139*5113495bSYour Name 	wmi_handle = wma_handle->wmi_handle;
140*5113495bSYour Name 	if (wmi_validate_handle(wmi_handle))
141*5113495bSYour Name 		return status;
142*5113495bSYour Name 
143*5113495bSYour Name 	if (!mac)
144*5113495bSYour Name 		return status;
145*5113495bSYour Name 
146*5113495bSYour Name 	if (wmi_handle->ops->extract_twt_enable_comp_event)
147*5113495bSYour Name 		status = wmi_handle->ops->extract_twt_enable_comp_event(
148*5113495bSYour Name 								wmi_handle,
149*5113495bSYour Name 								event,
150*5113495bSYour Name 								&param);
151*5113495bSYour Name 	wma_debug("TWT: Received TWT enable comp event, status:%d", status);
152*5113495bSYour Name 
153*5113495bSYour Name 	if (mac->sme.twt_enable_cb)
154*5113495bSYour Name 		mac->sme.twt_enable_cb(mac->hdd_handle, &param);
155*5113495bSYour Name 
156*5113495bSYour Name 	return status;
157*5113495bSYour Name }
158*5113495bSYour Name 
wma_send_twt_disable_cmd(uint32_t pdev_id,struct twt_enable_disable_conf * conf)159*5113495bSYour Name void wma_send_twt_disable_cmd(uint32_t pdev_id,
160*5113495bSYour Name 			      struct twt_enable_disable_conf *conf)
161*5113495bSYour Name {
162*5113495bSYour Name 	t_wma_handle *wma = cds_get_context(QDF_MODULE_ID_WMA);
163*5113495bSYour Name 	struct wmi_twt_disable_param twt_disable_params = {0};
164*5113495bSYour Name 	int32_t ret;
165*5113495bSYour Name 
166*5113495bSYour Name 	if (!wma)
167*5113495bSYour Name 		return;
168*5113495bSYour Name 
169*5113495bSYour Name 	twt_disable_params.pdev_id = pdev_id;
170*5113495bSYour Name 	twt_disable_params.ext_conf_present = conf->ext_conf_present;
171*5113495bSYour Name 	twt_disable_params.twt_role = conf->role;
172*5113495bSYour Name 	twt_disable_params.twt_oper = conf->oper;
173*5113495bSYour Name 
174*5113495bSYour Name 	ret = wmi_unified_twt_disable_cmd(wma->wmi_handle, &twt_disable_params);
175*5113495bSYour Name 
176*5113495bSYour Name 	if (ret)
177*5113495bSYour Name 		wma_err("Failed to disable TWT");
178*5113495bSYour Name }
179*5113495bSYour Name 
180*5113495bSYour Name /**
181*5113495bSYour Name  * wma_twt_disable_comp_event_handler- TWT disable complete event handler
182*5113495bSYour Name  * @handle: wma handle
183*5113495bSYour Name  * @data: data buffer
184*5113495bSYour Name  * @len: buffer length
185*5113495bSYour Name  *
186*5113495bSYour Name  * Return: 0 on success, negative value on failure
187*5113495bSYour Name  */
188*5113495bSYour Name static
wma_twt_disable_comp_event_handler(void * handle,uint8_t * data,uint32_t len)189*5113495bSYour Name int wma_twt_disable_comp_event_handler(void *handle, uint8_t *data,
190*5113495bSYour Name 				       uint32_t len)
191*5113495bSYour Name {
192*5113495bSYour Name 	struct mac_context *mac;
193*5113495bSYour Name 	struct wmi_twt_disable_complete_event event;
194*5113495bSYour Name 	tp_wma_handle wma_handle = handle;
195*5113495bSYour Name 	wmi_unified_t wmi_handle;
196*5113495bSYour Name 	QDF_STATUS status;
197*5113495bSYour Name 
198*5113495bSYour Name 	mac = (struct mac_context *)cds_get_context(QDF_MODULE_ID_PE);
199*5113495bSYour Name 	if (!mac)
200*5113495bSYour Name 		return -EINVAL;
201*5113495bSYour Name 
202*5113495bSYour Name 	if (wma_validate_handle(wma_handle))
203*5113495bSYour Name 		return -EINVAL;
204*5113495bSYour Name 
205*5113495bSYour Name 	wmi_handle = wma_handle->wmi_handle;
206*5113495bSYour Name 	if (wmi_validate_handle(wmi_handle))
207*5113495bSYour Name 		return -EINVAL;
208*5113495bSYour Name 
209*5113495bSYour Name 	wma_debug("TWT: Rcvd TWT disable comp event");
210*5113495bSYour Name 	status = wmi_extract_twt_disable_comp_event(wmi_handle, data, &event);
211*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
212*5113495bSYour Name 		wma_err("TWT disable extract event failed(status=%d)", status);
213*5113495bSYour Name 		return -EINVAL;
214*5113495bSYour Name 	}
215*5113495bSYour Name 
216*5113495bSYour Name 	wma_debug("pdev_id: %d", event.pdev_id);
217*5113495bSYour Name 
218*5113495bSYour Name 	if (mac->sme.twt_disable_cb)
219*5113495bSYour Name 		mac->sme.twt_disable_cb(mac->hdd_handle);
220*5113495bSYour Name 
221*5113495bSYour Name 	return 0;
222*5113495bSYour Name }
223*5113495bSYour Name 
wma_set_twt_peer_caps(tpAddStaParams params,struct peer_assoc_params * cmd)224*5113495bSYour Name void wma_set_twt_peer_caps(tpAddStaParams params, struct peer_assoc_params *cmd)
225*5113495bSYour Name {
226*5113495bSYour Name 	if (params->twt_requestor)
227*5113495bSYour Name 		cmd->twt_requester = 1;
228*5113495bSYour Name 	if (params->twt_responder)
229*5113495bSYour Name 		cmd->twt_responder = 1;
230*5113495bSYour Name }
231*5113495bSYour Name 
wma_twt_process_add_dialog(t_wma_handle * wma_handle,struct wmi_twt_add_dialog_param * params)232*5113495bSYour Name QDF_STATUS wma_twt_process_add_dialog(t_wma_handle *wma_handle,
233*5113495bSYour Name 				      struct wmi_twt_add_dialog_param *params)
234*5113495bSYour Name {
235*5113495bSYour Name 	wmi_unified_t wmi_handle;
236*5113495bSYour Name 
237*5113495bSYour Name 	if (wma_validate_handle(wma_handle))
238*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
239*5113495bSYour Name 
240*5113495bSYour Name 	wmi_handle = wma_handle->wmi_handle;
241*5113495bSYour Name 	if (wmi_validate_handle(wmi_handle))
242*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
243*5113495bSYour Name 
244*5113495bSYour Name 	return wmi_unified_twt_add_dialog_cmd(wmi_handle, params);
245*5113495bSYour Name }
246*5113495bSYour Name 
247*5113495bSYour Name /**
248*5113495bSYour Name  * wma_twt_add_dialog_complete_event_handler - TWT add dialog complete event
249*5113495bSYour Name  * handler
250*5113495bSYour Name  * @handle: wma handle
251*5113495bSYour Name  * @event: buffer with event
252*5113495bSYour Name  * @len: buffer length
253*5113495bSYour Name  *
254*5113495bSYour Name  * Return: 0 on success, negative value on failure
255*5113495bSYour Name  */
256*5113495bSYour Name static
wma_twt_add_dialog_complete_event_handler(void * handle,uint8_t * event,uint32_t len)257*5113495bSYour Name int wma_twt_add_dialog_complete_event_handler(void *handle,
258*5113495bSYour Name 					      uint8_t *event, uint32_t len)
259*5113495bSYour Name {
260*5113495bSYour Name 	struct wma_twt_add_dialog_complete_event *add_dialog_event;
261*5113495bSYour Name 	struct scheduler_msg sme_msg = {0};
262*5113495bSYour Name 	tp_wma_handle wma_handle = handle;
263*5113495bSYour Name 	wmi_unified_t wmi_handle;
264*5113495bSYour Name 	struct mac_context *mac = cds_get_context(QDF_MODULE_ID_PE);
265*5113495bSYour Name 	QDF_STATUS status;
266*5113495bSYour Name 
267*5113495bSYour Name 	if (wma_validate_handle(wma_handle))
268*5113495bSYour Name 		return -EINVAL;
269*5113495bSYour Name 
270*5113495bSYour Name 	if (!mac)
271*5113495bSYour Name 		return -EINVAL;
272*5113495bSYour Name 
273*5113495bSYour Name 	wmi_handle = wma_handle->wmi_handle;
274*5113495bSYour Name 	if (wmi_validate_handle(wmi_handle))
275*5113495bSYour Name 		return -EINVAL;
276*5113495bSYour Name 
277*5113495bSYour Name 	add_dialog_event = qdf_mem_malloc(sizeof(*add_dialog_event));
278*5113495bSYour Name 	if (!add_dialog_event)
279*5113495bSYour Name 		return -ENOMEM;
280*5113495bSYour Name 
281*5113495bSYour Name 	status = wmi_extract_twt_add_dialog_comp_event(wmi_handle, event,
282*5113495bSYour Name 						       &add_dialog_event->params);
283*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status))
284*5113495bSYour Name 		goto exit;
285*5113495bSYour Name 
286*5113495bSYour Name 	if (add_dialog_event->params.num_additional_twt_params) {
287*5113495bSYour Name 		status = wmi_extract_twt_add_dialog_comp_additional_params(wmi_handle,
288*5113495bSYour Name 									   event,
289*5113495bSYour Name 									   len, 0,
290*5113495bSYour Name 									   &add_dialog_event->additional_params);
291*5113495bSYour Name 		if (QDF_IS_STATUS_ERROR(status))
292*5113495bSYour Name 			goto exit;
293*5113495bSYour Name 	}
294*5113495bSYour Name 
295*5113495bSYour Name 	wma_debug("TWT: Extract TWT add dialog event id:%d",
296*5113495bSYour Name 		  add_dialog_event->params.dialog_id);
297*5113495bSYour Name 
298*5113495bSYour Name 	sme_msg.type = eWNI_SME_TWT_ADD_DIALOG_EVENT;
299*5113495bSYour Name 	sme_msg.bodyptr = add_dialog_event;
300*5113495bSYour Name 	sme_msg.bodyval = 0;
301*5113495bSYour Name 	status = scheduler_post_message(QDF_MODULE_ID_WMA,
302*5113495bSYour Name 					QDF_MODULE_ID_SME,
303*5113495bSYour Name 					QDF_MODULE_ID_SME, &sme_msg);
304*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status))
305*5113495bSYour Name 		goto exit;
306*5113495bSYour Name 
307*5113495bSYour Name exit:
308*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status))
309*5113495bSYour Name 		qdf_mem_free(add_dialog_event);
310*5113495bSYour Name 
311*5113495bSYour Name 	return qdf_status_to_os_return(status);
312*5113495bSYour Name }
313*5113495bSYour Name 
314*5113495bSYour Name QDF_STATUS
wma_twt_process_del_dialog(t_wma_handle * wma_handle,struct wmi_twt_del_dialog_param * params)315*5113495bSYour Name wma_twt_process_del_dialog(t_wma_handle *wma_handle,
316*5113495bSYour Name 			   struct wmi_twt_del_dialog_param *params)
317*5113495bSYour Name {
318*5113495bSYour Name 	wmi_unified_t wmi_handle;
319*5113495bSYour Name 
320*5113495bSYour Name 	if (wma_validate_handle(wma_handle))
321*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
322*5113495bSYour Name 
323*5113495bSYour Name 	wmi_handle = wma_handle->wmi_handle;
324*5113495bSYour Name 	if (wmi_validate_handle(wmi_handle))
325*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
326*5113495bSYour Name 
327*5113495bSYour Name 	return wmi_unified_twt_del_dialog_cmd(wmi_handle, params);
328*5113495bSYour Name }
329*5113495bSYour Name 
330*5113495bSYour Name /**
331*5113495bSYour Name  * wma_twt_del_dialog_complete_event_handler - TWT del dialog complete event
332*5113495bSYour Name  * handler
333*5113495bSYour Name  * @handle: wma handle
334*5113495bSYour Name  * @event: buffer with event
335*5113495bSYour Name  * @len: buffer length
336*5113495bSYour Name  *
337*5113495bSYour Name  * Return: 0 on success, negative value on failure
338*5113495bSYour Name  */
339*5113495bSYour Name static
wma_twt_del_dialog_complete_event_handler(void * handle,uint8_t * event,uint32_t len)340*5113495bSYour Name int wma_twt_del_dialog_complete_event_handler(void *handle,
341*5113495bSYour Name 					      uint8_t *event, uint32_t len)
342*5113495bSYour Name {
343*5113495bSYour Name 	struct wmi_twt_del_dialog_complete_event_param *param;
344*5113495bSYour Name 	struct scheduler_msg sme_msg = {0};
345*5113495bSYour Name 	tp_wma_handle wma_handle = handle;
346*5113495bSYour Name 	wmi_unified_t wmi_handle;
347*5113495bSYour Name 	struct mac_context *mac = cds_get_context(QDF_MODULE_ID_PE);
348*5113495bSYour Name 	int status = -EINVAL;
349*5113495bSYour Name 
350*5113495bSYour Name 	if (wma_validate_handle(wma_handle))
351*5113495bSYour Name 		return status;
352*5113495bSYour Name 
353*5113495bSYour Name 	wmi_handle = wma_handle->wmi_handle;
354*5113495bSYour Name 	if (wmi_validate_handle(wmi_handle))
355*5113495bSYour Name 		return status;
356*5113495bSYour Name 
357*5113495bSYour Name 	if (!mac)
358*5113495bSYour Name 		return status;
359*5113495bSYour Name 
360*5113495bSYour Name 	param = qdf_mem_malloc(sizeof(*param));
361*5113495bSYour Name 	if (!param)
362*5113495bSYour Name 		return -ENOMEM;
363*5113495bSYour Name 
364*5113495bSYour Name 	status = wmi_extract_twt_del_dialog_comp_event(wmi_handle, event,
365*5113495bSYour Name 						       param);
366*5113495bSYour Name 	wma_debug("TWT: Extract TWT del dlg comp event, status:%d", status);
367*5113495bSYour Name 
368*5113495bSYour Name 	sme_msg.type = eWNI_SME_TWT_DEL_DIALOG_EVENT;
369*5113495bSYour Name 	sme_msg.bodyptr = param;
370*5113495bSYour Name 	sme_msg.bodyval = 0;
371*5113495bSYour Name 	status = scheduler_post_message(QDF_MODULE_ID_WMA,
372*5113495bSYour Name 					QDF_MODULE_ID_SME,
373*5113495bSYour Name 					QDF_MODULE_ID_SME, &sme_msg);
374*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status))
375*5113495bSYour Name 		return -EINVAL;
376*5113495bSYour Name 
377*5113495bSYour Name 	return status;
378*5113495bSYour Name }
379*5113495bSYour Name 
380*5113495bSYour Name QDF_STATUS
wma_twt_process_pause_dialog(t_wma_handle * wma_handle,struct wmi_twt_pause_dialog_cmd_param * params)381*5113495bSYour Name wma_twt_process_pause_dialog(t_wma_handle *wma_handle,
382*5113495bSYour Name 			     struct wmi_twt_pause_dialog_cmd_param *params)
383*5113495bSYour Name {
384*5113495bSYour Name 	wmi_unified_t wmi_handle;
385*5113495bSYour Name 
386*5113495bSYour Name 	if (wma_validate_handle(wma_handle))
387*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
388*5113495bSYour Name 
389*5113495bSYour Name 	wmi_handle = wma_handle->wmi_handle;
390*5113495bSYour Name 	if (wmi_validate_handle(wmi_handle))
391*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
392*5113495bSYour Name 
393*5113495bSYour Name 	return wmi_unified_twt_pause_dialog_cmd(wmi_handle, params);
394*5113495bSYour Name }
395*5113495bSYour Name 
396*5113495bSYour Name QDF_STATUS
wma_twt_process_nudge_dialog(t_wma_handle * wma_handle,struct wmi_twt_nudge_dialog_cmd_param * params)397*5113495bSYour Name wma_twt_process_nudge_dialog(t_wma_handle *wma_handle,
398*5113495bSYour Name 			     struct wmi_twt_nudge_dialog_cmd_param *params)
399*5113495bSYour Name {
400*5113495bSYour Name 	wmi_unified_t wmi_handle;
401*5113495bSYour Name 
402*5113495bSYour Name 	if (wma_validate_handle(wma_handle))
403*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
404*5113495bSYour Name 
405*5113495bSYour Name 	wmi_handle = (wmi_unified_t)wma_handle->wmi_handle;
406*5113495bSYour Name 	if (!wmi_handle) {
407*5113495bSYour Name 		wma_err("Invalid wmi handle, twt nudge dialog failed");
408*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
409*5113495bSYour Name 	}
410*5113495bSYour Name 
411*5113495bSYour Name 	return wmi_unified_twt_nudge_dialog_cmd(wmi_handle, params);
412*5113495bSYour Name }
413*5113495bSYour Name 
414*5113495bSYour Name /**
415*5113495bSYour Name  * wma_twt_pause_dialog_complete_event_handler - TWT pause dlg complete evt
416*5113495bSYour Name  * handler
417*5113495bSYour Name  * @handle: wma handle
418*5113495bSYour Name  * @event: buffer with event
419*5113495bSYour Name  * @len: buffer length
420*5113495bSYour Name  *
421*5113495bSYour Name  * Return: 0 on success, negative value on failure
422*5113495bSYour Name  */
423*5113495bSYour Name static
wma_twt_pause_dialog_complete_event_handler(void * handle,uint8_t * event,uint32_t len)424*5113495bSYour Name int wma_twt_pause_dialog_complete_event_handler(void *handle, uint8_t *event,
425*5113495bSYour Name 						uint32_t len)
426*5113495bSYour Name {
427*5113495bSYour Name 	struct wmi_twt_pause_dialog_complete_event_param *param;
428*5113495bSYour Name 	struct scheduler_msg sme_msg = {0};
429*5113495bSYour Name 	tp_wma_handle wma_handle = handle;
430*5113495bSYour Name 	wmi_unified_t wmi_handle;
431*5113495bSYour Name 	struct mac_context *mac = cds_get_context(QDF_MODULE_ID_PE);
432*5113495bSYour Name 	int status = -EINVAL;
433*5113495bSYour Name 
434*5113495bSYour Name 	if (!mac)
435*5113495bSYour Name 		return status;
436*5113495bSYour Name 
437*5113495bSYour Name 	if (wma_validate_handle(wma_handle))
438*5113495bSYour Name 		return status;
439*5113495bSYour Name 
440*5113495bSYour Name 	wmi_handle = wma_handle->wmi_handle;
441*5113495bSYour Name 	if (wmi_validate_handle(wmi_handle))
442*5113495bSYour Name 		return status;
443*5113495bSYour Name 
444*5113495bSYour Name 	param = qdf_mem_malloc(sizeof(*param));
445*5113495bSYour Name 	if (!param)
446*5113495bSYour Name 		return -ENOMEM;
447*5113495bSYour Name 
448*5113495bSYour Name 	if (wmi_handle->ops->extract_twt_pause_dialog_comp_event)
449*5113495bSYour Name 		status = wmi_handle->ops->extract_twt_pause_dialog_comp_event(wmi_handle,
450*5113495bSYour Name 									      event,
451*5113495bSYour Name 									      param);
452*5113495bSYour Name 	wma_debug("TWT: Extract pause dialog comp event status:%d", status);
453*5113495bSYour Name 
454*5113495bSYour Name 	sme_msg.type = eWNI_SME_TWT_PAUSE_DIALOG_EVENT;
455*5113495bSYour Name 	sme_msg.bodyptr = param;
456*5113495bSYour Name 	sme_msg.bodyval = 0;
457*5113495bSYour Name 	status = scheduler_post_message(QDF_MODULE_ID_WMA,
458*5113495bSYour Name 					QDF_MODULE_ID_SME,
459*5113495bSYour Name 					QDF_MODULE_ID_SME, &sme_msg);
460*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status))
461*5113495bSYour Name 		return -EINVAL;
462*5113495bSYour Name 
463*5113495bSYour Name 	return status;
464*5113495bSYour Name }
465*5113495bSYour Name 
466*5113495bSYour Name /**
467*5113495bSYour Name  * wma_twt_nudge_dialog_complete_event_handler - TWT nudge dlg complete evt
468*5113495bSYour Name  * handler
469*5113495bSYour Name  * @handle: wma handle
470*5113495bSYour Name  * @event: buffer with event
471*5113495bSYour Name  * @len: buffer length
472*5113495bSYour Name  *
473*5113495bSYour Name  * Return: 0 on success, negative value on failure
474*5113495bSYour Name  */
475*5113495bSYour Name static
wma_twt_nudge_dialog_complete_event_handler(void * handle,uint8_t * event,uint32_t len)476*5113495bSYour Name int wma_twt_nudge_dialog_complete_event_handler(void *handle, uint8_t *event,
477*5113495bSYour Name 						uint32_t len)
478*5113495bSYour Name {
479*5113495bSYour Name 	struct wmi_twt_nudge_dialog_complete_event_param *param;
480*5113495bSYour Name 	struct scheduler_msg sme_msg = {0};
481*5113495bSYour Name 	tp_wma_handle wma_handle = handle;
482*5113495bSYour Name 	wmi_unified_t wmi_handle;
483*5113495bSYour Name 	struct mac_context *mac = cds_get_context(QDF_MODULE_ID_PE);
484*5113495bSYour Name 	int status = -EINVAL;
485*5113495bSYour Name 
486*5113495bSYour Name 	if (!mac)
487*5113495bSYour Name 		return status;
488*5113495bSYour Name 
489*5113495bSYour Name 	if (wma_validate_handle(wma_handle))
490*5113495bSYour Name 		return status;
491*5113495bSYour Name 
492*5113495bSYour Name 	wmi_handle = (wmi_unified_t)wma_handle->wmi_handle;
493*5113495bSYour Name 	if (!wmi_handle) {
494*5113495bSYour Name 		wma_err("Invalid wmi handle for TWT nudge dialog complete");
495*5113495bSYour Name 		return status;
496*5113495bSYour Name 	}
497*5113495bSYour Name 
498*5113495bSYour Name 	param = qdf_mem_malloc(sizeof(*param));
499*5113495bSYour Name 	if (!param)
500*5113495bSYour Name 		return -ENOMEM;
501*5113495bSYour Name 
502*5113495bSYour Name 	if (wmi_handle->ops->extract_twt_nudge_dialog_comp_event)
503*5113495bSYour Name 		status = wmi_handle->ops->extract_twt_nudge_dialog_comp_event(
504*5113495bSYour Name 						      wmi_handle, event, param);
505*5113495bSYour Name 
506*5113495bSYour Name 	wma_debug("TWT: Extract nudge dialog comp event status:%d", status);
507*5113495bSYour Name 
508*5113495bSYour Name 	sme_msg.type = eWNI_SME_TWT_NUDGE_DIALOG_EVENT;
509*5113495bSYour Name 	sme_msg.bodyptr = param;
510*5113495bSYour Name 	sme_msg.bodyval = 0;
511*5113495bSYour Name 	status = scheduler_post_message(QDF_MODULE_ID_WMA,
512*5113495bSYour Name 					QDF_MODULE_ID_SME,
513*5113495bSYour Name 					QDF_MODULE_ID_SME, &sme_msg);
514*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status))
515*5113495bSYour Name 		return -EINVAL;
516*5113495bSYour Name 
517*5113495bSYour Name 	return status;
518*5113495bSYour Name }
519*5113495bSYour Name QDF_STATUS
wma_twt_process_resume_dialog(t_wma_handle * wma_handle,struct wmi_twt_resume_dialog_cmd_param * params)520*5113495bSYour Name wma_twt_process_resume_dialog(t_wma_handle *wma_handle,
521*5113495bSYour Name 			      struct wmi_twt_resume_dialog_cmd_param *params)
522*5113495bSYour Name {
523*5113495bSYour Name 	wmi_unified_t wmi_handle;
524*5113495bSYour Name 
525*5113495bSYour Name 	if (wma_validate_handle(wma_handle))
526*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
527*5113495bSYour Name 
528*5113495bSYour Name 	wmi_handle = wma_handle->wmi_handle;
529*5113495bSYour Name 	if (wmi_validate_handle(wmi_handle))
530*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
531*5113495bSYour Name 
532*5113495bSYour Name 	return wmi_unified_twt_resume_dialog_cmd(wmi_handle, params);
533*5113495bSYour Name }
534*5113495bSYour Name 
535*5113495bSYour Name /**
536*5113495bSYour Name  * wma_twt_notify_event_handler - TWT notify event handler
537*5113495bSYour Name  * @handle: wma handle
538*5113495bSYour Name  * @event: buffer with event
539*5113495bSYour Name  * @len: buffer length
540*5113495bSYour Name  *
541*5113495bSYour Name  * Return: 0 on success, negative value on failure
542*5113495bSYour Name  */
543*5113495bSYour Name static
wma_twt_notify_event_handler(void * handle,uint8_t * event,uint32_t len)544*5113495bSYour Name int wma_twt_notify_event_handler(void *handle, uint8_t *event, uint32_t len)
545*5113495bSYour Name {
546*5113495bSYour Name 	struct wmi_twt_notify_event_param *param;
547*5113495bSYour Name 	struct scheduler_msg sme_msg = {0};
548*5113495bSYour Name 	tp_wma_handle wma_handle = handle;
549*5113495bSYour Name 	wmi_unified_t wmi_handle;
550*5113495bSYour Name 	struct mac_context *mac = cds_get_context(QDF_MODULE_ID_PE);
551*5113495bSYour Name 	int status = -EINVAL;
552*5113495bSYour Name 
553*5113495bSYour Name 	if (!mac)
554*5113495bSYour Name 		return status;
555*5113495bSYour Name 
556*5113495bSYour Name 	if (wma_validate_handle(wma_handle))
557*5113495bSYour Name 		return status;
558*5113495bSYour Name 
559*5113495bSYour Name 	wmi_handle = (wmi_unified_t)wma_handle->wmi_handle;
560*5113495bSYour Name 	if (!wmi_handle) {
561*5113495bSYour Name 		wma_err("Invalid wmi handle for TWT notify event");
562*5113495bSYour Name 		return status;
563*5113495bSYour Name 	}
564*5113495bSYour Name 
565*5113495bSYour Name 	param = qdf_mem_malloc(sizeof(*param));
566*5113495bSYour Name 	if (!param)
567*5113495bSYour Name 		return -ENOMEM;
568*5113495bSYour Name 
569*5113495bSYour Name 	if (wmi_handle->ops->extract_twt_notify_event)
570*5113495bSYour Name 		status = wmi_handle->ops->extract_twt_notify_event(wmi_handle,
571*5113495bSYour Name 								   event,
572*5113495bSYour Name 								   param);
573*5113495bSYour Name 	wma_debug("Extract Notify event status:%d", status);
574*5113495bSYour Name 
575*5113495bSYour Name 	sme_msg.type = eWNI_SME_TWT_NOTIFY_EVENT;
576*5113495bSYour Name 	sme_msg.bodyptr = param;
577*5113495bSYour Name 	sme_msg.bodyval = 0;
578*5113495bSYour Name 	status = scheduler_post_message(QDF_MODULE_ID_WMA,
579*5113495bSYour Name 					QDF_MODULE_ID_SME,
580*5113495bSYour Name 					QDF_MODULE_ID_SME, &sme_msg);
581*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status))
582*5113495bSYour Name 		return -EINVAL;
583*5113495bSYour Name 
584*5113495bSYour Name 	return 0;
585*5113495bSYour Name }
586*5113495bSYour Name 
587*5113495bSYour Name /**
588*5113495bSYour Name  * wma_twt_resume_dialog_complete_event_handler - TWT resume dlg complete evt
589*5113495bSYour Name  * handler
590*5113495bSYour Name  * @handle: wma handle
591*5113495bSYour Name  * @event: buffer with event
592*5113495bSYour Name  * @len: buffer length
593*5113495bSYour Name  *
594*5113495bSYour Name  * Return: 0 on success, negative value on failure
595*5113495bSYour Name  */
596*5113495bSYour Name static
wma_twt_resume_dialog_complete_event_handler(void * handle,uint8_t * event,uint32_t len)597*5113495bSYour Name int wma_twt_resume_dialog_complete_event_handler(void *handle, uint8_t *event,
598*5113495bSYour Name 						 uint32_t len)
599*5113495bSYour Name {
600*5113495bSYour Name 	struct wmi_twt_resume_dialog_complete_event_param *param;
601*5113495bSYour Name 	struct scheduler_msg sme_msg = {0};
602*5113495bSYour Name 	tp_wma_handle wma_handle = handle;
603*5113495bSYour Name 	wmi_unified_t wmi_handle;
604*5113495bSYour Name 	struct mac_context *mac = cds_get_context(QDF_MODULE_ID_PE);
605*5113495bSYour Name 	int status = -EINVAL;
606*5113495bSYour Name 
607*5113495bSYour Name 	if (!mac)
608*5113495bSYour Name 		return status;
609*5113495bSYour Name 
610*5113495bSYour Name 	if (wma_validate_handle(wma_handle))
611*5113495bSYour Name 		return status;
612*5113495bSYour Name 
613*5113495bSYour Name 	wmi_handle = wma_handle->wmi_handle;
614*5113495bSYour Name 	if (wmi_validate_handle(wmi_handle))
615*5113495bSYour Name 		return status;
616*5113495bSYour Name 
617*5113495bSYour Name 	param = qdf_mem_malloc(sizeof(*param));
618*5113495bSYour Name 	if (!param)
619*5113495bSYour Name 		return -ENOMEM;
620*5113495bSYour Name 
621*5113495bSYour Name 	if (wmi_handle->ops->extract_twt_resume_dialog_comp_event)
622*5113495bSYour Name 		status = wmi_handle->ops->extract_twt_resume_dialog_comp_event(wmi_handle,
623*5113495bSYour Name 									       event,
624*5113495bSYour Name 									       param);
625*5113495bSYour Name 	wma_debug("TWT: Extract resume dialog comp event status:%d", status);
626*5113495bSYour Name 
627*5113495bSYour Name 	sme_msg.type = eWNI_SME_TWT_RESUME_DIALOG_EVENT;
628*5113495bSYour Name 	sme_msg.bodyptr = param;
629*5113495bSYour Name 	sme_msg.bodyval = 0;
630*5113495bSYour Name 	status = scheduler_post_message(QDF_MODULE_ID_WMA,
631*5113495bSYour Name 					QDF_MODULE_ID_SME,
632*5113495bSYour Name 					QDF_MODULE_ID_SME, &sme_msg);
633*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status))
634*5113495bSYour Name 		return -EINVAL;
635*5113495bSYour Name 
636*5113495bSYour Name 	return status;
637*5113495bSYour Name }
638*5113495bSYour Name 
639*5113495bSYour Name static
wma_twt_ack_complete_event_handler(void * handle,uint8_t * event,uint32_t len)640*5113495bSYour Name int wma_twt_ack_complete_event_handler(void *handle, uint8_t *event,
641*5113495bSYour Name 				       uint32_t len)
642*5113495bSYour Name {
643*5113495bSYour Name 	struct wmi_twt_ack_complete_event_param *param;
644*5113495bSYour Name 	tp_wma_handle wma_handle = handle;
645*5113495bSYour Name 	wmi_unified_t wmi_handle;
646*5113495bSYour Name 	struct mac_context *mac = cds_get_context(QDF_MODULE_ID_PE);
647*5113495bSYour Name 	QDF_STATUS status;
648*5113495bSYour Name 
649*5113495bSYour Name 	if (!mac)
650*5113495bSYour Name 		return -EINVAL;
651*5113495bSYour Name 
652*5113495bSYour Name 	if (wma_validate_handle(wma_handle))
653*5113495bSYour Name 		return -EINVAL;
654*5113495bSYour Name 
655*5113495bSYour Name 	wmi_handle = wma_handle->wmi_handle;
656*5113495bSYour Name 	if (wmi_validate_handle(wmi_handle))
657*5113495bSYour Name 		return -EINVAL;
658*5113495bSYour Name 
659*5113495bSYour Name 	param = qdf_mem_malloc(sizeof(*param));
660*5113495bSYour Name 	if (!param)
661*5113495bSYour Name 		return -ENOMEM;
662*5113495bSYour Name 
663*5113495bSYour Name 	status = wmi_extract_twt_ack_comp_event(wmi_handle, event,
664*5113495bSYour Name 						param);
665*5113495bSYour Name 
666*5113495bSYour Name 	wma_debug("TWT: Received TWT ack comp event, status:%d", status);
667*5113495bSYour Name 
668*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status))
669*5113495bSYour Name 		goto exit;
670*5113495bSYour Name 
671*5113495bSYour Name 	if (mac->sme.twt_ack_comp_cb)
672*5113495bSYour Name 		mac->sme.twt_ack_comp_cb(param, mac->sme.twt_ack_context_cb);
673*5113495bSYour Name 
674*5113495bSYour Name exit:
675*5113495bSYour Name 	qdf_mem_free(param);
676*5113495bSYour Name 	return qdf_status_to_os_return(status);
677*5113495bSYour Name }
678*5113495bSYour Name 
679*5113495bSYour Name /**
680*5113495bSYour Name  * wma_update_bcast_twt_support() - update bcost twt support
681*5113495bSYour Name  * @wh: wma handle
682*5113495bSYour Name  * @tgt_cfg: target configuration to be updated
683*5113495bSYour Name  *
684*5113495bSYour Name  * Update braodcast twt support based on service bit.
685*5113495bSYour Name  *
686*5113495bSYour Name  * Return: None
687*5113495bSYour Name  */
wma_update_bcast_twt_support(tp_wma_handle wh,struct wma_tgt_cfg * tgt_cfg)688*5113495bSYour Name void wma_update_bcast_twt_support(tp_wma_handle wh,
689*5113495bSYour Name 				  struct wma_tgt_cfg *tgt_cfg)
690*5113495bSYour Name {
691*5113495bSYour Name 	if (wmi_service_enabled(wh->wmi_handle,
692*5113495bSYour Name 				wmi_service_bcast_twt_support))
693*5113495bSYour Name 		tgt_cfg->legacy_bcast_twt_support = true;
694*5113495bSYour Name 	else
695*5113495bSYour Name 		tgt_cfg->legacy_bcast_twt_support = false;
696*5113495bSYour Name 
697*5113495bSYour Name 	if (wmi_service_enabled(wh->wmi_handle,
698*5113495bSYour Name 				wmi_service_twt_bcast_req_support))
699*5113495bSYour Name 		tgt_cfg->twt_bcast_req_support = true;
700*5113495bSYour Name 	else
701*5113495bSYour Name 		tgt_cfg->twt_bcast_req_support = false;
702*5113495bSYour Name 
703*5113495bSYour Name 	if (wmi_service_enabled(wh->wmi_handle,
704*5113495bSYour Name 				wmi_service_twt_bcast_resp_support))
705*5113495bSYour Name 		tgt_cfg->twt_bcast_res_support = true;
706*5113495bSYour Name 	else
707*5113495bSYour Name 		tgt_cfg->twt_bcast_res_support = false;
708*5113495bSYour Name }
709*5113495bSYour Name 
wma_update_twt_tgt_cap(tp_wma_handle wh,struct wma_tgt_cfg * tgt_cfg)710*5113495bSYour Name void wma_update_twt_tgt_cap(tp_wma_handle wh, struct wma_tgt_cfg *tgt_cfg)
711*5113495bSYour Name {
712*5113495bSYour Name 	if (wmi_service_enabled(wh->wmi_handle, wmi_service_twt_nudge))
713*5113495bSYour Name 		tgt_cfg->twt_nudge_enabled = true;
714*5113495bSYour Name 
715*5113495bSYour Name 	if (wmi_service_enabled(wh->wmi_handle, wmi_service_all_twt))
716*5113495bSYour Name 		tgt_cfg->all_twt_enabled = true;
717*5113495bSYour Name 
718*5113495bSYour Name 	if (wmi_service_enabled(wh->wmi_handle, wmi_service_twt_statistics))
719*5113495bSYour Name 		tgt_cfg->twt_stats_enabled = true;
720*5113495bSYour Name }
721*5113495bSYour Name 
wma_register_twt_events(tp_wma_handle wma_handle)722*5113495bSYour Name void wma_register_twt_events(tp_wma_handle wma_handle)
723*5113495bSYour Name {
724*5113495bSYour Name 	wmi_unified_register_event_handler(wma_handle->wmi_handle,
725*5113495bSYour Name 					   wmi_twt_enable_complete_event_id,
726*5113495bSYour Name 					   wma_twt_en_complete_event_handler,
727*5113495bSYour Name 					   WMA_RX_SERIALIZER_CTX);
728*5113495bSYour Name 	wmi_unified_register_event_handler(wma_handle->wmi_handle,
729*5113495bSYour Name 					   wmi_twt_disable_complete_event_id,
730*5113495bSYour Name 					   wma_twt_disable_comp_event_handler,
731*5113495bSYour Name 					   WMA_RX_SERIALIZER_CTX);
732*5113495bSYour Name 	wmi_unified_register_event_handler
733*5113495bSYour Name 				(wma_handle->wmi_handle,
734*5113495bSYour Name 				 wmi_twt_add_dialog_complete_event_id,
735*5113495bSYour Name 				 wma_twt_add_dialog_complete_event_handler,
736*5113495bSYour Name 				 WMA_RX_WORK_CTX);
737*5113495bSYour Name 	wmi_unified_register_event_handler
738*5113495bSYour Name 				(wma_handle->wmi_handle,
739*5113495bSYour Name 				 wmi_twt_del_dialog_complete_event_id,
740*5113495bSYour Name 				 wma_twt_del_dialog_complete_event_handler,
741*5113495bSYour Name 				 WMA_RX_WORK_CTX);
742*5113495bSYour Name 
743*5113495bSYour Name 	wmi_unified_register_event_handler
744*5113495bSYour Name 				(wma_handle->wmi_handle,
745*5113495bSYour Name 				 wmi_twt_pause_dialog_complete_event_id,
746*5113495bSYour Name 				 wma_twt_pause_dialog_complete_event_handler,
747*5113495bSYour Name 				 WMA_RX_WORK_CTX);
748*5113495bSYour Name 	wmi_unified_register_event_handler
749*5113495bSYour Name 				(wma_handle->wmi_handle,
750*5113495bSYour Name 				 wmi_twt_resume_dialog_complete_event_id,
751*5113495bSYour Name 				 wma_twt_resume_dialog_complete_event_handler,
752*5113495bSYour Name 				 WMA_RX_WORK_CTX);
753*5113495bSYour Name 	wmi_unified_register_event_handler
754*5113495bSYour Name 				(wma_handle->wmi_handle,
755*5113495bSYour Name 				 wmi_twt_nudge_dialog_complete_event_id,
756*5113495bSYour Name 				 wma_twt_nudge_dialog_complete_event_handler,
757*5113495bSYour Name 				 WMA_RX_WORK_CTX);
758*5113495bSYour Name 	wmi_unified_register_event_handler
759*5113495bSYour Name 				(wma_handle->wmi_handle,
760*5113495bSYour Name 				 wmi_twt_notify_event_id,
761*5113495bSYour Name 				 wma_twt_notify_event_handler,
762*5113495bSYour Name 				 WMA_RX_SERIALIZER_CTX);
763*5113495bSYour Name 	wmi_unified_register_event_handler
764*5113495bSYour Name 				(wma_handle->wmi_handle,
765*5113495bSYour Name 				 wmi_twt_ack_complete_event_id,
766*5113495bSYour Name 				 wma_twt_ack_complete_event_handler,
767*5113495bSYour Name 				 WMA_RX_WORK_CTX);
768*5113495bSYour Name }
769*5113495bSYour Name #endif
770