• 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 #include "mac_resource.h"
20 #include "oal_util.h"
21 
22 #ifdef __cplusplus
23 #if __cplusplus
24 extern "C" {
25 #endif
26 #endif
27 
28 /* ****************************************************************************
29   全局变量定义
30 **************************************************************************** */
31 mac_res_hash_stru g_mac_hash_res;
32 
33 /* ****************************************************************************
34   函数实现
35 **************************************************************************** */
36 /* ****************************************************************************
37  功能描述  : 资源池退出,释放动态申请的内存
38  修改历史      :
39   1.日    期   : 2013年8月27日
40     作    者   : HiSilicon
41 **************************************************************************** */
mac_res_exit(hi_void)42 hi_void mac_res_exit(hi_void)
43 {
44     hi_free(HI_MOD_ID_WIFI_DRV, g_mac_hash_res.user_hash_info);
45     hi_free(HI_MOD_ID_WIFI_DRV, g_mac_hash_res.pul_idx);
46     hi_free(HI_MOD_ID_WIFI_DRV, g_mac_hash_res.puc_user_cnt);
47 
48     g_mac_hash_res.user_hash_info = HI_NULL;
49     g_mac_hash_res.pul_idx        = HI_NULL;
50     g_mac_hash_res.puc_user_cnt   = HI_NULL;
51 }
52 
53 /* ****************************************************************************
54  功能描述  : 初始化MAC资源池内容
55  修改历史      :
56   1.日    期   : 2013年5月8日
57     作    者   : HiSilicon
58     修改内容   : 新生成函数
59 **************************************************************************** */
mac_res_init(hi_void)60 hi_u32 mac_res_init(hi_void)
61 {
62     hi_u32 loop;
63     hi_u8 user_num = oal_mem_get_user_res_num();
64     hi_void *hash_info = HI_NULL;
65     hi_void *hash_idx  = HI_NULL;
66     hi_void *hash_cnt  = HI_NULL;
67 
68     /* 安全编程规则6.6例外(1) 对固定长度的数组进行初始化,或对固定长度的结构体进行内存初始化 */
69     memset_s(&g_mac_hash_res, sizeof(mac_res_hash_stru), 0, sizeof(mac_res_hash_stru));
70 
71     /* **************************************************************************
72             初始化HASH桶的资源管理内容
73     ************************************************************************** */
74     hash_info = hi_malloc(HI_MOD_ID_WIFI_DRV, sizeof(mac_res_user_hash_stru) * user_num);
75     hash_idx  = hi_malloc(HI_MOD_ID_WIFI_DRV, sizeof(hi_u32) * user_num);
76     hash_cnt  = hi_malloc(HI_MOD_ID_WIFI_DRV, sizeof(hi_u8) * user_num);
77     if ((hash_info == HI_NULL) || (hash_idx == HI_NULL) || (hash_cnt == HI_NULL)) {
78         oam_error_log0(0, OAM_SF_ANY, "{mac_res_init::malloc fail.}");
79         goto exit;
80     }
81     /* 内存初始清0 */
82     /* 安全编程规则6.6例外(3) 从堆中分配内存后,赋予初值 */
83     memset_s(hash_info, (sizeof(mac_res_user_hash_stru) * user_num), 0, (sizeof(mac_res_user_hash_stru) * user_num));
84     memset_s(hash_idx, (sizeof(hi_u32) * user_num), 0, (sizeof(hi_u32) * user_num));
85     memset_s(hash_cnt, (sizeof(hi_u8) * user_num), 0, (sizeof(hi_u8) * user_num));
86 
87     g_mac_hash_res.user_hash_info = hash_info;
88     g_mac_hash_res.pul_idx            = hash_idx;
89     g_mac_hash_res.puc_user_cnt       = hash_cnt;
90     oal_queue_set(&(g_mac_hash_res.queue), g_mac_hash_res.pul_idx, user_num);
91     for (loop = 0; loop < user_num; loop++) {
92         /* 初始值保存的是对应数组下标值加1 */
93         oal_queue_enqueue(&(g_mac_hash_res.queue), (hi_void *)(uintptr_t)(loop + 1));
94         /* 初始化对应的引用计数值为0 */
95         g_mac_hash_res.puc_user_cnt[loop] = 0;
96     }
97     return HI_SUCCESS;
98 
99 exit: // 操作失败之后,进行内存释放等操作,属于例外,lint_t e801告警屏蔽
100     if (hash_info != HI_NULL) {
101         hi_free(HI_MOD_ID_WIFI_DRV, hash_info);
102     }
103     if (hash_idx != HI_NULL) {
104         hi_free(HI_MOD_ID_WIFI_DRV, hash_idx);
105     }
106     if (hash_cnt != HI_NULL) {
107         hi_free(HI_MOD_ID_WIFI_DRV, hash_cnt);
108     }
109     return HI_FAIL;
110 }
111 
112 /* ****************************************************************************
113  功能描述  : 释放对应HASH的内存
114  输入参数  : 对应HASH内存索引
115  返 回 值  : HI_SUCCESS/HI_FAIL
116  修改历史      :
117   1.日    期   : 2013年5月8日
118     作    者   : HiSilicon
119     修改内容   : 新生成函数
120 **************************************************************************** */
mac_res_free_hash(hi_u32 hash_idx)121 hi_u32 mac_res_free_hash(hi_u32 hash_idx)
122 {
123     if (oal_unlikely(hash_idx >= (hi_u32)g_mac_hash_res.queue.max_elements)) {
124         return HI_FAIL;
125     }
126     if (g_mac_hash_res.puc_user_cnt[hash_idx] == 0) {
127         oam_error_log1(0, OAM_SF_ANY, "mac_res_free_hash::cnt==0! idx:%d", hash_idx);
128         return HI_SUCCESS;
129     }
130     (g_mac_hash_res.puc_user_cnt[hash_idx])--;
131     if (g_mac_hash_res.puc_user_cnt[hash_idx] != 0) {
132         return HI_SUCCESS;
133     }
134     /* 入队索引值需要加1操作 */
135     oal_queue_enqueue(&(g_mac_hash_res.queue), (hi_void *)((uintptr_t)hash_idx + 1));
136     return HI_SUCCESS;
137 }
138 
139 /* ****************************************************************************
140  功能描述  : 获取一个HASH资源
141  输出参数  : HASH内存索引值
142  返 回 值  : HI_SUCCESS/HI_FAIL
143  修改历史      :
144   1.日    期   : 2013年5月8日
145     作    者   : HiSilicon
146     修改内容   : 新生成函数
147 **************************************************************************** */
mac_res_alloc_hash(hi_u8 * puc_hash_idx)148 hi_u32 mac_res_alloc_hash(hi_u8 *puc_hash_idx)
149 {
150     hi_u32 hash_idx_temp;
151 
152     hash_idx_temp = (hi_u32)(uintptr_t)oal_queue_dequeue(&(g_mac_hash_res.queue));
153     /* 0为无效值 */
154     if (hash_idx_temp == 0) {
155         return HI_FAIL;
156     }
157     *puc_hash_idx = (hi_u8)(hash_idx_temp - 1);
158     (g_mac_hash_res.puc_user_cnt[hash_idx_temp - 1])++;
159     return HI_SUCCESS;
160 }
161 
162 /* ****************************************************************************
163  功能描述  : 获取对应hash索引的内存
164  输入参数  : 对应hash内存索引
165  返 回 值  : 对应内存地址
166  修改历史      :
167   1.日    期   : 2013年5月8日
168     作    者   : HiSilicon
169     修改内容   : 新生成函数
170 **************************************************************************** */
mac_res_get_hash(hi_u8 dev_idx)171 mac_res_user_hash_stru *mac_res_get_hash(hi_u8 dev_idx)
172 {
173     return &(g_mac_hash_res.user_hash_info[dev_idx]);
174 }
175 
176 #ifdef __cplusplus
177 #if __cplusplus
178 }
179 #endif
180 #endif
181