xref: /wlan-dirver/qca-wifi-host-cmn/wmi/src/wmi_unified_twt_tlv.c (revision f28396d060cff5c6519f883cb28ae0116ce479f1)
1 /*
2  * Copyright (c) 2018-2020 The Linux Foundation. All rights reserved.
3  *
4  * Permission to use, copy, modify, and/or distribute this software for
5  * any purpose with or without fee is hereby granted, provided that the
6  * above copyright notice and this permission notice appear in all
7  * copies.
8  *
9  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
10  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
11  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
12  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
13  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
14  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
15  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
16  * PERFORMANCE OF THIS SOFTWARE.
17  */
18 
19 #include <osdep.h>
20 #include "wmi.h"
21 #include "wmi_unified_priv.h"
22 #include "wmi_unified_twt_param.h"
23 #include "wmi_unified_twt_api.h"
24 
25 static QDF_STATUS send_twt_enable_cmd_tlv(wmi_unified_t wmi_handle,
26 			struct wmi_twt_enable_param *params)
27 {
28 	wmi_twt_enable_cmd_fixed_param *cmd;
29 	wmi_buf_t buf;
30 	QDF_STATUS status;
31 
32 	buf = wmi_buf_alloc(wmi_handle, sizeof(*cmd));
33 	if (!buf) {
34 		WMI_LOGE("Failed to allocate memory");
35 		return QDF_STATUS_E_FAILURE;
36 	}
37 
38 	cmd = (wmi_twt_enable_cmd_fixed_param *) wmi_buf_data(buf);
39 	WMITLV_SET_HDR(&cmd->tlv_header,
40 			WMITLV_TAG_STRUC_wmi_twt_enable_cmd_fixed_param,
41 			WMITLV_GET_STRUCT_TLVLEN
42 			(wmi_twt_enable_cmd_fixed_param));
43 
44 	cmd->pdev_id =
45 		wmi_handle->ops->convert_pdev_id_host_to_target(
46 						wmi_handle,
47 						params->pdev_id);
48 	cmd->sta_cong_timer_ms =            params->sta_cong_timer_ms;
49 	cmd->mbss_support =                 params->mbss_support;
50 	cmd->default_slot_size =            params->default_slot_size;
51 	cmd->congestion_thresh_setup =      params->congestion_thresh_setup;
52 	cmd->congestion_thresh_teardown =   params->congestion_thresh_teardown;
53 	cmd->congestion_thresh_critical =   params->congestion_thresh_critical;
54 	cmd->interference_thresh_teardown =
55 					params->interference_thresh_teardown;
56 	cmd->interference_thresh_setup =    params->interference_thresh_setup;
57 	cmd->min_no_sta_setup =             params->min_no_sta_setup;
58 	cmd->min_no_sta_teardown =          params->min_no_sta_teardown;
59 	cmd->no_of_bcast_mcast_slots =      params->no_of_bcast_mcast_slots;
60 	cmd->min_no_twt_slots =             params->min_no_twt_slots;
61 	cmd->max_no_sta_twt =               params->max_no_sta_twt;
62 	cmd->mode_check_interval =          params->mode_check_interval;
63 	cmd->add_sta_slot_interval =        params->add_sta_slot_interval;
64 	cmd->remove_sta_slot_interval =     params->remove_sta_slot_interval;
65 	cmd->flags =                        params->flags;
66 
67 	status = wmi_unified_cmd_send(wmi_handle, buf, sizeof(*cmd),
68 			WMI_TWT_ENABLE_CMDID);
69 	if (QDF_IS_STATUS_ERROR(status)) {
70 		WMI_LOGE("Failed to send WMI_TWT_ENABLE_CMDID");
71 		wmi_buf_free(buf);
72 	}
73 
74 	return status;
75 }
76 
77 
78 static QDF_STATUS send_twt_disable_cmd_tlv(wmi_unified_t wmi_handle,
79 			struct wmi_twt_disable_param *params)
80 {
81 	wmi_twt_disable_cmd_fixed_param *cmd;
82 	wmi_buf_t buf;
83 	QDF_STATUS status;
84 
85 	buf = wmi_buf_alloc(wmi_handle, sizeof(*cmd));
86 	if (!buf) {
87 		WMI_LOGE("Failed to allocate memory");
88 		return QDF_STATUS_E_FAILURE;
89 	}
90 
91 	cmd = (wmi_twt_disable_cmd_fixed_param *) wmi_buf_data(buf);
92 	WMITLV_SET_HDR(&cmd->tlv_header,
93 			WMITLV_TAG_STRUC_wmi_twt_disable_cmd_fixed_param,
94 			WMITLV_GET_STRUCT_TLVLEN
95 			(wmi_twt_disable_cmd_fixed_param));
96 
97 	cmd->pdev_id =
98 		wmi_handle->ops->convert_pdev_id_host_to_target(
99 						wmi_handle,
100 						params->pdev_id);
101 
102 	status = wmi_unified_cmd_send(wmi_handle, buf, sizeof(*cmd),
103 			WMI_TWT_DISABLE_CMDID);
104 	if (QDF_IS_STATUS_ERROR(status)) {
105 		WMI_LOGE("Failed to send WMI_TWT_DISABLE_CMDID");
106 		wmi_buf_free(buf);
107 	}
108 
109 	return status;
110 }
111 
112 #ifdef WLAN_SUPPORT_BCAST_TWT
113 static void
114 twt_add_dialog_set_bcast_twt_params(struct wmi_twt_add_dialog_param *params,
115                 wmi_twt_add_dialog_cmd_fixed_param *cmd)
116 {
117 	TWT_FLAGS_SET_BTWT_ID0(cmd->flags, params->flag_b_twt_id0);
118 	cmd->b_twt_persistence = params->b_twt_persistence;
119 	cmd->b_twt_recommendation = params->b_twt_recommendation;
120 
121 	return;
122 }
123 #else
124 static void
125 twt_add_dialog_set_bcast_twt_params(struct wmi_twt_add_dialog_param *params,
126                 wmi_twt_add_dialog_cmd_fixed_param *cmd)
127 {
128 	return;
129 }
130 #endif
131 
132 static QDF_STATUS
133 send_twt_add_dialog_cmd_tlv(wmi_unified_t wmi_handle,
134 			    struct wmi_twt_add_dialog_param *params)
135 {
136 	wmi_twt_add_dialog_cmd_fixed_param *cmd;
137 	wmi_buf_t buf;
138 	QDF_STATUS status;
139 
140 	buf = wmi_buf_alloc(wmi_handle, sizeof(*cmd));
141 	if (!buf) {
142 		WMI_LOGE("Failed to allocate memory");
143 		return QDF_STATUS_E_FAILURE;
144 	}
145 
146 	cmd = (wmi_twt_add_dialog_cmd_fixed_param *) wmi_buf_data(buf);
147 	WMITLV_SET_HDR(&cmd->tlv_header,
148 		       WMITLV_TAG_STRUC_wmi_twt_add_dialog_cmd_fixed_param,
149 		       WMITLV_GET_STRUCT_TLVLEN
150 		       (wmi_twt_add_dialog_cmd_fixed_param));
151 
152 	cmd->vdev_id = params->vdev_id;
153 	WMI_CHAR_ARRAY_TO_MAC_ADDR(params->peer_macaddr, &cmd->peer_macaddr);
154 	cmd->dialog_id =         params->dialog_id;
155 	cmd->wake_intvl_us =     params->wake_intvl_us;
156 	cmd->wake_intvl_mantis = params->wake_intvl_mantis;
157 	cmd->wake_dura_us =      params->wake_dura_us;
158 	cmd->sp_offset_us =      params->sp_offset_us;
159 	TWT_FLAGS_SET_CMD(cmd->flags, params->twt_cmd);
160 	TWT_FLAGS_SET_BROADCAST(cmd->flags, params->flag_bcast);
161 	TWT_FLAGS_SET_TRIGGER(cmd->flags, params->flag_trigger);
162 	TWT_FLAGS_SET_FLOW_TYPE(cmd->flags, params->flag_flow_type);
163 	TWT_FLAGS_SET_PROTECTION(cmd->flags, params->flag_protection);
164 
165 	twt_add_dialog_set_bcast_twt_params(params, cmd);
166 
167 	status = wmi_unified_cmd_send(wmi_handle, buf, sizeof(*cmd),
168 				      WMI_TWT_ADD_DIALOG_CMDID);
169 	if (QDF_IS_STATUS_ERROR(status)) {
170 		WMI_LOGE("Failed to send WMI_TWT_ADD_DIALOG_CMDID");
171 		wmi_buf_free(buf);
172 	}
173 
174 	return status;
175 }
176 
177 #ifdef WLAN_SUPPORT_BCAST_TWT
178 static void
179 twt_del_dialog_set_bcast_twt_params(struct wmi_twt_del_dialog_param *params,
180                 wmi_twt_del_dialog_cmd_fixed_param *cmd)
181 {
182 	cmd->b_twt_persistence = params->b_twt_persistence;
183 	return;
184 }
185 #else
186 static void
187 twt_del_dialog_set_bcast_twt_params(struct wmi_twt_del_dialog_param *params,
188                 wmi_twt_del_dialog_cmd_fixed_param *cmd)
189 {
190 	return;
191 }
192 #endif
193 
194 static QDF_STATUS
195 send_twt_del_dialog_cmd_tlv(wmi_unified_t wmi_handle,
196 			    struct wmi_twt_del_dialog_param *params)
197 {
198 	wmi_twt_del_dialog_cmd_fixed_param *cmd;
199 	wmi_buf_t buf;
200 	QDF_STATUS status;
201 
202 	buf = wmi_buf_alloc(wmi_handle, sizeof(*cmd));
203 	if (!buf) {
204 		WMI_LOGE("Failed to allocate memory");
205 		return QDF_STATUS_E_FAILURE;
206 	}
207 
208 	cmd = (wmi_twt_del_dialog_cmd_fixed_param *) wmi_buf_data(buf);
209 	WMITLV_SET_HDR(&cmd->tlv_header,
210 		       WMITLV_TAG_STRUC_wmi_twt_del_dialog_cmd_fixed_param,
211 		       WMITLV_GET_STRUCT_TLVLEN
212 		       (wmi_twt_del_dialog_cmd_fixed_param));
213 
214 	cmd->vdev_id = params->vdev_id;
215 	WMI_CHAR_ARRAY_TO_MAC_ADDR(params->peer_macaddr, &cmd->peer_macaddr);
216 	cmd->dialog_id = params->dialog_id;
217 
218 	twt_del_dialog_set_bcast_twt_params(params, cmd);
219 
220 	status = wmi_unified_cmd_send(wmi_handle, buf, sizeof(*cmd),
221 				      WMI_TWT_DEL_DIALOG_CMDID);
222 	if (QDF_IS_STATUS_ERROR(status)) {
223 		WMI_LOGE("Failed to send WMI_TWT_DEL_DIALOG_CMDID");
224 		wmi_buf_free(buf);
225 	}
226 
227 	return status;
228 }
229 
230 static QDF_STATUS
231 send_twt_pause_dialog_cmd_tlv(wmi_unified_t wmi_handle,
232 			      struct wmi_twt_pause_dialog_cmd_param *params)
233 {
234 	wmi_twt_pause_dialog_cmd_fixed_param *cmd;
235 	wmi_buf_t buf;
236 	QDF_STATUS status;
237 
238 	buf = wmi_buf_alloc(wmi_handle, sizeof(*cmd));
239 	if (!buf) {
240 		WMI_LOGE("Failed to allocate memory");
241 		return QDF_STATUS_E_FAILURE;
242 	}
243 
244 	cmd = (wmi_twt_pause_dialog_cmd_fixed_param *) wmi_buf_data(buf);
245 	WMITLV_SET_HDR(&cmd->tlv_header,
246 		       WMITLV_TAG_STRUC_wmi_twt_pause_dialog_cmd_fixed_param,
247 		       WMITLV_GET_STRUCT_TLVLEN
248 		       (wmi_twt_pause_dialog_cmd_fixed_param));
249 
250 	cmd->vdev_id = params->vdev_id;
251 	WMI_CHAR_ARRAY_TO_MAC_ADDR(params->peer_macaddr, &cmd->peer_macaddr);
252 	cmd->dialog_id = params->dialog_id;
253 
254 	status = wmi_unified_cmd_send(wmi_handle, buf, sizeof(*cmd),
255 				      WMI_TWT_PAUSE_DIALOG_CMDID);
256 	if (QDF_IS_STATUS_ERROR(status)) {
257 		WMI_LOGE("Failed to send WMI_TWT_PAUSE_DIALOG_CMDID");
258 		wmi_buf_free(buf);
259 	}
260 
261 	return status;
262 }
263 
264 static QDF_STATUS send_twt_resume_dialog_cmd_tlv(wmi_unified_t wmi_handle,
265 			struct wmi_twt_resume_dialog_cmd_param *params)
266 {
267 	wmi_twt_resume_dialog_cmd_fixed_param *cmd;
268 	wmi_buf_t buf;
269 	QDF_STATUS status;
270 
271 	buf = wmi_buf_alloc(wmi_handle, sizeof(*cmd));
272 	if (!buf) {
273 		WMI_LOGE("Failed to allocate memory");
274 		return QDF_STATUS_E_FAILURE;
275 	}
276 
277 	cmd = (wmi_twt_resume_dialog_cmd_fixed_param *) wmi_buf_data(buf);
278 	WMITLV_SET_HDR(&cmd->tlv_header,
279 			WMITLV_TAG_STRUC_wmi_twt_resume_dialog_cmd_fixed_param,
280 			WMITLV_GET_STRUCT_TLVLEN
281 			(wmi_twt_resume_dialog_cmd_fixed_param));
282 
283 	cmd->vdev_id = params->vdev_id;
284 	WMI_CHAR_ARRAY_TO_MAC_ADDR(params->peer_macaddr, &cmd->peer_macaddr);
285 	cmd->dialog_id = params->dialog_id;
286 	cmd->sp_offset_us = params->sp_offset_us;
287 	cmd->next_twt_size = params->next_twt_size;
288 
289 	status = wmi_unified_cmd_send(wmi_handle, buf, sizeof(*cmd),
290 						WMI_TWT_RESUME_DIALOG_CMDID);
291 	if (QDF_IS_STATUS_ERROR(status)) {
292 		WMI_LOGE("Failed to send WMI_TWT_RESUME_DIALOG_CMDID");
293 		wmi_buf_free(buf);
294 	}
295 
296 	return status;
297 }
298 
299 #ifdef WLAN_SUPPORT_BCAST_TWT
300 static QDF_STATUS
301 send_twt_btwt_invite_sta_cmd_tlv(wmi_unified_t wmi_handle,
302 				 struct wmi_twt_btwt_invite_sta_cmd_param
303 				 *params)
304 {
305 	wmi_twt_btwt_invite_sta_cmd_fixed_param *cmd;
306 	wmi_buf_t buf;
307 	QDF_STATUS status;
308 
309 	buf = wmi_buf_alloc(wmi_handle, sizeof(*cmd));
310 	if (!buf) {
311 		WMI_LOGE("Failed to allocate memory");
312 		return QDF_STATUS_E_FAILURE;
313 	}
314 
315 	cmd = (wmi_twt_btwt_invite_sta_cmd_fixed_param *)wmi_buf_data(buf);
316 	WMITLV_SET_HDR(&cmd->tlv_header,
317 		       WMITLV_TAG_STRUC_wmi_twt_btwt_invite_sta_cmd_fixed_param,
318 		       WMITLV_GET_STRUCT_TLVLEN
319 		       (wmi_twt_btwt_invite_sta_cmd_fixed_param));
320 
321 	cmd->vdev_id = params->vdev_id;
322 	WMI_CHAR_ARRAY_TO_MAC_ADDR(params->peer_macaddr, &cmd->peer_macaddr);
323 	cmd->dialog_id = params->dialog_id;
324 
325 	status = wmi_unified_cmd_send(wmi_handle, buf, sizeof(*cmd),
326 				      WMI_TWT_BTWT_INVITE_STA_CMDID);
327 	if (QDF_IS_STATUS_ERROR(status)) {
328 		wmi_buf_free(buf);
329 	}
330 
331 	return status;
332 }
333 
334 static QDF_STATUS
335 send_twt_btwt_remove_sta_cmd_tlv(wmi_unified_t wmi_handle,
336 				 struct wmi_twt_btwt_remove_sta_cmd_param
337 				 *params)
338 {
339 	wmi_twt_btwt_remove_sta_cmd_fixed_param *cmd;
340 	wmi_buf_t buf;
341 	QDF_STATUS status;
342 
343 	buf = wmi_buf_alloc(wmi_handle, sizeof(*cmd));
344 	if (!buf) {
345 		WMI_LOGE("Failed to allocate memory");
346 		return QDF_STATUS_E_FAILURE;
347 	}
348 
349 	cmd = (wmi_twt_btwt_remove_sta_cmd_fixed_param *)wmi_buf_data(buf);
350 	WMITLV_SET_HDR(&cmd->tlv_header,
351 		       WMITLV_TAG_STRUC_wmi_twt_btwt_remove_sta_cmd_fixed_param,
352 		       WMITLV_GET_STRUCT_TLVLEN
353 		       (wmi_twt_btwt_remove_sta_cmd_fixed_param));
354 
355 	cmd->vdev_id = params->vdev_id;
356 	WMI_CHAR_ARRAY_TO_MAC_ADDR(params->peer_macaddr, &cmd->peer_macaddr);
357 	cmd->dialog_id = params->dialog_id;
358 
359 	status = wmi_unified_cmd_send(wmi_handle, buf, sizeof(*cmd),
360 				      WMI_TWT_BTWT_REMOVE_STA_CMDID);
361 	if (QDF_IS_STATUS_ERROR(status)) {
362 		wmi_buf_free(buf);
363 	}
364 
365 	return status;
366 }
367 #endif
368 
369 static QDF_STATUS extract_twt_enable_comp_event_tlv(wmi_unified_t wmi_handle,
370 		uint8_t *evt_buf,
371 		struct wmi_twt_enable_complete_event_param *params)
372 {
373 	WMI_TWT_ENABLE_COMPLETE_EVENTID_param_tlvs *param_buf;
374 	wmi_twt_enable_complete_event_fixed_param *ev;
375 
376 	param_buf = (WMI_TWT_ENABLE_COMPLETE_EVENTID_param_tlvs *)evt_buf;
377 	if (!param_buf) {
378 		WMI_LOGE("evt_buf is NULL");
379 		return QDF_STATUS_E_INVAL;
380 	}
381 
382 	ev = param_buf->fixed_param;
383 
384 	params->pdev_id =
385 		wmi_handle->ops->convert_pdev_id_target_to_host(wmi_handle,
386 								ev->pdev_id);
387 	params->status = ev->status;
388 
389 	return QDF_STATUS_SUCCESS;
390 }
391 
392 static QDF_STATUS extract_twt_disable_comp_event_tlv(wmi_unified_t wmi_handle,
393 		uint8_t *evt_buf,
394 		struct wmi_twt_disable_complete_event *params)
395 {
396 	WMI_TWT_DISABLE_COMPLETE_EVENTID_param_tlvs *param_buf;
397 	wmi_twt_disable_complete_event_fixed_param *ev;
398 
399 	param_buf = (WMI_TWT_DISABLE_COMPLETE_EVENTID_param_tlvs *)evt_buf;
400 	if (!param_buf) {
401 		WMI_LOGE("evt_buf is NULL");
402 		return QDF_STATUS_E_INVAL;
403 	}
404 
405 	ev = param_buf->fixed_param;
406 
407 #if 0
408 	params->pdev_id =
409 		wmi_handle->ops->convert_pdev_id_target_to_host(ev->pdev_id);
410 	params->status = ev->status;
411 #endif
412 
413 	return QDF_STATUS_SUCCESS;
414 }
415 
416 static QDF_STATUS extract_twt_add_dialog_comp_event_tlv(
417 		wmi_unified_t wmi_handle,
418 		uint8_t *evt_buf,
419 		struct wmi_twt_add_dialog_complete_event_param *params)
420 {
421 	WMI_TWT_ADD_DIALOG_COMPLETE_EVENTID_param_tlvs *param_buf;
422 	wmi_twt_add_dialog_complete_event_fixed_param *ev;
423 
424 	param_buf = (WMI_TWT_ADD_DIALOG_COMPLETE_EVENTID_param_tlvs *)evt_buf;
425 	if (!param_buf) {
426 		WMI_LOGE("evt_buf is NULL");
427 		return QDF_STATUS_E_INVAL;
428 	}
429 
430 	ev = param_buf->fixed_param;
431 
432 	params->vdev_id = ev->vdev_id;
433 	WMI_MAC_ADDR_TO_CHAR_ARRAY(&ev->peer_macaddr, params->peer_macaddr);
434 	params->status = ev->status;
435 	params->dialog_id = ev->dialog_id;
436 
437 	return QDF_STATUS_SUCCESS;
438 }
439 
440 static QDF_STATUS extract_twt_del_dialog_comp_event_tlv(
441 		wmi_unified_t wmi_handle,
442 		uint8_t *evt_buf,
443 		struct wmi_twt_del_dialog_complete_event_param *params)
444 {
445 	WMI_TWT_DEL_DIALOG_COMPLETE_EVENTID_param_tlvs *param_buf;
446 	wmi_twt_del_dialog_complete_event_fixed_param *ev;
447 
448 	param_buf = (WMI_TWT_DEL_DIALOG_COMPLETE_EVENTID_param_tlvs *)evt_buf;
449 	if (!param_buf) {
450 		WMI_LOGE("evt_buf is NULL");
451 		return QDF_STATUS_E_INVAL;
452 	}
453 
454 	ev = param_buf->fixed_param;
455 
456 	params->vdev_id = ev->vdev_id;
457 	WMI_MAC_ADDR_TO_CHAR_ARRAY(&ev->peer_macaddr, params->peer_macaddr);
458 	params->dialog_id = ev->dialog_id;
459 
460 	return QDF_STATUS_SUCCESS;
461 }
462 
463 static QDF_STATUS extract_twt_pause_dialog_comp_event_tlv(
464 		wmi_unified_t wmi_handle,
465 		uint8_t *evt_buf,
466 		struct wmi_twt_pause_dialog_complete_event_param *params)
467 {
468 	WMI_TWT_PAUSE_DIALOG_COMPLETE_EVENTID_param_tlvs *param_buf;
469 	wmi_twt_pause_dialog_complete_event_fixed_param *ev;
470 
471 	param_buf = (WMI_TWT_PAUSE_DIALOG_COMPLETE_EVENTID_param_tlvs *)evt_buf;
472 	if (!param_buf) {
473 		WMI_LOGE("evt_buf is NULL");
474 		return QDF_STATUS_E_INVAL;
475 	}
476 
477 	ev = param_buf->fixed_param;
478 
479 	params->vdev_id = ev->vdev_id;
480 	WMI_MAC_ADDR_TO_CHAR_ARRAY(&ev->peer_macaddr, params->peer_macaddr);
481 	params->status = ev->status;
482 	params->dialog_id = ev->dialog_id;
483 
484 	return QDF_STATUS_SUCCESS;
485 }
486 
487 static QDF_STATUS extract_twt_resume_dialog_comp_event_tlv(
488 		wmi_unified_t wmi_handle,
489 		uint8_t *evt_buf,
490 		struct wmi_twt_resume_dialog_complete_event_param *params)
491 {
492 	WMI_TWT_RESUME_DIALOG_COMPLETE_EVENTID_param_tlvs *param_buf;
493 	wmi_twt_resume_dialog_complete_event_fixed_param *ev;
494 
495 	param_buf =
496 		(WMI_TWT_RESUME_DIALOG_COMPLETE_EVENTID_param_tlvs *)evt_buf;
497 	if (!param_buf) {
498 		WMI_LOGE("evt_buf is NULL");
499 		return QDF_STATUS_E_INVAL;
500 	}
501 
502 	ev = param_buf->fixed_param;
503 
504 	params->vdev_id = ev->vdev_id;
505 	WMI_MAC_ADDR_TO_CHAR_ARRAY(&ev->peer_macaddr, params->peer_macaddr);
506 	params->status = ev->status;
507 	params->dialog_id = ev->dialog_id;
508 
509 	return QDF_STATUS_SUCCESS;
510 }
511 
512 #ifdef WLAN_SUPPORT_BCAST_TWT
513 static QDF_STATUS
514 extract_twt_btwt_invite_sta_comp_event_tlv(
515 					   wmi_unified_t wmi_handle,
516 					   uint8_t *evt_buf,
517 					   struct
518 					   wmi_twt_btwt_invite_sta_complete_event_param
519 					   *params)
520 {
521 	WMI_TWT_BTWT_INVITE_STA_COMPLETE_EVENTID_param_tlvs *param_buf;
522 	wmi_twt_btwt_invite_sta_complete_event_fixed_param *ev;
523 
524 	param_buf =
525 		(WMI_TWT_BTWT_INVITE_STA_COMPLETE_EVENTID_param_tlvs *)evt_buf;
526 	if (!param_buf) {
527 		WMI_LOGE("evt_buf is NULL");
528 		return QDF_STATUS_E_INVAL;
529 	}
530 
531 	ev = param_buf->fixed_param;
532 
533 	params->vdev_id = ev->vdev_id;
534 	WMI_MAC_ADDR_TO_CHAR_ARRAY(&ev->peer_macaddr, params->peer_macaddr);
535 	params->status = ev->status;
536 	params->dialog_id = ev->dialog_id;
537 
538 	return QDF_STATUS_SUCCESS;
539 }
540 
541 static QDF_STATUS
542 extract_twt_btwt_remove_sta_comp_event_tlv(
543 					   wmi_unified_t wmi_handle,
544 					   uint8_t *evt_buf,
545 					   struct
546 					   wmi_twt_btwt_remove_sta_complete_event_param
547 					   *params)
548 {
549 	WMI_TWT_BTWT_REMOVE_STA_COMPLETE_EVENTID_param_tlvs *param_buf;
550 	wmi_twt_btwt_remove_sta_complete_event_fixed_param *ev;
551 
552 	param_buf =
553 		(WMI_TWT_BTWT_REMOVE_STA_COMPLETE_EVENTID_param_tlvs *)evt_buf;
554 	if (!param_buf) {
555 		WMI_LOGE("evt_buf is NULL");
556 		return QDF_STATUS_E_INVAL;
557 	}
558 
559 	ev = param_buf->fixed_param;
560 
561 	params->vdev_id = ev->vdev_id;
562 	WMI_MAC_ADDR_TO_CHAR_ARRAY(&ev->peer_macaddr, params->peer_macaddr);
563 	params->status = ev->status;
564 	params->dialog_id = ev->dialog_id;
565 
566 	return QDF_STATUS_SUCCESS;
567 }
568 #endif
569 
570 #ifdef WLAN_SUPPORT_BCAST_TWT
571 static void
572 wmi_twt_attach_bcast_twt_tlv(struct wmi_ops *ops)
573 {
574 	ops->send_twt_btwt_invite_sta_cmd = send_twt_btwt_invite_sta_cmd_tlv;
575 	ops->send_twt_btwt_remove_sta_cmd = send_twt_btwt_remove_sta_cmd_tlv;
576 	ops->extract_twt_btwt_invite_sta_comp_event =
577 				extract_twt_btwt_invite_sta_comp_event_tlv;
578 	ops->extract_twt_btwt_remove_sta_comp_event =
579 				extract_twt_btwt_remove_sta_comp_event_tlv;
580 
581 	return;
582 }
583 #else
584 static void
585 wmi_twt_attach_bcast_twt_tlv(struct wmi_ops *ops)
586 {
587 	return;
588 }
589 #endif
590 
591 void wmi_twt_attach_tlv(wmi_unified_t wmi_handle)
592 {
593 	struct wmi_ops *ops = wmi_handle->ops;
594 
595 	ops->send_twt_enable_cmd = send_twt_enable_cmd_tlv;
596 	ops->send_twt_disable_cmd = send_twt_disable_cmd_tlv;
597 	ops->send_twt_add_dialog_cmd = send_twt_add_dialog_cmd_tlv;
598 	ops->send_twt_del_dialog_cmd = send_twt_del_dialog_cmd_tlv;
599 	ops->send_twt_pause_dialog_cmd = send_twt_pause_dialog_cmd_tlv;
600 	ops->send_twt_resume_dialog_cmd = send_twt_resume_dialog_cmd_tlv;
601 	ops->extract_twt_enable_comp_event = extract_twt_enable_comp_event_tlv;
602 	ops->extract_twt_disable_comp_event =
603 				extract_twt_disable_comp_event_tlv;
604 	ops->extract_twt_add_dialog_comp_event =
605 				extract_twt_add_dialog_comp_event_tlv;
606 	ops->extract_twt_del_dialog_comp_event =
607 				extract_twt_del_dialog_comp_event_tlv;
608 	ops->extract_twt_pause_dialog_comp_event =
609 				extract_twt_pause_dialog_comp_event_tlv;
610 	ops->extract_twt_resume_dialog_comp_event =
611 				extract_twt_resume_dialog_comp_event_tlv;
612 
613 	wmi_twt_attach_bcast_twt_tlv(ops);
614 }
615