1 /* 2 * Copyright (c) 2017-2021 The Linux Foundation. All rights reserved. 3 * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved. 4 * 5 * Permission to use, copy, modify, and/or distribute this software for 6 * any purpose with or without fee is hereby granted, provided that the 7 * above copyright notice and this permission notice appear in all 8 * copies. 9 * 10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL 11 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED 12 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE 13 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL 14 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR 15 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 16 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 17 * PERFORMANCE OF THIS SOFTWARE. 18 */ 19 /** 20 * DOC: public API related to the pmo called by north bound HDD/OSIF 21 */ 22 23 #include "wlan_pmo_ucfg_api.h" 24 #include "wlan_pmo_apf.h" 25 #include "wlan_pmo_arp.h" 26 #include "wlan_pmo_ns.h" 27 #include "wlan_pmo_gtk.h" 28 #include "wlan_pmo_wow.h" 29 #include "wlan_pmo_mc_addr_filtering.h" 30 #include "wlan_pmo_main.h" 31 #include "wlan_pmo_lphb.h" 32 #include "wlan_pmo_suspend_resume.h" 33 #include "wlan_pmo_pkt_filter.h" 34 #include "wlan_pmo_hw_filter.h" 35 #include "wlan_pmo_cfg.h" 36 #include "wlan_pmo_static_config.h" 37 #include "cfg_ucfg_api.h" 38 #include "wlan_pmo_icmp.h" 39 40 QDF_STATUS ucfg_pmo_psoc_open(struct wlan_objmgr_psoc *psoc) 41 { 42 return pmo_psoc_open(psoc); 43 } 44 45 QDF_STATUS ucfg_pmo_psoc_close(struct wlan_objmgr_psoc *psoc) 46 { 47 return pmo_psoc_close(psoc); 48 } 49 50 uint32_t ucfg_pmo_get_apf_instruction_size(struct wlan_objmgr_psoc *psoc) 51 { 52 QDF_BUG(psoc); 53 if (!psoc) 54 return 0; 55 56 return pmo_get_apf_instruction_size(psoc); 57 } 58 59 uint8_t ucfg_pmo_get_num_wow_filters(struct wlan_objmgr_psoc *psoc) 60 { 61 QDF_BUG(psoc); 62 if (!psoc) 63 return 0; 64 65 return pmo_get_num_wow_filters(psoc); 66 } 67 68 QDF_STATUS ucfg_pmo_get_psoc_config(struct wlan_objmgr_psoc *psoc, 69 struct pmo_psoc_cfg *psoc_cfg) 70 { 71 return pmo_core_get_psoc_config(psoc, psoc_cfg); 72 } 73 74 QDF_STATUS ucfg_pmo_update_psoc_config(struct wlan_objmgr_psoc *psoc, 75 struct pmo_psoc_cfg *psoc_cfg) 76 { 77 return pmo_core_update_psoc_config(psoc, psoc_cfg); 78 } 79 80 QDF_STATUS ucfg_pmo_psoc_set_caps(struct wlan_objmgr_psoc *psoc, 81 struct pmo_device_caps *caps) 82 { 83 QDF_BUG(psoc); 84 if (!psoc) 85 return QDF_STATUS_E_INVAL; 86 87 QDF_BUG(caps); 88 if (!caps) 89 return QDF_STATUS_E_INVAL; 90 91 pmo_psoc_set_caps(psoc, caps); 92 93 return QDF_STATUS_SUCCESS; 94 } 95 96 bool ucfg_pmo_is_ap_mode_supports_arp_ns(struct wlan_objmgr_psoc *psoc, 97 enum QDF_OPMODE vdev_opmode) 98 { 99 return pmo_core_is_ap_mode_supports_arp_ns(psoc, vdev_opmode); 100 } 101 102 bool ucfg_pmo_is_vdev_connected(struct wlan_objmgr_vdev *vdev) 103 { 104 if (wlan_vdev_is_up(vdev) == QDF_STATUS_SUCCESS) 105 return true; 106 else 107 return false; 108 } 109 110 bool ucfg_pmo_is_vdev_supports_offload(struct wlan_objmgr_vdev *vdev) 111 { 112 return pmo_core_is_vdev_supports_offload(vdev); 113 } 114 115 void ucfg_pmo_enable_wakeup_event(struct wlan_objmgr_psoc *psoc, 116 uint32_t vdev_id, 117 WOW_WAKE_EVENT_TYPE wow_event) 118 { 119 pmo_core_enable_wakeup_event(psoc, vdev_id, wow_event); 120 } 121 122 void ucfg_pmo_disable_wakeup_event(struct wlan_objmgr_psoc *psoc, 123 uint32_t vdev_id, 124 WOW_WAKE_EVENT_TYPE wow_event) 125 { 126 pmo_core_disable_wakeup_event(psoc, vdev_id, wow_event); 127 } 128 129 QDF_STATUS ucfg_pmo_cache_arp_offload_req(struct pmo_arp_req *arp_req) 130 { 131 return pmo_core_cache_arp_offload_req(arp_req); 132 } 133 134 QDF_STATUS ucfg_pmo_check_arp_offload(struct wlan_objmgr_psoc *psoc, 135 enum pmo_offload_trigger trigger, 136 uint8_t vdev_id) 137 { 138 return pmo_core_arp_check_offload(psoc, trigger, vdev_id); 139 } 140 141 QDF_STATUS ucfg_pmo_flush_arp_offload_req(struct wlan_objmgr_vdev *vdev) 142 { 143 return pmo_core_flush_arp_offload_req(vdev); 144 } 145 146 QDF_STATUS ucfg_pmo_enable_arp_offload_in_fwr(struct wlan_objmgr_vdev *vdev, 147 enum pmo_offload_trigger trigger) 148 { 149 return pmo_core_enable_arp_offload_in_fwr(vdev, trigger); 150 } 151 152 QDF_STATUS 153 ucfg_pmo_disable_arp_offload_in_fwr(struct wlan_objmgr_vdev *vdev, 154 enum pmo_offload_trigger trigger) 155 { 156 return pmo_core_disable_arp_offload_in_fwr(vdev, trigger); 157 } 158 159 QDF_STATUS 160 ucfg_pmo_get_arp_offload_params(struct wlan_objmgr_vdev *vdev, 161 struct pmo_arp_offload_params *params) 162 { 163 return pmo_core_get_arp_offload_params(vdev, params); 164 } 165 166 #ifdef WLAN_NS_OFFLOAD 167 QDF_STATUS ucfg_pmo_cache_ns_offload_req(struct pmo_ns_req *ns_req) 168 { 169 return pmo_core_cache_ns_offload_req(ns_req); 170 } 171 172 QDF_STATUS ucfg_pmo_ns_offload_check(struct wlan_objmgr_psoc *psoc, 173 enum pmo_offload_trigger trigger, 174 uint8_t vdev_id) 175 { 176 return pmo_core_ns_check_offload(psoc, trigger, vdev_id); 177 } 178 179 QDF_STATUS ucfg_pmo_flush_ns_offload_req(struct wlan_objmgr_vdev *vdev) 180 { 181 return pmo_core_flush_ns_offload_req(vdev); 182 } 183 184 QDF_STATUS 185 ucfg_pmo_enable_ns_offload_in_fwr(struct wlan_objmgr_vdev *vdev, 186 enum pmo_offload_trigger trigger) 187 { 188 return pmo_core_enable_ns_offload_in_fwr(vdev, trigger); 189 } 190 191 QDF_STATUS 192 ucfg_pmo_disable_ns_offload_in_fwr(struct wlan_objmgr_vdev *vdev, 193 enum pmo_offload_trigger trigger) 194 { 195 return pmo_core_disable_ns_offload_in_fwr(vdev, trigger); 196 } 197 #endif /* WLAN_NS_OFFLOAD */ 198 199 #ifdef FEATURE_WLAN_DYNAMIC_ARP_NS_OFFLOAD 200 QDF_STATUS 201 ucfg_pmo_dynamic_arp_ns_offload_enable(struct wlan_objmgr_vdev *vdev) 202 { 203 return pmo_core_dynamic_arp_ns_offload_enable(vdev); 204 } 205 206 QDF_STATUS 207 ucfg_pmo_dynamic_arp_ns_offload_disable(struct wlan_objmgr_vdev *vdev) 208 { 209 return pmo_core_dynamic_arp_ns_offload_disable(vdev); 210 } 211 212 bool 213 ucfg_pmo_get_arp_ns_offload_dynamic_disable(struct wlan_objmgr_vdev *vdev) 214 { 215 return pmo_core_get_dynamic_arp_ns_offload_disable(vdev); 216 } 217 218 void 219 ucfg_pmo_dynamic_arp_ns_offload_runtime_prevent(struct wlan_objmgr_vdev *vdev) 220 { 221 return pmo_core_dynamic_arp_ns_offload_runtime_prevent(vdev); 222 } 223 224 void 225 ucfg_pmo_dynamic_arp_ns_offload_runtime_allow(struct wlan_objmgr_vdev *vdev) 226 { 227 return pmo_core_dynamic_arp_ns_offload_runtime_allow(vdev); 228 } 229 #endif 230 231 QDF_STATUS 232 ucfg_pmo_get_ns_offload_params(struct wlan_objmgr_vdev *vdev, 233 struct pmo_ns_offload_params *params) 234 { 235 return pmo_core_get_ns_offload_params(vdev, params); 236 } 237 238 enum pmo_ns_addr_scope 239 ucfg_pmo_ns_addr_scope(uint32_t ipv6_scope) 240 { 241 switch (ipv6_scope) { 242 case IPV6_ADDR_SCOPE_NODELOCAL: 243 return PMO_NS_ADDR_SCOPE_NODELOCAL; 244 case IPV6_ADDR_SCOPE_LINKLOCAL: 245 return PMO_NS_ADDR_SCOPE_LINKLOCAL; 246 case IPV6_ADDR_SCOPE_SITELOCAL: 247 return PMO_NS_ADDR_SCOPE_SITELOCAL; 248 case IPV6_ADDR_SCOPE_ORGLOCAL: 249 return PMO_NS_ADDR_SCOPE_ORGLOCAL; 250 case IPV6_ADDR_SCOPE_GLOBAL: 251 return PMO_NS_ADDR_SCOPE_GLOBAL; 252 } 253 254 return PMO_NS_ADDR_SCOPE_INVALID; 255 } 256 257 QDF_STATUS ucfg_pmo_cache_mc_addr_list( 258 struct pmo_mc_addr_list_params *mc_list_config) 259 { 260 return pmo_core_cache_mc_addr_list(mc_list_config); 261 } 262 263 QDF_STATUS ucfg_pmo_flush_mc_addr_list(struct wlan_objmgr_psoc *psoc, 264 uint8_t vdev_id) 265 { 266 return pmo_core_flush_mc_addr_list(psoc, vdev_id); 267 } 268 269 QDF_STATUS ucfg_pmo_enable_mc_addr_filtering_in_fwr( 270 struct wlan_objmgr_psoc *psoc, 271 uint8_t vdev_id, 272 enum pmo_offload_trigger trigger) 273 { 274 return pmo_core_enable_mc_addr_filtering_in_fwr(psoc, 275 vdev_id, trigger); 276 } 277 278 QDF_STATUS ucfg_pmo_disable_mc_addr_filtering_in_fwr( 279 struct wlan_objmgr_psoc *psoc, 280 uint8_t vdev_id, 281 enum pmo_offload_trigger trigger) 282 { 283 return pmo_core_disable_mc_addr_filtering_in_fwr(psoc, 284 vdev_id, trigger); 285 } 286 287 uint8_t ucfg_pmo_max_mc_addr_supported(struct wlan_objmgr_psoc *psoc) 288 { 289 return pmo_core_max_mc_addr_supported(psoc); 290 } 291 292 QDF_STATUS 293 ucfg_pmo_get_mc_addr_list(struct wlan_objmgr_psoc *psoc, 294 uint8_t vdev_id, 295 struct pmo_mc_addr_list *mc_list_req) 296 { 297 return pmo_core_get_mc_addr_list(psoc, vdev_id, mc_list_req); 298 } 299 300 QDF_STATUS 301 ucfg_pmo_cache_gtk_offload_req(struct wlan_objmgr_vdev *vdev, 302 struct pmo_gtk_req *gtk_req) 303 { 304 return pmo_core_cache_gtk_offload_req(vdev, gtk_req); 305 } 306 307 QDF_STATUS ucfg_pmo_flush_gtk_offload_req(struct wlan_objmgr_vdev *vdev) 308 { 309 return pmo_core_flush_gtk_offload_req(vdev); 310 } 311 312 QDF_STATUS ucfg_pmo_enable_gtk_offload_in_fwr(struct wlan_objmgr_vdev *vdev) 313 { 314 return pmo_core_enable_gtk_offload_in_fwr(vdev); 315 } 316 317 #ifdef WLAN_FEATURE_IGMP_OFFLOAD 318 QDF_STATUS ucfg_pmo_enable_igmp_offload(struct wlan_objmgr_vdev *vdev, 319 struct pmo_igmp_offload_req *igmp_req) 320 { 321 return pmo_core_enable_igmp_offload(vdev, igmp_req); 322 } 323 #endif 324 325 QDF_STATUS ucfg_pmo_disable_gtk_offload_in_fwr(struct wlan_objmgr_vdev *vdev) 326 { 327 return pmo_core_disable_gtk_offload_in_fwr(vdev); 328 } 329 330 #ifdef WLAN_FEATURE_PACKET_FILTERING 331 uint8_t ucfg_pmo_get_pkt_filter_bitmap(struct wlan_objmgr_psoc *psoc) 332 { 333 struct pmo_psoc_priv_obj *pmo_psoc_ctx = pmo_psoc_get_priv(psoc); 334 335 return pmo_psoc_ctx->psoc_cfg.packet_filters_bitmap; 336 } 337 338 uint32_t ucfg_pmo_get_num_packet_filters(struct wlan_objmgr_psoc *psoc) 339 { 340 QDF_BUG(psoc); 341 if (!psoc) 342 return 0; 343 344 return pmo_get_num_packet_filters(psoc); 345 } 346 347 QDF_STATUS 348 ucfg_pmo_set_pkt_filter(struct wlan_objmgr_psoc *psoc, 349 struct pmo_rcv_pkt_fltr_cfg *pmo_set_pkt_fltr_req, 350 uint8_t vdev_id) 351 { 352 return pmo_core_set_pkt_filter(psoc, pmo_set_pkt_fltr_req, vdev_id); 353 } 354 355 QDF_STATUS ucfg_pmo_clear_pkt_filter( 356 struct wlan_objmgr_psoc *psoc, 357 struct pmo_rcv_pkt_fltr_clear_param *pmo_clr_pkt_fltr_param, 358 uint8_t vdev_id) 359 { 360 return pmo_core_clear_pkt_filter(psoc, 361 pmo_clr_pkt_fltr_param, vdev_id); 362 } 363 #endif 364 365 QDF_STATUS ucfg_pmo_get_gtk_rsp(struct wlan_objmgr_vdev *vdev, 366 struct pmo_gtk_rsp_req *gtk_rsp_req) 367 { 368 return pmo_core_get_gtk_rsp(vdev, gtk_rsp_req); 369 } 370 371 void ucfg_pmo_update_extscan_in_progress(struct wlan_objmgr_vdev *vdev, 372 bool value) 373 { 374 pmo_core_update_extscan_in_progress(vdev, value); 375 } 376 377 void ucfg_pmo_update_p2plo_in_progress(struct wlan_objmgr_vdev *vdev, 378 bool value) 379 { 380 pmo_core_update_p2plo_in_progress(vdev, value); 381 } 382 383 QDF_STATUS ucfg_pmo_lphb_config_req(struct wlan_objmgr_psoc *psoc, 384 struct pmo_lphb_req *lphb_req, 385 void *lphb_cb_ctx, 386 pmo_lphb_callback callback) 387 { 388 return pmo_core_lphb_config_req(psoc, lphb_req, lphb_cb_ctx, callback); 389 } 390 391 void ucfg_pmo_psoc_update_power_save_mode(struct wlan_objmgr_psoc *psoc, 392 uint8_t value) 393 { 394 pmo_core_psoc_update_power_save_mode(psoc, value); 395 } 396 397 void ucfg_pmo_psoc_update_dp_handle(struct wlan_objmgr_psoc *psoc, 398 void *dp_handle) 399 { 400 pmo_core_psoc_update_dp_handle(psoc, dp_handle); 401 } 402 403 void ucfg_pmo_psoc_update_htc_handle(struct wlan_objmgr_psoc *psoc, 404 void *htc_handle) 405 { 406 pmo_core_psoc_update_htc_handle(psoc, htc_handle); 407 } 408 409 void ucfg_pmo_psoc_set_hif_handle(struct wlan_objmgr_psoc *psoc, 410 void *hif_handle) 411 { 412 pmo_core_psoc_set_hif_handle(psoc, hif_handle); 413 } 414 415 void ucfg_pmo_psoc_set_txrx_pdev_id(struct wlan_objmgr_psoc *psoc, 416 uint8_t txrx_pdev_id) 417 { 418 pmo_core_psoc_set_txrx_pdev_id(psoc, txrx_pdev_id); 419 } 420 421 void ucfg_pmo_psoc_handle_initial_wake_up(void *cb_ctx) 422 { 423 return pmo_core_psoc_handle_initial_wake_up(cb_ctx); 424 } 425 426 QDF_STATUS 427 ucfg_pmo_psoc_user_space_suspend_req(struct wlan_objmgr_psoc *psoc, 428 enum qdf_suspend_type type) 429 { 430 return pmo_core_psoc_user_space_suspend_req(psoc, type); 431 } 432 433 QDF_STATUS 434 ucfg_pmo_psoc_user_space_resume_req(struct wlan_objmgr_psoc *psoc, 435 enum qdf_suspend_type type) 436 { 437 return pmo_core_psoc_user_space_resume_req(psoc, type); 438 } 439 440 QDF_STATUS ucfg_pmo_suspend_all_components(struct wlan_objmgr_psoc *psoc, 441 enum qdf_suspend_type type) 442 { 443 return pmo_suspend_all_components(psoc, type); 444 } 445 446 QDF_STATUS ucfg_pmo_resume_all_components(struct wlan_objmgr_psoc *psoc, 447 enum qdf_suspend_type type) 448 { 449 return pmo_resume_all_components(psoc, type); 450 } 451 452 QDF_STATUS 453 ucfg_pmo_psoc_bus_suspend_req(struct wlan_objmgr_psoc *psoc, 454 enum qdf_suspend_type type, 455 struct pmo_wow_enable_params *wow_params) 456 { 457 return pmo_core_psoc_bus_suspend_req(psoc, type, wow_params); 458 } 459 460 #ifdef FEATURE_RUNTIME_PM 461 QDF_STATUS ucfg_pmo_psoc_bus_runtime_suspend(struct wlan_objmgr_psoc *psoc, 462 pmo_pld_auto_suspend_cb pld_cb) 463 { 464 return pmo_core_psoc_bus_runtime_suspend(psoc, pld_cb); 465 } 466 467 QDF_STATUS ucfg_pmo_psoc_bus_runtime_resume(struct wlan_objmgr_psoc *psoc, 468 pmo_pld_auto_suspend_cb pld_cb) 469 { 470 return pmo_core_psoc_bus_runtime_resume(psoc, pld_cb); 471 } 472 #endif 473 474 QDF_STATUS 475 ucfg_pmo_psoc_suspend_target(struct wlan_objmgr_psoc *psoc, 476 int disable_target_intr) 477 { 478 return pmo_core_psoc_suspend_target(psoc, disable_target_intr); 479 } 480 481 QDF_STATUS 482 ucfg_pmo_add_wow_user_pattern(struct wlan_objmgr_vdev *vdev, 483 struct pmo_wow_add_pattern *ptrn) 484 { 485 return pmo_core_add_wow_user_pattern(vdev, ptrn); 486 } 487 488 void ucfg_pmo_register_wow_default_patterns(struct wlan_objmgr_vdev *vdev) 489 { 490 pmo_register_wow_default_patterns(vdev); 491 } 492 493 QDF_STATUS 494 ucfg_pmo_del_wow_pattern(struct wlan_objmgr_vdev *vdev) 495 { 496 return pmo_core_del_wow_pattern(vdev); 497 } 498 499 QDF_STATUS 500 ucfg_pmo_del_wow_user_pattern(struct wlan_objmgr_vdev *vdev, 501 uint8_t pattern_id) 502 { 503 return pmo_core_del_wow_user_pattern(vdev, pattern_id); 504 } 505 506 QDF_STATUS 507 ucfg_pmo_psoc_bus_resume_req(struct wlan_objmgr_psoc *psoc, 508 enum qdf_suspend_type type) 509 { 510 return pmo_core_psoc_bus_resume_req(psoc, type); 511 } 512 513 bool ucfg_pmo_get_wow_bus_suspend(struct wlan_objmgr_psoc *psoc) 514 { 515 return pmo_core_get_wow_bus_suspend(psoc); 516 } 517 518 int ucfg_pmo_psoc_is_target_wake_up_received(struct wlan_objmgr_psoc *psoc) 519 { 520 return pmo_core_psoc_is_target_wake_up_received(psoc); 521 } 522 523 int ucfg_pmo_psoc_clear_target_wake_up(struct wlan_objmgr_psoc *psoc) 524 { 525 return pmo_core_psoc_clear_target_wake_up(psoc); 526 } 527 528 void ucfg_pmo_psoc_target_suspend_acknowledge(void *context, bool wow_nack, 529 uint16_t reason_code) 530 { 531 pmo_core_psoc_target_suspend_acknowledge(context, wow_nack, 532 reason_code); 533 } 534 535 void ucfg_pmo_psoc_wakeup_host_event_received(struct wlan_objmgr_psoc *psoc) 536 { 537 pmo_core_psoc_wakeup_host_event_received(psoc); 538 } 539 540 QDF_STATUS ucfg_pmo_enable_hw_filter_in_fwr(struct wlan_objmgr_vdev *vdev) 541 { 542 return pmo_core_enable_hw_filter_in_fwr(vdev); 543 } 544 545 QDF_STATUS 546 ucfg_pmo_enable_action_frame_patterns(struct wlan_objmgr_vdev *vdev, 547 enum qdf_suspend_type suspend_type) 548 { 549 return pmo_register_action_frame_patterns(vdev, suspend_type); 550 } 551 552 QDF_STATUS ucfg_pmo_disable_action_frame_patterns(struct wlan_objmgr_vdev *vdev) 553 { 554 return pmo_clear_action_frame_patterns(vdev); 555 } 556 557 QDF_STATUS ucfg_pmo_disable_hw_filter_in_fwr(struct wlan_objmgr_vdev *vdev) 558 { 559 return pmo_core_disable_hw_filter_in_fwr(vdev); 560 } 561 562 QDF_STATUS ucfg_pmo_config_listen_interval(struct wlan_objmgr_vdev *vdev, 563 uint32_t listen_interval) 564 { 565 return pmo_core_config_listen_interval(vdev, listen_interval); 566 } 567 568 QDF_STATUS ucfg_pmo_get_listen_interval(struct wlan_objmgr_vdev *vdev, 569 uint32_t *listen_interval) 570 { 571 return pmo_core_get_listen_interval(vdev, listen_interval); 572 } 573 574 QDF_STATUS ucfg_pmo_config_modulated_dtim(struct wlan_objmgr_vdev *vdev, 575 uint32_t mod_dtim) 576 { 577 return pmo_core_config_modulated_dtim(vdev, mod_dtim); 578 } 579 580 enum pmo_wow_enable_type 581 ucfg_pmo_get_wow_enable(struct wlan_objmgr_psoc *psoc) 582 { 583 struct pmo_psoc_priv_obj *pmo_psoc_ctx = pmo_psoc_get_priv(psoc); 584 585 return pmo_psoc_ctx->psoc_cfg.wow_enable; 586 } 587 588 void 589 ucfg_pmo_set_wow_enable(struct wlan_objmgr_psoc *psoc, 590 enum pmo_wow_enable_type val) 591 { 592 struct pmo_psoc_priv_obj *pmo_psoc_ctx = pmo_psoc_get_priv(psoc); 593 594 pmo_psoc_ctx->psoc_cfg.wow_enable = val; 595 } 596 597 void 598 ucfg_pmo_set_ps_params(struct wlan_objmgr_vdev *vdev, 599 struct pmo_ps_params *ps_params) 600 { 601 pmo_core_vdev_set_ps_params(vdev, ps_params); 602 } 603 604 QDF_STATUS ucfg_pmo_get_ps_params(struct wlan_objmgr_vdev *vdev, 605 struct pmo_ps_params *ps_params) 606 { 607 return pmo_core_vdev_get_ps_params(vdev, ps_params); 608 } 609 610 QDF_STATUS ucfg_pmo_core_vdev_set_ps_opm_mode(struct wlan_objmgr_vdev *vdev, 611 enum powersave_mode opm_mode) 612 { 613 return pmo_vdev_set_ps_opm_mode(vdev, opm_mode); 614 } 615 616 QDF_STATUS ucfg_pmo_core_vdev_get_ps_opm_mode(struct wlan_objmgr_vdev *vdev, 617 enum powersave_mode *opm_mode) 618 { 619 return pmo_vdev_get_ps_opm_mode(vdev, opm_mode); 620 } 621 622 bool 623 ucfg_pmo_is_arp_offload_enabled(struct wlan_objmgr_psoc *psoc) 624 { 625 struct pmo_psoc_priv_obj *pmo_psoc_ctx = pmo_psoc_get_priv(psoc); 626 627 return pmo_psoc_ctx->psoc_cfg.arp_offload_enable; 628 } 629 630 #ifdef WLAN_FEATURE_IGMP_OFFLOAD 631 bool 632 ucfg_pmo_is_igmp_offload_enabled(struct wlan_objmgr_psoc *psoc) 633 { 634 struct pmo_psoc_priv_obj *pmo_psoc_ctx = pmo_psoc_get_priv(psoc); 635 636 return pmo_psoc_ctx->psoc_cfg.igmp_offload_enable; 637 } 638 #endif 639 640 void 641 ucfg_pmo_set_arp_offload_enabled(struct wlan_objmgr_psoc *psoc, 642 bool val) 643 { 644 struct pmo_psoc_priv_obj *pmo_psoc_ctx = pmo_psoc_get_priv(psoc); 645 646 pmo_psoc_ctx->psoc_cfg.arp_offload_enable = val; 647 } 648 649 #ifdef WLAN_FEATURE_IGMP_OFFLOAD 650 void 651 ucfg_pmo_set_igmp_offload_enabled(struct wlan_objmgr_psoc *psoc, 652 bool val) 653 { 654 struct pmo_psoc_priv_obj *pmo_psoc_ctx = pmo_psoc_get_priv(psoc); 655 656 pmo_psoc_ctx->psoc_cfg.igmp_offload_enable = val; 657 } 658 #endif 659 660 enum pmo_auto_pwr_detect_failure_mode 661 ucfg_pmo_get_auto_power_fail_mode(struct wlan_objmgr_psoc *psoc) 662 { 663 struct pmo_psoc_priv_obj *pmo_psoc_ctx = pmo_psoc_get_priv(psoc); 664 665 return pmo_psoc_ctx->psoc_cfg.auto_power_save_fail_mode; 666 } 667 668 #ifdef WLAN_FEATURE_WOW_PULSE 669 bool ucfg_pmo_is_wow_pulse_enabled(struct wlan_objmgr_psoc *psoc) 670 { 671 struct pmo_psoc_priv_obj *pmo_psoc_ctx = pmo_psoc_get_priv(psoc); 672 673 return pmo_psoc_ctx->psoc_cfg.is_wow_pulse_supported; 674 } 675 676 uint8_t ucfg_pmo_get_wow_pulse_pin(struct wlan_objmgr_psoc *psoc) 677 { 678 struct pmo_psoc_priv_obj *pmo_psoc_ctx = pmo_psoc_get_priv(psoc); 679 680 return pmo_psoc_ctx->psoc_cfg.wow_pulse_pin; 681 } 682 683 uint16_t ucfg_pmo_get_wow_pulse_interval_high(struct wlan_objmgr_psoc *psoc) 684 { 685 struct pmo_psoc_priv_obj *pmo_psoc_ctx = pmo_psoc_get_priv(psoc); 686 687 return pmo_psoc_ctx->psoc_cfg.wow_pulse_interval_high; 688 } 689 690 uint16_t ucfg_pmo_get_wow_pulse_interval_low(struct wlan_objmgr_psoc *psoc) 691 { 692 struct pmo_psoc_priv_obj *pmo_psoc_ctx = pmo_psoc_get_priv(psoc); 693 694 return pmo_psoc_ctx->psoc_cfg.wow_pulse_interval_low; 695 } 696 697 uint32_t ucfg_pmo_get_wow_pulse_repeat_count(struct wlan_objmgr_psoc *psoc) 698 { 699 struct pmo_psoc_priv_obj *pmo_psoc_ctx = pmo_psoc_get_priv(psoc); 700 701 return pmo_psoc_ctx->psoc_cfg.wow_pulse_repeat_count; 702 } 703 704 uint32_t ucfg_pmo_get_wow_pulse_init_state(struct wlan_objmgr_psoc *psoc) 705 { 706 struct pmo_psoc_priv_obj *pmo_psoc_ctx = pmo_psoc_get_priv(psoc); 707 708 return pmo_psoc_ctx->psoc_cfg.wow_pulse_init_state; 709 } 710 #endif 711 712 bool ucfg_pmo_is_active_mode_offloaded(struct wlan_objmgr_psoc *psoc) 713 { 714 struct pmo_psoc_priv_obj *pmo_psoc_ctx = pmo_psoc_get_priv(psoc); 715 716 return pmo_psoc_ctx->psoc_cfg.active_mode_offload; 717 } 718 719 #ifdef FEATURE_WLAN_APF 720 bool ucfg_pmo_is_apf_enabled(struct wlan_objmgr_psoc *psoc) 721 { 722 struct pmo_psoc_priv_obj *pmo_psoc_ctx = pmo_psoc_get_priv(psoc); 723 724 return pmo_intersect_apf(pmo_psoc_ctx); 725 } 726 #endif 727 728 bool 729 ucfg_pmo_is_ssdp_enabled(struct wlan_objmgr_psoc *psoc) 730 { 731 struct pmo_psoc_priv_obj *pmo_psoc_ctx = pmo_psoc_get_priv(psoc); 732 733 return pmo_psoc_ctx->psoc_cfg.ssdp; 734 } 735 736 #ifdef FEATURE_RUNTIME_PM 737 uint32_t 738 ucfg_pmo_get_runtime_pm_delay(struct wlan_objmgr_psoc *psoc) 739 { 740 struct pmo_psoc_priv_obj *pmo_psoc_ctx = pmo_psoc_get_priv(psoc); 741 742 return pmo_psoc_ctx->psoc_cfg.runtime_pm_delay; 743 } 744 #endif /* FEATURE_RUNTIME_PM */ 745 746 bool 747 ucfg_pmo_is_ns_offloaded(struct wlan_objmgr_psoc *psoc) 748 { 749 struct pmo_psoc_priv_obj *pmo_psoc_ctx = pmo_psoc_get_priv(psoc); 750 751 return pmo_psoc_ctx->psoc_cfg.ns_offload_enable_static; 752 } 753 754 uint8_t 755 ucfg_pmo_get_sta_dynamic_dtim(struct wlan_objmgr_psoc *psoc) 756 { 757 struct pmo_psoc_priv_obj *pmo_psoc_ctx = pmo_psoc_get_priv(psoc); 758 759 return pmo_psoc_ctx->psoc_cfg.sta_dynamic_dtim; 760 } 761 762 uint8_t 763 ucfg_pmo_get_sta_mod_dtim(struct wlan_objmgr_psoc *psoc) 764 { 765 struct pmo_psoc_priv_obj *pmo_psoc_ctx = pmo_psoc_get_priv(psoc); 766 767 return pmo_psoc_ctx->psoc_cfg.sta_mod_dtim; 768 } 769 770 void 771 ucfg_pmo_set_sta_mod_dtim(struct wlan_objmgr_psoc *psoc, 772 uint8_t val) 773 { 774 struct pmo_psoc_priv_obj *pmo_psoc_ctx = pmo_psoc_get_priv(psoc); 775 776 pmo_psoc_ctx->psoc_cfg.sta_mod_dtim = val; 777 } 778 779 bool 780 ucfg_pmo_is_mc_addr_list_enabled(struct wlan_objmgr_psoc *psoc) 781 { 782 struct pmo_psoc_priv_obj *pmo_psoc_ctx = pmo_psoc_get_priv(psoc); 783 784 return pmo_psoc_ctx->psoc_cfg.enable_mc_list; 785 } 786 787 enum powersave_mode 788 ucfg_pmo_get_power_save_mode(struct wlan_objmgr_psoc *psoc) 789 { 790 struct pmo_psoc_priv_obj *pmo_psoc_ctx = pmo_psoc_get_priv(psoc); 791 792 return pmo_psoc_ctx->psoc_cfg.power_save_mode; 793 } 794 795 enum powersave_mode 796 ucfg_pmo_get_default_power_save_mode(struct wlan_objmgr_psoc *psoc) 797 { 798 struct pmo_psoc_priv_obj *pmo_psoc_ctx = pmo_psoc_get_priv(psoc); 799 800 return pmo_psoc_ctx->psoc_cfg.default_power_save_mode; 801 } 802 803 void 804 ucfg_pmo_set_power_save_mode(struct wlan_objmgr_psoc *psoc, 805 enum powersave_mode val) 806 { 807 struct pmo_psoc_priv_obj *pmo_psoc_ctx = pmo_psoc_get_priv(psoc); 808 809 pmo_psoc_ctx->psoc_cfg.power_save_mode = val; 810 } 811 812 uint8_t 813 ucfg_pmo_get_max_ps_poll(struct wlan_objmgr_psoc *psoc) 814 { 815 struct pmo_psoc_priv_obj *pmo_psoc_ctx = pmo_psoc_get_priv(psoc); 816 817 return pmo_psoc_ctx->psoc_cfg.max_ps_poll; 818 } 819 820 uint8_t 821 ucfg_pmo_power_save_offload_enabled(struct wlan_objmgr_psoc *psoc) 822 { 823 uint8_t powersave_offload_enabled = PMO_PS_ADVANCED_POWER_SAVE_ENABLE; 824 struct pmo_psoc_priv_obj *pmo_psoc_ctx = pmo_psoc_get_priv(psoc); 825 826 if (!pmo_psoc_ctx->psoc_cfg.max_ps_poll || 827 !pmo_psoc_ctx->psoc_cfg.power_save_mode) 828 powersave_offload_enabled = 829 pmo_psoc_ctx->psoc_cfg.power_save_mode; 830 831 pmo_debug("powersave offload enabled type:%d", 832 powersave_offload_enabled); 833 834 return powersave_offload_enabled; 835 } 836 837 QDF_STATUS 838 ucfg_pmo_tgt_psoc_send_idle_roam_suspend_mode(struct wlan_objmgr_psoc *psoc, 839 uint8_t val) 840 { 841 return pmo_tgt_psoc_send_idle_roam_monitor(psoc, val); 842 } 843 844 #ifdef WLAN_FEATURE_EXTWOW_SUPPORT 845 bool 846 ucfg_pmo_extwow_is_goto_suspend_enabled(struct wlan_objmgr_psoc *psoc) 847 { 848 struct pmo_psoc_priv_obj *pmo_psoc_ctx = pmo_psoc_get_priv(psoc); 849 850 return pmo_psoc_ctx->psoc_cfg.extwow_goto_suspend; 851 } 852 853 uint8_t 854 ucfg_pmo_extwow_app1_wakeup_pin_num(struct wlan_objmgr_psoc *psoc) 855 { 856 struct pmo_psoc_priv_obj *pmo_psoc_ctx = pmo_psoc_get_priv(psoc); 857 858 return pmo_psoc_ctx->psoc_cfg.extwow_app1_wakeup_pin_num; 859 } 860 861 uint8_t 862 ucfg_pmo_extwow_app2_wakeup_pin_num(struct wlan_objmgr_psoc *psoc) 863 { 864 struct pmo_psoc_priv_obj *pmo_psoc_ctx = pmo_psoc_get_priv(psoc); 865 866 return pmo_psoc_ctx->psoc_cfg.extwow_app2_wakeup_pin_num; 867 } 868 869 uint32_t 870 ucfg_pmo_extwow_app2_init_ping_interval(struct wlan_objmgr_psoc *psoc) 871 { 872 struct pmo_psoc_priv_obj *pmo_psoc_ctx = pmo_psoc_get_priv(psoc); 873 874 return pmo_psoc_ctx->psoc_cfg.extwow_app2_init_ping_interval; 875 } 876 877 uint32_t 878 ucfg_pmo_extwow_app2_min_ping_interval(struct wlan_objmgr_psoc *psoc) 879 { 880 struct pmo_psoc_priv_obj *pmo_psoc_ctx = pmo_psoc_get_priv(psoc); 881 882 return pmo_psoc_ctx->psoc_cfg.extwow_app2_min_ping_interval; 883 } 884 885 uint32_t 886 ucfg_pmo_extwow_app2_max_ping_interval(struct wlan_objmgr_psoc *psoc) 887 { 888 struct pmo_psoc_priv_obj *pmo_psoc_ctx = pmo_psoc_get_priv(psoc); 889 890 return pmo_psoc_ctx->psoc_cfg.extwow_app2_max_ping_interval; 891 } 892 893 uint32_t 894 ucfg_pmo_extwow_app2_inc_ping_interval(struct wlan_objmgr_psoc *psoc) 895 { 896 struct pmo_psoc_priv_obj *pmo_psoc_ctx = pmo_psoc_get_priv(psoc); 897 898 return pmo_psoc_ctx->psoc_cfg.extwow_app2_inc_ping_interval; 899 } 900 901 uint16_t 902 ucfg_pmo_extwow_app2_tcp_src_port(struct wlan_objmgr_psoc *psoc) 903 { 904 struct pmo_psoc_priv_obj *pmo_psoc_ctx = pmo_psoc_get_priv(psoc); 905 906 return pmo_psoc_ctx->psoc_cfg.extwow_app2_tcp_src_port; 907 } 908 909 uint16_t 910 ucfg_pmo_extwow_app2_tcp_dst_port(struct wlan_objmgr_psoc *psoc) 911 { 912 struct pmo_psoc_priv_obj *pmo_psoc_ctx = pmo_psoc_get_priv(psoc); 913 914 return pmo_psoc_ctx->psoc_cfg.extwow_app2_tcp_dst_port; 915 } 916 917 uint32_t 918 ucfg_pmo_extwow_app2_tcp_tx_timeout(struct wlan_objmgr_psoc *psoc) 919 { 920 struct pmo_psoc_priv_obj *pmo_psoc_ctx = pmo_psoc_get_priv(psoc); 921 922 return pmo_psoc_ctx->psoc_cfg.extwow_app2_tcp_tx_timeout; 923 } 924 925 uint32_t 926 ucfg_pmo_extwow_app2_tcp_rx_timeout(struct wlan_objmgr_psoc *psoc) 927 { 928 struct pmo_psoc_priv_obj *pmo_psoc_ctx = pmo_psoc_get_priv(psoc); 929 930 return pmo_psoc_ctx->psoc_cfg.extwow_app2_tcp_rx_timeout; 931 } 932 #endif 933 934 bool 935 ucfg_pmo_get_enable_sap_suspend(struct wlan_objmgr_psoc *psoc) 936 { 937 struct pmo_psoc_priv_obj *pmo_psoc_ctx = pmo_psoc_get_priv(psoc); 938 939 return pmo_psoc_ctx->psoc_cfg.enable_sap_suspend; 940 } 941 942 void 943 ucfg_pmo_set_wow_data_inactivity_timeout(struct wlan_objmgr_psoc *psoc, 944 uint8_t val) 945 { 946 struct pmo_psoc_priv_obj *pmo_psoc_ctx = pmo_psoc_get_priv(psoc); 947 948 pmo_psoc_ctx->psoc_cfg.wow_data_inactivity_timeout = val; 949 } 950 951 bool ucfg_pmo_is_pkt_filter_enabled(struct wlan_objmgr_psoc *psoc) 952 { 953 struct pmo_psoc_priv_obj *pmo_psoc_ctx = pmo_psoc_get_priv(psoc); 954 955 return pmo_psoc_ctx->psoc_cfg.packet_filter_enabled; 956 } 957 958 enum active_apf_mode 959 ucfg_pmo_get_active_uc_apf_mode(struct wlan_objmgr_psoc *psoc) 960 { 961 struct pmo_psoc_priv_obj *pmo_psoc_ctx = pmo_psoc_get_priv(psoc); 962 963 return pmo_psoc_ctx->psoc_cfg.active_uc_apf_mode; 964 } 965 966 enum active_apf_mode 967 ucfg_pmo_get_active_mc_bc_apf_mode(struct wlan_objmgr_psoc *psoc) 968 { 969 struct pmo_psoc_priv_obj *pmo_psoc_ctx = pmo_psoc_get_priv(psoc); 970 971 return pmo_psoc_ctx->psoc_cfg.active_mc_bc_apf_mode; 972 } 973 974 #ifdef WLAN_ENABLE_GPIO_WAKEUP 975 bool ucfg_pmo_is_gpio_wakeup_enabled(struct wlan_objmgr_psoc *psoc) 976 { 977 struct pmo_psoc_priv_obj *pmo_psoc_ctx = pmo_psoc_get_priv(psoc); 978 979 return pmo_psoc_ctx->psoc_cfg.enable_gpio_wakeup; 980 } 981 982 uint32_t ucfg_pmo_get_gpio_wakeup_pin(struct wlan_objmgr_psoc *psoc) 983 { 984 struct pmo_psoc_priv_obj *pmo_psoc_ctx = pmo_psoc_get_priv(psoc); 985 986 return pmo_psoc_ctx->psoc_cfg.gpio_wakeup_pin; 987 } 988 989 enum pmo_gpio_wakeup_mode 990 ucfg_pmo_get_gpio_wakeup_mode(struct wlan_objmgr_psoc *psoc) 991 { 992 struct pmo_psoc_priv_obj *pmo_psoc_ctx = pmo_psoc_get_priv(psoc); 993 994 return pmo_psoc_ctx->psoc_cfg.gpio_wakeup_mode; 995 } 996 #endif 997 998 bool 999 ucfg_pmo_get_sap_mode_bus_suspend(struct wlan_objmgr_psoc *psoc) 1000 { 1001 struct pmo_psoc_priv_obj *pmo_psoc_ctx = pmo_psoc_get_priv(psoc); 1002 1003 return pmo_psoc_ctx->psoc_cfg.is_bus_suspend_enabled_in_sap_mode; 1004 } 1005 1006 bool 1007 ucfg_pmo_get_go_mode_bus_suspend(struct wlan_objmgr_psoc *psoc) 1008 { 1009 struct pmo_psoc_priv_obj *pmo_psoc_ctx = pmo_psoc_get_priv(psoc); 1010 1011 return pmo_psoc_ctx->psoc_cfg.is_bus_suspend_enabled_in_go_mode; 1012 } 1013 1014 enum pmo_suspend_mode 1015 ucfg_pmo_get_suspend_mode(struct wlan_objmgr_psoc *psoc) 1016 { 1017 struct pmo_psoc_priv_obj *pmo_psoc_ctx = pmo_psoc_get_priv(psoc); 1018 1019 return pmo_psoc_ctx->psoc_cfg.suspend_mode; 1020 } 1021 1022 QDF_STATUS ucfg_pmo_core_txrx_suspend(struct wlan_objmgr_psoc *psoc) 1023 { 1024 return pmo_core_txrx_suspend(psoc); 1025 } 1026 1027 QDF_STATUS ucfg_pmo_core_txrx_resume(struct wlan_objmgr_psoc *psoc) 1028 { 1029 return pmo_core_txrx_resume(psoc); 1030 } 1031 1032 #ifdef SYSTEM_PM_CHECK 1033 void ucfg_pmo_notify_system_resume(struct wlan_objmgr_psoc *psoc) 1034 { 1035 pmo_core_system_resume(psoc); 1036 } 1037 #endif 1038 1039 bool ucfg_pmo_get_moddtim_user_enable(struct wlan_objmgr_vdev *vdev) 1040 { 1041 return pmo_core_vdev_get_moddtim_user_enabled(vdev); 1042 } 1043 1044 void ucfg_pmo_set_moddtim_user_enable(struct wlan_objmgr_vdev *vdev, 1045 bool value) 1046 { 1047 pmo_core_vdev_set_moddtim_user_enabled(vdev, value); 1048 } 1049 1050 bool ucfg_pmo_get_moddtim_user_active(struct wlan_objmgr_vdev *vdev) 1051 { 1052 return pmo_core_vdev_get_moddtim_user_active(vdev); 1053 } 1054 1055 uint32_t ucfg_pmo_get_moddtim_user(struct wlan_objmgr_vdev *vdev) 1056 { 1057 return pmo_core_vdev_get_moddtim_user(vdev); 1058 } 1059 1060 uint32_t 1061 ucfg_pmo_get_ssr_frequency_on_pagefault(struct wlan_objmgr_psoc *psoc) 1062 { 1063 return pmo_get_ssr_frequency_on_pagefault(psoc); 1064 } 1065 1066 bool 1067 ucfg_pmo_get_disconnect_sap_tdls_in_wow(struct wlan_objmgr_psoc *psoc) 1068 { 1069 struct pmo_psoc_priv_obj *pmo_psoc_ctx = pmo_psoc_get_priv(psoc); 1070 1071 return pmo_psoc_ctx->psoc_cfg.disconnect_sap_tdls_in_wow; 1072 } 1073 1074 #ifdef WLAN_FEATURE_ICMP_OFFLOAD 1075 QDF_STATUS ucfg_pmo_check_icmp_offload(struct wlan_objmgr_psoc *psoc, 1076 uint8_t vdev_id) 1077 { 1078 return pmo_core_icmp_check_offload(psoc, vdev_id); 1079 } 1080 1081 bool 1082 ucfg_pmo_is_icmp_offload_enabled(struct wlan_objmgr_psoc *psoc) 1083 { 1084 struct pmo_psoc_priv_obj *pmo_psoc_ctx = pmo_psoc_get_priv(psoc); 1085 1086 return pmo_psoc_ctx->psoc_cfg.is_icmp_offload_enable; 1087 } 1088 1089 QDF_STATUS ucfg_pmo_config_icmp_offload(struct wlan_objmgr_psoc *psoc, 1090 struct pmo_icmp_offload *pmo_icmp_req) 1091 { 1092 return pmo_tgt_config_icmp_offload_req(psoc, pmo_icmp_req); 1093 } 1094 #endif 1095 1096 QDF_STATUS ucfg_pmo_set_vdev_bridge_addr(struct wlan_objmgr_vdev *vdev, 1097 struct qdf_mac_addr *bridgeaddr) 1098 { 1099 return pmo_set_vdev_bridge_addr(vdev, bridgeaddr); 1100 } 1101 1102 QDF_STATUS ucfg_pmo_get_vdev_bridge_addr(struct wlan_objmgr_vdev *vdev, 1103 struct qdf_mac_addr *bridgeaddr) 1104 { 1105 return pmo_get_vdev_bridge_addr(vdev, bridgeaddr); 1106 } 1107