1 /* 2 * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved. 3 * Copyright (c) 2021-2024 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: declare various api which shall be used by 21 * IPA user configuration and target interface 22 */ 23 24 #ifndef _WLAN_IPA_MAIN_H_ 25 #define _WLAN_IPA_MAIN_H_ 26 27 #ifdef IPA_OFFLOAD 28 29 #include <wlan_objmgr_psoc_obj.h> 30 #include <wlan_objmgr_pdev_obj.h> 31 #include <wlan_ipa_public_struct.h> 32 #include <wlan_ipa_priv.h> 33 #include "cfg_ucfg_api.h" 34 35 /* Declare a variable for IPA instancess added based on pdev */ 36 extern uint8_t g_instances_added; 37 #define IPA_INVALID_HDL 0xFF 38 #define IPA_OFFLOAD_CFG 0x7D 39 40 #define INTRL_MODE_DISABLE 0xEEEEEEEE 41 #define INTRL_MODE_ENABLE 0x27D 42 43 #define ipa_fatal(params...) \ 44 QDF_TRACE_FATAL(QDF_MODULE_ID_IPA, params) 45 #define ipa_err(params...) \ 46 QDF_TRACE_ERROR(QDF_MODULE_ID_IPA, params) 47 #define ipa_warn(params...) \ 48 QDF_TRACE_WARN(QDF_MODULE_ID_IPA, params) 49 #define ipa_info(params...) \ 50 QDF_TRACE_INFO(QDF_MODULE_ID_IPA, params) 51 #define ipa_debug(params...) \ 52 QDF_TRACE_DEBUG(QDF_MODULE_ID_IPA, params) 53 54 #define ipa_nofl_fatal(params...) \ 55 QDF_TRACE_FATAL_NO_FL(QDF_MODULE_ID_IPA, params) 56 #define ipa_nofl_err(params...) \ 57 QDF_TRACE_ERROR_NO_FL(QDF_MODULE_ID_IPA, params) 58 #define ipa_nofl_warn(params...) \ 59 QDF_TRACE_WARN_NO_FL(QDF_MODULE_ID_IPA, params) 60 #define ipa_nofl_info(params...) \ 61 QDF_TRACE_INFO_NO_FL(QDF_MODULE_ID_IPA, params) 62 #define ipa_nofl_debug(params...) \ 63 QDF_TRACE_DEBUG_NO_FL(QDF_MODULE_ID_IPA, params) 64 65 #define ipa_fatal_rl(params...) QDF_TRACE_FATAL_RL(QDF_MODULE_ID_IPA, params) 66 #define ipa_err_rl(params...) QDF_TRACE_ERROR_RL(QDF_MODULE_ID_IPA, params) 67 #define ipa_warn_rl(params...) QDF_TRACE_WARN_RL(QDF_MODULE_ID_IPA, params) 68 #define ipa_info_rl(params...) QDF_TRACE_INFO_RL(QDF_MODULE_ID_IPA, params) 69 #define ipa_debug_rl(params...) QDF_TRACE_DEBUG_RL(QDF_MODULE_ID_IPA, params) 70 71 #define IPA_ENTER() \ 72 QDF_TRACE_ENTER(QDF_MODULE_ID_IPA, "enter") 73 #define IPA_EXIT() \ 74 QDF_TRACE_EXIT(QDF_MODULE_ID_IPA, "exit") 75 76 /** 77 * ipa_set_cap_offload() - set IPA capability offload support 78 * @flag: flag to set 79 * 80 * Return: None 81 */ 82 void ipa_set_cap_offload(bool flag); 83 84 /** 85 * ipa_set_pld_enable() - set g_ipa_pld_enable 86 * @flag: flag to set g_ipa_pld_enable 87 * 88 * Return: None 89 */ 90 void ipa_set_pld_enable(bool flag); 91 92 /** 93 * ipa_get_pld_enable() - check if IPA is disabled in pld 94 * 95 * Return: g_ipa_pld_enable 96 */ 97 bool ipa_get_pld_enable(void); 98 99 /** 100 * ipa_check_hw_present() - get IPA hw status 101 * 102 * ipa_uc_reg_rdyCB is not directly designed to check 103 * ipa hw status. This is an undocumented function which 104 * has confirmed with IPA team. 105 * 106 * Return: true - ipa hw present 107 * false - ipa hw not present 108 */ 109 bool ipa_check_hw_present(void); 110 111 /** 112 * ipa_pdev_get_priv_obj() - private API to get ipa pdev object 113 * @pdev: pdev object 114 * 115 * Return: ipa object 116 */ 117 static inline struct wlan_ipa_priv * 118 ipa_pdev_get_priv_obj(struct wlan_objmgr_pdev *pdev) 119 { 120 struct wlan_ipa_priv *pdev_obj; 121 122 pdev_obj = (struct wlan_ipa_priv *) 123 wlan_objmgr_pdev_get_comp_private_obj(pdev, 124 WLAN_UMAC_COMP_IPA); 125 126 return pdev_obj; 127 } 128 129 /** 130 * get_ipa_config() - API to get IPAConfig INI 131 * @psoc : psoc handle 132 * 133 * Return: IPA config value 134 */ 135 uint32_t get_ipa_config(struct wlan_objmgr_psoc *psoc); 136 137 /** 138 * ipa_priv_obj_get_pdev() - API to get pdev from IPA object 139 * @ipa_obj: IPA object 140 * 141 * Return: pdev object 142 */ 143 static inline struct wlan_objmgr_pdev * 144 ipa_priv_obj_get_pdev(struct wlan_ipa_priv *ipa_obj) 145 { 146 return ipa_obj->pdev; 147 } 148 149 /** 150 * ipa_is_hw_support() - Is IPA HW support? 151 * 152 * Return: true if IPA HW is present or false otherwise 153 */ 154 bool ipa_is_hw_support(void); 155 156 /** 157 * ipa_config_mem_alloc() - IPA config allocation 158 * 159 * Return: QDF_STATUS_SUCCESS on success 160 */ 161 QDF_STATUS ipa_config_mem_alloc(void); 162 163 /** 164 * ipa_config_mem_free() - IPA config mem free 165 * 166 * Return: None 167 */ 168 void ipa_config_mem_free(void); 169 170 /** 171 * ipa_config_is_enabled() - Is IPA config enabled? 172 * 173 * Return: true if IPA is enabled in IPA config 174 */ 175 bool ipa_config_is_enabled(void); 176 177 /** 178 * ipa_config_is_uc_enabled() - Is IPA uC config enabled? 179 * 180 * Return: true if IPA uC is enabled in IPA config 181 */ 182 bool ipa_config_is_uc_enabled(void); 183 184 /** 185 * ipa_config_is_opt_wifi_dp_enabled() - Is IPA optional wifi dp enabled? 186 * 187 * Return: true if IPA opt wifi dp is enabled in IPA config 188 */ 189 bool ipa_config_is_opt_wifi_dp_enabled(void); 190 191 /** 192 * ipa_config_is_vlan_enabled() - Is IPA vlan config enabled? 193 * 194 * Return: true if IPA clan support is enabled in IPA config 195 */ 196 bool ipa_config_is_vlan_enabled(void); 197 198 /** 199 * ipa_obj_setup() - IPA obj initialization and setup 200 * @ipa_ctx: IPA obj context 201 * 202 * Return: QDF_STATUS_SUCCESS on success 203 */ 204 QDF_STATUS ipa_obj_setup(struct wlan_ipa_priv *ipa_ctx); 205 206 /** 207 * ipa_obj_cleanup() - IPA obj cleanup 208 * @ipa_ctx: IPA obj context 209 * 210 * Return: QDF_STATUS_SUCCESS on success 211 */ 212 QDF_STATUS ipa_obj_cleanup(struct wlan_ipa_priv *ipa_ctx); 213 214 /** 215 * ipa_send_uc_offload_enable_disable() - wdi enable/disable notify to fw 216 * @pdev: objmgr pdev object 217 * @req: ipa offload control request 218 * 219 * Return: QDF status success or failure 220 */ 221 QDF_STATUS ipa_send_uc_offload_enable_disable(struct wlan_objmgr_pdev *pdev, 222 struct ipa_uc_offload_control_params *req); 223 224 /** 225 * ipa_send_intrabss_enable_disable() - wdi intrabss enable/disable notify to fw 226 * @pdev: objmgr pdev object 227 * @req: ipa intrabss control request 228 * 229 * Return: QDF status success or failure 230 */ 231 QDF_STATUS 232 ipa_send_intrabss_enable_disable(struct wlan_objmgr_pdev *pdev, 233 struct ipa_intrabss_control_params *req); 234 235 /** 236 * ipa_set_dp_handle() - set dp soc handle 237 * @psoc: psoc handle 238 * @dp_soc: dp soc handle 239 * 240 * Return: None 241 */ 242 void ipa_set_dp_handle(struct wlan_objmgr_psoc *psoc, void *dp_soc); 243 244 /** 245 * ipa_set_pdev_id() - set dp pdev id 246 * @psoc: psoc handle 247 * @pdev_id: dp txrx physical device id 248 * 249 * Return: None 250 */ 251 void ipa_set_pdev_id(struct wlan_objmgr_psoc *psoc, uint8_t pdev_id); 252 253 /** 254 * ipa_rm_set_perf_level() - set ipa rm perf level 255 * @pdev: pdev handle 256 * @tx_packets: packets transmitted in the last sample period 257 * @rx_packets: packets received in the last sample period 258 * 259 * Return: QDF_STATUS 260 */ 261 QDF_STATUS ipa_rm_set_perf_level(struct wlan_objmgr_pdev *pdev, 262 uint64_t tx_packets, uint64_t rx_packets); 263 264 /** 265 * ipa_uc_info() - Print IPA uC resource and session information 266 * @pdev: pdev obj 267 * 268 * Return: None 269 */ 270 void ipa_uc_info(struct wlan_objmgr_pdev *pdev); 271 272 /** 273 * ipa_uc_stat() - Print IPA uC stats 274 * @pdev: pdev obj 275 * 276 * Return: None 277 */ 278 void ipa_uc_stat(struct wlan_objmgr_pdev *pdev); 279 280 /** 281 * ipa_uc_rt_debug_host_dump() - IPA rt debug host dump 282 * @pdev: pdev obj 283 * 284 * Return: None 285 */ 286 void ipa_uc_rt_debug_host_dump(struct wlan_objmgr_pdev *pdev); 287 288 /** 289 * ipa_dump_info() - Dump IPA context information 290 * @pdev: pdev obj 291 * 292 * Return: None 293 */ 294 void ipa_dump_info(struct wlan_objmgr_pdev *pdev); 295 296 /** 297 * ipa_uc_stat_request() - Get IPA stats from IPA. 298 * @pdev: pdev obj 299 * @reason: STAT REQ Reason 300 * 301 * Return: None 302 */ 303 void ipa_uc_stat_request(struct wlan_objmgr_pdev *pdev, 304 uint8_t reason); 305 306 /** 307 * ipa_uc_stat_query() - Query the IPA stats 308 * @pdev: pdev obj 309 * @ipa_tx_diff: tx packet count diff from previous tx packet count 310 * @ipa_rx_diff: rx packet count diff from previous rx packet count 311 * 312 * Return: None 313 */ 314 void ipa_uc_stat_query(struct wlan_objmgr_pdev *pdev, 315 uint32_t *ipa_tx_diff, uint32_t *ipa_rx_diff); 316 317 /** 318 * ipa_reg_sap_xmit_cb() - Register upper layer SAP cb to transmit 319 * @pdev: pdev obj 320 * @cb: callback 321 * 322 * Return: None 323 */ 324 void ipa_reg_sap_xmit_cb(struct wlan_objmgr_pdev *pdev, 325 wlan_ipa_softap_xmit cb); 326 327 /** 328 * ipa_reg_send_to_nw_cb() - Register cb to send IPA Rx packet to network 329 * @pdev: pdev obj 330 * @cb: callback 331 * 332 * Return: None 333 */ 334 void ipa_reg_send_to_nw_cb(struct wlan_objmgr_pdev *pdev, 335 wlan_ipa_send_to_nw cb); 336 337 #if defined(QCA_CONFIG_RPS) && !defined(MDM_PLATFORM) 338 /** 339 * ipa_reg_rps_enable_cb() - Register cb to enable RPS 340 * @pdev: pdev obj 341 * @cb: callback 342 * 343 * Return: None 344 */ 345 void ipa_reg_rps_enable_cb(struct wlan_objmgr_pdev *pdev, 346 wlan_ipa_rps_enable cb); 347 #endif 348 349 /** 350 * ipa_reg_is_driver_unloading_cb() - Register cb to check if driver is 351 * unloading 352 * @pdev: pdev obj 353 * @cb: callback 354 * 355 * Return: None 356 */ 357 void ipa_reg_is_driver_unloading_cb(struct wlan_objmgr_pdev *pdev, 358 wlan_ipa_driver_unloading cb); 359 /** 360 * ipa_set_mcc_mode() - Set MCC mode 361 * @pdev: pdev obj 362 * @mcc_mode: 0=MCC/1=SCC 363 * 364 * Return: void 365 */ 366 void ipa_set_mcc_mode(struct wlan_objmgr_pdev *pdev, bool mcc_mode); 367 368 /** 369 * ipa_set_dfs_cac_tx() - Set DFS cac tx block 370 * @pdev: pdev obj 371 * @tx_block: dfs cac tx block 372 * 373 * Return: void 374 */ 375 void ipa_set_dfs_cac_tx(struct wlan_objmgr_pdev *pdev, bool tx_block); 376 377 /** 378 * ipa_set_ap_ibss_fwd() - Set AP intra bss forward 379 * @pdev: pdev obj 380 * @session_id: vdev id 381 * @intra_bss: enable or disable ap intra bss forward 382 * 383 * Return: void 384 */ 385 void ipa_set_ap_ibss_fwd(struct wlan_objmgr_pdev *pdev, uint8_t session_id, 386 bool intra_bss); 387 388 /** 389 * ipa_uc_force_pipe_shutdown() - Force IPA pipe shutdown 390 * @pdev: pdev obj 391 * 392 * Return: void 393 */ 394 void ipa_uc_force_pipe_shutdown(struct wlan_objmgr_pdev *pdev); 395 396 /** 397 * ipa_flush() - flush IPA exception path SKB's 398 * @pdev: pdev obj 399 * 400 * Return: None 401 */ 402 void ipa_flush(struct wlan_objmgr_pdev *pdev); 403 404 /** 405 * ipa_suspend() - Suspend IPA 406 * @pdev: pdev obj 407 * 408 * Return: QDF STATUS 409 */ 410 QDF_STATUS ipa_suspend(struct wlan_objmgr_pdev *pdev); 411 412 /** 413 * ipa_resume() - Resume IPA 414 * @pdev: pdev obj 415 * 416 * Return: None 417 */ 418 QDF_STATUS ipa_resume(struct wlan_objmgr_pdev *pdev); 419 420 /** 421 * ipa_uc_ol_init() - Initialize IPA uC offload 422 * @pdev: pdev obj 423 * @osdev: OS dev 424 * 425 * Return: QDF STATUS 426 */ 427 QDF_STATUS ipa_uc_ol_init(struct wlan_objmgr_pdev *pdev, 428 qdf_device_t osdev); 429 430 /** 431 * ipa_uc_ol_deinit() - Deinitialize IPA uC offload 432 * @pdev: pdev obj 433 * 434 * Return: QDF STATUS 435 */ 436 QDF_STATUS ipa_uc_ol_deinit(struct wlan_objmgr_pdev *pdev); 437 438 /** 439 * ipa_is_tx_pending() - Check if IPA WLAN TX completions are pending 440 * @pdev: pdev obj 441 * 442 * Return: bool if pending TX for IPA. 443 */ 444 bool ipa_is_tx_pending(struct wlan_objmgr_pdev *pdev); 445 446 /** 447 * ipa_send_mcc_scc_msg() - Send IPA WLAN_SWITCH_TO_MCC/SCC message 448 * @pdev: pdev obj 449 * @mcc_mode: 0=MCC/1=SCC 450 * 451 * Return: QDF STATUS 452 */ 453 QDF_STATUS ipa_send_mcc_scc_msg(struct wlan_objmgr_pdev *pdev, 454 bool mcc_mode); 455 456 /** 457 * ipa_wlan_evt() - IPA event handler 458 * @pdev: pdev obj 459 * @net_dev: Interface net device 460 * @device_mode: Net interface device mode 461 * @session_id: session id for the event 462 * @ipa_event_type: event enum of type ipa_wlan_event 463 * @mac_addr: MAC address associated with the event 464 * @is_2g_iface: true if interface is operating on 2G band, otherwise false 465 * 466 * Return: QDF_STATUS 467 */ 468 QDF_STATUS ipa_wlan_evt(struct wlan_objmgr_pdev *pdev, qdf_netdev_t net_dev, 469 uint8_t device_mode, uint8_t session_id, 470 enum wlan_ipa_wlan_event ipa_event_type, 471 const uint8_t *mac_addr, bool is_2g_iface); 472 473 /** 474 * ipa_uc_smmu_map() - Map / Unmap DMA buffer to IPA UC 475 * @map: Map / unmap operation 476 * @num_buf: Number of buffers in array 477 * @buf_arr: Buffer array of DMA mem mapping info 478 * 479 * Return: Status of map operation 480 */ 481 int ipa_uc_smmu_map(bool map, uint32_t num_buf, qdf_mem_info_t *buf_arr); 482 483 /** 484 * ipa_is_fw_wdi_activated - Is FW WDI activated? 485 * @pdev: pdev obj 486 * 487 * Return: true if FW WDI activated, false otherwise 488 */ 489 bool ipa_is_fw_wdi_activated(struct wlan_objmgr_pdev *pdev); 490 491 /** 492 * ipa_uc_cleanup_sta() - disconnect and cleanup sta iface 493 * @pdev: pdev obj 494 * @net_dev: Interface net device 495 * @session_id: vdev id 496 * 497 * Send disconnect sta event to IPA driver and cleanup IPA iface, 498 * if not yet done 499 * 500 * Return: void 501 */ 502 void ipa_uc_cleanup_sta(struct wlan_objmgr_pdev *pdev, 503 qdf_netdev_t net_dev, uint8_t session_id); 504 505 /** 506 * ipa_uc_disconnect_ap() - send ap disconnect event 507 * @pdev: pdev obj 508 * @net_dev: Interface net device 509 * 510 * Send disconnect ap event to IPA driver 511 * 512 * Return: QDF_STATUS 513 */ 514 QDF_STATUS ipa_uc_disconnect_ap(struct wlan_objmgr_pdev *pdev, 515 qdf_netdev_t net_dev); 516 517 /** 518 * ipa_cleanup_dev_iface() - Clean up net dev IPA interface 519 * @pdev: pdev obj 520 * @net_dev: Interface net device 521 * @session_id: vdev_id 522 * 523 * Return: None 524 */ 525 void ipa_cleanup_dev_iface(struct wlan_objmgr_pdev *pdev, 526 qdf_netdev_t net_dev, uint8_t session_id); 527 528 /** 529 * ipa_uc_ssr_cleanup() - handle IPA UC cleanup during SSR 530 * @pdev: pdev obj 531 * 532 * Return: None 533 */ 534 void ipa_uc_ssr_cleanup(struct wlan_objmgr_pdev *pdev); 535 536 /** 537 * ipa_fw_rejuvenate_send_msg() - send fw rejuvenate message to IPA driver 538 * @pdev: pdev obj 539 * 540 * Return: None 541 */ 542 void ipa_fw_rejuvenate_send_msg(struct wlan_objmgr_pdev *pdev); 543 544 /** 545 * ipa_component_config_update() - update ipa config from psoc 546 * @psoc: psoc obj 547 * 548 * Return: None 549 */ 550 void ipa_component_config_update(struct wlan_objmgr_psoc *psoc); 551 552 /** 553 * ipa_component_config_free() - Free ipa config 554 * 555 * Return: None 556 */ 557 void ipa_component_config_free(void); 558 559 /** 560 * ipa_get_tx_buf_count() - get IPA config tx buffer count 561 * 562 * Return: IPA config tx buffer count 563 */ 564 uint32_t ipa_get_tx_buf_count(void); 565 566 /** 567 * ipa_update_tx_stats() - Update embedded tx traffic in bytes to IPA 568 * @pdev: pdev obj 569 * @sta_tx: tx in bytes on sta vdev 570 * @ap_tx: tx in bytes on sap vdev 571 * 572 * Return: None 573 */ 574 void ipa_update_tx_stats(struct wlan_objmgr_pdev *pdev, uint64_t sta_tx, 575 uint64_t ap_tx); 576 577 /** 578 * ipa_flush_pending_vdev_events() - flush pending vdev wlan ipa events 579 * @pdev: pdev obj 580 * @vdev_id: vdev id 581 * 582 * Return: None 583 */ 584 void ipa_flush_pending_vdev_events(struct wlan_objmgr_pdev *pdev, 585 uint8_t vdev_id); 586 587 /** 588 * ipa_cb_is_ready() - Is IPA register callback is invoked 589 * 590 * Return: true if IPA register callback is invoked or false 591 * otherwise 592 */ 593 bool ipa_cb_is_ready(void); 594 595 /** 596 * ipa_init_deinit_lock() - lock ipa init deinit lock 597 * 598 * Return: None 599 */ 600 void ipa_init_deinit_lock(void); 601 602 /** 603 * ipa_init_deinit_unlock() - unlock ipa init deinit lock 604 * 605 * Return: None 606 */ 607 void ipa_init_deinit_unlock(void); 608 609 /** 610 * ipa_is_wds_enabled() - IPA wds status 611 * 612 * Return: true if WDS is enabled otherwise false 613 */ 614 bool ipa_is_wds_enabled(void); 615 616 /** 617 * ipa_get_alt_pipe() - Get alt_pipe for vdev_id 618 * @pdev: pdev obj 619 * @vdev_id: vdev_id of the target interface 620 * @alt_pipe: Boolean output to indicate if interface with @vdev_id 621 * is using alternate TX pipe or not. 622 * 623 * Return: QDF_STATUS 624 */ 625 QDF_STATUS ipa_get_alt_pipe(struct wlan_objmgr_pdev *pdev, 626 uint8_t vdev_id, 627 bool *alt_pipe); 628 629 /** 630 * ipa_set_perf_level_bw_enabled - Get bandwidth based IPA perf voting status 631 * @pdev: pdev objmgr pointer 632 * 633 * This function returns true or false for bandwidth based IPA perf level 634 * voting. 635 * 636 * Return: true - bandwidth based IPA perf voting is enabld. Otherwise false. 637 */ 638 bool ipa_set_perf_level_bw_enabled(struct wlan_objmgr_pdev *pdev); 639 640 /** 641 * ipa_set_perf_level_bw() - Set IPA perf level based on BW 642 * @pdev: pdev objmgr pointer 643 * @lvl: enum wlan_ipa_bw_level 644 * 645 * This routine is called to set IPA perf level based on max BW 646 * configured among in-use STA and SAP vdevs 647 * 648 * Return: None 649 */ 650 void ipa_set_perf_level_bw(struct wlan_objmgr_pdev *pdev, 651 enum wlan_ipa_bw_level lvl); 652 653 #else /* Not IPA_OFFLOAD */ 654 typedef QDF_STATUS (*wlan_ipa_softap_xmit)(qdf_nbuf_t nbuf, qdf_netdev_t dev); 655 typedef void (*wlan_ipa_send_to_nw)(qdf_nbuf_t nbuf, qdf_netdev_t dev); 656 typedef void (*wlan_ipa_rps_enable)(uint8_t vdev_id, bool enable); 657 typedef bool (*wlan_ipa_driver_unloading)(void); 658 659 #endif /* IPA_OFFLOAD */ 660 #endif /* end of _WLAN_IPA_MAIN_H_ */ 661