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