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