PageRenderTime 33ms CodeModel.GetById 20ms app.highlight 11ms RepoModel.GetById 0ms app.codeStats 0ms

/drivers/staging/rtl8192u/ieee80211/EndianFree.h

https://bitbucket.org/slukk/jb-tsm-kernel-4.2
C Header | 194 lines | 122 code | 27 blank | 45 comment | 3 complexity | 2028bf33d0356ae533138d8b09fabb1f MD5 | raw file
Possible License(s): GPL-2.0, LGPL-2.0, AGPL-1.0
  1#ifndef __INC_ENDIANFREE_H
  2#define __INC_ENDIANFREE_H
  3
  4/*
  5 *	Call endian free function when
  6 *		1. Read/write packet content.
  7 *		2. Before write integer to IO.
  8 *		3. After read integer from IO.
  9 */
 10
 11#define __MACHINE_LITTLE_ENDIAN 1234    /* LSB first: i386, vax */
 12#define __MACHINE_BIG_ENDIAN    4321    /* MSB first: 68000, ibm, net, ppc */
 13
 14#define BYTE_ORDER __MACHINE_LITTLE_ENDIAN
 15
 16#if BYTE_ORDER == __MACHINE_LITTLE_ENDIAN
 17// Convert data
 18#define EF1Byte(_val)				((u8)(_val))
 19#define EF2Byte(_val)				((u16)(_val))
 20#define EF4Byte(_val)				((u32)(_val))
 21
 22#else
 23// Convert data
 24#define EF1Byte(_val)				((u8)(_val))
 25#define EF2Byte(_val)				(((((u16)(_val))&0x00ff)<<8)|((((u16)(_val))&0xff00)>>8))
 26#define EF4Byte(_val)				(((((u32)(_val))&0x000000ff)<<24)|\
 27						((((u32)(_val))&0x0000ff00)<<8)|\
 28						((((u32)(_val))&0x00ff0000)>>8)|\
 29						((((u32)(_val))&0xff000000)>>24))
 30#endif
 31
 32// Read data from memory
 33#define ReadEF1Byte(_ptr)		EF1Byte(*((u8 *)(_ptr)))
 34#define ReadEF2Byte(_ptr)		EF2Byte(*((u16 *)(_ptr)))
 35#define ReadEF4Byte(_ptr)		EF4Byte(*((u32 *)(_ptr)))
 36
 37// Write data to memory
 38#define WriteEF1Byte(_ptr, _val)	(*((u8 *)(_ptr)))=EF1Byte(_val)
 39#define WriteEF2Byte(_ptr, _val)	(*((u16 *)(_ptr)))=EF2Byte(_val)
 40#define WriteEF4Byte(_ptr, _val)	(*((u32 *)(_ptr)))=EF4Byte(_val)
 41// Convert Host system specific byte ording (litten or big endia) to Network byte ording (big endian).
 42// 2006.05.07, by rcnjko.
 43#if BYTE_ORDER == __MACHINE_LITTLE_ENDIAN
 44#define H2N1BYTE(_val)	((u8)(_val))
 45#define H2N2BYTE(_val)	(((((u16)(_val))&0x00ff)<<8)|\
 46			((((u16)(_val))&0xff00)>>8))
 47#define H2N4BYTE(_val)	(((((u32)(_val))&0x000000ff)<<24)|\
 48			((((u32)(_val))&0x0000ff00)<<8)	|\
 49			((((u32)(_val))&0x00ff0000)>>8)	|\
 50			((((u32)(_val))&0xff000000)>>24))
 51#else
 52#define H2N1BYTE(_val)			((u8)(_val))
 53#define H2N2BYTE(_val)			((u16)(_val))
 54#define H2N4BYTE(_val)			((u32)(_val))
 55#endif
 56
 57// Convert from Network byte ording (big endian) to Host system specific byte ording (litten or big endia).
 58// 2006.05.07, by rcnjko.
 59#if BYTE_ORDER == __MACHINE_LITTLE_ENDIAN
 60#define N2H1BYTE(_val)	((u8)(_val))
 61#define N2H2BYTE(_val)	(((((u16)(_val))&0x00ff)<<8)|\
 62			((((u16)(_val))&0xff00)>>8))
 63#define N2H4BYTE(_val)	(((((u32)(_val))&0x000000ff)<<24)|\
 64			((((u32)(_val))&0x0000ff00)<<8)	|\
 65			((((u32)(_val))&0x00ff0000)>>8)	|\
 66			((((u32)(_val))&0xff000000)>>24))
 67#else
 68#define N2H1BYTE(_val)			((u8)(_val))
 69#define N2H2BYTE(_val)			((u16)(_val))
 70#define N2H4BYTE(_val)			((u32)(_val))
 71#endif
 72
 73//
 74//	Example:
 75//		BIT_LEN_MASK_32(0) => 0x00000000
 76//		BIT_LEN_MASK_32(1) => 0x00000001
 77//		BIT_LEN_MASK_32(2) => 0x00000003
 78//		BIT_LEN_MASK_32(32) => 0xFFFFFFFF
 79//
 80#define BIT_LEN_MASK_32(__BitLen) (0xFFFFFFFF >> (32 - (__BitLen)))
 81//
 82//	Example:
 83//		BIT_OFFSET_LEN_MASK_32(0, 2) => 0x00000003
 84//		BIT_OFFSET_LEN_MASK_32(16, 2) => 0x00030000
 85//
 86#define BIT_OFFSET_LEN_MASK_32(__BitOffset, __BitLen) (BIT_LEN_MASK_32(__BitLen) << (__BitOffset))
 87
 88//
 89//	Description:
 90//		Return 4-byte value in host byte ordering from
 91//		4-byte pointer in litten-endian system.
 92//
 93#define LE_P4BYTE_TO_HOST_4BYTE(__pStart) (EF4Byte(*((u32 *)(__pStart))))
 94
 95//
 96//	Description:
 97//		Translate subfield (continuous bits in little-endian) of 4-byte value in litten byte to
 98//		4-byte value in host byte ordering.
 99//
100#define LE_BITS_TO_4BYTE(__pStart, __BitOffset, __BitLen) \
101	( \
102	  ( LE_P4BYTE_TO_HOST_4BYTE(__pStart) >> (__BitOffset) ) \
103	  & \
104	  BIT_LEN_MASK_32(__BitLen) \
105	)
106
107//
108//	Description:
109//		Mask subfield (continuous bits in little-endian) of 4-byte value in litten byte oredering
110//		and return the result in 4-byte value in host byte ordering.
111//
112#define LE_BITS_CLEARED_TO_4BYTE(__pStart, __BitOffset, __BitLen) \
113	( \
114	  LE_P4BYTE_TO_HOST_4BYTE(__pStart) \
115	  & \
116	  ( ~BIT_OFFSET_LEN_MASK_32(__BitOffset, __BitLen) ) \
117	)
118
119//
120//	Description:
121//		Set subfield of little-endian 4-byte value to specified value.
122//
123#define SET_BITS_TO_LE_4BYTE(__pStart, __BitOffset, __BitLen, __Value) \
124	*((u32 *)(__pStart)) = \
125	EF4Byte( \
126	LE_BITS_CLEARED_TO_4BYTE(__pStart, __BitOffset, __BitLen) \
127	| \
128	( (((u32)__Value) & BIT_LEN_MASK_32(__BitLen)) << (__BitOffset) ) \
129       );
130
131
132#define BIT_LEN_MASK_16(__BitLen) \
133	(0xFFFF >> (16 - (__BitLen)))
134
135#define BIT_OFFSET_LEN_MASK_16(__BitOffset, __BitLen) \
136	(BIT_LEN_MASK_16(__BitLen) << (__BitOffset))
137
138#define LE_P2BYTE_TO_HOST_2BYTE(__pStart) \
139	(EF2Byte(*((u16 *)(__pStart))))
140
141#define LE_BITS_TO_2BYTE(__pStart, __BitOffset, __BitLen) \
142	( \
143	  ( LE_P2BYTE_TO_HOST_2BYTE(__pStart) >> (__BitOffset) ) \
144	  & \
145	  BIT_LEN_MASK_16(__BitLen) \
146	)
147
148#define LE_BITS_CLEARED_TO_2BYTE(__pStart, __BitOffset, __BitLen) \
149	( \
150	  LE_P2BYTE_TO_HOST_2BYTE(__pStart) \
151	  & \
152	  ( ~BIT_OFFSET_LEN_MASK_16(__BitOffset, __BitLen) ) \
153	)
154
155#define SET_BITS_TO_LE_2BYTE(__pStart, __BitOffset, __BitLen, __Value) \
156	*((u16 *)(__pStart)) = \
157	EF2Byte( \
158		LE_BITS_CLEARED_TO_2BYTE(__pStart, __BitOffset, __BitLen) \
159		| \
160		( (((u16)__Value) & BIT_LEN_MASK_16(__BitLen)) << (__BitOffset) ) \
161       );
162
163#define BIT_LEN_MASK_8(__BitLen) \
164	(0xFF >> (8 - (__BitLen)))
165
166#define BIT_OFFSET_LEN_MASK_8(__BitOffset, __BitLen) \
167	(BIT_LEN_MASK_8(__BitLen) << (__BitOffset))
168
169#define LE_P1BYTE_TO_HOST_1BYTE(__pStart) \
170	(EF1Byte(*((u8 *)(__pStart))))
171
172#define LE_BITS_TO_1BYTE(__pStart, __BitOffset, __BitLen) \
173	( \
174	  ( LE_P1BYTE_TO_HOST_1BYTE(__pStart) >> (__BitOffset) ) \
175	  & \
176	  BIT_LEN_MASK_8(__BitLen) \
177	)
178
179#define LE_BITS_CLEARED_TO_1BYTE(__pStart, __BitOffset, __BitLen) \
180	( \
181	  LE_P1BYTE_TO_HOST_1BYTE(__pStart) \
182	  & \
183	  ( ~BIT_OFFSET_LEN_MASK_8(__BitOffset, __BitLen) ) \
184	)
185
186#define SET_BITS_TO_LE_1BYTE(__pStart, __BitOffset, __BitLen, __Value) \
187	*((u8 *)(__pStart)) = \
188	EF1Byte( \
189		LE_BITS_CLEARED_TO_1BYTE(__pStart, __BitOffset, __BitLen) \
190		| \
191		( (((u8)__Value) & BIT_LEN_MASK_8(__BitLen)) << (__BitOffset) ) \
192       );
193
194#endif // #ifndef __INC_ENDIANFREE_H