1 /*
2 * Copyright (C) 2021 HiSilicon (Shanghai) Technologies CO., LIMITED.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation; either version 2
7 * of the License, or (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 */
18
19 /* ****************************************************************************
20 1 头文件包含
21 **************************************************************************** */
22 #include "oal_ext_if.h"
23 #include "plat_firmware.h"
24 #include "plat_pm_wlan.h"
25 #include "oam_ext_if.h"
26 #include "frw_main.h"
27 #include "frw_timer.h"
28 #include "hmac_ext_if.h"
29 #include "wal_ioctl.h"
30 #include "wal_hipriv.h"
31 #include "wal_cfg80211.h"
32 #include "wal_linux_flowctl.h"
33 #include "net_adpater.h"
34 #ifdef _PRE_WLAN_FEATURE_CSI
35 #include "wal_event.h"
36 #endif
37 #include "wal_event_msg.h"
38 #include "wal_customize.h"
39 #include "hcc_hmac_if.h"
40 #include "wal_main.h"
41
42 #ifdef __cplusplus
43 #if __cplusplus
44 extern "C" {
45 #endif
46 #endif
47
48 /* ****************************************************************************
49 2 全局变量定义
50 **************************************************************************** */
51 /* HOST CTX字表 */
52 const frw_event_sub_table_item_stru g_ast_wal_host_ctx_table[HMAC_HOST_CTX_EVENT_SUB_TYPE_BUTT] = {
53 {wal_scan_comp_proc_sta, HI_NULL, HI_NULL}, /* HMAC_HOST_CTX_EVENT_SUB_TYPE_SCAN_COMP_STA */
54 {wal_asoc_comp_proc_sta, HI_NULL, HI_NULL}, /* HMAC_HOST_CTX_EVENT_SUB_TYPE_ASOC_COMP_STA */
55 {wal_disasoc_comp_proc_sta, HI_NULL, HI_NULL}, /* HMAC_HOST_CTX_EVENT_SUB_TYPE_DISASOC_COMP_STA */
56 {wal_connect_new_sta_proc_ap, HI_NULL, HI_NULL}, /* HMAC_HOST_CTX_EVENT_SUB_TYPE_STA_CONNECT_AP */
57 {wal_disconnect_sta_proc_ap, HI_NULL, HI_NULL}, /* HMAC_HOST_CTX_EVENT_SUB_TYPE_STA_DISCONNECT_AP */
58 #if (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION)
59 {wal_mic_failure_proc, HI_NULL, HI_NULL}, /* HMAC_HOST_CTX_EVENT_SUB_TYPE_MIC_FAILURE */
60 #endif
61 {wal_send_mgmt_to_host, HI_NULL, HI_NULL}, /* HMAC_HOST_CTX_EVENT_SUB_TYPE_RX_MGMT */
62 #ifdef _PRE_WLAN_FEATURE_P2P
63 {wal_p2p_listen_timeout, HI_NULL, HI_NULL}, /* HMAC_HOST_CTX_EVENT_SUB_TYPE_LISTEN_EXPIRED */
64 #endif
65 {wal_report_sta_assoc_info, HI_NULL, HI_NULL}, /* HMAC_HOST_CTX_EVENT_SUB_TYPE_STA_CONN_RESULT */
66 #ifdef _PRE_WLAN_FEATURE_FLOWCTL
67 {wal_flowctl_backp_event_handler, HI_NULL, HI_NULL}, /* HMAC_HOST_CTX_EVENT_SUB_TYPE_FLOWCTL_BACKP */
68 #endif
69 {wal_cfg80211_mgmt_tx_status, HI_NULL, HI_NULL}, /* HMAC_HOST_CTX_EVENT_SUB_TYPE_MGMT_TX_STATUS */
70 #ifdef _PRE_WLAN_FEATURE_ANY
71 {wal_any_process_rx_data, HI_NULL, HI_NULL}, /* HMAC_HOST_CTX_EVENT_SUB_TYPE_ANY_RX_DATA */
72 {wal_any_process_tx_complete, HI_NULL, HI_NULL}, /* HMAC_HOST_CTX_EVENT_SUB_TYPE_ANY_TX_STATUS */
73 {wal_any_process_scan_result, HI_NULL, HI_NULL}, /* HMAC_HOST_CTX_EVENT_SUB_TYPE_ANY_SCAN_RESULT */
74 {wal_any_process_peer_info, HI_NULL, HI_NULL}, /* HMAC_HOST_CTX_EVENT_SUB_TYPE_ANY_PEER_INFO */
75 #endif
76 #ifdef _PRE_WLAN_FEATURE_MESH
77 {wal_mesh_close_peer_inform, HI_NULL, HI_NULL}, /* HMAC_HOST_CTX_EVENT_SUB_TYPE_PEER_CLOSE_MESH */
78 {wal_mesh_new_peer_candidate, HI_NULL, HI_NULL}, /* HMAC_HOST_CTX_EVENT_SUB_TYPE_NEW_PEER_CANDIDATE */
79 {wal_mesh_inform_tx_data_info, HI_NULL, HI_NULL}, /* HMAC_HOST_CTX_EVENT_SUB_TYPE_TX_DATA_INFO */
80 {wal_mesh_report_mesh_user_info, HI_NULL, HI_NULL}, /* HMAC_HOST_CTX_EVENT_SUB_TYPE_MESH_USER_INFO */
81 #endif
82 #ifdef _PRE_WLAN_FEATURE_CSI
83 {wal_csi_data_report, HI_NULL, HI_NULL}, /* HMAC_HOST_CTX_EVENT_SUB_TYPE_CSI_REPORT */
84 #endif
85 #ifdef _PRE_WLAN_FEATURE_P2P
86 {wal_p2p_action_tx_status, HI_NULL, HI_NULL}, /* HMAC_HOST_CTX_EVENT_SUB_TYPE_P2P_TX_STATUS */
87 #endif
88
89 #ifdef FEATURE_DAQ
90 {wal_data_acq_status, HI_NULL, HI_NULL}, /* HMAC_HOST_CTX_EVENT_SUB_TYPE_ACQ_STATUS */
91 {wal_data_acq_result, HI_NULL, HI_NULL}, /* HMAC_HOST_CTX_EVENT_SUB_TYPE_ACQ_RESULT */
92 #endif
93 #if (_PRE_MULTI_CORE_MODE != _PRE_MULTI_CORE_MODE_OFFLOAD_DMAC)
94 {wal_channel_switch_report, HI_NULL, HI_NULL}, /* HMAC_HOST_CTX_EVENT_SUB_TYPE_CHANNEL_SWITCH */
95 #endif
96 {wal_get_efuse_mac_from_dev, HI_NULL, HI_NULL}, /* HMAC_HOST_CTX_EVENT_GET_MAC_FROM_EFUSE */
97 #ifdef _PRE_WLAN_FEATURE_MFG_TEST
98 {wal_get_dbg_cal_data_from_dev, HI_NULL, HI_NULL}, /* HMAC_HOST_CTX_EVENT_GET_DBG_CAL_DATA */
99 #endif
100 {wal_report_tx_params, HI_NULL, HI_NULL}, /* HMAC_HOST_CTX_EVENT_REPORT_TX_PARAMS */
101 };
102
103 #if (_PRE_OS_VERSION_LITEOS == _PRE_OS_VERSION)
104 EVENT_CB_S g_backup_event;
105 #endif
106 hi_u32 g_wlan_reusme_wifi_mode = 0; /* 0:不启动wifi,1:启动AP,2: 启动 STA */
107 hi_u8 g_wifi_exit_stop_flag = HI_FALSE;
108 #define WAL_HAL_INTERRUPT_COUNT 4
109 /* ****************************************************************************
110 3 函数实现
111 **************************************************************************** */
112 /* ****************************************************************************
113 函 数 名 : wal_event_fsm_init
114 功能描述 : 注册事件处理函数
115 输入参数 : 无
116 输出参数 : 无
117 返 回 值 : HI_SUCCESS
118 调用函数 :
119 被调函数 :
120
121 修改历史 :
122 1.日 期 : 2012年11月16日
123 作 者 : HiSilicon
124 修改内容 : 新生成函数
125
126 **************************************************************************** */
wal_event_fsm_init(hi_void)127 hi_void wal_event_fsm_init(hi_void)
128 {
129 frw_event_table_register(FRW_EVENT_TYPE_HOST_CTX, FRW_EVENT_PIPELINE_STAGE_0, g_ast_wal_host_ctx_table);
130 }
131
132 /* ****************************************************************************
133 功能描述 : WAL模块初始化总入口,包含WAL模块内部所有特性的初始化。
134 返 回 值 : 初始化返回值,成功或失败原因
135 修改历史 :
136 1.日 期 : 2012年9月18日
137 作 者 : HiSilicon
138 修改内容 : 新生成函数
139 **************************************************************************** */
wal_main_init(hi_void)140 hi_u32 wal_main_init(hi_void)
141 {
142 hi_u32 ret;
143 frw_init_enum_uint8 init_state;
144
145 wal_msg_queue_init();
146
147 init_state = frw_get_init_state();
148 /* WAL模块初始化开始时,说明HMAC肯定已经初始化成功 */
149 if ((init_state == FRW_INIT_STATE_BUTT) || (init_state < FRW_INIT_STATE_HMAC_CONFIG_VAP_SUCC)) {
150 oam_warning_log1(0, OAM_SF_ANY, "{wal_main_init::invalid state value [%d]!}", init_state);
151 frw_timer_delete_all_timer();
152 return HI_FAIL;
153 }
154
155 wal_event_fsm_init();
156 wal_init_dev_addr();
157
158 #ifdef _PRE_CONFIG_CONN_HISI_SYSFS_SUPPORT
159 /* 创建proc */
160 ret = wal_hipriv_create_proc(HI_NULL);
161 if (ret != HI_SUCCESS) {
162 oam_warning_log1(0, OAM_SF_ANY, "{wal_main_init_etc::wal_hipriv_create_proc_etc fail[%d]!}\r\n", ret);
163
164 frw_timer_delete_all_timer();
165 return -OAL_EFAIL;
166 }
167 #endif
168 ret = wal_customize_set_config();
169 if (ret != HI_SUCCESS) {
170 oam_warning_log1(0, OAM_SF_ANY, "{wal_main_init::customize init failed [%d]!}", ret);
171 frw_timer_delete_all_timer();
172 return HI_FAIL;
173 }
174 ret = wal_cfg80211_init();
175 if (ret != HI_SUCCESS) {
176 oam_warning_log1(0, OAM_SF_ANY, "{wal_main_init::wal_cfg80211_init fail[%d]!}", ret);
177 frw_timer_delete_all_timer();
178 return HI_FAIL;
179 }
180 /* 在host侧如果WAL初始化成功,即为全部初始化成功 */
181 frw_set_init_state(FRW_INIT_STATE_ALL_SUCC);
182
183 printk("wal_main_init SUCCESSFULLY\r\n");
184 return HI_SUCCESS;
185 }
186
187 /* ****************************************************************************
188 功能描述 : 卸载前删除所有vap
189 **************************************************************************** */
wal_destroy_all_vap(hi_void)190 hi_void wal_destroy_all_vap(hi_void)
191 {
192 oal_net_device_stru* netdev = HI_NULL;
193 hi_u8 vap_id = WLAN_SERVICE_VAP_START_ID;
194
195 /* 删除业务vap之前处理frw中事件 */
196 frw_event_process_all_event();
197
198 /* 删除业务vap */
199 for (; vap_id < WLAN_SERVICE_VAP_NUM_PER_DEVICE; vap_id++) {
200 netdev = hmac_vap_get_net_device(vap_id);
201 if (netdev != HI_NULL) {
202 oal_net_device_close(netdev);
203 wal_hipriv_del_vap(netdev);
204 hmac_vap_stru *hmac_vap = hmac_vap_get_vap_stru(vap_id);
205 if (hmac_vap != HI_NULL) {
206 hmac_vap->net_device = HI_NULL;
207 }
208 }
209 }
210 return;
211 }
212
213 /* ****************************************************************************
214 函 数 名 : wal_main_exit
215 功能描述 : WAL模块卸载
216 输入参数 : 无
217 输出参数 : 无
218 返 回 值 : 模块卸载返回值,成功或失败原因
219 调用函数 : 无
220 被调函数 : 无
221
222 修改历史 :
223 1.日 期 : 2012年9月18日
224 作 者 : HiSilicon
225 修改内容 : 新生成函数
226
227 **************************************************************************** */
wal_main_exit(hi_void)228 hi_void wal_main_exit(hi_void)
229 {
230 if (frw_get_init_state() != FRW_INIT_STATE_ALL_SUCC) {
231 oam_info_log0(0, 0, "{wal_main_exit::frw state wrong.\n");
232 return;
233 }
234 /* down掉所有的vap */
235 wal_destroy_all_vap();
236 wal_cfg80211_exit();
237 #ifdef _PRE_CONFIG_CONN_HISI_SYSFS_SUPPORT
238 /* 删除proc */
239 wal_hipriv_remove_proc();
240 #endif
241 /* 卸载成功时,将初始化状态置为HMAC初始化成功 */
242 #if (_PRE_MULTI_CORE_MODE_OFFLOAD_DMAC == _PRE_MULTI_CORE_MODE)
243 frw_set_init_state(FRW_INIT_STATE_HAL_SUCC);
244 #else
245 frw_set_init_state(FRW_INIT_STATE_HMAC_CONFIG_VAP_SUCC);
246 #endif
247 }
248
249 /* ****************************************************************************
250 函 数 名 : hisi_wifi_resume_process
251 功能描述 : 恢复wifi进程
252 **************************************************************************** */
hisi_wifi_resume_process(hi_void)253 hi_void hisi_wifi_resume_process(hi_void)
254 {
255 oam_info_log1(0, 0, "{hisi_wifi_resume_process::wifi_init, wifi_mode = %u}\n", g_wlan_reusme_wifi_mode);
256
257 /* g_ul_wlan_reusme_wifi_mode:0:不启动wifi,1:启动AP,2: 启动 STA */
258 if (g_wlan_reusme_wifi_mode == 1) {
259 oam_info_log0(0, 0, "{hisi_wifi_resume_process::cmd_wifi_init_module:: end!}\n");
260 msleep(3000); /* 3000: 睡眠时间 */
261 } else if (g_wlan_reusme_wifi_mode == 2) { /* 2: 启动STA */
262 oam_warning_log0(0, 0, "hisi_wifi_resume_process:: wait development");
263 } else {
264 /* nothing */
265 }
266 }
267
268 /* ****************************************************************************
269 功能描述 : Host部分 加载初始化
270 修改历史 :
271 1.日 期 : 2019年06月04日
272 作 者 : HiSilicon
273 修改内容 : 新生成函数
274 **************************************************************************** */
hi_wifi_host_init(struct BusDev * bus)275 hi_u32 hi_wifi_host_init(struct BusDev *bus)
276 {
277 hi_u32 ret;
278 g_wifi_exit_stop_flag = HI_FALSE;
279 ret = hcc_hmac_init(bus);
280 if (ret != HI_SUCCESS) {
281 oam_error_log1(0, 0, "hi_wifi_host_init: hcc_hmac_init return error code: %d", ret);
282 goto hcc_hmac_init_fail;
283 }
284
285 if (plat_firmware_init() != HI_SUCCESS) {
286 oam_error_log0(0, OAM_SF_ANY, "plat_firmware_init error\n");
287 goto plat_firmware_init_fail;
288 }
289
290 if (wlan_pm_open() != HI_SUCCESS) {
291 oam_error_log0(0, OAM_SF_ANY, "wlan_pm_open error\n");
292 goto wlan_pm_open_fail;
293 }
294
295 ret = hmac_main_init();
296 if (ret != HI_SUCCESS) {
297 oam_error_log1(0, 0, "hi_wifi_host_init: hmac_main_init return error code: %d", ret);
298 goto hmac_main_init_fail;
299 }
300
301 #if (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION)
302 /* 将从wifi_cfg读出的配置项同步给wal_customize */
303 ret = firmware_sync_cfg_paras_to_wal_customize();
304 if (ret != HI_SUCCESS) {
305 oam_error_log1(0, 0, "hi_wifi_host_init: wal_main_init return error code: %d", ret);
306 goto hmac_main_init_fail;
307 }
308 #endif
309 ret = wal_main_init();
310 if (ret != HI_SUCCESS) {
311 oam_error_log1(0, 0, "hi_wifi_host_init: wal_main_init return error code: %d", ret);
312 goto wal_main_init_fail;
313 }
314
315 printk("hi_wifi_host_init SUCCESSFULLY\r\n");
316 return HI_SUCCESS;
317
318 wal_main_init_fail:
319 wal_main_exit();
320 hmac_main_init_fail:
321 hmac_main_exit();
322 wlan_pm_open_fail:
323 wlan_pm_exit();
324 plat_firmware_clear();
325 plat_firmware_init_fail:
326 hcc_hmac_init_fail:
327 hcc_hmac_exit();
328 return HI_FAIL;
329 }
330
331 /* ****************************************************************************
332 功能描述 : Host部分 卸载
333 修改历史 :
334 1.日 期 : 2019年06月04日
335 作 者 : HiSilicon
336 修改内容 : 新生成函数
337 **************************************************************************** */
hi_wifi_host_exit(hi_void)338 hi_void hi_wifi_host_exit(hi_void)
339 {
340 g_wifi_exit_stop_flag = HI_TRUE;
341 wal_main_exit();
342 hmac_main_exit();
343 plat_firmware_clear();
344
345 printk("wifi host exit successfully\r\n");
346 return;
347 }
348
349 /* ****************************************************************************
350 功能描述 : 平台初始化函数总入口
351 输入参数 : vap_num : 最大支持的同时工作的vap数量
352 user_num: 最大支持接入的用户数量,多vap时共享
353 修改历史 :
354 1.日 期 : 2014年11月3日
355 作 者 : HiSilicon
356 修改内容 : 新生成函数
357 **************************************************************************** */
hi_wifi_plat_init(const hi_u8 vap_num,const hi_u8 user_num)358 hi_u32 hi_wifi_plat_init(const hi_u8 vap_num, const hi_u8 user_num)
359 {
360 #if (_PRE_MULTI_CORE_MODE == _PRE_MULTI_CORE_MODE_OFFLOAD_DMAC)
361 hi_bool offload_mode = HI_TRUE; /* DMAC OFFLOAD: IPC场景 */
362 #else
363 hi_bool offload_mode = HI_FALSE; /* DMAC HOST合一: IOT场景 */
364 #endif
365 hi_u32 wifi_task_size = (hi_u32)FRW_TASK_SIZE;
366
367 oam_info_log2(0, OAM_SF_ANY, "hi_wifi_plat_init vap_num[%d], user_num[%d]", vap_num, user_num);
368
369 #if (_PRE_MULTI_CORE_MODE_OFFLOAD_DMAC == _PRE_MULTI_CORE_MODE)
370 if (oam_main_init() != HI_SUCCESS) {
371 oam_error_log0(0, 0, "plat_init: oam_main_init return error code.");
372 goto oam_main_init_fail;
373 }
374 #endif
375
376 if (wal_customize_init() != HI_SUCCESS) {
377 oam_error_log0(0, 0, "plat_init: wal_customize_init return error code.");
378 goto wal_customize_init_fail;
379 }
380
381 if (oal_main_init(vap_num, user_num) != HI_SUCCESS) {
382 oam_error_log0(0, 0, "plat_init: oal_main_init return error code.");
383 goto oal_main_init_fail;
384 }
385
386 if (frw_main_init(offload_mode, wifi_task_size) != HI_SUCCESS) {
387 oam_error_log0(0, 0, "plat_init: frw_main_init return error code.");
388 goto frw_main_init_fail;
389 }
390
391 printk("hi_wifi_plat_init SUCCESSFULLY\r\n");
392 return HI_SUCCESS;
393
394 frw_main_init_fail:
395 #if (_PRE_MULTI_CORE_MODE_OFFLOAD_DMAC == _PRE_MULTI_CORE_MODE)
396 oam_main_exit();
397 oam_main_init_fail:
398 #endif
399 oal_main_exit();
400 oal_main_init_fail:
401 #if (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION)
402 wal_customize_exit();
403 #endif
404 wal_customize_init_fail:
405 return HI_FAIL;
406 }
407
408 /* ****************************************************************************
409 功能描述 : 平台卸载函数总入口
410 修改历史 :
411 1.日 期 : 2014年11月3日
412 作 者 : HiSilicon
413 修改内容 : 新生成函数
414 **************************************************************************** */
hi_wifi_plat_exit(hi_void)415 hi_void hi_wifi_plat_exit(hi_void)
416 {
417 oam_main_exit();
418 if (frw_get_init_state() != FRW_INIT_STATE_FRW_SUCC) {
419 oam_error_log0(0, 0, "{hi_wifi_plat_exit:: frw init state error.}");
420 return;
421 }
422 frw_main_exit();
423 oal_main_exit();
424 wal_customize_exit();
425 }
426
hi_wifi_get_host_exit_flag(hi_void)427 hi_u8 hi_wifi_get_host_exit_flag(hi_void)
428 {
429 return g_wifi_exit_stop_flag;
430 }
431 #ifdef __cplusplus
432 #if __cplusplus
433 }
434 #endif
435 #endif
436