1 /******************************************************************************
3 * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
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.
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
14 ******************************************************************************/
15 #ifndef __BASIC_TYPES_H__
16 #define __BASIC_TYPES_H__
18 #include <linux/types.h>
22 /* TODO: Macros Below are Sync from SD7-Driver. It is necessary
23 * to check correctness */
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.
32 /* Convert little data endian to host ordering */
33 #define EF1BYTE(_val) \
35 #define EF2BYTE(_val) \
37 #define EF4BYTE(_val) \
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
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)))
54 /* Create an offset bit mask
56 * BIT_OFFSET_LEN_MASK_32(0, 2) => 0x00000003
57 * BIT_OFFSET_LEN_MASK_32(16, 2) => 0x00030000
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))
67 * Return 4-byte value in host byte ordering from
68 * 4-byte pointer in little-endian system.
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))))
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) \
82 (LE_P4BYTE_TO_HOST_4BYTE(__pstart) >> (__bitoffset)) & \
83 BIT_LEN_MASK_32(__bitlen) \
85 #define LE_BITS_TO_2BYTE(__pstart, __bitoffset, __bitlen) \
87 (LE_P2BYTE_TO_HOST_2BYTE(__pstart) >> (__bitoffset)) & \
88 BIT_LEN_MASK_16(__bitlen) \
90 #define LE_BITS_TO_1BYTE(__pstart, __bitoffset, __bitlen) \
92 (LE_P1BYTE_TO_HOST_1BYTE(__pstart) >> (__bitoffset)) & \
93 BIT_LEN_MASK_8(__bitlen) \
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.
100 #define LE_BITS_CLEARED_TO_4BYTE(__pstart, __bitoffset, __bitlen) \
102 LE_P4BYTE_TO_HOST_4BYTE(__pstart) & \
103 (~BIT_OFFSET_LEN_MASK_32(__bitoffset, __bitlen)) \
105 #define LE_BITS_CLEARED_TO_2BYTE(__pstart, __bitoffset, __bitlen) \
107 LE_P2BYTE_TO_HOST_2BYTE(__pstart) & \
108 (~BIT_OFFSET_LEN_MASK_16(__bitoffset, __bitlen)) \
110 #define LE_BITS_CLEARED_TO_1BYTE(__pstart, __bitoffset, __bitlen) \
112 LE_P1BYTE_TO_HOST_1BYTE(__pstart) & \
113 (~BIT_OFFSET_LEN_MASK_8(__bitoffset, __bitlen)) \
117 * Set subfield of little-endian 4-byte value to specified value.
119 #define SET_BITS_TO_LE_4BYTE(__pstart, __bitoffset, __bitlen, __val) \
120 *((u32 *)(__pstart)) = \
122 LE_BITS_CLEARED_TO_4BYTE(__pstart, __bitoffset, __bitlen) | \
123 ((((u32)__val) & BIT_LEN_MASK_32(__bitlen)) << (__bitoffset)) \
126 #define SET_BITS_TO_LE_2BYTE(__pstart, __bitoffset, __bitlen, __val) \
127 *((u16 *)(__pstart)) = \
129 LE_BITS_CLEARED_TO_2BYTE(__pstart, __bitoffset, __bitlen) | \
130 ((((u16)__val) & BIT_LEN_MASK_16(__bitlen)) << (__bitoffset)) \
133 #define SET_BITS_TO_LE_1BYTE(__pstart, __bitoffset, __bitlen, __val) \
134 *((u8 *)(__pstart)) = EF1BYTE \
136 LE_BITS_CLEARED_TO_1BYTE(__pstart, __bitoffset, __bitlen) | \
137 ((((u8)__val) & BIT_LEN_MASK_8(__bitlen)) << (__bitoffset)) \
140 #endif /* __BASIC_TYPES_H__ */