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