xref: /linux/drivers/staging/rtl8723bs/include/basic_types.h (revision 27d51f066072e415ef46bc09ac7a326305dafbca)
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /******************************************************************************
3  *
4  * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
5  *
6  ******************************************************************************/
7 #ifndef __BASIC_TYPES_H__
8 #define __BASIC_TYPES_H__
9 
10 #define SUCCESS	0
11 #define FAIL	(-1)
12 
13 #include <linux/types.h>
14 #include <linux/stddef.h>
15 
16 #define SIZE_PTR __kernel_size_t
17 #define SSIZE_PTR __kernel_ssize_t
18 
19 /* port from fw by thomas */
20 /*  TODO: Belows are Sync from SD7-Driver. It is necessary to check correctness */
21 
22 /*
23  * Call endian free function when
24  *	1. Read/write packet content.
25  *	2. Before write integer to IO.
26  *	3. After read integer from IO.
27  */
28 
29 /*  */
30 /*  Byte Swapping routine. */
31 /*  */
32 #define EF1Byte	(u8)
33 #define EF2Byte		le16_to_cpu
34 #define EF4Byte	le32_to_cpu
35 
36 /* Convert little data endian to host ordering */
37 #define EF1BYTE(_val)		\
38 	((u8)(_val))
39 #define EF2BYTE(_val)		\
40 	(le16_to_cpu(_val))
41 #define EF4BYTE(_val)		\
42 	(le32_to_cpu(_val))
43 
44 /*
45  * Create a bit mask
46  * Examples:
47  * BIT_LEN_MASK_32(0) => 0x00000000
48  * BIT_LEN_MASK_32(1) => 0x00000001
49  * BIT_LEN_MASK_32(2) => 0x00000003
50  * BIT_LEN_MASK_32(32) => 0xFFFFFFFF
51  */
52 #define BIT_LEN_MASK_32(__bitlen)	 \
53 	(0xFFFFFFFF >> (32 - (__bitlen)))
54 #define BIT_LEN_MASK_16(__bitlen)	 \
55 	(0xFFFF >> (16 - (__bitlen)))
56 #define BIT_LEN_MASK_8(__bitlen) \
57 	(0xFF >> (8 - (__bitlen)))
58 
59 /*
60  * Create an offset bit mask
61  * Examples:
62  * BIT_OFFSET_LEN_MASK_32(0, 2) => 0x00000003
63  * BIT_OFFSET_LEN_MASK_32(16, 2) => 0x00030000
64  */
65 #define BIT_OFFSET_LEN_MASK_32(__bitoffset, __bitlen) \
66 	(BIT_LEN_MASK_32(__bitlen) << (__bitoffset))
67 #define BIT_OFFSET_LEN_MASK_16(__bitoffset, __bitlen) \
68 	(BIT_LEN_MASK_16(__bitlen) << (__bitoffset))
69 #define BIT_OFFSET_LEN_MASK_8(__bitoffset, __bitlen) \
70 	(BIT_LEN_MASK_8(__bitlen) << (__bitoffset))
71 
72 /*
73  * Description:
74  * Return 4-byte value in host byte ordering from
75  * 4-byte pointer in little-endian system.
76  */
77 #define LE_P4BYTE_TO_HOST_4BYTE(__pstart) \
78 	(EF4BYTE(*((__le32 *)(__pstart))))
79 #define LE_P2BYTE_TO_HOST_2BYTE(__pstart) \
80 	(EF2BYTE(*((__le16 *)(__pstart))))
81 #define LE_P1BYTE_TO_HOST_1BYTE(__pstart) \
82 	(EF1BYTE(*((u8 *)(__pstart))))
83 
84 /*
85  * Description:
86  * Translate subfield (continuous bits in little-endian) of 4-byte value in
87  * little byte to 4-byte value in host byte ordering.
88  */
89 #define LE_BITS_TO_4BYTE(__pstart, __bitoffset, __bitlen) \
90 	(\
91 		(LE_P4BYTE_TO_HOST_4BYTE(__pstart) >> (__bitoffset))  & \
92 		BIT_LEN_MASK_32(__bitlen) \
93 	)
94 #define LE_BITS_TO_2BYTE(__pstart, __bitoffset, __bitlen) \
95 	(\
96 		(LE_P2BYTE_TO_HOST_2BYTE(__pstart) >> (__bitoffset)) & \
97 		BIT_LEN_MASK_16(__bitlen) \
98 	)
99 #define LE_BITS_TO_1BYTE(__pstart, __bitoffset, __bitlen) \
100 	(\
101 		(LE_P1BYTE_TO_HOST_1BYTE(__pstart) >> (__bitoffset)) & \
102 		BIT_LEN_MASK_8(__bitlen) \
103 	)
104 
105 /*
106  * Description:
107  * Mask subfield (continuous bits in little-endian) of 4-byte value in little
108  * byte ordering and return the result in 4-byte value in host byte ordering.
109  */
110 #define LE_BITS_CLEARED_TO_4BYTE(__pstart, __bitoffset, __bitlen) \
111 	(\
112 		LE_P4BYTE_TO_HOST_4BYTE(__pstart)  & \
113 		(~BIT_OFFSET_LEN_MASK_32(__bitoffset, __bitlen)) \
114 	)
115 #define LE_BITS_CLEARED_TO_2BYTE(__pstart, __bitoffset, __bitlen) \
116 	(\
117 		LE_P2BYTE_TO_HOST_2BYTE(__pstart) & \
118 		(~BIT_OFFSET_LEN_MASK_16(__bitoffset, __bitlen)) \
119 	)
120 #define LE_BITS_CLEARED_TO_1BYTE(__pstart, __bitoffset, __bitlen) \
121 	(\
122 		LE_P1BYTE_TO_HOST_1BYTE(__pstart) & \
123 		(~BIT_OFFSET_LEN_MASK_8(__bitoffset, __bitlen)) \
124 	)
125 
126 /*
127  * Description:
128  * Set subfield of little-endian 4-byte value to specified value.
129  */
130 #define SET_BITS_TO_LE_4BYTE(__pstart, __bitoffset, __bitlen, __val) \
131 		(*((u32 *)(__pstart)) =				\
132 		(						\
133 		LE_BITS_CLEARED_TO_4BYTE(__pstart, __bitoffset, __bitlen) | \
134 		((((u32)__val) & BIT_LEN_MASK_32(__bitlen)) << (__bitoffset)) \
135 		))
136 
137 #define SET_BITS_TO_LE_2BYTE(__pstart, __bitoffset, __bitlen, __val) \
138 		(*((u16 *)(__pstart)) =				\
139 		(					\
140 		LE_BITS_CLEARED_TO_2BYTE(__pstart, __bitoffset, __bitlen) | \
141 		((((u16)__val) & BIT_LEN_MASK_16(__bitlen)) << (__bitoffset)) \
142 		))
143 
144 #define SET_BITS_TO_LE_1BYTE(__pstart, __bitoffset, __bitlen, __val) \
145 		(*((u8 *)(__pstart)) = EF1BYTE			\
146 		(					\
147 		LE_BITS_CLEARED_TO_1BYTE(__pstart, __bitoffset, __bitlen) | \
148 		((((u8)__val) & BIT_LEN_MASK_8(__bitlen)) << (__bitoffset)) \
149 		))
150 
151 #define LE_BITS_CLEARED_TO_1BYTE_8BIT(__pStart, __BitOffset, __BitLen) \
152 	(\
153 		LE_P1BYTE_TO_HOST_1BYTE(__pStart) \
154 	)
155 
156 #define SET_BITS_TO_LE_1BYTE_8BIT(__pStart, __BitOffset, __BitLen, __Value) \
157 { \
158 	*((u8 *)(__pStart)) = \
159 		EF1Byte(\
160 			LE_BITS_CLEARED_TO_1BYTE_8BIT(__pStart, __BitOffset, __BitLen) \
161 			| \
162 			((u8)__Value) \
163 		); \
164 }
165 
166 /*  Get the N-bytes alignent offset from the current length */
167 #define N_BYTE_ALIGMENT(__Value, __Aligment) ((__Aligment == 1) ? (__Value) : (((__Value + __Aligment - 1) / __Aligment) * __Aligment))
168 
169 #define TEST_FLAG(__Flag, __testFlag)		(((__Flag) & (__testFlag)) != 0)
170 #define SET_FLAG(__Flag, __setFlag)			((__Flag) |= __setFlag)
171 #define CLEAR_FLAG(__Flag, __clearFlag)		((__Flag) &= ~(__clearFlag))
172 #define CLEAR_FLAGS(__Flag)					((__Flag) = 0)
173 #define TEST_FLAGS(__Flag, __testFlags)		(((__Flag) & (__testFlags)) == (__testFlags))
174 
175 #endif /* __BASIC_TYPES_H__ */
176