• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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