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 *
ipa_pdev_get_priv_obj(struct wlan_objmgr_pdev * pdev)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 *
ipa_priv_obj_get_pdev(struct wlan_ipa_priv * ipa_obj)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