1554c0a3aSHans de Goede /******************************************************************************
2554c0a3aSHans de Goede  *
3554c0a3aSHans de Goede  * Copyright(c) 2007 - 2013 Realtek Corporation. All rights reserved.
4554c0a3aSHans de Goede  *
5554c0a3aSHans de Goede  * This program is free software; you can redistribute it and/or modify it
6554c0a3aSHans de Goede  * under the terms of version 2 of the GNU General Public License as
7554c0a3aSHans de Goede  * published by the Free Software Foundation.
8554c0a3aSHans de Goede  *
9554c0a3aSHans de Goede  * This program is distributed in the hope that it will be useful, but WITHOUT
10554c0a3aSHans de Goede  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11554c0a3aSHans de Goede  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12554c0a3aSHans de Goede  * more details.
13554c0a3aSHans de Goede  *
14554c0a3aSHans de Goede  ******************************************************************************/
15554c0a3aSHans de Goede #ifndef __OSDEP_SERVICE_H_
16554c0a3aSHans de Goede #define __OSDEP_SERVICE_H_
17554c0a3aSHans de Goede 
18554c0a3aSHans de Goede 
19554c0a3aSHans de Goede #define _FAIL		0
20554c0a3aSHans de Goede #define _SUCCESS	1
21554c0a3aSHans de Goede #define RTW_RX_HANDLED 2
22554c0a3aSHans de Goede 
23554c0a3aSHans de Goede #include <osdep_service_linux.h>
24554c0a3aSHans de Goede 
25554c0a3aSHans de Goede #ifndef BIT
26554c0a3aSHans de Goede 	#define BIT(x)	(1 << (x))
27554c0a3aSHans de Goede #endif
28554c0a3aSHans de Goede 
29554c0a3aSHans de Goede #define BIT0	0x00000001
30554c0a3aSHans de Goede #define BIT1	0x00000002
31554c0a3aSHans de Goede #define BIT2	0x00000004
32554c0a3aSHans de Goede #define BIT3	0x00000008
33554c0a3aSHans de Goede #define BIT4	0x00000010
34554c0a3aSHans de Goede #define BIT5	0x00000020
35554c0a3aSHans de Goede #define BIT6	0x00000040
36554c0a3aSHans de Goede #define BIT7	0x00000080
37554c0a3aSHans de Goede #define BIT8	0x00000100
38554c0a3aSHans de Goede #define BIT9	0x00000200
39554c0a3aSHans de Goede #define BIT10	0x00000400
40554c0a3aSHans de Goede #define BIT11	0x00000800
41554c0a3aSHans de Goede #define BIT12	0x00001000
42554c0a3aSHans de Goede #define BIT13	0x00002000
43554c0a3aSHans de Goede #define BIT14	0x00004000
44554c0a3aSHans de Goede #define BIT15	0x00008000
45554c0a3aSHans de Goede #define BIT16	0x00010000
46554c0a3aSHans de Goede #define BIT17	0x00020000
47554c0a3aSHans de Goede #define BIT18	0x00040000
48554c0a3aSHans de Goede #define BIT19	0x00080000
49554c0a3aSHans de Goede #define BIT20	0x00100000
50554c0a3aSHans de Goede #define BIT21	0x00200000
51554c0a3aSHans de Goede #define BIT22	0x00400000
52554c0a3aSHans de Goede #define BIT23	0x00800000
53554c0a3aSHans de Goede #define BIT24	0x01000000
54554c0a3aSHans de Goede #define BIT25	0x02000000
55554c0a3aSHans de Goede #define BIT26	0x04000000
56554c0a3aSHans de Goede #define BIT27	0x08000000
57554c0a3aSHans de Goede #define BIT28	0x10000000
58554c0a3aSHans de Goede #define BIT29	0x20000000
59554c0a3aSHans de Goede #define BIT30	0x40000000
60554c0a3aSHans de Goede #define BIT31	0x80000000
61554c0a3aSHans de Goede #define BIT32	0x0100000000
62554c0a3aSHans de Goede #define BIT33	0x0200000000
63554c0a3aSHans de Goede #define BIT34	0x0400000000
64554c0a3aSHans de Goede #define BIT35	0x0800000000
65554c0a3aSHans de Goede #define BIT36	0x1000000000
66554c0a3aSHans de Goede 
67554c0a3aSHans de Goede extern int RTW_STATUS_CODE(int error_code);
68554c0a3aSHans de Goede 
69554c0a3aSHans de Goede /* flags used for rtw_mstat_update() */
70554c0a3aSHans de Goede enum mstat_f {
71554c0a3aSHans de Goede 	/* type: 0x00ff */
72554c0a3aSHans de Goede 	MSTAT_TYPE_VIR = 0x00,
73554c0a3aSHans de Goede 	MSTAT_TYPE_PHY = 0x01,
74554c0a3aSHans de Goede 	MSTAT_TYPE_SKB = 0x02,
75554c0a3aSHans de Goede 	MSTAT_TYPE_USB = 0x03,
76554c0a3aSHans de Goede 	MSTAT_TYPE_MAX = 0x04,
77554c0a3aSHans de Goede 
78554c0a3aSHans de Goede 	/* func: 0xff00 */
79554c0a3aSHans de Goede 	MSTAT_FUNC_UNSPECIFIED = 0x00<<8,
80554c0a3aSHans de Goede 	MSTAT_FUNC_IO = 0x01<<8,
81554c0a3aSHans de Goede 	MSTAT_FUNC_TX_IO = 0x02<<8,
82554c0a3aSHans de Goede 	MSTAT_FUNC_RX_IO = 0x03<<8,
83554c0a3aSHans de Goede 	MSTAT_FUNC_TX = 0x04<<8,
84554c0a3aSHans de Goede 	MSTAT_FUNC_RX = 0x05<<8,
85554c0a3aSHans de Goede 	MSTAT_FUNC_MAX = 0x06<<8,
86554c0a3aSHans de Goede };
87554c0a3aSHans de Goede 
88554c0a3aSHans de Goede #define mstat_tf_idx(flags) ((flags)&0xff)
89554c0a3aSHans de Goede #define mstat_ff_idx(flags) (((flags)&0xff00) >> 8)
90554c0a3aSHans de Goede 
91554c0a3aSHans de Goede typedef enum mstat_status{
92554c0a3aSHans de Goede 	MSTAT_ALLOC_SUCCESS = 0,
93554c0a3aSHans de Goede 	MSTAT_ALLOC_FAIL,
94554c0a3aSHans de Goede 	MSTAT_FREE
95554c0a3aSHans de Goede } MSTAT_STATUS;
96554c0a3aSHans de Goede 
97554c0a3aSHans de Goede #define rtw_mstat_update(flag, status, sz) do {} while (0)
98554c0a3aSHans de Goede #define rtw_mstat_dump(sel) do {} while (0)
9935628c4aSJoe Perches void *_rtw_zmalloc(u32 sz);
10035628c4aSJoe Perches void *_rtw_malloc(u32 sz);
101554c0a3aSHans de Goede void _kfree(u8 *pbuf, u32 sz);
102554c0a3aSHans de Goede 
103554c0a3aSHans de Goede struct sk_buff *_rtw_skb_alloc(u32 sz);
104554c0a3aSHans de Goede struct sk_buff *_rtw_skb_copy(const struct sk_buff *skb);
105554c0a3aSHans de Goede struct sk_buff *_rtw_skb_clone(struct sk_buff *skb);
106554c0a3aSHans de Goede int _rtw_netif_rx(_nic_hdl ndev, struct sk_buff *skb);
107554c0a3aSHans de Goede 
108554c0a3aSHans de Goede #define rtw_malloc(sz)			_rtw_malloc((sz))
109554c0a3aSHans de Goede #define rtw_zmalloc(sz)			_rtw_zmalloc((sz))
110554c0a3aSHans de Goede 
111554c0a3aSHans de Goede #define rtw_skb_alloc(size) _rtw_skb_alloc((size))
112554c0a3aSHans de Goede #define rtw_skb_alloc_f(size, mstat_f)	_rtw_skb_alloc((size))
113554c0a3aSHans de Goede #define rtw_skb_copy(skb)	_rtw_skb_copy((skb))
114554c0a3aSHans de Goede #define rtw_skb_clone(skb)	_rtw_skb_clone((skb))
115554c0a3aSHans de Goede #define rtw_skb_copy_f(skb, mstat_f)	_rtw_skb_copy((skb))
116554c0a3aSHans de Goede #define rtw_skb_clone_f(skb, mstat_f)	_rtw_skb_clone((skb))
117554c0a3aSHans de Goede #define rtw_netif_rx(ndev, skb) _rtw_netif_rx(ndev, skb)
118554c0a3aSHans de Goede 
119554c0a3aSHans de Goede extern void _rtw_init_queue(struct __queue	*pqueue);
120554c0a3aSHans de Goede 
121554c0a3aSHans de Goede extern void rtw_init_timer(_timer *ptimer, void *padapter, void *pfunc);
122554c0a3aSHans de Goede 
123554c0a3aSHans de Goede static __inline void thread_enter(char *name)
124554c0a3aSHans de Goede {
125554c0a3aSHans de Goede 	allow_signal(SIGTERM);
126554c0a3aSHans de Goede }
127554c0a3aSHans de Goede 
128554c0a3aSHans de Goede __inline static void flush_signals_thread(void)
129554c0a3aSHans de Goede {
130554c0a3aSHans de Goede 	if (signal_pending (current))
131554c0a3aSHans de Goede 	{
132554c0a3aSHans de Goede 		flush_signals(current);
133554c0a3aSHans de Goede 	}
134554c0a3aSHans de Goede }
135554c0a3aSHans de Goede 
136554c0a3aSHans de Goede #define rtw_warn_on(condition) WARN_ON(condition)
137554c0a3aSHans de Goede 
138554c0a3aSHans de Goede __inline static int rtw_bug_check(void *parg1, void *parg2, void *parg3, void *parg4)
139554c0a3aSHans de Goede {
140554c0a3aSHans de Goede 	int ret = true;
141554c0a3aSHans de Goede 
142554c0a3aSHans de Goede 	return ret;
143554c0a3aSHans de Goede 
144554c0a3aSHans de Goede }
145554c0a3aSHans de Goede 
146554c0a3aSHans de Goede #define _RND(sz, r) ((((sz)+((r)-1))/(r))*(r))
147554c0a3aSHans de Goede #define RND4(x)	(((x >> 2) + (((x & 3) == 0) ?  0: 1)) << 2)
148554c0a3aSHans de Goede 
149554c0a3aSHans de Goede __inline static u32 _RND4(u32 sz)
150554c0a3aSHans de Goede {
151554c0a3aSHans de Goede 
152554c0a3aSHans de Goede 	u32 val;
153554c0a3aSHans de Goede 
154554c0a3aSHans de Goede 	val = ((sz >> 2) + ((sz & 3) ? 1: 0)) << 2;
155554c0a3aSHans de Goede 
156554c0a3aSHans de Goede 	return val;
157554c0a3aSHans de Goede 
158554c0a3aSHans de Goede }
159554c0a3aSHans de Goede 
160554c0a3aSHans de Goede __inline static u32 _RND8(u32 sz)
161554c0a3aSHans de Goede {
162554c0a3aSHans de Goede 
163554c0a3aSHans de Goede 	u32 val;
164554c0a3aSHans de Goede 
165554c0a3aSHans de Goede 	val = ((sz >> 3) + ((sz & 7) ? 1: 0)) << 3;
166554c0a3aSHans de Goede 
167554c0a3aSHans de Goede 	return val;
168554c0a3aSHans de Goede 
169554c0a3aSHans de Goede }
170554c0a3aSHans de Goede 
171554c0a3aSHans de Goede #ifndef MAC_FMT
17212cc28baSJoe Perches #define MAC_FMT "%pM"
173554c0a3aSHans de Goede #endif
174554c0a3aSHans de Goede #ifndef MAC_ARG
17512cc28baSJoe Perches #define MAC_ARG(x) (x)
176554c0a3aSHans de Goede #endif
177554c0a3aSHans de Goede 
178554c0a3aSHans de Goede 
179554c0a3aSHans de Goede #ifdef CONFIG_AP_WOWLAN
180554c0a3aSHans de Goede extern void rtw_softap_lock_suspend(void);
181554c0a3aSHans de Goede extern void rtw_softap_unlock_suspend(void);
182554c0a3aSHans de Goede #endif
183554c0a3aSHans de Goede 
184554c0a3aSHans de Goede /* File operation APIs, just for linux now */
185554c0a3aSHans de Goede extern int rtw_is_file_readable(char *path);
186554c0a3aSHans de Goede extern int rtw_retrive_from_file(char *path, u8 *buf, u32 sz);
187554c0a3aSHans de Goede 
188554c0a3aSHans de Goede extern void rtw_free_netdev(struct net_device * netdev);
189554c0a3aSHans de Goede 
190554c0a3aSHans de Goede 
191554c0a3aSHans de Goede extern u64 rtw_modular64(u64 x, u64 y);
192554c0a3aSHans de Goede 
193554c0a3aSHans de Goede /* Macros for handling unaligned memory accesses */
194554c0a3aSHans de Goede 
195554c0a3aSHans de Goede #define RTW_GET_BE16(a) ((u16) (((a)[0] << 8) | (a)[1]))
196554c0a3aSHans de Goede #define RTW_PUT_BE16(a, val)			\
197554c0a3aSHans de Goede 	do {					\
198554c0a3aSHans de Goede 		(a)[0] = ((u16) (val)) >> 8;	\
199554c0a3aSHans de Goede 		(a)[1] = ((u16) (val)) & 0xff;	\
200554c0a3aSHans de Goede 	} while (0)
201554c0a3aSHans de Goede 
202554c0a3aSHans de Goede #define RTW_GET_LE16(a) ((u16) (((a)[1] << 8) | (a)[0]))
203554c0a3aSHans de Goede #define RTW_PUT_LE16(a, val)			\
204554c0a3aSHans de Goede 	do {					\
205554c0a3aSHans de Goede 		(a)[1] = ((u16) (val)) >> 8;	\
206554c0a3aSHans de Goede 		(a)[0] = ((u16) (val)) & 0xff;	\
207554c0a3aSHans de Goede 	} while (0)
208554c0a3aSHans de Goede 
209554c0a3aSHans de Goede #define RTW_GET_BE24(a) ((((u32) (a)[0]) << 16) | (((u32) (a)[1]) << 8) | \
210554c0a3aSHans de Goede 			 ((u32) (a)[2]))
211554c0a3aSHans de Goede #define RTW_PUT_BE24(a, val)					\
212554c0a3aSHans de Goede 	do {							\
213554c0a3aSHans de Goede 		(a)[0] = (u8) ((((u32) (val)) >> 16) & 0xff);	\
214554c0a3aSHans de Goede 		(a)[1] = (u8) ((((u32) (val)) >> 8) & 0xff);	\
215554c0a3aSHans de Goede 		(a)[2] = (u8) (((u32) (val)) & 0xff);		\
216554c0a3aSHans de Goede 	} while (0)
217554c0a3aSHans de Goede 
218554c0a3aSHans de Goede #define RTW_GET_BE32(a) ((((u32) (a)[0]) << 24) | (((u32) (a)[1]) << 16) | \
219554c0a3aSHans de Goede 			 (((u32) (a)[2]) << 8) | ((u32) (a)[3]))
220554c0a3aSHans de Goede #define RTW_PUT_BE32(a, val)					\
221554c0a3aSHans de Goede 	do {							\
222554c0a3aSHans de Goede 		(a)[0] = (u8) ((((u32) (val)) >> 24) & 0xff);	\
223554c0a3aSHans de Goede 		(a)[1] = (u8) ((((u32) (val)) >> 16) & 0xff);	\
224554c0a3aSHans de Goede 		(a)[2] = (u8) ((((u32) (val)) >> 8) & 0xff);	\
225554c0a3aSHans de Goede 		(a)[3] = (u8) (((u32) (val)) & 0xff);		\
226554c0a3aSHans de Goede 	} while (0)
227554c0a3aSHans de Goede 
228554c0a3aSHans de Goede #define RTW_GET_LE32(a) ((((u32) (a)[3]) << 24) | (((u32) (a)[2]) << 16) | \
229554c0a3aSHans de Goede 			 (((u32) (a)[1]) << 8) | ((u32) (a)[0]))
230554c0a3aSHans de Goede #define RTW_PUT_LE32(a, val)					\
231554c0a3aSHans de Goede 	do {							\
232554c0a3aSHans de Goede 		(a)[3] = (u8) ((((u32) (val)) >> 24) & 0xff);	\
233554c0a3aSHans de Goede 		(a)[2] = (u8) ((((u32) (val)) >> 16) & 0xff);	\
234554c0a3aSHans de Goede 		(a)[1] = (u8) ((((u32) (val)) >> 8) & 0xff);	\
235554c0a3aSHans de Goede 		(a)[0] = (u8) (((u32) (val)) & 0xff);		\
236554c0a3aSHans de Goede 	} while (0)
237554c0a3aSHans de Goede 
238554c0a3aSHans de Goede #define RTW_GET_BE64(a) ((((u64) (a)[0]) << 56) | (((u64) (a)[1]) << 48) | \
239554c0a3aSHans de Goede 			 (((u64) (a)[2]) << 40) | (((u64) (a)[3]) << 32) | \
240554c0a3aSHans de Goede 			 (((u64) (a)[4]) << 24) | (((u64) (a)[5]) << 16) | \
241554c0a3aSHans de Goede 			 (((u64) (a)[6]) << 8) | ((u64) (a)[7]))
242554c0a3aSHans de Goede #define RTW_PUT_BE64(a, val)				\
243554c0a3aSHans de Goede 	do {						\
244554c0a3aSHans de Goede 		(a)[0] = (u8) (((u64) (val)) >> 56);	\
245554c0a3aSHans de Goede 		(a)[1] = (u8) (((u64) (val)) >> 48);	\
246554c0a3aSHans de Goede 		(a)[2] = (u8) (((u64) (val)) >> 40);	\
247554c0a3aSHans de Goede 		(a)[3] = (u8) (((u64) (val)) >> 32);	\
248554c0a3aSHans de Goede 		(a)[4] = (u8) (((u64) (val)) >> 24);	\
249554c0a3aSHans de Goede 		(a)[5] = (u8) (((u64) (val)) >> 16);	\
250554c0a3aSHans de Goede 		(a)[6] = (u8) (((u64) (val)) >> 8);	\
251554c0a3aSHans de Goede 		(a)[7] = (u8) (((u64) (val)) & 0xff);	\
252554c0a3aSHans de Goede 	} while (0)
253554c0a3aSHans de Goede 
254554c0a3aSHans de Goede #define RTW_GET_LE64(a) ((((u64) (a)[7]) << 56) | (((u64) (a)[6]) << 48) | \
255554c0a3aSHans de Goede 			 (((u64) (a)[5]) << 40) | (((u64) (a)[4]) << 32) | \
256554c0a3aSHans de Goede 			 (((u64) (a)[3]) << 24) | (((u64) (a)[2]) << 16) | \
257554c0a3aSHans de Goede 			 (((u64) (a)[1]) << 8) | ((u64) (a)[0]))
258554c0a3aSHans de Goede 
259554c0a3aSHans de Goede void rtw_buf_free(u8 **buf, u32 *buf_len);
260554c0a3aSHans de Goede void rtw_buf_update(u8 **buf, u32 *buf_len, u8 *src, u32 src_len);
261554c0a3aSHans de Goede 
262554c0a3aSHans de Goede struct rtw_cbuf {
263554c0a3aSHans de Goede 	u32 write;
264554c0a3aSHans de Goede 	u32 read;
265554c0a3aSHans de Goede 	u32 size;
266554c0a3aSHans de Goede 	void *bufs[0];
267554c0a3aSHans de Goede };
268554c0a3aSHans de Goede 
269554c0a3aSHans de Goede bool rtw_cbuf_full(struct rtw_cbuf *cbuf);
270554c0a3aSHans de Goede bool rtw_cbuf_empty(struct rtw_cbuf *cbuf);
271554c0a3aSHans de Goede bool rtw_cbuf_push(struct rtw_cbuf *cbuf, void *buf);
272554c0a3aSHans de Goede void *rtw_cbuf_pop(struct rtw_cbuf *cbuf);
273554c0a3aSHans de Goede struct rtw_cbuf *rtw_cbuf_alloc(u32 size);
274554c0a3aSHans de Goede 
275554c0a3aSHans de Goede /*  String handler */
276554c0a3aSHans de Goede /*
277554c0a3aSHans de Goede  * Write formatted output to sized buffer
278554c0a3aSHans de Goede  */
279554c0a3aSHans de Goede #define rtw_sprintf(buf, size, format, arg...)	snprintf(buf, size, format, ##arg)
280554c0a3aSHans de Goede 
281554c0a3aSHans de Goede #endif
282