1 /*
2 * Copyright (c) 2020 HiSilicon (Shanghai) Technologies CO., LIMITED.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 * Description: hmac_btcoex_rom.c 的头文件。
15 * Create: 2020-07-03
16 */
17
18 #ifndef __HMAC_BTCOEX_H__
19 #define __HMAC_BTCOEX_H__
20
21 /*****************************************************************************
22 1 其他头文件包含
23 *****************************************************************************/
24 #include "frw_ext_if.h"
25 #include "oal_ext_if.h"
26 #include "mac_frame.h"
27
28 #include "hal_ext_if.h"
29 #include "mac_resource_ext.h"
30 #include "mac_frame.h"
31 #include "dmac_ext_if_hcm.h"
32 #include "hmac_feature_main.h"
33 #include "hal_coex_reg.h"
34 #include "msg_user_manage_rom.h"
35
36 #include "hal_chip.h"
37 #include "hmac_auto_adjust_freq.h"
38
39 #ifdef __cplusplus
40 #if __cplusplus
41 extern "C" {
42 #endif
43 #endif
44
45 /*****************************************************************************
46 2 宏定义
47 *****************************************************************************/
48 #define WLAN_TIDNO_COEX_QOSNULL WLAN_TIDNO_ANT_TRAINING_HIGH_PRIO /* 发送qos null复用智能天线高优先级训练帧 */
49
50 #define BTCOEX_RSSI_THRESHOLD (WLAN_FAR_DISTANCE_RSSI)
51
52 #define BTCOEX_RX_LOW_RATE_TIME (5000)
53 #define BTCOEX_SCO_CALCULATE_TIME (500)
54
55 #define BTCOEX_PRIO_TIMEOUT_150MS (150) // 软件定时器操作精度是ms
56 #define BTCOEX_PRIO_TIMEOUT_100MS (100) // 软件定时器操作精度是ms
57 #define BTCOEX_PRIO_TIMEOUT_60MS (60)
58 #define BTCOEX_PRIO_TIMEOUT_50MS (50)
59
60 #define BTCOEX_PRIO_TIMEOUT_ALWAYS_ON (0xffff) // 持续拉高
61 #define BTCOEX_PRIO_TIMEOUT_20MS (20000) // 硬件单位为us
62 #define BTCOEX_PRIO_TIMEOUT_10MS (10000)
63 #define BTCOEX_PRIO_TIMEOUT_5MS (5000)
64 #define BTCOEX_PRIO_TIMEOUT_ALWAYS_OFF (0x0) // 拉低
65
66 #define ALL_MID_PRIO_TIME (10) // 5s / BTCOEX_SCO_CALCULATE_TIME
67 #define ALL_HIGH_PRIO_TIME (4) // 2s / BTCOEX_SCO_CALCULATE_TIME
68
69 #define BTCOEX_LINKLOSS_OCCUPIED_NUMBER (8)
70 #define BTCOEX_POW_SAVE_CNT (5) /* 连续处于ps=1状态次数,超过时,wifi强制恢复(用于低功耗唤醒时) */
71
72 #define BTCOEX_20M_40PLUS_CHAN_OFFSET (2)
73 #define BTCOEX_40MINUS_CHAN_OFFSET (6)
74 #define BTCOEX_20M_CHAN_BITMASK (0x1F) /* 20M信道使用5bit掩码,例如ch6占用ch4~8 */
75 #define BTCOEX_40M_CHAN_BITMASK (0x1FF) /* 40M信道使用9bit掩码,例如ch6+10占用ch4~12 */
76 #define BTCOEX_2G_ALL_CHAN_BITMASK (0x3FFF) /* 1~14信道掩码 */
77 #define BTCOEX_WORK_MODE_BIT_STA (1) /* work mode bitmap */
78 #define BTCOEX_WORK_MODE_BIT_AP (2)
79 #define BTCOEX_WORK_MODE_BIT_GC (4)
80 #define BTCOEX_WORK_MODE_BIT_GO (8)
81
82 #define BTCOEX_ARP_FAIL_DELBA_NUM 2
83 #define BTCOEX_ARP_FAIL_REASSOC_NUM 4
84 #define BTCOEX_ARP_PROBE_TIMEOUT (300) // ms
85
86 #define BTCOEX_BLE_CONN_NUM_THOLD 4 // BLE多连接场景:调整BA连接数阈值
87
88
89 /*****************************************************************************
90 3 枚举定义
91 *****************************************************************************/
92 typedef enum {
93 HMAC_BTCOEX_PS_SWITCH_OFF = 0,
94 HMAC_BTCOEX_PS_SWITCH_ON = 1,
95 HMAC_BTCOEX_PS_TIMOUT = 2,
96 HMAC_BTCOEX_PS_ABORT = 3, /* 被扫描等事件打断 */
97 HMAC_BTCOEX_PS_SWITCH_BUTT
98 } hmac_btcoex_ps_switch_enum;
99 typedef osal_u8 hmac_btcoex_ps_switch_enum_uint8;
100
101 /* 不应该BUTT后续存在枚举 */
102 typedef enum {
103 HMAC_EXTCOEX_2A = 0, /* 2线A模式 */
104 HMAC_EXTCOEX_2B = 1, /* 2线B模式 */
105 HMAC_EXTCOEX_3 = 2, /* 3线模式 */
106 HMAC_EXTCOEX_4 = 3, /* 4线模式 */
107 } wlan_extcoex_wire_mode_enum;
108 typedef osal_u8 wlan_extcoex_wire_mode_enum_uint8;
109
110 typedef enum {
111 HMAC_EXTCOEX_OFF = 0,
112 HMAC_EXTCOEX_ON = 1,
113 } wlan_extcoex_enable_enum;
114 typedef osal_u8 wlan_extcoex_enable_uint8;
115
116 typedef enum {
117 HMAC_EXTCOEX_WIFI_BT = 0,
118 HMAC_EXTCOEX_WIFI_BSLE_BT = 1,
119 }wlan_extcoex_mode;
120 typedef osal_u8 wlan_extcoex_mode_uint8;
121
122 /*****************************************************************************
123 7 STRUCT定义
124 *****************************************************************************/
125 typedef struct {
126 osal_u8 eanble;
127 osal_u8 extcoex_wire_mode;
128 osal_u8 extcoex_mode;
129 osal_u8 share_ant;
130 osal_u8 preempt_enable;
131 osal_u8 resv[3];
132 }hmac_extcoex_mode_stru;
133
134 typedef struct {
135 mac_header_frame_control_stru frame_control;
136 osal_u16 duration_value : 15, /* duration/id */
137 duration_flag : 1;
138 osal_u8 address1[WLAN_MAC_ADDR_LEN];
139 osal_u8 address2[WLAN_MAC_ADDR_LEN];
140 osal_u8 address3[WLAN_MAC_ADDR_LEN];
141 osal_u16 sc_frag_num : 4, /* sequence control */
142 sc_seq_num : 12;
143 osal_u8 qc_tid : 4,
144 qc_eosp : 1,
145 qc_ack_polocy : 2,
146 qc_amsdu : 1;
147 } hmac_btcoex_qosnull_frame_stru;
148
149 typedef struct {
150 osal_u8 ps_stop;
151 osal_u8 band;
152 osal_u8 legacy_connect_state;
153 osal_u8 p2p_connect_state;
154 osal_u8 channel_num;
155 osal_u8 bandwidth;
156 osal_u16 chan_bitmap; /* bit0-13表示channel 1-14 */
157 osal_u8 work_mode;
158 osal_u8 diff_chan;
159 osal_u8 protocol_11bgn;
160 osal_u8 protocol_11ax;
161 }hmac_btcoex_ps_stru;
162
163 typedef struct {
164 osal_u32 rx_rate_threshold_min;
165 osal_u32 rx_rate_threshold_max;
166 osal_u8 get_addba_req_flag : 1;
167 osal_u8 ba_size_expect_index : 2; /* 期望聚合大小索引 */
168 osal_u8 ba_size_real_index : 2; /* 实际聚合大小索引 */
169 osal_u8 ba_size_tendence : 2;
170 osal_u8 delba_trigger : 1;
171 osal_u8 ba_size;
172 wlan_nss_enum_uint8 user_nss_num;
173 osal_u8 resv;
174 } hmac_user_btcoex_delba_stru;
175
176 typedef struct {
177 osal_u64 rx_rate_mbps;
178 osal_u16 rx_rate_stat_count;
179 osal_u8 auc_resv[2]; /* 保留2个字节用作对齐 */
180 } hmac_user_btcoex_rx_info_stru;
181
182 typedef struct {
183 osal_u16 last_baw_start; /* 上一次接收到ADDBA REQ中的baw_start值 */
184 osal_u16 last_seq_num; /* 上一次接收到ADDBA REQ中的seq_num值 */
185 btcoex_blacklist_type_enum_uint8 blacklist_tpye; /* 黑名单方案 */
186 oal_bool_enum_uint8 ba_handle_allow; /* 黑名单方案1:是否允许共存删建聚合 黑名单方案2:是否允许建立聚合 */
187 } hmac_btcoex_addba_req_stru;
188
189 typedef struct {
190 frw_timeout_stru delba_opt_timer; /* 发送ARP REQ后启动定时器 */
191 osal_atomic rx_unicast_pkt_to_lan; /* 接收到的单播帧个数 */
192 } hmac_btcoex_arp_req_process_stru;
193
194 typedef struct {
195 hmac_user_btcoex_delba_stru hmac_user_btcoex_delba;
196 hmac_user_btcoex_rx_info_stru hmac_user_btcoex_rx_info;
197 hmac_btcoex_arp_req_process_stru hmac_btcoex_arp_req_process;
198 hmac_btcoex_addba_req_stru hmac_btcoex_addba_req;
199 osal_u16 ba_size;
200 osal_u8 rx_no_pkt_count; /* 超时时间内没有收到帧的次数 */
201 oal_bool_enum_uint8 delba_btcoex_trigger; /* 是否btcoex触发删建BA */
202 oal_bool_enum_uint8 arp_probe_on; /* 是否打开arp统计,做重关联保护 */
203 } hmac_user_btcoex_stru;
204
205 typedef struct {
206 } hmac_vap_btcoex_mgr_stru;
207
208 typedef struct {
209 frw_timeout_stru bt_coex_low_rate_timer;
210 frw_timeout_stru bt_coex_statistics_timer;
211 oal_bool_enum_uint8 rx_rate_statistics_flag;
212 oal_bool_enum_uint8 rx_rate_statistics_timeout;
213 osal_u8 auc_resv[2]; /* 2byte保留字段 */
214 } hmac_vap_btcoex_rx_statistics_stru;
215
216 typedef struct {
217 frw_timeout_stru bt_coex_priority_timer; /* 读取寄存器周期定时器 */
218 frw_timeout_stru bt_coex_occupied_timer; /* 周期拉高occupied信号线,保证WiFi不被BT抢占 */
219 osal_u32 ap_beacon_count;
220 osal_u32 timestamp;
221 osal_u8 beacon_miss_cnt;
222 osal_u8 occupied_times;
223 osal_u8 prio_occupied_state;
224 osal_u8 linkloss_occupied_times;
225 osal_u8 linkloss_index;
226 osal_u8 auc_resv[3]; /* 保留3个字节用于对齐 */
227 } hmac_vap_btcoex_occupied_stru;
228
229 typedef struct {
230 osal_u8 null_qosnull_frame[32]; /* null&qos null,取最大长度32 */
231 osal_u16 cfg_coex_tx_vap_index : 4; /* 03新增premmpt帧配置参数 */
232 osal_u16 cfg_coex_tx_qos_null_tid : 4;
233 osal_u16 bit_rsv : 3;
234 osal_u16 cfg_coex_tx_peer_index : 5;
235 } hmac_vap_btcoex_null_preempt_stru;
236
237 typedef struct {
238 frw_timeout_stru bt_coex_double_chain_timer; /* 双链路延迟处理定时器 delba或者m2s都一样 */
239 oal_bool_enum_uint8 bitmap_update_flag; /* 业务bitmap是否更新标记 */
240 oal_bool_enum_uint8 delba_on_6slot; /* 支持双链接下,6slot业务是否已经删聚合 */
241 osal_u8 bitmap_6slot; /* 支持双链接下,6slot业务类型 */
242 hal_coex_hw_preempt_mode_enum_uint8 ps_type; /* ps机制one pkt帧类型,默认是null data */
243
244 hmac_vap_btcoex_rx_statistics_stru hmac_vap_btcoex_rx_statistics;
245 hmac_vap_btcoex_occupied_stru hmac_vap_btcoex_occupied;
246 hmac_vap_btcoex_null_preempt_stru null_preempt_param;
247 hal_coex_hw_preempt_mode_enum_uint8 all_abort_preempt_type;
248 uintptr_t *_rom; /* vap btcoex开启4个字节空间 */
249 } hmac_vap_btcoex_stru;
250
251 typedef struct {
252 osal_u8 cfg_btcoex_mode; /* 0:参数查询模式; 1:参数配置模式 */
253 osal_u8 cfg_btcoex_type; /* 0:门限类型; 1:聚合大小类型 */
254 wlan_nss_enum_uint8 btcoex_nss; /* 0:siso 1:mimo */
255
256 union {
257 struct {
258 osal_u8 low_20m; /* 2G 20M low */
259 osal_u8 high_20m; /* 2G 20M high */
260 osal_u8 low_40m; /* 2G 40M low */
261 osal_u16 high_40m; /* 2G 40M high */
262 } threhold;
263
264 struct {
265 osal_u8 grade; /* 0级或者1级 */
266 osal_u8 rx_size0; /* size0大小 */
267 osal_u8 rx_size1; /* size1大小 */
268 osal_u8 rx_size2; /* size2大小 */
269 osal_u8 rx_size3; /* size3大小 */
270 } rx_size;
271 } pri_data;
272 } mac_btcoex_mgr_stru;
273
274 typedef struct {
275 osal_u8 user_mac_addr[WLAN_MAC_ADDR_LEN]; /* 黑名单MAC地址 */
276 osal_u8 type; /* 写入黑名单的类型 */
277 osal_u8 used; /* 是否已经写过黑名单MAC地址 */
278 } hmac_btcoex_delba_exception_stru;
279
280 typedef struct {
281 hmac_btcoex_delba_exception_stru hmac_btcoex_delba_exception[BTCOEX_BSS_NUM_IN_BLACKLIST];
282 osal_u8 exception_bss_index; /* 黑名单MAC地址的数组下标 */
283 osal_u8 auc_resv[3];
284 } hmac_device_btcoex_stru;
285
286 typedef struct {
287 osal_u16 tx_throughput;
288 osal_u16 rx_throughput;
289 } hmac_btcoex_throughput_stru;
290
291 /*****************************************************************************
292 8 ROM预留回调函数类型定义
293 *****************************************************************************/
294
295
296 /*****************************************************************************
297 10 函数声明
298 *****************************************************************************/
299 osal_u8 hmac_get_g_rx_ba_win_size(osal_u32 index1, osal_u32 index2);
300 osal_u8 hmac_get_g_rx_win_size_siso(osal_u32 index1, osal_u32 index2);
301 osal_u8 hmac_get_g_rx_win_size_grage_siso(osal_u32 index1, osal_u32 index2, osal_u32 index3);
302 osal_u8 hmac_get_g_rx_win_size_mimo(osal_u32 index1, osal_u32 index2);
303 osal_u8 hmac_get_g_rx_win_size_grage_mimo(osal_u32 index1, osal_u32 index2, osal_u32 index3);
304 osal_void hmac_btcoex_set_rx_win_size(const mac_btcoex_mgr_stru *btcoex_mgr);
305 osal_void hmac_btcoex_restart_ps_timer(hal_to_dmac_device_stru *hal_device);
306 osal_void hmac_btcoex_ps_status_handler(osal_void);
307 osal_u32 hmac_btcoex_config_tx_aggr_num(osal_u8 aggt_num);
308 osal_void hmac_btcoex_set_mgmt_priority(const hmac_vap_stru *hmac_vap, osal_u16 timeout_ms);
309 osal_void hmac_btcoex_status_info_dump(const hal_to_dmac_device_stru *hal_device, hal_chip_stru *hal_chip);
310 osal_u32 hmac_btcoex_wlan_priority_timeout_callback(osal_void *arg);
311 osal_u32 hmac_btcoex_rx_rate_statistics_flag_callback(osal_void *arg);
312 osal_void hmac_btcoex_update_rx_rate_threshold(const hmac_vap_stru *hmac_vap,
313 hmac_user_btcoex_delba_stru *btcoex_delba);
314 osal_u8 hmac_btcoex_find_all_valid_sta_per_device(const hal_to_dmac_device_stru *hal_device,
315 osal_u8 *vap_id, osal_u16 vap_id_len);
316 osal_u8 hmac_btcoex_find_all_valid_ap_per_device(const hal_to_dmac_device_stru *hal_device, osal_u8 *vap_id,
317 osal_u16 vap_id_size);
318
319 osal_void hmac_btcoex_blacklist_handle_init(hmac_user_stru *hmac_user);
320
hmac_btcoex_get_user_info(hmac_user_stru * hmac_user)321 static inline hmac_user_btcoex_stru *hmac_btcoex_get_user_info(hmac_user_stru *hmac_user)
322 {
323 return (hmac_user_btcoex_stru *)hmac_user_get_feature_ptr(hmac_user, WLAN_FEATURE_INDEX_BTCOEX);
324 }
hmac_btcoex_get_vap_info(hmac_vap_stru * hmac_vap)325 static inline hmac_vap_btcoex_stru *hmac_btcoex_get_vap_info(hmac_vap_stru *hmac_vap)
326 {
327 return (hmac_vap_btcoex_stru *)hmac_vap_get_feature_ptr(hmac_vap, WLAN_FEATURE_INDEX_BTCOEX);
328 }
hmac_btcoex_get_blacklist_type(hmac_user_stru * hmac_user)329 static inline btcoex_blacklist_type_enum_uint8 hmac_btcoex_get_blacklist_type(hmac_user_stru *hmac_user)
330 {
331 return hmac_btcoex_get_user_info(hmac_user)->hmac_btcoex_addba_req.blacklist_tpye;
332 }
333
334 /*****************************************************************************
335 功能描述 : 获取指定vap的双链接下6slot业务类型的bitmap
336 *****************************************************************************/
hmac_vap_get_vap_btcoex_mgr_6slot(hmac_vap_stru * hmac_vap)337 static INLINE__ osal_u8 hmac_vap_get_vap_btcoex_mgr_6slot(hmac_vap_stru *hmac_vap)
338 {
339 return hmac_btcoex_get_vap_info(hmac_vap)->bitmap_6slot;
340 }
341
342 typedef osal_void (*hmac_btcoex_recover_coex_priority_cb)(hmac_vap_stru *hmac_vap);
343 typedef osal_void (*hmac_btcoex_recover_coex_priority_clear_cb)(hmac_vap_stru *hmac_vap,
344 const hmac_device_stru *hmac_device);
345 typedef osal_void (*hmac_btcoex_set_wlan_priority_cb)(hmac_vap_stru *hmac_vap, oal_bool_enum_uint8 value,
346 osal_u8 timeout_ms);
347 typedef osal_void (*hmac_btcoex_rx_process_ect_cb)(hmac_vap_stru *hmac_vap, osal_u8 frame_subtype,
348 oal_netbuf_stru *netbuf, oal_bool_enum_uint8 ampdu);
349 typedef osal_void (*hmac_btcoex_linkloss_update_threshold_cb)(hmac_vap_stru *hmac_vap);
350 typedef osal_void (*hmac_btcoex_linkloss_occupied_process_cb)(
351 const hal_to_dmac_chip_stru *hal_chip, const hal_to_dmac_device_stru *hal_device, hmac_vap_stru *hmac_vap);
352 typedef osal_u32 (*hmac_config_btcoex_assoc_state_syn_cb)(hmac_vap_stru *hmac_vap, hmac_user_stru *hmac_user);
353 typedef osal_void (*hmac_btcoex_roam_succ_handler_cb)(hmac_vap_stru *hmac_vap);
354 typedef osal_void (*hmac_btcoex_check_exception_in_list_cb)(hmac_vap_stru *hmac_vap, hmac_user_stru *hmac_user,
355 osal_u8 *addr_sa);
356 typedef osal_u32 (*hmac_btcoex_proc_user_add_cb)(hmac_user_stru *hmac_user);
357 typedef osal_u32 (*hmac_btcoex_proc_vap_add_cb)(hmac_vap_stru *hmac_vap);
358 typedef osal_void (*hmac_btcoex_tx_mgmt_frame_cb)(const hmac_vap_stru *hmac_vap,
359 const mac_ieee80211_frame_stru *mac_header);
360 typedef osal_void (*hmac_btcoex_tx_vip_frame_cb)(hmac_vap_stru *hmac_vap, const oal_netbuf_head_stru *buff_headr,
361 osal_u8 mpdu_num);
362 typedef osal_void (*hmac_btcoex_check_rx_same_baw_start_from_addba_req_etc_cb)(hmac_vap_stru *hmac_vap,
363 hmac_user_stru *hmac_user, mac_ieee80211_frame_stru *frame_hdr, const osal_u8 *action);
364 typedef osal_void (*hmac_btcoex_user_spatial_stream_change_notify_cb)(const hmac_vap_stru *hmac_vap,
365 hmac_user_stru *hmac_user);
366 typedef osal_void (*hmac_btcoex_set_txop_alg_cb)(hal_tx_txop_alg_stru *txop_alg);
367 typedef osal_void (*hmac_btcoex_update_bss_list_protocol_cb)(mac_bss_dscr_stru *bss_dscr, osal_u8 *frame_body,
368 osal_u16 frame_len);
369 typedef osal_u32 (*hmac_btcoex_check_ap_type_blacklist_cb)(hmac_vap_stru *hmac_vap, osal_u8 *mac_addr,
370 wlan_nss_enum_uint8 *support_max_nss);
371 typedef osal_void (*hmac_btcoex_clear_arp_timer_cb)(hmac_user_stru *hmac_user);
372 typedef osal_void (*hmac_btcoex_keepalive_timer_ect_cb)(osal_u32 *aging_time);
373 typedef osal_u32 (*hmac_btcoex_check_user_req_declined_cb)(hmac_vap_stru *hmac_vap, hmac_user_stru *hmac_user);
374 typedef osal_u32 (*hmac_btcoex_check_sw_preempt_type_cb)(const hmac_vap_stru *hmac_vap,
375 const hal_to_dmac_device_stru *hal_device);
376 typedef osal_void (*hmac_btcoex_compatibility_set_ps_type_cb)(hmac_vap_stru *hmac_vap);
377 typedef osal_void (*hmac_btcoex_compatibility_set_ap_type_cb)(hmac_vap_stru *hmac_vap, mac_ap_type_enum_uint8 ap_type);
378 typedef osal_void (*hmac_btcoex_vap_resume_tx_by_chl_cb)(hmac_vap_stru *hmac_vap, hal_to_dmac_device_stru *hal_device);
379 typedef osal_void (*hmac_btcoex_vap_config_sw_preempt_subtype_cb)(hal_to_dmac_device_stru *hal_device);
380 typedef osal_void (*hmac_btcoex_device_exit_destroy_timer_cb)(hal_to_dmac_device_stru *hal_device);
381 typedef osal_void (*hmac_btcoex_report_linkloss_info_cb)(const hmac_vap_stru *hmac_sta);
382 typedef osal_void (*hmac_btcoex_sw_preempt_type_check_cb)(hal_to_dmac_device_stru *hal_device);
383 typedef osal_u16 (*hmac_btcoex_hal_get_btstatus_bton_cb)(osal_void);
384 typedef osal_void (*hmac_btcoex_hal_blinkloss_clean_cb)(hmac_vap_stru *hmac_vap);
385 typedef osal_u32 (*hmac_btcoex_hal_set_aging_time_cb)(hmac_vap_stru *hmac_vap, osal_u32 *aging_time);
386 typedef osal_void (*hmac_btcoex_hal_set_btcoex_wifi_status_cb)(const hmac_vap_stru *hmac_vap, osal_u32 status);
387 typedef osal_u32 (*hmac_btcoex_hal_end_scan_check_ps_cb)(hal_to_dmac_device_stru *hal_device, hmac_vap_stru *hmac_vap);
388 typedef osal_void (*hmac_btcoex_hal_user_add_handle_cb)(hmac_vap_stru *hmac_vap, mac_user_type_enum_uint8 user_type);
389 typedef osal_void (*hmac_btcoex_hal_wifi_busy_notify_cb)(osal_u32 tx_throughput_mbps, osal_u32 rx_throughput_mbps);
390
391 static osal_u32 hmac_btcoex_init_weakref(osal_void) __attribute__ ((weakref("hmac_btcoex_init"), used));
392 static osal_void hmac_btcoex_deinit_weakref(osal_void) __attribute__ ((weakref("hmac_btcoex_deinit"), used));
393
394 #ifdef __cplusplus
395 #if __cplusplus
396 }
397 #endif
398 #endif
399
400 #endif /* end of __HMAC_BTCOEX_H__ */
401
402