GNU Linux-libre 4.9.337-gnu1
[releases.git] / drivers / staging / rtl8188eu / include / basic_types.h
1 /******************************************************************************
2  *
3  * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
4  *
5  * This program is free software; you can redistribute it and/or modify it
6  * under the terms of version 2 of the GNU General Public License as
7  * published by the Free Software Foundation.
8  *
9  * This program is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12  * more details.
13  *
14  ******************************************************************************/
15 #ifndef __BASIC_TYPES_H__
16 #define __BASIC_TYPES_H__
17
18 #include <linux/types.h>
19 #define NDIS_OID uint
20
21 /* port from fw */
22 /*  TODO: Macros Below are Sync from SD7-Driver. It is necessary
23  * to check correctness */
24
25 /*
26  *      Call endian free function when
27  *              1. Read/write packet content.
28  *              2. Before write integer to IO.
29  *              3. After read integer from IO.
30 */
31
32 /* Convert little data endian to host ordering */
33 #define EF1BYTE(_val)           \
34         ((u8)(_val))
35 #define EF2BYTE(_val)           \
36         (le16_to_cpu(_val))
37 #define EF4BYTE(_val)           \
38         (le32_to_cpu(_val))
39
40 /* Create a bit mask
41  * Examples:
42  * BIT_LEN_MASK_32(0) => 0x00000000
43  * BIT_LEN_MASK_32(1) => 0x00000001
44  * BIT_LEN_MASK_32(2) => 0x00000003
45  * BIT_LEN_MASK_32(32) => 0xFFFFFFFF
46  */
47 #define BIT_LEN_MASK_32(__bitlen)        \
48         (0xFFFFFFFF >> (32 - (__bitlen)))
49 #define BIT_LEN_MASK_16(__bitlen)        \
50         (0xFFFF >> (16 - (__bitlen)))
51 #define BIT_LEN_MASK_8(__bitlen) \
52         (0xFF >> (8 - (__bitlen)))
53
54 /* Create an offset bit mask
55  * Examples:
56  * BIT_OFFSET_LEN_MASK_32(0, 2) => 0x00000003
57  * BIT_OFFSET_LEN_MASK_32(16, 2) => 0x00030000
58  */
59 #define BIT_OFFSET_LEN_MASK_32(__bitoffset, __bitlen) \
60         (BIT_LEN_MASK_32(__bitlen) << (__bitoffset))
61 #define BIT_OFFSET_LEN_MASK_16(__bitoffset, __bitlen) \
62         (BIT_LEN_MASK_16(__bitlen) << (__bitoffset))
63 #define BIT_OFFSET_LEN_MASK_8(__bitoffset, __bitlen) \
64         (BIT_LEN_MASK_8(__bitlen) << (__bitoffset))
65
66 /*Description:
67  * Return 4-byte value in host byte ordering from
68  * 4-byte pointer in little-endian system.
69  */
70 #define LE_P4BYTE_TO_HOST_4BYTE(__pstart) \
71         (EF4BYTE(*((__le32 *)(__pstart))))
72 #define LE_P2BYTE_TO_HOST_2BYTE(__pstart) \
73         (EF2BYTE(*((__le16 *)(__pstart))))
74 #define LE_P1BYTE_TO_HOST_1BYTE(__pstart) \
75         (EF1BYTE(*((u8 *)(__pstart))))
76
77 /*Description:
78 Translate subfield (continuous bits in little-endian) of 4-byte
79 value to host byte ordering.*/
80 #define LE_BITS_TO_4BYTE(__pstart, __bitoffset, __bitlen) \
81         ( \
82                 (LE_P4BYTE_TO_HOST_4BYTE(__pstart) >> (__bitoffset))  & \
83                 BIT_LEN_MASK_32(__bitlen) \
84         )
85 #define LE_BITS_TO_2BYTE(__pstart, __bitoffset, __bitlen) \
86         ( \
87                 (LE_P2BYTE_TO_HOST_2BYTE(__pstart) >> (__bitoffset)) & \
88                 BIT_LEN_MASK_16(__bitlen) \
89         )
90 #define LE_BITS_TO_1BYTE(__pstart, __bitoffset, __bitlen) \
91         ( \
92                 (LE_P1BYTE_TO_HOST_1BYTE(__pstart) >> (__bitoffset)) & \
93                 BIT_LEN_MASK_8(__bitlen) \
94         )
95
96 /* Description:
97  * Mask subfield (continuous bits in little-endian) of 4-byte value
98  * and return the result in 4-byte value in host byte ordering.
99  */
100 #define LE_BITS_CLEARED_TO_4BYTE(__pstart, __bitoffset, __bitlen) \
101         ( \
102                 LE_P4BYTE_TO_HOST_4BYTE(__pstart)  & \
103                 (~BIT_OFFSET_LEN_MASK_32(__bitoffset, __bitlen)) \
104         )
105 #define LE_BITS_CLEARED_TO_2BYTE(__pstart, __bitoffset, __bitlen) \
106         ( \
107                 LE_P2BYTE_TO_HOST_2BYTE(__pstart) & \
108                 (~BIT_OFFSET_LEN_MASK_16(__bitoffset, __bitlen)) \
109         )
110 #define LE_BITS_CLEARED_TO_1BYTE(__pstart, __bitoffset, __bitlen) \
111         ( \
112                 LE_P1BYTE_TO_HOST_1BYTE(__pstart) & \
113                 (~BIT_OFFSET_LEN_MASK_8(__bitoffset, __bitlen)) \
114         )
115
116 /* Description:
117  * Set subfield of little-endian 4-byte value to specified value.
118  */
119 #define SET_BITS_TO_LE_4BYTE(__pstart, __bitoffset, __bitlen, __val) \
120                 *((u32 *)(__pstart)) =                          \
121                 (                                                       \
122                 LE_BITS_CLEARED_TO_4BYTE(__pstart, __bitoffset, __bitlen) | \
123                 ((((u32)__val) & BIT_LEN_MASK_32(__bitlen)) << (__bitoffset)) \
124                 )
125
126 #define SET_BITS_TO_LE_2BYTE(__pstart, __bitoffset, __bitlen, __val) \
127                 *((u16 *)(__pstart)) =                          \
128                 (                                               \
129                 LE_BITS_CLEARED_TO_2BYTE(__pstart, __bitoffset, __bitlen) | \
130                 ((((u16)__val) & BIT_LEN_MASK_16(__bitlen)) << (__bitoffset)) \
131                 );
132
133 #define SET_BITS_TO_LE_1BYTE(__pstart, __bitoffset, __bitlen, __val) \
134                 *((u8 *)(__pstart)) = EF1BYTE                   \
135                 (                                               \
136                 LE_BITS_CLEARED_TO_1BYTE(__pstart, __bitoffset, __bitlen) | \
137                 ((((u8)__val) & BIT_LEN_MASK_8(__bitlen)) << (__bitoffset)) \
138                 )
139
140 #endif /* __BASIC_TYPES_H__ */