1 /*
2 * Copyright: 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: 状态通知、去/关联流程处理
15 * Date: 2023-02-01 15:33
16 */
17 #ifndef __HMAC_BTCOEX_NOTIFY_C__
18 #define __HMAC_BTCOEX_NOTIFY_C__
19
20 #include "hmac_mgmt_sta.h"
21 #include "hmac_scan.h"
22 #include "oal_netbuf_data.h"
23 #include "hmac_btcoex.h"
24 #include "hmac_btcoex_ba.h"
25 #include "hmac_btcoex_m2s.h"
26 #include "hmac_btcoex_ps.h"
27 #include "frw_util_notifier.h"
28 #include "hmac_feature_interface.h"
29 #include "hmac_btcoex_notify.h"
30
31 #ifdef __cplusplus
32 #if __cplusplus
33 extern "C" {
34 #endif
35 #endif
36 #undef THIS_FILE_ID
37 #define THIS_FILE_ID DIAG_FILE_ID_WIFI_HOST_HMAC_BTCOEX_NOTIFY_C
38
39 #undef THIS_MOD_ID
40 #define THIS_MOD_ID DIAG_MOD_ID_WIFI_HOST
41
42 /* WIFI状态通知处理 */
43 /*****************************************************************************
44 函 数 名 : hmac_btcoex_set_wifi_status_irq_notify
45 功能描述 : 软件设定共天线通知位: bit8 主路c1 siso bit9 DBDC(辅路c1 siso)
46 *****************************************************************************/
hmac_btcoex_set_wifi_status_irq_notify(osal_u8 id,osal_u8 val)47 OSAL_STATIC osal_void hmac_btcoex_set_wifi_status_irq_notify(osal_u8 id, osal_u8 val)
48 {
49 hal_set_btcoex_wifi_status_notify(id, val);
50
51 hal_coex_sw_irq_set(HAL_COEX_SW_IRQ_BT);
52 }
53
hmac_btcoex_chan_to_bitmap(osal_u8 chan_idx,wlan_channel_bandwidth_enum_uint8 band_width)54 OSAL_STATIC osal_u16 hmac_btcoex_chan_to_bitmap(osal_u8 chan_idx, wlan_channel_bandwidth_enum_uint8 band_width)
55 {
56 osal_u8 left = 0;
57 osal_u16 mask = 0, ch_bitmap = 0;
58
59 if (chan_idx >= MAC_CHANNEL_FREQ_2_BUTT) {
60 return ch_bitmap;
61 }
62
63 switch (band_width) {
64 case WLAN_BAND_WIDTH_20M:
65 case WLAN_BAND_WIDTH_5M: /* 5M,10M考虑到beacon 按照占用20M处理 */
66 case WLAN_BAND_WIDTH_10M:
67 left = BTCOEX_20M_40PLUS_CHAN_OFFSET;
68 mask = BTCOEX_20M_CHAN_BITMASK;
69 break;
70
71 case WLAN_BAND_WIDTH_40PLUS:
72 left = BTCOEX_20M_40PLUS_CHAN_OFFSET;
73 mask = BTCOEX_40M_CHAN_BITMASK;
74 break;
75
76 case WLAN_BAND_WIDTH_40MINUS:
77 left = BTCOEX_40MINUS_CHAN_OFFSET;
78 mask = BTCOEX_40M_CHAN_BITMASK;
79 break;
80
81 default:
82 return ch_bitmap;
83 }
84
85 left = (chan_idx >= left) ? (chan_idx - left) : (left - chan_idx);
86 ch_bitmap = (mask << left) & BTCOEX_2G_ALL_CHAN_BITMASK;
87 return ch_bitmap;
88 }
89
hmac_btcoex_update_ps_capability(hal_to_dmac_device_stru * hal_device,hmac_btcoex_ps_stru * ps_param)90 OSAL_STATIC osal_void hmac_btcoex_update_ps_capability(hal_to_dmac_device_stru *hal_device,
91 hmac_btcoex_ps_stru *ps_param)
92 {
93 oal_bool_enum_uint8 sco_status = OSAL_FALSE;
94 hmac_device_stru *hmac_device = hmac_res_get_mac_dev_etc(0);
95
96 /* 5.3.电话场景 或 dbac场景 或 c1 siso场景 */
97 hal_btcoex_get_bt_sco_status(hal_device, &sco_status);
98 if ((sco_status == OSAL_TRUE) || (mac_is_dbac_running(hmac_device) == OSAL_TRUE) ||
99 (hal_device->hal_m2s_fsm.oal_fsm.cur_state == HAL_M2S_STATE_SISO &&
100 hal_device->cfg_cap_info->phy_chain == WLAN_PHY_CHAIN_ONE)) {
101 ps_param->ps_stop = OSAL_TRUE;
102 }
103
104 if (hmac_device->vap_num == 0) {
105 hal_set_btcoex_wifi_status_notify(HAL_BTCOEX_WIFI_STATE_ON, OAL_FALSE);
106 }
107
108 if (hmac_device_calc_up_vap_num_etc(hmac_device) == 0) {
109 /* 状态上报BT */
110 oam_warning_log0(0, OAM_SF_COEX, "{hmac_btcoex_update_ps_capability::Notify BT cancel AFH.}");
111 }
112
113 /* 刷新ps能力 */
114 hal_device->btcoex_sw_preempt.ps_stop = ps_param->ps_stop;
115 hmac_btcoex_set_ps_flag(hal_device);
116
117 hal_set_btcoex_wifi_status_notify(HAL_BTCOEX_WIFI_STATE_BAND, ps_param->band);
118
119 hal_set_btcoex_wifi_status_notify(HAL_BTCOEX_WIFI_STATE_CONN, ps_param->legacy_connect_state);
120
121 hal_set_btcoex_wifi_status_notify(HAL_BTCOEX_WIFI_STATE_P2P_CONN, ps_param->p2p_connect_state);
122
123 hal_set_btcoex_wifi_status_notify(HAL_BTCOEX_WIFI_STATE_CHAN_NUM, ps_param->channel_num);
124 hal_set_btcoex_wifi_status_notify(HAL_BTCOEX_WIFI_STATE_BAND_WIDTH, ps_param->bandwidth);
125 hal_set_btcoex_wifi_status_notify(HAL_BTCOEX_WIFI_STATE_CHAN_BITMAP, ps_param->chan_bitmap);
126
127 hal_set_btcoex_wifi_status_notify(HAL_BTCOEX_WIFI_STATE_PS_STOP, ps_param->ps_stop);
128
129 hal_set_btcoex_wifi_status_notify(HAL_BTCOEX_WIFI_STATE_WORK_MODE, ps_param->work_mode);
130 hal_set_btcoex_wifi_status_notify(HAL_BTCOEX_WIFI_STATE_DIFF_CHANNEL, ps_param->diff_chan);
131 hal_set_btcoex_wifi_status_notify(HAL_BTCOEX_WIFI_STATE_PROTOCOL_2G11AX, ps_param->protocol_11ax);
132 hal_set_btcoex_wifi_status_notify(HAL_BTCOEX_WIFI_STATE_PROTOCOL_2G11BGN, ps_param->protocol_11bgn);
133
134 hal_coex_sw_irq_set(HAL_COEX_SW_IRQ_BT);
135
136 oam_warning_log_alter(0, OAM_SF_COEX,
137 "{hmac_btcoex_update_ps_capability::band[%d]legacy[%d]p2p[%d]chan_idx[%d]bandwidth[%d] !}",
138 // 5表示5后面含5个待打印参数
139 5, ps_param->band, ps_param->legacy_connect_state, ps_param->p2p_connect_state, ps_param->channel_num,
140 ps_param->bandwidth);
141 }
142
hmac_btcoex_update_vap_work_status(hmac_vap_stru * hmac_vap,hmac_btcoex_ps_stru * ps_param)143 static osal_void hmac_btcoex_update_vap_work_status(hmac_vap_stru *hmac_vap, hmac_btcoex_ps_stru *ps_param)
144 {
145 osal_u16 chan_bitmap;
146
147 /* 1. legacy vap connect状态判断 */
148 if ((is_legacy_sta(hmac_vap) || is_legacy_ap(hmac_vap)) && (hmac_vap->user_nums != 0)) {
149 ps_param->legacy_connect_state = OSAL_TRUE;
150 } else if ((is_p2p_cl(hmac_vap) || is_p2p_go(hmac_vap)) && (hmac_vap->user_nums != 0)) {
151 /* 1.1. p2p vap connect状态判断 */
152 ps_param->p2p_connect_state = OSAL_TRUE;
153 }
154
155 if (hmac_vap->user_nums != 0) {
156 /* AP/STA/GO/GC mode */
157 if (is_legacy_sta(hmac_vap)) {
158 ps_param->work_mode |= BTCOEX_WORK_MODE_BIT_STA;
159 } else if (is_legacy_ap(hmac_vap)) {
160 ps_param->work_mode |= BTCOEX_WORK_MODE_BIT_AP;
161 } else if (is_p2p_cl(hmac_vap)) {
162 ps_param->work_mode |= BTCOEX_WORK_MODE_BIT_GC;
163 } else if (is_p2p_go(hmac_vap)) {
164 ps_param->work_mode |= BTCOEX_WORK_MODE_BIT_GO;
165 } else {
166 /* nothing */
167 }
168
169 /* protocol mode */
170 if (hmac_vap->protocol <= WLAN_HT_11G_MODE) {
171 ps_param->protocol_11bgn = OSAL_TRUE;
172 } else {
173 ps_param->protocol_11ax = OSAL_TRUE;
174 }
175 }
176
177 /* 2.考虑2g下 */
178 if (mac_btcoex_check_valid_vap(hmac_vap) == OSAL_TRUE) {
179 ps_param->band = WLAN_BAND_2G; /* 存在2G设备,那就一直通知状态是2G频段,数传退让要生效 */
180
181 /* 3.判断带宽 */
182 ps_param->bandwidth = hmac_vap->channel.en_bandwidth;
183
184 /* 3.信道 */
185 ps_param->channel_num = hmac_vap->channel.chan_number;
186
187 chan_bitmap = hmac_btcoex_chan_to_bitmap(hmac_vap->channel.chan_idx, hmac_vap->channel.en_bandwidth);
188 ps_param->chan_bitmap |= chan_bitmap;
189 if (chan_bitmap != ps_param->chan_bitmap) {
190 ps_param->diff_chan = OSAL_TRUE;
191 }
192 }
193 }
194
195 /*****************************************************************************
196 函 数 名 : hmac_btcoex_set_freq_and_work_state_hal_device
197 功能描述 : 配置当前工作频段和connect状态,通知bt用于数传业务,
198 频段和connect状态放到一起处理,在用户关联和去关联接口即可
199 *****************************************************************************/
hmac_btcoex_set_freq_and_work_state_hal_device(hal_to_dmac_device_stru * hal_device)200 osal_void hmac_btcoex_set_freq_and_work_state_hal_device(hal_to_dmac_device_stru *hal_device)
201 {
202 osal_u8 mac_vap_id[WLAN_SERVICE_VAP_MAX_NUM_PER_DEVICE] = {0};
203 osal_u8 up_ap_num = 0;
204 osal_u8 up_sta_num = 0;
205 osal_u8 up_2g_num = 0;
206 osal_u8 up_5g_num = 0;
207 osal_u8 up_vap_num, vap_index;
208 hmac_btcoex_ps_stru ps_param;
209
210 (osal_void)memset_s(&ps_param, sizeof(hmac_btcoex_ps_stru), 0, sizeof(hmac_btcoex_ps_stru));
211 ps_param.band = WLAN_BAND_5G; /* 默认是5G无影响状态 */
212 ps_param.bandwidth = WLAN_BAND_WIDTH_20M; /* 默认带宽模式 */
213
214 /* 2.频段直接所有up或者pause的vap,取小,保证有2G设备时,数传需要生效 */
215 up_vap_num = hal_device_find_all_up_vap(hal_device, mac_vap_id, WLAN_SERVICE_VAP_MAX_NUM_PER_DEVICE);
216 for (vap_index = 0; vap_index < up_vap_num; vap_index++) {
217 hmac_vap_stru *hmac_vap = (hmac_vap_stru *)mac_res_get_hmac_vap(mac_vap_id[vap_index]);
218 if (hmac_vap == OSAL_NULL) {
219 oam_error_log1(0, OAM_SF_COEX,
220 "vap_id[%d] {hmac_btcoex_set_freq_and_work_state_hal_device::the vap is null!}", mac_vap_id[vap_index]);
221 continue;
222 }
223
224 /* 非有效状态,不统,去关联时候调用此接口时还是up状态 */
225 if (hmac_vap->vap_state != MAC_VAP_STATE_UP && hmac_vap->vap_state != MAC_VAP_STATE_PAUSE) {
226 continue;
227 }
228
229 hmac_btcoex_update_vap_work_status(hmac_vap, &ps_param);
230
231 /* 关联用户数不为0 */
232 if (hmac_vap->user_nums != 0) {
233 (is_ap(hmac_vap)) ? (up_ap_num++) : (up_sta_num++);
234
235 (mac_btcoex_check_valid_vap(hmac_vap) == OSAL_TRUE) ? (up_2g_num++) : (up_5g_num++);
236 }
237
238 /* 5.单ap模式 或5g模式 */
239 if ((up_ap_num != 0 && up_sta_num == 0) || (up_5g_num != 0 && up_2g_num == 0)) {
240 ps_param.ps_stop = OSAL_TRUE;
241 }
242 }
243
244 hmac_btcoex_update_ps_capability(hal_device, &ps_param);
245 }
246
247 #ifdef _PRE_WLAN_FEATURE_BT_SUPPORT
hmac_config_btcoex_asooc_bt_state_process(hmac_vap_stru * hmac_vap,hmac_user_btcoex_delba_stru * btcoex_delba,const bt_status_stru * bt_status,oal_bool_enum_uint8 * need_delba)248 osal_void hmac_config_btcoex_asooc_bt_state_process(hmac_vap_stru *hmac_vap, hmac_user_btcoex_delba_stru *btcoex_delba,
249 const bt_status_stru *bt_status, oal_bool_enum_uint8 *need_delba)
250 {
251 hal_to_dmac_device_stru *hal_device = hmac_vap->hal_device;
252 hmac_vap_btcoex_stru *hmac_vap_btcoex = hmac_btcoex_get_vap_info(hmac_vap);
253 osal_void *fhook = hmac_get_feature_fhook(HMAC_FHOOK_AUTO_FREQ_BTCOEX);
254
255 if (hmac_vap_btcoex == OSAL_NULL) {
256 oam_error_log0(0, OAM_SF_CFG, "hmac_config_btcoex_asooc_bt_state_process::hmac_vap_btcoex is null.");
257 return;
258 }
259
260 /* 看是否需要执行ap siso切换 */
261 if (bt_status->bt_ba != 0) {
262 hmac_btcoex_assoc_ap_check_process(hal_device);
263 }
264
265 /* 默认刚关联上时mimo */
266 /* 电话场景下需要立即删聚合 */
267 if (bt_status->bt_6slot != 0) {
268 get_hal_device_btcoex_s2m_mode_bitmap(hal_device) |= BT_M2S_6SLOT_MASK;
269
270 /* 电话下,需要立即触发删减BA,刷新hmac侧的BA标记 */
271 *need_delba = OSAL_TRUE;
272
273 /* Tplink5630不识别聚合2个,还是高聚合发送造成电话下容易掉底断流 */
274 btcoex_delba->ba_size_expect_index = BTCOEX_RX_WINDOW_SIZE_INDEX_1;
275 } else if (bt_status->bt_a2dp != 0 || bt_status->bt_transfer != 0) { /* 有sco存在时,a2dp=0,会采用sco链路来播放音乐 */
276 /* 如果是在ldac音乐下,需要关闭动态调频,并关闭拉occu */
277 if (bt_status->bt_ldac != 0) {
278 if (fhook != OSAL_NULL) {
279 ((hmac_auto_freq_btcoex_handle_cb)fhook)((osal_u8)bt_status->bt_ldac);
280 }
281
282 /* 关闭优先级配置 */
283 hal_device->btcoex_sw_preempt.coex_pri_forbit = OSAL_TRUE;
284
285 get_hal_device_btcoex_s2m_mode_bitmap(hal_device) |= BT_M2S_LDAC_MASK;
286 }
287
288 get_hal_device_btcoex_s2m_mode_bitmap(hal_device) |= BT_M2S_A2DP_MASK;
289
290 frw_destroy_timer_entry(&(hal_device->btcoex_powersave_timer));
291
292 /* ps机制启动时,需要根据当前状态,刷新超时定时器时间,因为对应业务存在时,不会再来ps中断,需要此处来刷时间 */
293 hmac_btcoex_ps_timeout_update_time(hal_device);
294
295 /* 创建ps定时器 */
296 frw_create_timer_entry(&(hal_device->btcoex_powersave_timer), hmac_btcoex_pow_save_callback,
297 hal_device->btcoex_sw_preempt.timeout_ms, (osal_void *)hal_device, OSAL_FALSE);
298
299 btcoex_delba->ba_size_expect_index = BTCOEX_RX_WINDOW_SIZE_INDEX_2;
300 hmac_vap_btcoex->hmac_vap_btcoex_rx_statistics.rx_rate_statistics_flag = OSAL_TRUE;
301 hmac_vap_btcoex->hmac_vap_btcoex_rx_statistics.rx_rate_statistics_timeout = OSAL_FALSE;
302
303 if (hmac_vap_btcoex->hmac_vap_btcoex_rx_statistics.bt_coex_statistics_timer.is_registerd == OSAL_TRUE) {
304 frw_destroy_timer_entry(&(hmac_vap_btcoex->hmac_vap_btcoex_rx_statistics.bt_coex_statistics_timer));
305 }
306
307 frw_create_timer_entry(&(hmac_vap_btcoex->hmac_vap_btcoex_rx_statistics.bt_coex_statistics_timer),
308 hmac_btcoex_rx_rate_statistics_flag_callback, BTCOEX_RX_STATISTICS_TIME, (osal_void *)hmac_vap,
309 OSAL_TRUE);
310 }
311 }
312 #endif
313
314 /* 关联/去关联处理 */
hmac_config_btcoex_assoc_state_proc(hmac_vap_stru * hmac_vap,const ble_status_stru * ble_status,hmac_user_btcoex_delba_stru * btcoex_delba,const bt_status_stru * bt_status,const hal_btcoex_btble_status_stru * btcoex_btble_status)315 osal_void hmac_config_btcoex_assoc_state_proc(hmac_vap_stru *hmac_vap, const ble_status_stru *ble_status,
316 hmac_user_btcoex_delba_stru *btcoex_delba, const bt_status_stru *bt_status,
317 const hal_btcoex_btble_status_stru *btcoex_btble_status)
318 {
319 oal_bool_enum_uint8 need_delba = OSAL_FALSE;
320 unref_param(ble_status);
321
322 #ifdef _PRE_WLAN_FEATURE_BT_SUPPORT
323 hmac_config_btcoex_asooc_bt_state_process(hmac_vap, btcoex_delba, bt_status, &need_delba);
324 #else
325 unref_param(bt_status);
326 #endif
327 hmac_btcoex_update_ba_size(hmac_vap, btcoex_delba, btcoex_btble_status);
328
329 #ifdef _PRE_WLAN_FEATURE_BT_SUPPORT
330 oam_warning_log3(0, OAM_SF_COEX, "{hmac_config_btcoex_assoc_state_proc::status 6slot:%d,a2dp:%d,data_transfer:%d.}",
331 bt_status->bt_6slot, bt_status->bt_a2dp, bt_status->bt_transfer);
332 oam_warning_log3(0, OAM_SF_COEX, "{expect_ba_size:%d, ba_size:%d, need_delba:%d.}",
333 btcoex_delba->ba_size_expect_index, btcoex_delba->ba_size, need_delba);
334 #endif
335
336 hmac_btcoex_delba_trigger(hmac_vap, need_delba, btcoex_delba);
337 }
338
339 /*****************************************************************************
340 功能描述 : 同步共存下mac的状态
341 *****************************************************************************/
hmac_config_btcoex_disassoc_state_syn(osal_void * notify_data)342 osal_bool hmac_config_btcoex_disassoc_state_syn(osal_void *notify_data)
343 {
344 hmac_vap_btcoex_rx_statistics_stru *btcoex_rx_stat = OSAL_NULL;
345 hmac_vap_btcoex_occupied_stru *btcoex_occupied = OSAL_NULL;
346 hmac_vap_stru *hmac_vap = (hmac_vap_stru *)notify_data;
347
348 if (is_sta(hmac_vap) || (is_ap(hmac_vap) && (hmac_vap->user_nums == 0))) {
349 /* sta down时,刷新频段,legacy vap和p2p 关联状态,带宽和信道 */
350 hmac_btcoex_set_freq_and_work_state_hal_device(hmac_vap->hal_device);
351 }
352
353 btcoex_rx_stat = &(hmac_btcoex_get_vap_info(hmac_vap)->hmac_vap_btcoex_rx_statistics);
354 btcoex_occupied = &(hmac_btcoex_get_vap_info(hmac_vap)->hmac_vap_btcoex_occupied);
355
356 frw_destroy_timer_entry(&(btcoex_rx_stat->bt_coex_statistics_timer));
357 frw_destroy_timer_entry(&(btcoex_rx_stat->bt_coex_low_rate_timer));
358 // 功能暂时关闭
359 frw_destroy_timer_entry(&(btcoex_occupied->bt_coex_occupied_timer));
360 frw_destroy_timer_entry(&(btcoex_occupied->bt_coex_priority_timer));
361 frw_destroy_timer_entry(&(hmac_btcoex_get_vap_info(hmac_vap)->bt_coex_double_chain_timer));
362
363 hmac_btcoex_set_vap_ps_frame(hmac_vap, OSAL_FALSE);
364 return OSAL_TRUE;
365 }
366
hmac_btcoex_notify_inout_siso(hal_to_dmac_device_stru * hal_device)367 OSAL_STATIC osal_void hmac_btcoex_notify_inout_siso(hal_to_dmac_device_stru *hal_device)
368 {
369 if (hal_device->cfg_cap_info->phy_chain == WLAN_PHY_CHAIN_ONE) {
370 /* 进入c1 siso, wifi使用c1时,需要通知蓝牙c1 siso状态,可以全速发送 */
371 hmac_btcoex_set_wifi_status_irq_notify(HAL_BTCOEX_WIFI_STATE_C1_SISO, (osal_u8)OSAL_TRUE);
372 } else if (hal_device->cfg_cap_info->phy_chain == WLAN_PHY_CHAIN_ZERO) {
373 /* 出c1 siso, wifi使用c0,需要通知蓝牙c1 siso状态,不要全速发送 */
374 hmac_btcoex_set_wifi_status_irq_notify(HAL_BTCOEX_WIFI_STATE_C1_SISO, (osal_u8)OSAL_FALSE);
375 } else {
376 oam_error_log2(0, OAM_SF_M2S, "{hmac_m2s_siso_to_siso:: phy_chain[%d], cur state[%d].}",
377 hal_device->cfg_cap_info->phy_chain, hal_device->hal_m2s_fsm.oal_fsm.cur_state);
378 }
379 }
hmac_btcoex_notify_init(osal_void)380 osal_u32 hmac_btcoex_notify_init(osal_void)
381 {
382 /* 消息接口注册 */
383 frw_util_notifier_register(WLAN_UTIL_NOTIFIER_EVENT_DEL_USER_RESET, hmac_config_btcoex_disassoc_state_syn);
384 hmac_feature_hook_register(HMAC_FHOOK_BTCOEX_NOTIFY_SET_WIFI_STATUS, hmac_btcoex_set_wifi_status_irq_notify);
385 hmac_feature_hook_register(HMAC_FHOOK_BTCOEX_NOTIFY_INOUT_SISO, hmac_btcoex_notify_inout_siso);
386 return OAL_SUCC;
387 }
388
hmac_btcoex_notify_deinit(osal_void)389 osal_void hmac_btcoex_notify_deinit(osal_void)
390 {
391 /* 消息接口去注册 */
392 frw_util_notifier_unregister(WLAN_UTIL_NOTIFIER_EVENT_DEL_USER_RESET, hmac_config_btcoex_disassoc_state_syn);
393 hmac_feature_hook_unregister(HMAC_FHOOK_BTCOEX_NOTIFY_SET_WIFI_STATUS);
394 hmac_feature_hook_unregister(HMAC_FHOOK_BTCOEX_NOTIFY_INOUT_SISO);
395 return;
396 }
397
398 #ifdef __cplusplus
399 #if __cplusplus
400 }
401 #endif
402 #endif
403
404 #endif
405