xref: /OK3568_Linux_fs/external/rkwifibt/drivers/rtl8852be/os_dep/osdep_service.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /******************************************************************************
2*4882a593Smuzhiyun  *
3*4882a593Smuzhiyun  * Copyright(c) 2007 - 2019 Realtek Corporation.
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * This program is free software; you can redistribute it and/or modify it
6*4882a593Smuzhiyun  * under the terms of version 2 of the GNU General Public License as
7*4882a593Smuzhiyun  * published by the Free Software Foundation.
8*4882a593Smuzhiyun  *
9*4882a593Smuzhiyun  * This program is distributed in the hope that it will be useful, but WITHOUT
10*4882a593Smuzhiyun  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11*4882a593Smuzhiyun  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12*4882a593Smuzhiyun  * more details.
13*4882a593Smuzhiyun  *
14*4882a593Smuzhiyun  *****************************************************************************/
15*4882a593Smuzhiyun #define _OSDEP_SERVICE_C_
16*4882a593Smuzhiyun 
17*4882a593Smuzhiyun #include <drv_types.h>
18*4882a593Smuzhiyun 
19*4882a593Smuzhiyun #ifdef CONFIG_HWSIM
20*4882a593Smuzhiyun #include "rtw_hwsim_intf.h"
_rtw_netif_rx(_nic_hdl ndev,struct sk_buff * skb)21*4882a593Smuzhiyun inline int _rtw_netif_rx(_nic_hdl ndev, struct sk_buff *skb)
22*4882a593Smuzhiyun {
23*4882a593Smuzhiyun 	skb->dev = ndev;
24*4882a593Smuzhiyun 	rtw_hwsim_medium_pre_netif_rx(skb);
25*4882a593Smuzhiyun 	return netif_rx(skb);
26*4882a593Smuzhiyun }
27*4882a593Smuzhiyun #endif /* CONFIG_HWSIM */
28*4882a593Smuzhiyun 
rtw_atoi(u8 * s)29*4882a593Smuzhiyun u32 rtw_atoi(u8 *s)
30*4882a593Smuzhiyun {
31*4882a593Smuzhiyun 
32*4882a593Smuzhiyun 	int num = 0, flag = 0;
33*4882a593Smuzhiyun 	int i;
34*4882a593Smuzhiyun 	for (i = 0; i <= strlen(s); i++) {
35*4882a593Smuzhiyun 		if (s[i] >= '0' && s[i] <= '9')
36*4882a593Smuzhiyun 			num = num * 10 + s[i] - '0';
37*4882a593Smuzhiyun 		else if (s[0] == '-' && i == 0)
38*4882a593Smuzhiyun 			flag = 1;
39*4882a593Smuzhiyun 		else
40*4882a593Smuzhiyun 			break;
41*4882a593Smuzhiyun 	}
42*4882a593Smuzhiyun 
43*4882a593Smuzhiyun 	if (flag == 1)
44*4882a593Smuzhiyun 		num = num * -1;
45*4882a593Smuzhiyun 
46*4882a593Smuzhiyun 	return num;
47*4882a593Smuzhiyun 
48*4882a593Smuzhiyun }
49*4882a593Smuzhiyun 
50*4882a593Smuzhiyun #if defined(DBG_MEM_ALLOC)
51*4882a593Smuzhiyun 
52*4882a593Smuzhiyun struct rtw_mem_stat {
53*4882a593Smuzhiyun 	ATOMIC_T alloc; /* the memory bytes we allocate currently */
54*4882a593Smuzhiyun 	ATOMIC_T peak; /* the peak memory bytes we allocate */
55*4882a593Smuzhiyun 	ATOMIC_T alloc_cnt; /* the alloc count for alloc currently */
56*4882a593Smuzhiyun 	ATOMIC_T alloc_err_cnt; /* the error times we fail to allocate memory */
57*4882a593Smuzhiyun };
58*4882a593Smuzhiyun 
59*4882a593Smuzhiyun struct rtw_mem_stat rtw_mem_type_stat[mstat_tf_idx(MSTAT_TYPE_MAX)];
60*4882a593Smuzhiyun #ifdef RTW_MEM_FUNC_STAT
61*4882a593Smuzhiyun struct rtw_mem_stat rtw_mem_func_stat[mstat_ff_idx(MSTAT_FUNC_MAX)];
62*4882a593Smuzhiyun #endif
63*4882a593Smuzhiyun 
64*4882a593Smuzhiyun char *MSTAT_TYPE_str[] = {
65*4882a593Smuzhiyun 	"VIR",
66*4882a593Smuzhiyun 	"PHY",
67*4882a593Smuzhiyun 	"SKB",
68*4882a593Smuzhiyun 	"USB",
69*4882a593Smuzhiyun };
70*4882a593Smuzhiyun 
71*4882a593Smuzhiyun #ifdef RTW_MEM_FUNC_STAT
72*4882a593Smuzhiyun char *MSTAT_FUNC_str[] = {
73*4882a593Smuzhiyun 	"UNSP",
74*4882a593Smuzhiyun 	"IO",
75*4882a593Smuzhiyun 	"TXIO",
76*4882a593Smuzhiyun 	"RXIO",
77*4882a593Smuzhiyun 	"TX",
78*4882a593Smuzhiyun 	"RX",
79*4882a593Smuzhiyun };
80*4882a593Smuzhiyun #endif
81*4882a593Smuzhiyun 
rtw_mstat_dump(void * sel)82*4882a593Smuzhiyun void rtw_mstat_dump(void *sel)
83*4882a593Smuzhiyun {
84*4882a593Smuzhiyun 	int i;
85*4882a593Smuzhiyun 	int value_t[4][mstat_tf_idx(MSTAT_TYPE_MAX)];
86*4882a593Smuzhiyun #ifdef RTW_MEM_FUNC_STAT
87*4882a593Smuzhiyun 	int value_f[4][mstat_ff_idx(MSTAT_FUNC_MAX)];
88*4882a593Smuzhiyun #endif
89*4882a593Smuzhiyun 
90*4882a593Smuzhiyun 	for (i = 0; i < mstat_tf_idx(MSTAT_TYPE_MAX); i++) {
91*4882a593Smuzhiyun 		value_t[0][i] = ATOMIC_READ(&(rtw_mem_type_stat[i].alloc));
92*4882a593Smuzhiyun 		value_t[1][i] = ATOMIC_READ(&(rtw_mem_type_stat[i].peak));
93*4882a593Smuzhiyun 		value_t[2][i] = ATOMIC_READ(&(rtw_mem_type_stat[i].alloc_cnt));
94*4882a593Smuzhiyun 		value_t[3][i] = ATOMIC_READ(&(rtw_mem_type_stat[i].alloc_err_cnt));
95*4882a593Smuzhiyun 	}
96*4882a593Smuzhiyun 
97*4882a593Smuzhiyun #ifdef RTW_MEM_FUNC_STAT
98*4882a593Smuzhiyun 	for (i = 0; i < mstat_ff_idx(MSTAT_FUNC_MAX); i++) {
99*4882a593Smuzhiyun 		value_f[0][i] = ATOMIC_READ(&(rtw_mem_func_stat[i].alloc));
100*4882a593Smuzhiyun 		value_f[1][i] = ATOMIC_READ(&(rtw_mem_func_stat[i].peak));
101*4882a593Smuzhiyun 		value_f[2][i] = ATOMIC_READ(&(rtw_mem_func_stat[i].alloc_cnt));
102*4882a593Smuzhiyun 		value_f[3][i] = ATOMIC_READ(&(rtw_mem_func_stat[i].alloc_err_cnt));
103*4882a593Smuzhiyun 	}
104*4882a593Smuzhiyun #endif
105*4882a593Smuzhiyun 
106*4882a593Smuzhiyun 	RTW_PRINT_SEL(sel, "===================== MSTAT =====================\n");
107*4882a593Smuzhiyun 	RTW_PRINT_SEL(sel, "%4s %10s %10s %10s %10s\n", "TAG", "alloc", "peak", "aloc_cnt", "err_cnt");
108*4882a593Smuzhiyun 	RTW_PRINT_SEL(sel, "-------------------------------------------------\n");
109*4882a593Smuzhiyun 	for (i = 0; i < mstat_tf_idx(MSTAT_TYPE_MAX); i++)
110*4882a593Smuzhiyun 		RTW_PRINT_SEL(sel, "%4s %10d %10d %10d %10d\n", MSTAT_TYPE_str[i], value_t[0][i], value_t[1][i], value_t[2][i], value_t[3][i]);
111*4882a593Smuzhiyun #ifdef RTW_MEM_FUNC_STAT
112*4882a593Smuzhiyun 	RTW_PRINT_SEL(sel, "-------------------------------------------------\n");
113*4882a593Smuzhiyun 	for (i = 0; i < mstat_ff_idx(MSTAT_FUNC_MAX); i++)
114*4882a593Smuzhiyun 		RTW_PRINT_SEL(sel, "%4s %10d %10d %10d %10d\n", MSTAT_FUNC_str[i], value_f[0][i], value_f[1][i], value_f[2][i], value_f[3][i]);
115*4882a593Smuzhiyun #endif
116*4882a593Smuzhiyun }
117*4882a593Smuzhiyun 
rtw_mstat_update(const enum mstat_f flags,const MSTAT_STATUS status,u32 sz)118*4882a593Smuzhiyun void rtw_mstat_update(const enum mstat_f flags, const MSTAT_STATUS status, u32 sz)
119*4882a593Smuzhiyun {
120*4882a593Smuzhiyun 	static systime update_time = 0;
121*4882a593Smuzhiyun 	int peak, alloc;
122*4882a593Smuzhiyun 	int i;
123*4882a593Smuzhiyun 
124*4882a593Smuzhiyun 	/* initialization */
125*4882a593Smuzhiyun 	if (!update_time) {
126*4882a593Smuzhiyun 		for (i = 0; i < mstat_tf_idx(MSTAT_TYPE_MAX); i++) {
127*4882a593Smuzhiyun 			ATOMIC_SET(&(rtw_mem_type_stat[i].alloc), 0);
128*4882a593Smuzhiyun 			ATOMIC_SET(&(rtw_mem_type_stat[i].peak), 0);
129*4882a593Smuzhiyun 			ATOMIC_SET(&(rtw_mem_type_stat[i].alloc_cnt), 0);
130*4882a593Smuzhiyun 			ATOMIC_SET(&(rtw_mem_type_stat[i].alloc_err_cnt), 0);
131*4882a593Smuzhiyun 		}
132*4882a593Smuzhiyun 		#ifdef RTW_MEM_FUNC_STAT
133*4882a593Smuzhiyun 		for (i = 0; i < mstat_ff_idx(MSTAT_FUNC_MAX); i++) {
134*4882a593Smuzhiyun 			ATOMIC_SET(&(rtw_mem_func_stat[i].alloc), 0);
135*4882a593Smuzhiyun 			ATOMIC_SET(&(rtw_mem_func_stat[i].peak), 0);
136*4882a593Smuzhiyun 			ATOMIC_SET(&(rtw_mem_func_stat[i].alloc_cnt), 0);
137*4882a593Smuzhiyun 			ATOMIC_SET(&(rtw_mem_func_stat[i].alloc_err_cnt), 0);
138*4882a593Smuzhiyun 		}
139*4882a593Smuzhiyun 		#endif
140*4882a593Smuzhiyun 	}
141*4882a593Smuzhiyun 
142*4882a593Smuzhiyun 	switch (status) {
143*4882a593Smuzhiyun 	case MSTAT_ALLOC_SUCCESS:
144*4882a593Smuzhiyun 		ATOMIC_INC(&(rtw_mem_type_stat[mstat_tf_idx(flags)].alloc_cnt));
145*4882a593Smuzhiyun 		alloc = ATOMIC_ADD_RETURN(&(rtw_mem_type_stat[mstat_tf_idx(flags)].alloc), sz);
146*4882a593Smuzhiyun 		peak = ATOMIC_READ(&(rtw_mem_type_stat[mstat_tf_idx(flags)].peak));
147*4882a593Smuzhiyun 		if (peak < alloc)
148*4882a593Smuzhiyun 			ATOMIC_SET(&(rtw_mem_type_stat[mstat_tf_idx(flags)].peak), alloc);
149*4882a593Smuzhiyun 
150*4882a593Smuzhiyun 		#ifdef RTW_MEM_FUNC_STAT
151*4882a593Smuzhiyun 		ATOMIC_INC(&(rtw_mem_func_stat[mstat_ff_idx(flags)].alloc_cnt));
152*4882a593Smuzhiyun 		alloc = ATOMIC_ADD_RETURN(&(rtw_mem_func_stat[mstat_ff_idx(flags)].alloc), sz);
153*4882a593Smuzhiyun 		peak = ATOMIC_READ(&(rtw_mem_func_stat[mstat_ff_idx(flags)].peak));
154*4882a593Smuzhiyun 		if (peak < alloc)
155*4882a593Smuzhiyun 			ATOMIC_SET(&(rtw_mem_func_stat[mstat_ff_idx(flags)].peak), alloc);
156*4882a593Smuzhiyun 		#endif
157*4882a593Smuzhiyun 		break;
158*4882a593Smuzhiyun 
159*4882a593Smuzhiyun 	case MSTAT_ALLOC_FAIL:
160*4882a593Smuzhiyun 		ATOMIC_INC(&(rtw_mem_type_stat[mstat_tf_idx(flags)].alloc_err_cnt));
161*4882a593Smuzhiyun 		#ifdef RTW_MEM_FUNC_STAT
162*4882a593Smuzhiyun 		ATOMIC_INC(&(rtw_mem_func_stat[mstat_ff_idx(flags)].alloc_err_cnt));
163*4882a593Smuzhiyun 		#endif
164*4882a593Smuzhiyun 		break;
165*4882a593Smuzhiyun 
166*4882a593Smuzhiyun 	case MSTAT_FREE:
167*4882a593Smuzhiyun 		ATOMIC_DEC(&(rtw_mem_type_stat[mstat_tf_idx(flags)].alloc_cnt));
168*4882a593Smuzhiyun 		ATOMIC_SUB(&(rtw_mem_type_stat[mstat_tf_idx(flags)].alloc), sz);
169*4882a593Smuzhiyun 		#ifdef RTW_MEM_FUNC_STAT
170*4882a593Smuzhiyun 		ATOMIC_DEC(&(rtw_mem_func_stat[mstat_ff_idx(flags)].alloc_cnt));
171*4882a593Smuzhiyun 		ATOMIC_SUB(&(rtw_mem_func_stat[mstat_ff_idx(flags)].alloc), sz);
172*4882a593Smuzhiyun 		#endif
173*4882a593Smuzhiyun 		break;
174*4882a593Smuzhiyun 	};
175*4882a593Smuzhiyun 
176*4882a593Smuzhiyun 	/* if (rtw_get_passing_time_ms(update_time) > 5000) { */
177*4882a593Smuzhiyun 	/*	rtw_mstat_dump(RTW_DBGDUMP); */
178*4882a593Smuzhiyun 	update_time = rtw_get_current_time();
179*4882a593Smuzhiyun 	/* } */
180*4882a593Smuzhiyun }
181*4882a593Smuzhiyun 
182*4882a593Smuzhiyun #ifndef SIZE_MAX
183*4882a593Smuzhiyun #define SIZE_MAX (~(size_t)0)
184*4882a593Smuzhiyun #endif
185*4882a593Smuzhiyun 
186*4882a593Smuzhiyun struct mstat_sniff_rule {
187*4882a593Smuzhiyun 	enum mstat_f flags;
188*4882a593Smuzhiyun 	size_t lb;
189*4882a593Smuzhiyun 	size_t hb;
190*4882a593Smuzhiyun };
191*4882a593Smuzhiyun 
192*4882a593Smuzhiyun struct mstat_sniff_rule mstat_sniff_rules[] = {
193*4882a593Smuzhiyun 	{MSTAT_TYPE_VIR, 32, 32},
194*4882a593Smuzhiyun };
195*4882a593Smuzhiyun 
196*4882a593Smuzhiyun int mstat_sniff_rule_num = sizeof(mstat_sniff_rules) / sizeof(struct mstat_sniff_rule);
197*4882a593Smuzhiyun 
match_mstat_sniff_rules(const enum mstat_f flags,const size_t size)198*4882a593Smuzhiyun bool match_mstat_sniff_rules(const enum mstat_f flags, const size_t size)
199*4882a593Smuzhiyun {
200*4882a593Smuzhiyun 	int i;
201*4882a593Smuzhiyun 	for (i = 0; i < mstat_sniff_rule_num; i++) {
202*4882a593Smuzhiyun 		if (mstat_sniff_rules[i].flags == flags
203*4882a593Smuzhiyun 			&& mstat_sniff_rules[i].lb <= size
204*4882a593Smuzhiyun 			&& mstat_sniff_rules[i].hb >= size)
205*4882a593Smuzhiyun 			return _TRUE;
206*4882a593Smuzhiyun 	}
207*4882a593Smuzhiyun 
208*4882a593Smuzhiyun 	return _FALSE;
209*4882a593Smuzhiyun }
210*4882a593Smuzhiyun 
dbg_rtw_vmalloc(u32 sz,const enum mstat_f flags,const char * func,const int line)211*4882a593Smuzhiyun inline void *dbg_rtw_vmalloc(u32 sz, const enum mstat_f flags, const char *func, const int line)
212*4882a593Smuzhiyun {
213*4882a593Smuzhiyun 	void *p;
214*4882a593Smuzhiyun 
215*4882a593Smuzhiyun 	if (match_mstat_sniff_rules(flags, sz))
216*4882a593Smuzhiyun 		RTW_INFO("DBG_MEM_ALLOC %s:%d %s(%d)\n", func, line, __FUNCTION__, (sz));
217*4882a593Smuzhiyun 
218*4882a593Smuzhiyun 	p = _rtw_vmalloc((sz));
219*4882a593Smuzhiyun 
220*4882a593Smuzhiyun 	rtw_mstat_update(
221*4882a593Smuzhiyun 		flags
222*4882a593Smuzhiyun 		, p ? MSTAT_ALLOC_SUCCESS : MSTAT_ALLOC_FAIL
223*4882a593Smuzhiyun 		, sz
224*4882a593Smuzhiyun 	);
225*4882a593Smuzhiyun 
226*4882a593Smuzhiyun 	return p;
227*4882a593Smuzhiyun }
228*4882a593Smuzhiyun 
dbg_rtw_zvmalloc(u32 sz,const enum mstat_f flags,const char * func,const int line)229*4882a593Smuzhiyun inline void *dbg_rtw_zvmalloc(u32 sz, const enum mstat_f flags, const char *func, const int line)
230*4882a593Smuzhiyun {
231*4882a593Smuzhiyun 	void *p;
232*4882a593Smuzhiyun 
233*4882a593Smuzhiyun 	if (match_mstat_sniff_rules(flags, sz))
234*4882a593Smuzhiyun 		RTW_INFO("DBG_MEM_ALLOC %s:%d %s(%d)\n", func, line, __FUNCTION__, (sz));
235*4882a593Smuzhiyun 
236*4882a593Smuzhiyun 	p = _rtw_zvmalloc((sz));
237*4882a593Smuzhiyun 
238*4882a593Smuzhiyun 	rtw_mstat_update(
239*4882a593Smuzhiyun 		flags
240*4882a593Smuzhiyun 		, p ? MSTAT_ALLOC_SUCCESS : MSTAT_ALLOC_FAIL
241*4882a593Smuzhiyun 		, sz
242*4882a593Smuzhiyun 	);
243*4882a593Smuzhiyun 
244*4882a593Smuzhiyun 	return p;
245*4882a593Smuzhiyun }
246*4882a593Smuzhiyun 
dbg_rtw_vmfree(void * pbuf,u32 sz,const enum mstat_f flags,const char * func,const int line)247*4882a593Smuzhiyun inline void dbg_rtw_vmfree(void *pbuf, u32 sz, const enum mstat_f flags, const char *func, const int line)
248*4882a593Smuzhiyun {
249*4882a593Smuzhiyun 
250*4882a593Smuzhiyun 	if (match_mstat_sniff_rules(flags, sz))
251*4882a593Smuzhiyun 		RTW_INFO("DBG_MEM_ALLOC %s:%d %s(%d)\n", func, line, __FUNCTION__, (sz));
252*4882a593Smuzhiyun 
253*4882a593Smuzhiyun 	_rtw_vmfree((pbuf), (sz));
254*4882a593Smuzhiyun 
255*4882a593Smuzhiyun 	rtw_mstat_update(
256*4882a593Smuzhiyun 		flags
257*4882a593Smuzhiyun 		, MSTAT_FREE
258*4882a593Smuzhiyun 		, sz
259*4882a593Smuzhiyun 	);
260*4882a593Smuzhiyun }
261*4882a593Smuzhiyun 
dbg_rtw_malloc(u32 sz,const enum mstat_f flags,const char * func,const int line)262*4882a593Smuzhiyun inline void *dbg_rtw_malloc(u32 sz, const enum mstat_f flags, const char *func, const int line)
263*4882a593Smuzhiyun {
264*4882a593Smuzhiyun 	void *p;
265*4882a593Smuzhiyun 
266*4882a593Smuzhiyun 	if (match_mstat_sniff_rules(flags, sz))
267*4882a593Smuzhiyun 		RTW_INFO("DBG_MEM_ALLOC %s:%d %s(%d)\n", func, line, __FUNCTION__, (sz));
268*4882a593Smuzhiyun 
269*4882a593Smuzhiyun 	p = _rtw_malloc((sz));
270*4882a593Smuzhiyun 
271*4882a593Smuzhiyun 	rtw_mstat_update(
272*4882a593Smuzhiyun 		flags
273*4882a593Smuzhiyun 		, p ? MSTAT_ALLOC_SUCCESS : MSTAT_ALLOC_FAIL
274*4882a593Smuzhiyun 		, sz
275*4882a593Smuzhiyun 	);
276*4882a593Smuzhiyun 
277*4882a593Smuzhiyun 	return p;
278*4882a593Smuzhiyun }
279*4882a593Smuzhiyun 
dbg_rtw_zmalloc(u32 sz,const enum mstat_f flags,const char * func,const int line)280*4882a593Smuzhiyun inline void *dbg_rtw_zmalloc(u32 sz, const enum mstat_f flags, const char *func, const int line)
281*4882a593Smuzhiyun {
282*4882a593Smuzhiyun 	void *p;
283*4882a593Smuzhiyun 
284*4882a593Smuzhiyun 	if (match_mstat_sniff_rules(flags, sz))
285*4882a593Smuzhiyun 		RTW_INFO("DBG_MEM_ALLOC %s:%d %s(%d)\n", func, line, __FUNCTION__, (sz));
286*4882a593Smuzhiyun 
287*4882a593Smuzhiyun 	p = _rtw_zmalloc((sz));
288*4882a593Smuzhiyun 
289*4882a593Smuzhiyun 	rtw_mstat_update(
290*4882a593Smuzhiyun 		flags
291*4882a593Smuzhiyun 		, p ? MSTAT_ALLOC_SUCCESS : MSTAT_ALLOC_FAIL
292*4882a593Smuzhiyun 		, sz
293*4882a593Smuzhiyun 	);
294*4882a593Smuzhiyun 
295*4882a593Smuzhiyun 	return p;
296*4882a593Smuzhiyun }
297*4882a593Smuzhiyun 
dbg_rtw_mfree(void * pbuf,u32 sz,const enum mstat_f flags,const char * func,const int line)298*4882a593Smuzhiyun inline void dbg_rtw_mfree(void *pbuf, u32 sz, const enum mstat_f flags, const char *func, const int line)
299*4882a593Smuzhiyun {
300*4882a593Smuzhiyun 	if (match_mstat_sniff_rules(flags, sz))
301*4882a593Smuzhiyun 		RTW_INFO("DBG_MEM_ALLOC %s:%d %s(%d)\n", func, line, __FUNCTION__, (sz));
302*4882a593Smuzhiyun 
303*4882a593Smuzhiyun 	_rtw_mfree((pbuf), (sz));
304*4882a593Smuzhiyun 
305*4882a593Smuzhiyun 	rtw_mstat_update(
306*4882a593Smuzhiyun 		flags
307*4882a593Smuzhiyun 		, MSTAT_FREE
308*4882a593Smuzhiyun 		, sz
309*4882a593Smuzhiyun 	);
310*4882a593Smuzhiyun }
311*4882a593Smuzhiyun 
dbg_rtw_skb_mstat_aid(struct sk_buff * skb_head,const enum mstat_f flags,enum mstat_status status)312*4882a593Smuzhiyun inline void dbg_rtw_skb_mstat_aid(struct sk_buff *skb_head, const enum mstat_f flags, enum mstat_status status)
313*4882a593Smuzhiyun {
314*4882a593Smuzhiyun 	unsigned int truesize = 0;
315*4882a593Smuzhiyun 	struct sk_buff *skb;
316*4882a593Smuzhiyun 
317*4882a593Smuzhiyun 	if (!skb_head)
318*4882a593Smuzhiyun 		return;
319*4882a593Smuzhiyun 
320*4882a593Smuzhiyun 	rtw_mstat_update(flags, status, skb_head->truesize);
321*4882a593Smuzhiyun 
322*4882a593Smuzhiyun 	skb_walk_frags(skb_head, skb)
323*4882a593Smuzhiyun 		rtw_mstat_update(flags, status, skb->truesize);
324*4882a593Smuzhiyun }
325*4882a593Smuzhiyun 
dbg_rtw_skb_alloc(unsigned int size,const enum mstat_f flags,const char * func,int line)326*4882a593Smuzhiyun inline struct sk_buff *dbg_rtw_skb_alloc(unsigned int size, const enum mstat_f flags, const char *func, int line)
327*4882a593Smuzhiyun {
328*4882a593Smuzhiyun 	struct sk_buff *skb;
329*4882a593Smuzhiyun 	unsigned int truesize = 0;
330*4882a593Smuzhiyun 
331*4882a593Smuzhiyun 	skb = _rtw_skb_alloc(size);
332*4882a593Smuzhiyun 
333*4882a593Smuzhiyun 	if (skb)
334*4882a593Smuzhiyun 		truesize = skb->truesize;
335*4882a593Smuzhiyun 
336*4882a593Smuzhiyun 	if (!skb || truesize < size || match_mstat_sniff_rules(flags, truesize))
337*4882a593Smuzhiyun 		RTW_INFO("DBG_MEM_ALLOC %s:%d %s(%d), skb:%p, truesize=%u\n", func, line, __FUNCTION__, size, skb, truesize);
338*4882a593Smuzhiyun 
339*4882a593Smuzhiyun 	rtw_mstat_update(
340*4882a593Smuzhiyun 		flags
341*4882a593Smuzhiyun 		, skb ? MSTAT_ALLOC_SUCCESS : MSTAT_ALLOC_FAIL
342*4882a593Smuzhiyun 		, truesize
343*4882a593Smuzhiyun 	);
344*4882a593Smuzhiyun 
345*4882a593Smuzhiyun 	return skb;
346*4882a593Smuzhiyun }
347*4882a593Smuzhiyun 
dbg_rtw_skb_free(struct sk_buff * skb,const enum mstat_f flags,const char * func,int line)348*4882a593Smuzhiyun inline void dbg_rtw_skb_free(struct sk_buff *skb, const enum mstat_f flags, const char *func, int line)
349*4882a593Smuzhiyun {
350*4882a593Smuzhiyun 	unsigned int truesize = skb->truesize;
351*4882a593Smuzhiyun 
352*4882a593Smuzhiyun 	if (match_mstat_sniff_rules(flags, truesize))
353*4882a593Smuzhiyun 		RTW_INFO("DBG_MEM_ALLOC %s:%d %s, truesize=%u\n", func, line, __FUNCTION__, truesize);
354*4882a593Smuzhiyun 
355*4882a593Smuzhiyun 	dbg_rtw_skb_mstat_aid(skb, flags, MSTAT_FREE);
356*4882a593Smuzhiyun 
357*4882a593Smuzhiyun 	_rtw_skb_free(skb);
358*4882a593Smuzhiyun }
359*4882a593Smuzhiyun 
dbg_rtw_skb_copy(const struct sk_buff * skb,const enum mstat_f flags,const char * func,const int line)360*4882a593Smuzhiyun inline struct sk_buff *dbg_rtw_skb_copy(const struct sk_buff *skb, const enum mstat_f flags, const char *func, const int line)
361*4882a593Smuzhiyun {
362*4882a593Smuzhiyun 	struct sk_buff *skb_cp;
363*4882a593Smuzhiyun 	unsigned int truesize = skb->truesize;
364*4882a593Smuzhiyun 	unsigned int cp_truesize = 0;
365*4882a593Smuzhiyun 
366*4882a593Smuzhiyun 	skb_cp = _rtw_skb_copy(skb);
367*4882a593Smuzhiyun 	if (skb_cp)
368*4882a593Smuzhiyun 		cp_truesize = skb_cp->truesize;
369*4882a593Smuzhiyun 
370*4882a593Smuzhiyun 	if (!skb_cp || cp_truesize < truesize || match_mstat_sniff_rules(flags, cp_truesize))
371*4882a593Smuzhiyun 		RTW_INFO("DBG_MEM_ALLOC %s:%d %s(%u), skb_cp:%p, cp_truesize=%u\n", func, line, __FUNCTION__, truesize, skb_cp, cp_truesize);
372*4882a593Smuzhiyun 
373*4882a593Smuzhiyun 	rtw_mstat_update(
374*4882a593Smuzhiyun 		flags
375*4882a593Smuzhiyun 		, skb_cp ? MSTAT_ALLOC_SUCCESS : MSTAT_ALLOC_FAIL
376*4882a593Smuzhiyun 		, cp_truesize
377*4882a593Smuzhiyun 	);
378*4882a593Smuzhiyun 
379*4882a593Smuzhiyun 	return skb_cp;
380*4882a593Smuzhiyun }
381*4882a593Smuzhiyun 
dbg_rtw_skb_clone(struct sk_buff * skb,const enum mstat_f flags,const char * func,const int line)382*4882a593Smuzhiyun inline struct sk_buff *dbg_rtw_skb_clone(struct sk_buff *skb, const enum mstat_f flags, const char *func, const int line)
383*4882a593Smuzhiyun {
384*4882a593Smuzhiyun 	struct sk_buff *skb_cl;
385*4882a593Smuzhiyun 	unsigned int truesize = skb->truesize;
386*4882a593Smuzhiyun 	unsigned int cl_truesize = 0;
387*4882a593Smuzhiyun 
388*4882a593Smuzhiyun 	skb_cl = _rtw_skb_clone(skb);
389*4882a593Smuzhiyun 	if (skb_cl)
390*4882a593Smuzhiyun 		cl_truesize = skb_cl->truesize;
391*4882a593Smuzhiyun 
392*4882a593Smuzhiyun 	if (!skb_cl || cl_truesize < truesize || match_mstat_sniff_rules(flags, cl_truesize))
393*4882a593Smuzhiyun 		RTW_INFO("DBG_MEM_ALLOC %s:%d %s(%u), skb_cl:%p, cl_truesize=%u\n", func, line, __FUNCTION__, truesize, skb_cl, cl_truesize);
394*4882a593Smuzhiyun 
395*4882a593Smuzhiyun 	rtw_mstat_update(
396*4882a593Smuzhiyun 		flags
397*4882a593Smuzhiyun 		, skb_cl ? MSTAT_ALLOC_SUCCESS : MSTAT_ALLOC_FAIL
398*4882a593Smuzhiyun 		, cl_truesize
399*4882a593Smuzhiyun 	);
400*4882a593Smuzhiyun 
401*4882a593Smuzhiyun 	return skb_cl;
402*4882a593Smuzhiyun }
403*4882a593Smuzhiyun 
dbg_rtw_skb_linearize(struct sk_buff * skb,const enum mstat_f flags,const char * func,int line)404*4882a593Smuzhiyun inline int dbg_rtw_skb_linearize(struct sk_buff *skb, const enum mstat_f flags, const char *func, int line)
405*4882a593Smuzhiyun {
406*4882a593Smuzhiyun 	unsigned int truesize = 0;
407*4882a593Smuzhiyun 	int ret;
408*4882a593Smuzhiyun 
409*4882a593Smuzhiyun 	dbg_rtw_skb_mstat_aid(skb, flags, MSTAT_FREE);
410*4882a593Smuzhiyun 
411*4882a593Smuzhiyun 	ret = _rtw_skb_linearize(skb);
412*4882a593Smuzhiyun 
413*4882a593Smuzhiyun 	dbg_rtw_skb_mstat_aid(skb, flags, MSTAT_ALLOC_SUCCESS);
414*4882a593Smuzhiyun 
415*4882a593Smuzhiyun 	return ret;
416*4882a593Smuzhiyun }
417*4882a593Smuzhiyun 
dbg_rtw_netif_rx(_nic_hdl ndev,struct sk_buff * skb,const enum mstat_f flags,const char * func,int line)418*4882a593Smuzhiyun inline int dbg_rtw_netif_rx(_nic_hdl ndev, struct sk_buff *skb, const enum mstat_f flags, const char *func, int line)
419*4882a593Smuzhiyun {
420*4882a593Smuzhiyun 	int ret;
421*4882a593Smuzhiyun 	unsigned int truesize = skb->truesize;
422*4882a593Smuzhiyun 
423*4882a593Smuzhiyun 	if (match_mstat_sniff_rules(flags, truesize))
424*4882a593Smuzhiyun 		RTW_INFO("DBG_MEM_ALLOC %s:%d %s, truesize=%u\n", func, line, __FUNCTION__, truesize);
425*4882a593Smuzhiyun 
426*4882a593Smuzhiyun 	ret = _rtw_netif_rx(ndev, skb);
427*4882a593Smuzhiyun 
428*4882a593Smuzhiyun 	rtw_mstat_update(
429*4882a593Smuzhiyun 		flags
430*4882a593Smuzhiyun 		, MSTAT_FREE
431*4882a593Smuzhiyun 		, truesize
432*4882a593Smuzhiyun 	);
433*4882a593Smuzhiyun 
434*4882a593Smuzhiyun 	return ret;
435*4882a593Smuzhiyun }
436*4882a593Smuzhiyun 
437*4882a593Smuzhiyun #ifdef CONFIG_RTW_NAPI
dbg_rtw_netif_receive_skb(_nic_hdl ndev,struct sk_buff * skb,const enum mstat_f flags,const char * func,int line)438*4882a593Smuzhiyun inline int dbg_rtw_netif_receive_skb(_nic_hdl ndev, struct sk_buff *skb, const enum mstat_f flags, const char *func, int line)
439*4882a593Smuzhiyun {
440*4882a593Smuzhiyun 	int ret;
441*4882a593Smuzhiyun 	unsigned int truesize = skb->truesize;
442*4882a593Smuzhiyun 
443*4882a593Smuzhiyun 	if (match_mstat_sniff_rules(flags, truesize))
444*4882a593Smuzhiyun 		RTW_INFO("DBG_MEM_ALLOC %s:%d %s, truesize=%u\n", func, line, __FUNCTION__, truesize);
445*4882a593Smuzhiyun 
446*4882a593Smuzhiyun 	ret = _rtw_netif_receive_skb(ndev, skb);
447*4882a593Smuzhiyun 
448*4882a593Smuzhiyun 	rtw_mstat_update(
449*4882a593Smuzhiyun 		flags
450*4882a593Smuzhiyun 		, MSTAT_FREE
451*4882a593Smuzhiyun 		, truesize
452*4882a593Smuzhiyun 	);
453*4882a593Smuzhiyun 
454*4882a593Smuzhiyun 	return ret;
455*4882a593Smuzhiyun }
456*4882a593Smuzhiyun 
457*4882a593Smuzhiyun #ifdef CONFIG_RTW_GRO
dbg_rtw_napi_gro_receive(struct napi_struct * napi,struct sk_buff * skb,const enum mstat_f flags,const char * func,int line)458*4882a593Smuzhiyun inline gro_result_t dbg_rtw_napi_gro_receive(struct napi_struct *napi, struct sk_buff *skb, const enum mstat_f flags, const char *func, int line)
459*4882a593Smuzhiyun {
460*4882a593Smuzhiyun 	int ret;
461*4882a593Smuzhiyun 	unsigned int truesize = skb->truesize;
462*4882a593Smuzhiyun 
463*4882a593Smuzhiyun 	if (match_mstat_sniff_rules(flags, truesize))
464*4882a593Smuzhiyun 		RTW_INFO("DBG_MEM_ALLOC %s:%d %s, truesize=%u\n", func, line, __FUNCTION__, truesize);
465*4882a593Smuzhiyun 
466*4882a593Smuzhiyun 	ret = _rtw_napi_gro_receive(napi, skb);
467*4882a593Smuzhiyun 
468*4882a593Smuzhiyun 	rtw_mstat_update(
469*4882a593Smuzhiyun 		flags
470*4882a593Smuzhiyun 		, MSTAT_FREE
471*4882a593Smuzhiyun 		, truesize
472*4882a593Smuzhiyun 	);
473*4882a593Smuzhiyun 
474*4882a593Smuzhiyun 	return ret;
475*4882a593Smuzhiyun }
476*4882a593Smuzhiyun #endif /* CONFIG_RTW_GRO */
477*4882a593Smuzhiyun #endif /* CONFIG_RTW_NAPI */
478*4882a593Smuzhiyun 
dbg_rtw_skb_queue_purge(struct sk_buff_head * list,enum mstat_f flags,const char * func,int line)479*4882a593Smuzhiyun inline void dbg_rtw_skb_queue_purge(struct sk_buff_head *list, enum mstat_f flags, const char *func, int line)
480*4882a593Smuzhiyun {
481*4882a593Smuzhiyun 	struct sk_buff *skb;
482*4882a593Smuzhiyun 
483*4882a593Smuzhiyun 	while ((skb = skb_dequeue(list)) != NULL)
484*4882a593Smuzhiyun 		dbg_rtw_skb_free(skb, flags, func, line);
485*4882a593Smuzhiyun }
486*4882a593Smuzhiyun 
487*4882a593Smuzhiyun #ifdef CONFIG_USB_HCI
dbg_rtw_usb_buffer_alloc(struct usb_device * dev,size_t size,dma_addr_t * dma,const enum mstat_f flags,const char * func,int line)488*4882a593Smuzhiyun inline void *dbg_rtw_usb_buffer_alloc(struct usb_device *dev, size_t size, dma_addr_t *dma, const enum mstat_f flags, const char *func, int line)
489*4882a593Smuzhiyun {
490*4882a593Smuzhiyun 	void *p;
491*4882a593Smuzhiyun 
492*4882a593Smuzhiyun 	if (match_mstat_sniff_rules(flags, size))
493*4882a593Smuzhiyun 		RTW_INFO("DBG_MEM_ALLOC %s:%d %s(%zu)\n", func, line, __FUNCTION__, size);
494*4882a593Smuzhiyun 
495*4882a593Smuzhiyun 	p = _rtw_usb_buffer_alloc(dev, size, dma);
496*4882a593Smuzhiyun 
497*4882a593Smuzhiyun 	rtw_mstat_update(
498*4882a593Smuzhiyun 		flags
499*4882a593Smuzhiyun 		, p ? MSTAT_ALLOC_SUCCESS : MSTAT_ALLOC_FAIL
500*4882a593Smuzhiyun 		, size
501*4882a593Smuzhiyun 	);
502*4882a593Smuzhiyun 
503*4882a593Smuzhiyun 	return p;
504*4882a593Smuzhiyun }
505*4882a593Smuzhiyun 
dbg_rtw_usb_buffer_free(struct usb_device * dev,size_t size,void * addr,dma_addr_t dma,const enum mstat_f flags,const char * func,int line)506*4882a593Smuzhiyun inline void dbg_rtw_usb_buffer_free(struct usb_device *dev, size_t size, void *addr, dma_addr_t dma, const enum mstat_f flags, const char *func, int line)
507*4882a593Smuzhiyun {
508*4882a593Smuzhiyun 
509*4882a593Smuzhiyun 	if (match_mstat_sniff_rules(flags, size))
510*4882a593Smuzhiyun 		RTW_INFO("DBG_MEM_ALLOC %s:%d %s(%zu)\n", func, line, __FUNCTION__, size);
511*4882a593Smuzhiyun 
512*4882a593Smuzhiyun 	_rtw_usb_buffer_free(dev, size, addr, dma);
513*4882a593Smuzhiyun 
514*4882a593Smuzhiyun 	rtw_mstat_update(
515*4882a593Smuzhiyun 		flags
516*4882a593Smuzhiyun 		, MSTAT_FREE
517*4882a593Smuzhiyun 		, size
518*4882a593Smuzhiyun 	);
519*4882a593Smuzhiyun }
520*4882a593Smuzhiyun #endif /* CONFIG_USB_HCI */
521*4882a593Smuzhiyun 
522*4882a593Smuzhiyun #endif /* defined(DBG_MEM_ALLOC) */
523*4882a593Smuzhiyun 
rtw_malloc2d(int h,int w,size_t size)524*4882a593Smuzhiyun void *rtw_malloc2d(int h, int w, size_t size)
525*4882a593Smuzhiyun {
526*4882a593Smuzhiyun 	int j;
527*4882a593Smuzhiyun 
528*4882a593Smuzhiyun 	void **a = (void **) rtw_zmalloc(h * sizeof(void *) + h * w * size);
529*4882a593Smuzhiyun 	if (a == NULL) {
530*4882a593Smuzhiyun 		RTW_INFO("%s: alloc memory fail!\n", __FUNCTION__);
531*4882a593Smuzhiyun 		return NULL;
532*4882a593Smuzhiyun 	}
533*4882a593Smuzhiyun 
534*4882a593Smuzhiyun 	for (j = 0; j < h; j++)
535*4882a593Smuzhiyun 		a[j] = ((char *)(a + h)) + j * w * size;
536*4882a593Smuzhiyun 
537*4882a593Smuzhiyun 	return a;
538*4882a593Smuzhiyun }
539*4882a593Smuzhiyun 
rtw_mfree2d(void * pbuf,int h,int w,int size)540*4882a593Smuzhiyun void rtw_mfree2d(void *pbuf, int h, int w, int size)
541*4882a593Smuzhiyun {
542*4882a593Smuzhiyun 	rtw_mfree((u8 *)pbuf, h * sizeof(void *) + w * h * size);
543*4882a593Smuzhiyun }
544*4882a593Smuzhiyun 
_rtw_memcmp2(const void * dst,const void * src,u32 sz)545*4882a593Smuzhiyun int _rtw_memcmp2(const void *dst, const void *src, u32 sz)
546*4882a593Smuzhiyun {
547*4882a593Smuzhiyun 	const unsigned char *p1 = dst, *p2 = src;
548*4882a593Smuzhiyun 
549*4882a593Smuzhiyun 	if (sz == 0)
550*4882a593Smuzhiyun 		return 0;
551*4882a593Smuzhiyun 
552*4882a593Smuzhiyun 	while (*p1 == *p2) {
553*4882a593Smuzhiyun 		p1++;
554*4882a593Smuzhiyun 		p2++;
555*4882a593Smuzhiyun 		sz--;
556*4882a593Smuzhiyun 		if (sz == 0)
557*4882a593Smuzhiyun 			return 0;
558*4882a593Smuzhiyun 	}
559*4882a593Smuzhiyun 
560*4882a593Smuzhiyun 	return *p1 - *p2;
561*4882a593Smuzhiyun }
562*4882a593Smuzhiyun 
_rtw_init_queue(_queue * pqueue)563*4882a593Smuzhiyun void _rtw_init_queue(_queue *pqueue)
564*4882a593Smuzhiyun {
565*4882a593Smuzhiyun 	_rtw_init_listhead(&(pqueue->queue));
566*4882a593Smuzhiyun 	_rtw_spinlock_init(&(pqueue->lock));
567*4882a593Smuzhiyun }
568*4882a593Smuzhiyun 
_rtw_deinit_queue(_queue * pqueue)569*4882a593Smuzhiyun void _rtw_deinit_queue(_queue *pqueue)
570*4882a593Smuzhiyun {
571*4882a593Smuzhiyun 	_rtw_spinlock_free(&(pqueue->lock));
572*4882a593Smuzhiyun }
573*4882a593Smuzhiyun 
_rtw_queue_empty(_queue * pqueue)574*4882a593Smuzhiyun u32 _rtw_queue_empty(_queue	*pqueue)
575*4882a593Smuzhiyun {
576*4882a593Smuzhiyun 	return rtw_is_list_empty(&(pqueue->queue));
577*4882a593Smuzhiyun }
578*4882a593Smuzhiyun 
579*4882a593Smuzhiyun 
rtw_end_of_queue_search(_list * head,_list * plist)580*4882a593Smuzhiyun u32 rtw_end_of_queue_search(_list *head, _list *plist)
581*4882a593Smuzhiyun {
582*4882a593Smuzhiyun 	if (head == plist)
583*4882a593Smuzhiyun 		return _TRUE;
584*4882a593Smuzhiyun 	else
585*4882a593Smuzhiyun 		return _FALSE;
586*4882a593Smuzhiyun }
587*4882a593Smuzhiyun 
588*4882a593Smuzhiyun /* the input parameter start use the same unit as returned by rtw_get_current_time */
_rtw_get_passing_time_ms(systime start)589*4882a593Smuzhiyun inline s32 _rtw_get_passing_time_ms(systime start)
590*4882a593Smuzhiyun {
591*4882a593Smuzhiyun 	return _rtw_systime_to_ms(_rtw_get_current_time() - start);
592*4882a593Smuzhiyun }
593*4882a593Smuzhiyun 
_rtw_get_remaining_time_ms(systime end)594*4882a593Smuzhiyun inline s32 _rtw_get_remaining_time_ms(systime end)
595*4882a593Smuzhiyun {
596*4882a593Smuzhiyun 	return _rtw_systime_to_ms(end - _rtw_get_current_time());
597*4882a593Smuzhiyun }
598*4882a593Smuzhiyun 
_rtw_get_time_interval_ms(systime start,systime end)599*4882a593Smuzhiyun inline s32 _rtw_get_time_interval_ms(systime start, systime end)
600*4882a593Smuzhiyun {
601*4882a593Smuzhiyun 	return _rtw_systime_to_ms(end - start);
602*4882a593Smuzhiyun }
603*4882a593Smuzhiyun 
rtw_macaddr_is_larger(const u8 * a,const u8 * b)604*4882a593Smuzhiyun bool rtw_macaddr_is_larger(const u8 *a, const u8 *b)
605*4882a593Smuzhiyun {
606*4882a593Smuzhiyun 	u32 va, vb;
607*4882a593Smuzhiyun 
608*4882a593Smuzhiyun 	va = be32_to_cpu(*((u32 *)a));
609*4882a593Smuzhiyun 	vb = be32_to_cpu(*((u32 *)b));
610*4882a593Smuzhiyun 	if (va > vb)
611*4882a593Smuzhiyun 		return 1;
612*4882a593Smuzhiyun 	else if (va < vb)
613*4882a593Smuzhiyun 		return 0;
614*4882a593Smuzhiyun 
615*4882a593Smuzhiyun 	return be16_to_cpu(*((u16 *)(a + 4))) > be16_to_cpu(*((u16 *)(b + 4)));
616*4882a593Smuzhiyun }
617*4882a593Smuzhiyun 
618*4882a593Smuzhiyun 
619*4882a593Smuzhiyun /*
620*4882a593Smuzhiyun * Test if the specifi @param path is a readable file with valid size.
621*4882a593Smuzhiyun * If readable, @param sz is got
622*4882a593Smuzhiyun * @param path the path of the file to test
623*4882a593Smuzhiyun * @return _TRUE or _FALSE
624*4882a593Smuzhiyun */
rtw_readable_file_sz_chk(const char * path,u32 sz)625*4882a593Smuzhiyun int rtw_readable_file_sz_chk(const char *path, u32 sz)
626*4882a593Smuzhiyun {
627*4882a593Smuzhiyun 	u32 fsz;
628*4882a593Smuzhiyun 
629*4882a593Smuzhiyun 	if (rtw_is_file_readable_with_size(path, &fsz) == _FALSE)
630*4882a593Smuzhiyun 		return _FALSE;
631*4882a593Smuzhiyun 
632*4882a593Smuzhiyun 	if (fsz > sz)
633*4882a593Smuzhiyun 		return _FALSE;
634*4882a593Smuzhiyun 
635*4882a593Smuzhiyun 	return _TRUE;
636*4882a593Smuzhiyun }
637*4882a593Smuzhiyun 
rtw_buf_free(u8 ** buf,u32 * buf_len)638*4882a593Smuzhiyun void rtw_buf_free(u8 **buf, u32 *buf_len)
639*4882a593Smuzhiyun {
640*4882a593Smuzhiyun 	u32 ori_len;
641*4882a593Smuzhiyun 
642*4882a593Smuzhiyun 	if (!buf || !buf_len)
643*4882a593Smuzhiyun 		return;
644*4882a593Smuzhiyun 
645*4882a593Smuzhiyun 	ori_len = *buf_len;
646*4882a593Smuzhiyun 
647*4882a593Smuzhiyun 	if (*buf) {
648*4882a593Smuzhiyun 		u32 tmp_buf_len = *buf_len;
649*4882a593Smuzhiyun 		*buf_len = 0;
650*4882a593Smuzhiyun 		rtw_mfree(*buf, tmp_buf_len);
651*4882a593Smuzhiyun 		*buf = NULL;
652*4882a593Smuzhiyun 	}
653*4882a593Smuzhiyun }
654*4882a593Smuzhiyun 
rtw_buf_update(u8 ** buf,u32 * buf_len,const u8 * src,u32 src_len)655*4882a593Smuzhiyun void rtw_buf_update(u8 **buf, u32 *buf_len, const u8 *src, u32 src_len)
656*4882a593Smuzhiyun {
657*4882a593Smuzhiyun 	u32 ori_len = 0, dup_len = 0;
658*4882a593Smuzhiyun 	u8 *ori = NULL;
659*4882a593Smuzhiyun 	u8 *dup = NULL;
660*4882a593Smuzhiyun 
661*4882a593Smuzhiyun 	if (!buf || !buf_len)
662*4882a593Smuzhiyun 		return;
663*4882a593Smuzhiyun 
664*4882a593Smuzhiyun 	if (!src || !src_len)
665*4882a593Smuzhiyun 		goto keep_ori;
666*4882a593Smuzhiyun 
667*4882a593Smuzhiyun 	/* duplicate src */
668*4882a593Smuzhiyun 	dup = rtw_malloc(src_len);
669*4882a593Smuzhiyun 	if (dup) {
670*4882a593Smuzhiyun 		dup_len = src_len;
671*4882a593Smuzhiyun 		_rtw_memcpy(dup, src, dup_len);
672*4882a593Smuzhiyun 	}
673*4882a593Smuzhiyun 
674*4882a593Smuzhiyun keep_ori:
675*4882a593Smuzhiyun 	ori = *buf;
676*4882a593Smuzhiyun 	ori_len = *buf_len;
677*4882a593Smuzhiyun 
678*4882a593Smuzhiyun 	/* replace buf with dup */
679*4882a593Smuzhiyun 	*buf_len = 0;
680*4882a593Smuzhiyun 	*buf = dup;
681*4882a593Smuzhiyun 	*buf_len = dup_len;
682*4882a593Smuzhiyun 
683*4882a593Smuzhiyun 	/* free ori */
684*4882a593Smuzhiyun 	if (ori && ori_len > 0)
685*4882a593Smuzhiyun 		rtw_mfree(ori, ori_len);
686*4882a593Smuzhiyun }
687*4882a593Smuzhiyun 
688*4882a593Smuzhiyun 
689*4882a593Smuzhiyun /**
690*4882a593Smuzhiyun  * rtw_cbuf_full - test if cbuf is full
691*4882a593Smuzhiyun  * @cbuf: pointer of struct rtw_cbuf
692*4882a593Smuzhiyun  *
693*4882a593Smuzhiyun  * Returns: _TRUE if cbuf is full
694*4882a593Smuzhiyun  */
rtw_cbuf_full(struct rtw_cbuf * cbuf)695*4882a593Smuzhiyun inline bool rtw_cbuf_full(struct rtw_cbuf *cbuf)
696*4882a593Smuzhiyun {
697*4882a593Smuzhiyun 	return (cbuf->write == cbuf->read - 1) ? _TRUE : _FALSE;
698*4882a593Smuzhiyun }
699*4882a593Smuzhiyun 
700*4882a593Smuzhiyun /**
701*4882a593Smuzhiyun  * rtw_cbuf_empty - test if cbuf is empty
702*4882a593Smuzhiyun  * @cbuf: pointer of struct rtw_cbuf
703*4882a593Smuzhiyun  *
704*4882a593Smuzhiyun  * Returns: _TRUE if cbuf is empty
705*4882a593Smuzhiyun  */
rtw_cbuf_empty(struct rtw_cbuf * cbuf)706*4882a593Smuzhiyun inline bool rtw_cbuf_empty(struct rtw_cbuf *cbuf)
707*4882a593Smuzhiyun {
708*4882a593Smuzhiyun 	return (cbuf->write == cbuf->read) ? _TRUE : _FALSE;
709*4882a593Smuzhiyun }
710*4882a593Smuzhiyun 
711*4882a593Smuzhiyun /**
712*4882a593Smuzhiyun  * rtw_cbuf_push - push a pointer into cbuf
713*4882a593Smuzhiyun  * @cbuf: pointer of struct rtw_cbuf
714*4882a593Smuzhiyun  * @buf: pointer to push in
715*4882a593Smuzhiyun  *
716*4882a593Smuzhiyun  * Lock free operation, be careful of the use scheme
717*4882a593Smuzhiyun  * Returns: _TRUE push success
718*4882a593Smuzhiyun  */
rtw_cbuf_push(struct rtw_cbuf * cbuf,void * buf)719*4882a593Smuzhiyun bool rtw_cbuf_push(struct rtw_cbuf *cbuf, void *buf)
720*4882a593Smuzhiyun {
721*4882a593Smuzhiyun 	if (rtw_cbuf_full(cbuf))
722*4882a593Smuzhiyun 		return _FAIL;
723*4882a593Smuzhiyun 
724*4882a593Smuzhiyun 	if (0)
725*4882a593Smuzhiyun 		RTW_INFO("%s on %u\n", __func__, cbuf->write);
726*4882a593Smuzhiyun 	cbuf->bufs[cbuf->write] = buf;
727*4882a593Smuzhiyun 	cbuf->write = (cbuf->write + 1) % cbuf->size;
728*4882a593Smuzhiyun 
729*4882a593Smuzhiyun 	return _SUCCESS;
730*4882a593Smuzhiyun }
731*4882a593Smuzhiyun 
732*4882a593Smuzhiyun /**
733*4882a593Smuzhiyun  * rtw_cbuf_pop - pop a pointer from cbuf
734*4882a593Smuzhiyun  * @cbuf: pointer of struct rtw_cbuf
735*4882a593Smuzhiyun  *
736*4882a593Smuzhiyun  * Lock free operation, be careful of the use scheme
737*4882a593Smuzhiyun  * Returns: pointer popped out
738*4882a593Smuzhiyun  */
rtw_cbuf_pop(struct rtw_cbuf * cbuf)739*4882a593Smuzhiyun void *rtw_cbuf_pop(struct rtw_cbuf *cbuf)
740*4882a593Smuzhiyun {
741*4882a593Smuzhiyun 	void *buf;
742*4882a593Smuzhiyun 	if (rtw_cbuf_empty(cbuf))
743*4882a593Smuzhiyun 		return NULL;
744*4882a593Smuzhiyun 
745*4882a593Smuzhiyun 	if (0)
746*4882a593Smuzhiyun 		RTW_INFO("%s on %u\n", __func__, cbuf->read);
747*4882a593Smuzhiyun 	buf = cbuf->bufs[cbuf->read];
748*4882a593Smuzhiyun 	cbuf->read = (cbuf->read + 1) % cbuf->size;
749*4882a593Smuzhiyun 
750*4882a593Smuzhiyun 	return buf;
751*4882a593Smuzhiyun }
752*4882a593Smuzhiyun 
753*4882a593Smuzhiyun /**
754*4882a593Smuzhiyun  * rtw_cbuf_alloc - allocte a rtw_cbuf with given size and do initialization
755*4882a593Smuzhiyun  * @size: size of pointer
756*4882a593Smuzhiyun  *
757*4882a593Smuzhiyun  * Returns: pointer of srtuct rtw_cbuf, NULL for allocation failure
758*4882a593Smuzhiyun  */
rtw_cbuf_alloc(u32 size)759*4882a593Smuzhiyun struct rtw_cbuf *rtw_cbuf_alloc(u32 size)
760*4882a593Smuzhiyun {
761*4882a593Smuzhiyun 	struct rtw_cbuf *cbuf;
762*4882a593Smuzhiyun 
763*4882a593Smuzhiyun 	cbuf = (struct rtw_cbuf *)rtw_malloc(sizeof(*cbuf) + sizeof(void *) * size);
764*4882a593Smuzhiyun 
765*4882a593Smuzhiyun 	if (cbuf) {
766*4882a593Smuzhiyun 		cbuf->write = cbuf->read = 0;
767*4882a593Smuzhiyun 		cbuf->size = size;
768*4882a593Smuzhiyun 	}
769*4882a593Smuzhiyun 
770*4882a593Smuzhiyun 	return cbuf;
771*4882a593Smuzhiyun }
772*4882a593Smuzhiyun 
773*4882a593Smuzhiyun /**
774*4882a593Smuzhiyun  * rtw_cbuf_free - free the given rtw_cbuf
775*4882a593Smuzhiyun  * @cbuf: pointer of struct rtw_cbuf to free
776*4882a593Smuzhiyun  */
rtw_cbuf_free(struct rtw_cbuf * cbuf)777*4882a593Smuzhiyun void rtw_cbuf_free(struct rtw_cbuf *cbuf)
778*4882a593Smuzhiyun {
779*4882a593Smuzhiyun 	rtw_mfree((u8 *)cbuf, sizeof(*cbuf) + sizeof(void *) * cbuf->size);
780*4882a593Smuzhiyun }
781*4882a593Smuzhiyun 
782*4882a593Smuzhiyun /**
783*4882a593Smuzhiyun  * map_readN - read a range of map data
784*4882a593Smuzhiyun  * @map: map to read
785*4882a593Smuzhiyun  * @offset: start address to read
786*4882a593Smuzhiyun  * @len: length to read
787*4882a593Smuzhiyun  * @buf: pointer of buffer to store data read
788*4882a593Smuzhiyun  *
789*4882a593Smuzhiyun  * Returns: _SUCCESS or _FAIL
790*4882a593Smuzhiyun  */
map_readN(const struct map_t * map,u16 offset,u16 len,u8 * buf)791*4882a593Smuzhiyun int map_readN(const struct map_t *map, u16 offset, u16 len, u8 *buf)
792*4882a593Smuzhiyun {
793*4882a593Smuzhiyun 	const struct map_seg_t *seg;
794*4882a593Smuzhiyun 	int ret = _FAIL;
795*4882a593Smuzhiyun 	int i;
796*4882a593Smuzhiyun 
797*4882a593Smuzhiyun 	if (len == 0) {
798*4882a593Smuzhiyun 		rtw_warn_on(1);
799*4882a593Smuzhiyun 		goto exit;
800*4882a593Smuzhiyun 	}
801*4882a593Smuzhiyun 
802*4882a593Smuzhiyun 	if (offset + len > map->len) {
803*4882a593Smuzhiyun 		rtw_warn_on(1);
804*4882a593Smuzhiyun 		goto exit;
805*4882a593Smuzhiyun 	}
806*4882a593Smuzhiyun 
807*4882a593Smuzhiyun 	_rtw_memset(buf, map->init_value, len);
808*4882a593Smuzhiyun 
809*4882a593Smuzhiyun 	for (i = 0; i < map->seg_num; i++) {
810*4882a593Smuzhiyun 		u8 *c_dst, *c_src;
811*4882a593Smuzhiyun 		u16 c_len;
812*4882a593Smuzhiyun 
813*4882a593Smuzhiyun 		seg = map->segs + i;
814*4882a593Smuzhiyun 		if (seg->sa + seg->len <= offset || seg->sa >= offset + len)
815*4882a593Smuzhiyun 			continue;
816*4882a593Smuzhiyun 
817*4882a593Smuzhiyun 		if (seg->sa >= offset) {
818*4882a593Smuzhiyun 			c_dst = buf + (seg->sa - offset);
819*4882a593Smuzhiyun 			c_src = seg->c;
820*4882a593Smuzhiyun 			if (seg->sa + seg->len <= offset + len)
821*4882a593Smuzhiyun 				c_len = seg->len;
822*4882a593Smuzhiyun 			else
823*4882a593Smuzhiyun 				c_len = offset + len - seg->sa;
824*4882a593Smuzhiyun 		} else {
825*4882a593Smuzhiyun 			c_dst = buf;
826*4882a593Smuzhiyun 			c_src = seg->c + (offset - seg->sa);
827*4882a593Smuzhiyun 			if (seg->sa + seg->len >= offset + len)
828*4882a593Smuzhiyun 				c_len = len;
829*4882a593Smuzhiyun 			else
830*4882a593Smuzhiyun 				c_len = seg->sa + seg->len - offset;
831*4882a593Smuzhiyun 		}
832*4882a593Smuzhiyun 
833*4882a593Smuzhiyun 		_rtw_memcpy(c_dst, c_src, c_len);
834*4882a593Smuzhiyun 	}
835*4882a593Smuzhiyun 
836*4882a593Smuzhiyun exit:
837*4882a593Smuzhiyun 	return ret;
838*4882a593Smuzhiyun }
839*4882a593Smuzhiyun 
840*4882a593Smuzhiyun /**
841*4882a593Smuzhiyun  * map_read8 - read 1 byte of map data
842*4882a593Smuzhiyun  * @map: map to read
843*4882a593Smuzhiyun  * @offset: address to read
844*4882a593Smuzhiyun  *
845*4882a593Smuzhiyun  * Returns: value of data of specified offset. map.init_value if offset is out of range
846*4882a593Smuzhiyun  */
map_read8(const struct map_t * map,u16 offset)847*4882a593Smuzhiyun u8 map_read8(const struct map_t *map, u16 offset)
848*4882a593Smuzhiyun {
849*4882a593Smuzhiyun 	const struct map_seg_t *seg;
850*4882a593Smuzhiyun 	u8 val = map->init_value;
851*4882a593Smuzhiyun 	int i;
852*4882a593Smuzhiyun 
853*4882a593Smuzhiyun 	if (offset + 1 > map->len) {
854*4882a593Smuzhiyun 		rtw_warn_on(1);
855*4882a593Smuzhiyun 		goto exit;
856*4882a593Smuzhiyun 	}
857*4882a593Smuzhiyun 
858*4882a593Smuzhiyun 	for (i = 0; i < map->seg_num; i++) {
859*4882a593Smuzhiyun 		seg = map->segs + i;
860*4882a593Smuzhiyun 		if (seg->sa + seg->len <= offset || seg->sa >= offset + 1)
861*4882a593Smuzhiyun 			continue;
862*4882a593Smuzhiyun 
863*4882a593Smuzhiyun 		val = *(seg->c + offset - seg->sa);
864*4882a593Smuzhiyun 		break;
865*4882a593Smuzhiyun 	}
866*4882a593Smuzhiyun 
867*4882a593Smuzhiyun exit:
868*4882a593Smuzhiyun 	return val;
869*4882a593Smuzhiyun }
870*4882a593Smuzhiyun 
rtw_blacklist_add(_queue * blist,const u8 * addr,u32 timeout_ms)871*4882a593Smuzhiyun int rtw_blacklist_add(_queue *blist, const u8 *addr, u32 timeout_ms)
872*4882a593Smuzhiyun {
873*4882a593Smuzhiyun 	struct blacklist_ent *ent;
874*4882a593Smuzhiyun 	_list *list, *head;
875*4882a593Smuzhiyun 	u8 exist = _FALSE, timeout = _FALSE;
876*4882a593Smuzhiyun 
877*4882a593Smuzhiyun 	_rtw_spinlock_bh(&blist->lock);
878*4882a593Smuzhiyun 
879*4882a593Smuzhiyun 	head = &blist->queue;
880*4882a593Smuzhiyun 	list = get_next(head);
881*4882a593Smuzhiyun 	while (rtw_end_of_queue_search(head, list) == _FALSE) {
882*4882a593Smuzhiyun 		ent = LIST_CONTAINOR(list, struct blacklist_ent, list);
883*4882a593Smuzhiyun 		list = get_next(list);
884*4882a593Smuzhiyun 
885*4882a593Smuzhiyun 		if (_rtw_memcmp(ent->addr, addr, ETH_ALEN) == _TRUE) {
886*4882a593Smuzhiyun 			exist = _TRUE;
887*4882a593Smuzhiyun 			if (rtw_time_after(rtw_get_current_time(), ent->exp_time))
888*4882a593Smuzhiyun 				timeout = _TRUE;
889*4882a593Smuzhiyun 			ent->exp_time = rtw_get_current_time()
890*4882a593Smuzhiyun 				+ rtw_ms_to_systime(timeout_ms);
891*4882a593Smuzhiyun 			break;
892*4882a593Smuzhiyun 		}
893*4882a593Smuzhiyun 
894*4882a593Smuzhiyun 		if (rtw_time_after(rtw_get_current_time(), ent->exp_time)) {
895*4882a593Smuzhiyun 			rtw_list_delete(&ent->list);
896*4882a593Smuzhiyun 			rtw_mfree(ent, sizeof(struct blacklist_ent));
897*4882a593Smuzhiyun 		}
898*4882a593Smuzhiyun 	}
899*4882a593Smuzhiyun 
900*4882a593Smuzhiyun 	if (exist == _FALSE) {
901*4882a593Smuzhiyun 		ent = rtw_malloc(sizeof(struct blacklist_ent));
902*4882a593Smuzhiyun 		if (ent) {
903*4882a593Smuzhiyun 			_rtw_memcpy(ent->addr, addr, ETH_ALEN);
904*4882a593Smuzhiyun 			ent->exp_time = rtw_get_current_time()
905*4882a593Smuzhiyun 				+ rtw_ms_to_systime(timeout_ms);
906*4882a593Smuzhiyun 			rtw_list_insert_tail(&ent->list, head);
907*4882a593Smuzhiyun 		}
908*4882a593Smuzhiyun 	}
909*4882a593Smuzhiyun 
910*4882a593Smuzhiyun 	_rtw_spinunlock_bh(&blist->lock);
911*4882a593Smuzhiyun 
912*4882a593Smuzhiyun 	return (exist == _TRUE && timeout == _FALSE) ? RTW_ALREADY : (ent ? _SUCCESS : _FAIL);
913*4882a593Smuzhiyun }
914*4882a593Smuzhiyun 
rtw_blacklist_del(_queue * blist,const u8 * addr)915*4882a593Smuzhiyun int rtw_blacklist_del(_queue *blist, const u8 *addr)
916*4882a593Smuzhiyun {
917*4882a593Smuzhiyun 	struct blacklist_ent *ent = NULL;
918*4882a593Smuzhiyun 	_list *list, *head;
919*4882a593Smuzhiyun 	u8 exist = _FALSE;
920*4882a593Smuzhiyun 
921*4882a593Smuzhiyun 	_rtw_spinlock_bh(&blist->lock);
922*4882a593Smuzhiyun 	head = &blist->queue;
923*4882a593Smuzhiyun 	list = get_next(head);
924*4882a593Smuzhiyun 	while (rtw_end_of_queue_search(head, list) == _FALSE) {
925*4882a593Smuzhiyun 		ent = LIST_CONTAINOR(list, struct blacklist_ent, list);
926*4882a593Smuzhiyun 		list = get_next(list);
927*4882a593Smuzhiyun 
928*4882a593Smuzhiyun 		if (_rtw_memcmp(ent->addr, addr, ETH_ALEN) == _TRUE) {
929*4882a593Smuzhiyun 			rtw_list_delete(&ent->list);
930*4882a593Smuzhiyun 			rtw_mfree(ent, sizeof(struct blacklist_ent));
931*4882a593Smuzhiyun 			exist = _TRUE;
932*4882a593Smuzhiyun 			break;
933*4882a593Smuzhiyun 		}
934*4882a593Smuzhiyun 
935*4882a593Smuzhiyun 		if (rtw_time_after(rtw_get_current_time(), ent->exp_time)) {
936*4882a593Smuzhiyun 			rtw_list_delete(&ent->list);
937*4882a593Smuzhiyun 			rtw_mfree(ent, sizeof(struct blacklist_ent));
938*4882a593Smuzhiyun 		}
939*4882a593Smuzhiyun 	}
940*4882a593Smuzhiyun 
941*4882a593Smuzhiyun 	_rtw_spinunlock_bh(&blist->lock);
942*4882a593Smuzhiyun 
943*4882a593Smuzhiyun 	return exist == _TRUE ? _SUCCESS : RTW_ALREADY;
944*4882a593Smuzhiyun }
945*4882a593Smuzhiyun 
rtw_blacklist_search(_queue * blist,const u8 * addr)946*4882a593Smuzhiyun int rtw_blacklist_search(_queue *blist, const u8 *addr)
947*4882a593Smuzhiyun {
948*4882a593Smuzhiyun 	struct blacklist_ent *ent = NULL;
949*4882a593Smuzhiyun 	_list *list, *head;
950*4882a593Smuzhiyun 	u8 exist = _FALSE;
951*4882a593Smuzhiyun 
952*4882a593Smuzhiyun 	_rtw_spinlock_bh(&blist->lock);
953*4882a593Smuzhiyun 	head = &blist->queue;
954*4882a593Smuzhiyun 	list = get_next(head);
955*4882a593Smuzhiyun 	while (rtw_end_of_queue_search(head, list) == _FALSE) {
956*4882a593Smuzhiyun 		ent = LIST_CONTAINOR(list, struct blacklist_ent, list);
957*4882a593Smuzhiyun 		list = get_next(list);
958*4882a593Smuzhiyun 
959*4882a593Smuzhiyun 		if (_rtw_memcmp(ent->addr, addr, ETH_ALEN) == _TRUE) {
960*4882a593Smuzhiyun 			if (rtw_time_after(rtw_get_current_time(), ent->exp_time)) {
961*4882a593Smuzhiyun 				rtw_list_delete(&ent->list);
962*4882a593Smuzhiyun 				rtw_mfree(ent, sizeof(struct blacklist_ent));
963*4882a593Smuzhiyun 			} else
964*4882a593Smuzhiyun 				exist = _TRUE;
965*4882a593Smuzhiyun 			break;
966*4882a593Smuzhiyun 		}
967*4882a593Smuzhiyun 
968*4882a593Smuzhiyun 		if (rtw_time_after(rtw_get_current_time(), ent->exp_time)) {
969*4882a593Smuzhiyun 			rtw_list_delete(&ent->list);
970*4882a593Smuzhiyun 			rtw_mfree(ent, sizeof(struct blacklist_ent));
971*4882a593Smuzhiyun 		}
972*4882a593Smuzhiyun 	}
973*4882a593Smuzhiyun 
974*4882a593Smuzhiyun 	_rtw_spinunlock_bh(&blist->lock);
975*4882a593Smuzhiyun 
976*4882a593Smuzhiyun 	return exist;
977*4882a593Smuzhiyun }
978*4882a593Smuzhiyun 
rtw_blacklist_flush(_queue * blist)979*4882a593Smuzhiyun void rtw_blacklist_flush(_queue *blist)
980*4882a593Smuzhiyun {
981*4882a593Smuzhiyun 	struct blacklist_ent *ent;
982*4882a593Smuzhiyun 	_list *list, *head;
983*4882a593Smuzhiyun 	_list tmp;
984*4882a593Smuzhiyun 
985*4882a593Smuzhiyun 	_rtw_init_listhead(&tmp);
986*4882a593Smuzhiyun 
987*4882a593Smuzhiyun 	_rtw_spinlock_bh(&blist->lock);
988*4882a593Smuzhiyun 	rtw_list_splice_init(&blist->queue, &tmp);
989*4882a593Smuzhiyun 	_rtw_spinunlock_bh(&blist->lock);
990*4882a593Smuzhiyun 
991*4882a593Smuzhiyun 	head = &tmp;
992*4882a593Smuzhiyun 	list = get_next(head);
993*4882a593Smuzhiyun 	while (rtw_end_of_queue_search(head, list) == _FALSE) {
994*4882a593Smuzhiyun 		ent = LIST_CONTAINOR(list, struct blacklist_ent, list);
995*4882a593Smuzhiyun 		list = get_next(list);
996*4882a593Smuzhiyun 		rtw_list_delete(&ent->list);
997*4882a593Smuzhiyun 		rtw_mfree(ent, sizeof(struct blacklist_ent));
998*4882a593Smuzhiyun 	}
999*4882a593Smuzhiyun }
1000*4882a593Smuzhiyun 
dump_blacklist(void * sel,_queue * blist,const char * title)1001*4882a593Smuzhiyun void dump_blacklist(void *sel, _queue *blist, const char *title)
1002*4882a593Smuzhiyun {
1003*4882a593Smuzhiyun 	struct blacklist_ent *ent = NULL;
1004*4882a593Smuzhiyun 	_list *list, *head;
1005*4882a593Smuzhiyun 
1006*4882a593Smuzhiyun 	_rtw_spinlock_bh(&blist->lock);
1007*4882a593Smuzhiyun 	head = &blist->queue;
1008*4882a593Smuzhiyun 	list = get_next(head);
1009*4882a593Smuzhiyun 
1010*4882a593Smuzhiyun 	if (rtw_end_of_queue_search(head, list) == _FALSE) {
1011*4882a593Smuzhiyun 		if (title)
1012*4882a593Smuzhiyun 			RTW_PRINT_SEL(sel, "%s:\n", title);
1013*4882a593Smuzhiyun 
1014*4882a593Smuzhiyun 		while (rtw_end_of_queue_search(head, list) == _FALSE) {
1015*4882a593Smuzhiyun 			ent = LIST_CONTAINOR(list, struct blacklist_ent, list);
1016*4882a593Smuzhiyun 			list = get_next(list);
1017*4882a593Smuzhiyun 
1018*4882a593Smuzhiyun 			if (rtw_time_after(rtw_get_current_time(), ent->exp_time))
1019*4882a593Smuzhiyun 				RTW_PRINT_SEL(sel, MAC_FMT" expired\n", MAC_ARG(ent->addr));
1020*4882a593Smuzhiyun 			else
1021*4882a593Smuzhiyun 				RTW_PRINT_SEL(sel, MAC_FMT" %u\n", MAC_ARG(ent->addr)
1022*4882a593Smuzhiyun 					, rtw_get_remaining_time_ms(ent->exp_time));
1023*4882a593Smuzhiyun 		}
1024*4882a593Smuzhiyun 
1025*4882a593Smuzhiyun 	}
1026*4882a593Smuzhiyun 	_rtw_spinunlock_bh(&blist->lock);
1027*4882a593Smuzhiyun }
1028*4882a593Smuzhiyun 
1029*4882a593Smuzhiyun /**
1030*4882a593Smuzhiyun * is_null -
1031*4882a593Smuzhiyun *
1032*4882a593Smuzhiyun * Return	TRUE if c is null character
1033*4882a593Smuzhiyun *		FALSE otherwise.
1034*4882a593Smuzhiyun */
is_null(char c)1035*4882a593Smuzhiyun inline BOOLEAN is_null(char c)
1036*4882a593Smuzhiyun {
1037*4882a593Smuzhiyun 	if (c == '\0')
1038*4882a593Smuzhiyun 		return _TRUE;
1039*4882a593Smuzhiyun 	else
1040*4882a593Smuzhiyun 		return _FALSE;
1041*4882a593Smuzhiyun }
1042*4882a593Smuzhiyun 
is_all_null(char * c,int len)1043*4882a593Smuzhiyun inline BOOLEAN is_all_null(char *c, int len)
1044*4882a593Smuzhiyun {
1045*4882a593Smuzhiyun 	for (; len > 0; len--)
1046*4882a593Smuzhiyun 		if (c[len - 1] != '\0')
1047*4882a593Smuzhiyun 			return _FALSE;
1048*4882a593Smuzhiyun 
1049*4882a593Smuzhiyun 	return _TRUE;
1050*4882a593Smuzhiyun }
1051*4882a593Smuzhiyun 
1052*4882a593Smuzhiyun /**
1053*4882a593Smuzhiyun * is_eol -
1054*4882a593Smuzhiyun *
1055*4882a593Smuzhiyun * Return	TRUE if c is represent for EOL (end of line)
1056*4882a593Smuzhiyun *		FALSE otherwise.
1057*4882a593Smuzhiyun */
is_eol(char c)1058*4882a593Smuzhiyun inline BOOLEAN is_eol(char c)
1059*4882a593Smuzhiyun {
1060*4882a593Smuzhiyun 	if (c == '\r' || c == '\n')
1061*4882a593Smuzhiyun 		return _TRUE;
1062*4882a593Smuzhiyun 	else
1063*4882a593Smuzhiyun 		return _FALSE;
1064*4882a593Smuzhiyun }
1065*4882a593Smuzhiyun 
1066*4882a593Smuzhiyun /**
1067*4882a593Smuzhiyun * is_space -
1068*4882a593Smuzhiyun *
1069*4882a593Smuzhiyun * Return	TRUE if c is represent for space
1070*4882a593Smuzhiyun *		FALSE otherwise.
1071*4882a593Smuzhiyun */
is_space(char c)1072*4882a593Smuzhiyun inline BOOLEAN is_space(char c)
1073*4882a593Smuzhiyun {
1074*4882a593Smuzhiyun 	if (c == ' ' || c == '\t')
1075*4882a593Smuzhiyun 		return _TRUE;
1076*4882a593Smuzhiyun 	else
1077*4882a593Smuzhiyun 		return _FALSE;
1078*4882a593Smuzhiyun }
1079*4882a593Smuzhiyun 
1080*4882a593Smuzhiyun /**
1081*4882a593Smuzhiyun * is_decimal -
1082*4882a593Smuzhiyun *
1083*4882a593Smuzhiyun * Return	TRUE if chTmp is represent for decimal digit
1084*4882a593Smuzhiyun *		FALSE otherwise.
1085*4882a593Smuzhiyun */
is_decimal(char chTmp)1086*4882a593Smuzhiyun inline BOOLEAN is_decimal(char chTmp)
1087*4882a593Smuzhiyun {
1088*4882a593Smuzhiyun 	if ((chTmp >= '0' && chTmp <= '9'))
1089*4882a593Smuzhiyun 		return _TRUE;
1090*4882a593Smuzhiyun 	else
1091*4882a593Smuzhiyun 		return _FALSE;
1092*4882a593Smuzhiyun }
1093*4882a593Smuzhiyun 
1094*4882a593Smuzhiyun /**
1095*4882a593Smuzhiyun * IsHexDigit -
1096*4882a593Smuzhiyun *
1097*4882a593Smuzhiyun * Return	TRUE if chTmp is represent for hex digit
1098*4882a593Smuzhiyun *		FALSE otherwise.
1099*4882a593Smuzhiyun */
IsHexDigit(char chTmp)1100*4882a593Smuzhiyun inline BOOLEAN IsHexDigit(char chTmp)
1101*4882a593Smuzhiyun {
1102*4882a593Smuzhiyun 	if ((chTmp >= '0' && chTmp <= '9') ||
1103*4882a593Smuzhiyun 		(chTmp >= 'a' && chTmp <= 'f') ||
1104*4882a593Smuzhiyun 		(chTmp >= 'A' && chTmp <= 'F'))
1105*4882a593Smuzhiyun 		return _TRUE;
1106*4882a593Smuzhiyun 	else
1107*4882a593Smuzhiyun 		return _FALSE;
1108*4882a593Smuzhiyun }
1109*4882a593Smuzhiyun 
1110*4882a593Smuzhiyun /**
1111*4882a593Smuzhiyun * is_alpha -
1112*4882a593Smuzhiyun *
1113*4882a593Smuzhiyun * Return	TRUE if chTmp is represent for alphabet
1114*4882a593Smuzhiyun *		FALSE otherwise.
1115*4882a593Smuzhiyun */
is_alpha(char chTmp)1116*4882a593Smuzhiyun inline BOOLEAN is_alpha(char chTmp)
1117*4882a593Smuzhiyun {
1118*4882a593Smuzhiyun 	if ((chTmp >= 'a' && chTmp <= 'z') ||
1119*4882a593Smuzhiyun 		(chTmp >= 'A' && chTmp <= 'Z'))
1120*4882a593Smuzhiyun 		return _TRUE;
1121*4882a593Smuzhiyun 	else
1122*4882a593Smuzhiyun 		return _FALSE;
1123*4882a593Smuzhiyun }
1124*4882a593Smuzhiyun 
alpha_to_upper(char c)1125*4882a593Smuzhiyun inline char alpha_to_upper(char c)
1126*4882a593Smuzhiyun {
1127*4882a593Smuzhiyun 	if ((c >= 'a' && c <= 'z'))
1128*4882a593Smuzhiyun 		c = 'A' + (c - 'a');
1129*4882a593Smuzhiyun 	return c;
1130*4882a593Smuzhiyun }
1131*4882a593Smuzhiyun 
hex2num_i(char c)1132*4882a593Smuzhiyun int hex2num_i(char c)
1133*4882a593Smuzhiyun {
1134*4882a593Smuzhiyun 	if (c >= '0' && c <= '9')
1135*4882a593Smuzhiyun 		return c - '0';
1136*4882a593Smuzhiyun 	if (c >= 'a' && c <= 'f')
1137*4882a593Smuzhiyun 		return c - 'a' + 10;
1138*4882a593Smuzhiyun 	if (c >= 'A' && c <= 'F')
1139*4882a593Smuzhiyun 		return c - 'A' + 10;
1140*4882a593Smuzhiyun 	return -1;
1141*4882a593Smuzhiyun }
1142*4882a593Smuzhiyun 
hex2byte_i(const char * hex)1143*4882a593Smuzhiyun int hex2byte_i(const char *hex)
1144*4882a593Smuzhiyun {
1145*4882a593Smuzhiyun 	int a, b;
1146*4882a593Smuzhiyun 	a = hex2num_i(*hex++);
1147*4882a593Smuzhiyun 	if (a < 0)
1148*4882a593Smuzhiyun 		return -1;
1149*4882a593Smuzhiyun 	b = hex2num_i(*hex++);
1150*4882a593Smuzhiyun 	if (b < 0)
1151*4882a593Smuzhiyun 		return -1;
1152*4882a593Smuzhiyun 	return (a << 4) | b;
1153*4882a593Smuzhiyun }
1154*4882a593Smuzhiyun 
hexstr2bin(const char * hex,u8 * buf,size_t len)1155*4882a593Smuzhiyun int hexstr2bin(const char *hex, u8 *buf, size_t len)
1156*4882a593Smuzhiyun {
1157*4882a593Smuzhiyun 	size_t i;
1158*4882a593Smuzhiyun 	int a;
1159*4882a593Smuzhiyun 	const char *ipos = hex;
1160*4882a593Smuzhiyun 	u8 *opos = buf;
1161*4882a593Smuzhiyun 
1162*4882a593Smuzhiyun 	for (i = 0; i < len; i++) {
1163*4882a593Smuzhiyun 		a = hex2byte_i(ipos);
1164*4882a593Smuzhiyun 		if (a < 0)
1165*4882a593Smuzhiyun 			return -1;
1166*4882a593Smuzhiyun 		*opos++ = a;
1167*4882a593Smuzhiyun 		ipos += 2;
1168*4882a593Smuzhiyun 	}
1169*4882a593Smuzhiyun 	return 0;
1170*4882a593Smuzhiyun }
1171*4882a593Smuzhiyun 
1172