xref: /OK3568_Linux_fs/external/rkwifibt/drivers/bcmdhd/include/bcmendian.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Byte order utilities
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * Copyright (C) 2020, Broadcom.
5*4882a593Smuzhiyun  *
6*4882a593Smuzhiyun  *      Unless you and Broadcom execute a separate written software license
7*4882a593Smuzhiyun  * agreement governing use of this software, this software is licensed to you
8*4882a593Smuzhiyun  * under the terms of the GNU General Public License version 2 (the "GPL"),
9*4882a593Smuzhiyun  * available at http://www.broadcom.com/licenses/GPLv2.php, with the
10*4882a593Smuzhiyun  * following added to such license:
11*4882a593Smuzhiyun  *
12*4882a593Smuzhiyun  *      As a special exception, the copyright holders of this software give you
13*4882a593Smuzhiyun  * permission to link this software with independent modules, and to copy and
14*4882a593Smuzhiyun  * distribute the resulting executable under terms of your choice, provided that
15*4882a593Smuzhiyun  * you also meet, for each linked independent module, the terms and conditions of
16*4882a593Smuzhiyun  * the license of that module.  An independent module is a module which is not
17*4882a593Smuzhiyun  * derived from this software.  The special exception does not apply to any
18*4882a593Smuzhiyun  * modifications of the software.
19*4882a593Smuzhiyun  *
20*4882a593Smuzhiyun  *
21*4882a593Smuzhiyun  * <<Broadcom-WL-IPTag/Dual:>>
22*4882a593Smuzhiyun  *
23*4882a593Smuzhiyun  * This file by default provides proper behavior on little-endian architectures.
24*4882a593Smuzhiyun  * On big-endian architectures, IL_BIGENDIAN should be defined.
25*4882a593Smuzhiyun  */
26*4882a593Smuzhiyun 
27*4882a593Smuzhiyun #ifndef _BCMENDIAN_H_
28*4882a593Smuzhiyun #define _BCMENDIAN_H_
29*4882a593Smuzhiyun 
30*4882a593Smuzhiyun #include <typedefs.h>
31*4882a593Smuzhiyun 
32*4882a593Smuzhiyun /* Reverse the bytes in a 16-bit value */
33*4882a593Smuzhiyun #define BCMSWAP16(val) \
34*4882a593Smuzhiyun 	((uint16)((((uint16)(val) & (uint16)0x00ffU) << 8) | \
35*4882a593Smuzhiyun 		  (((uint16)(val) & (uint16)0xff00U) >> 8)))
36*4882a593Smuzhiyun 
37*4882a593Smuzhiyun /* Reverse the bytes in a 32-bit value */
38*4882a593Smuzhiyun #define BCMSWAP32(val) \
39*4882a593Smuzhiyun 	((uint32)((((uint32)(val) & (uint32)0x000000ffU) << 24) | \
40*4882a593Smuzhiyun 		  (((uint32)(val) & (uint32)0x0000ff00U) <<  8) | \
41*4882a593Smuzhiyun 		  (((uint32)(val) & (uint32)0x00ff0000U) >>  8) | \
42*4882a593Smuzhiyun 		  (((uint32)(val) & (uint32)0xff000000U) >> 24)))
43*4882a593Smuzhiyun 
44*4882a593Smuzhiyun /* Reverse the two 16-bit halves of a 32-bit value */
45*4882a593Smuzhiyun #define BCMSWAP32BY16(val) \
46*4882a593Smuzhiyun 	((uint32)((((uint32)(val) & (uint32)0x0000ffffU) << 16) | \
47*4882a593Smuzhiyun 		  (((uint32)(val) & (uint32)0xffff0000U) >> 16)))
48*4882a593Smuzhiyun 
49*4882a593Smuzhiyun /* Reverse the bytes in a 64-bit value */
50*4882a593Smuzhiyun #define BCMSWAP64(val) \
51*4882a593Smuzhiyun 	((uint64)((((uint64)(val) & 0x00000000000000ffULL) << 56) | \
52*4882a593Smuzhiyun 	          (((uint64)(val) & 0x000000000000ff00ULL) << 40) | \
53*4882a593Smuzhiyun 	          (((uint64)(val) & 0x0000000000ff0000ULL) << 24) | \
54*4882a593Smuzhiyun 	          (((uint64)(val) & 0x00000000ff000000ULL) <<  8) | \
55*4882a593Smuzhiyun 	          (((uint64)(val) & 0x000000ff00000000ULL) >>  8) | \
56*4882a593Smuzhiyun 	          (((uint64)(val) & 0x0000ff0000000000ULL) >> 24) | \
57*4882a593Smuzhiyun 	          (((uint64)(val) & 0x00ff000000000000ULL) >> 40) | \
58*4882a593Smuzhiyun 	          (((uint64)(val) & 0xff00000000000000ULL) >> 56)))
59*4882a593Smuzhiyun 
60*4882a593Smuzhiyun /* Reverse the two 32-bit halves of a 64-bit value */
61*4882a593Smuzhiyun #define BCMSWAP64BY32(val) \
62*4882a593Smuzhiyun 	((uint64)((((uint64)(val) & 0x00000000ffffffffULL) << 32) | \
63*4882a593Smuzhiyun 	          (((uint64)(val) & 0xffffffff00000000ULL) >> 32)))
64*4882a593Smuzhiyun 
65*4882a593Smuzhiyun /* Byte swapping macros
66*4882a593Smuzhiyun  *    Host <=> Network (Big Endian) for 16- and 32-bit values
67*4882a593Smuzhiyun  *    Host <=> Little-Endian for 16- and 32-bit values
68*4882a593Smuzhiyun  */
69*4882a593Smuzhiyun #ifndef hton16
70*4882a593Smuzhiyun #ifndef IL_BIGENDIAN
71*4882a593Smuzhiyun #define HTON16(i) BCMSWAP16(i)
72*4882a593Smuzhiyun #define	hton16(i) bcmswap16(i)
73*4882a593Smuzhiyun #define	HTON32(i) BCMSWAP32(i)
74*4882a593Smuzhiyun #define	hton32(i) bcmswap32(i)
75*4882a593Smuzhiyun #define	NTOH16(i) BCMSWAP16(i)
76*4882a593Smuzhiyun #define	ntoh16(i) bcmswap16(i)
77*4882a593Smuzhiyun #define	NTOH32(i) BCMSWAP32(i)
78*4882a593Smuzhiyun #define	ntoh32(i) bcmswap32(i)
79*4882a593Smuzhiyun #define LTOH16(i) (i)
80*4882a593Smuzhiyun #define ltoh16(i) (i)
81*4882a593Smuzhiyun #define LTOH32(i) (i)
82*4882a593Smuzhiyun #define ltoh32(i) (i)
83*4882a593Smuzhiyun #define HTOL16(i) (i)
84*4882a593Smuzhiyun #define htol16(i) (i)
85*4882a593Smuzhiyun #define HTOL32(i) (i)
86*4882a593Smuzhiyun #define htol32(i) (i)
87*4882a593Smuzhiyun #define HTOL64(i) (i)
88*4882a593Smuzhiyun #define htol64(i) (i)
89*4882a593Smuzhiyun #else /* IL_BIGENDIAN */
90*4882a593Smuzhiyun #define HTON16(i) (i)
91*4882a593Smuzhiyun #define	hton16(i) (i)
92*4882a593Smuzhiyun #define	HTON32(i) (i)
93*4882a593Smuzhiyun #define	hton32(i) (i)
94*4882a593Smuzhiyun #define	NTOH16(i) (i)
95*4882a593Smuzhiyun #define	ntoh16(i) (i)
96*4882a593Smuzhiyun #define	NTOH32(i) (i)
97*4882a593Smuzhiyun #define	ntoh32(i) (i)
98*4882a593Smuzhiyun #define	LTOH16(i) BCMSWAP16(i)
99*4882a593Smuzhiyun #define	ltoh16(i) bcmswap16(i)
100*4882a593Smuzhiyun #define	LTOH32(i) BCMSWAP32(i)
101*4882a593Smuzhiyun #define	ltoh32(i) bcmswap32(i)
102*4882a593Smuzhiyun #define HTOL16(i) BCMSWAP16(i)
103*4882a593Smuzhiyun #define htol16(i) bcmswap16(i)
104*4882a593Smuzhiyun #define HTOL32(i) BCMSWAP32(i)
105*4882a593Smuzhiyun #define htol32(i) bcmswap32(i)
106*4882a593Smuzhiyun #define HTOL64(i) BCMSWAP64(i)
107*4882a593Smuzhiyun #define htol64(i) bcmswap64(i)
108*4882a593Smuzhiyun #endif /* IL_BIGENDIAN */
109*4882a593Smuzhiyun #endif /* hton16 */
110*4882a593Smuzhiyun 
111*4882a593Smuzhiyun #ifndef IL_BIGENDIAN
112*4882a593Smuzhiyun #define ltoh16_buf(buf, i)
113*4882a593Smuzhiyun #define htol16_buf(buf, i)
114*4882a593Smuzhiyun #define ltoh32_buf(buf, i)
115*4882a593Smuzhiyun #define htol32_buf(buf, i)
116*4882a593Smuzhiyun #define ltoh64_buf(buf, i)
117*4882a593Smuzhiyun #define htol64_buf(buf, i)
118*4882a593Smuzhiyun #else
119*4882a593Smuzhiyun #define ltoh16_buf(buf, i) bcmswap16_buf((uint16 *)(buf), (i))
120*4882a593Smuzhiyun #define htol16_buf(buf, i) bcmswap16_buf((uint16 *)(buf), (i))
121*4882a593Smuzhiyun #define ltoh32_buf(buf, i) bcmswap32_buf((uint16 *)(buf), (i))
122*4882a593Smuzhiyun #define htol32_buf(buf, i) bcmswap32_buf((uint16 *)(buf), (i))
123*4882a593Smuzhiyun #define ltoh64_buf(buf, i) bcmswap64_buf((uint16 *)(buf), (i))
124*4882a593Smuzhiyun #define htol64_buf(buf, i) bcmswap64_buf((uint16 *)(buf), (i))
125*4882a593Smuzhiyun #endif /* IL_BIGENDIAN */
126*4882a593Smuzhiyun 
127*4882a593Smuzhiyun /* Unaligned loads and stores in host byte order */
128*4882a593Smuzhiyun #ifndef IL_BIGENDIAN
129*4882a593Smuzhiyun #define load32_ua(a)		ltoh32_ua(a)
130*4882a593Smuzhiyun #define store32_ua(a, v)	htol32_ua_store(v, a)
131*4882a593Smuzhiyun #define load16_ua(a)		ltoh16_ua(a)
132*4882a593Smuzhiyun #define store16_ua(a, v)	htol16_ua_store(v, a)
133*4882a593Smuzhiyun #define load64_ua(a)		ltoh64_ua(a)
134*4882a593Smuzhiyun #define store64_ua(a, v)	htol64_ua_store(v, a)
135*4882a593Smuzhiyun #else
136*4882a593Smuzhiyun #define load32_ua(a)		ntoh32_ua(a)
137*4882a593Smuzhiyun #define store32_ua(a, v)	hton32_ua_store(v, a)
138*4882a593Smuzhiyun #define load16_ua(a)		ntoh16_ua(a)
139*4882a593Smuzhiyun #define store16_ua(a, v)	hton16_ua_store(v, a)
140*4882a593Smuzhiyun #define load64_ua(a)		ntoh64_ua(a)
141*4882a593Smuzhiyun #define store64_ua(a, v)	hton64_ua_store(v, a)
142*4882a593Smuzhiyun #endif /* IL_BIGENDIAN */
143*4882a593Smuzhiyun 
144*4882a593Smuzhiyun #define _LTOH16_UA(cp)	((uint16)(cp)[0] | ((uint16)(cp)[1] << 8))
145*4882a593Smuzhiyun #define _LTOH32_UA(cp)	((uint32)(cp)[0] | ((uint32)(cp)[1] << 8) | \
146*4882a593Smuzhiyun 	((uint32)(cp)[2] << 16) | ((uint32)(cp)[3] << 24))
147*4882a593Smuzhiyun #define _NTOH16_UA(cp)	(((uint16)(cp)[0] << 8) | (uint16)(cp)[1])
148*4882a593Smuzhiyun #define _NTOH32_UA(cp)	(((uint32)(cp)[0] << 24) | ((uint32)(cp)[1] << 16) | \
149*4882a593Smuzhiyun 	((uint32)(cp)[2] << 8) | (uint32)(cp)[3])
150*4882a593Smuzhiyun 
151*4882a593Smuzhiyun #define _LTOH64_UA(cp)	((uint64)(cp)[0] | ((uint64)(cp)[1] << 8) | \
152*4882a593Smuzhiyun 	((uint64)(cp)[2] << 16) | ((uint64)(cp)[3] << 24) | \
153*4882a593Smuzhiyun 	((uint64)(cp)[4] << 32) | ((uint64)(cp)[5] << 40) | \
154*4882a593Smuzhiyun 	((uint64)(cp)[6] << 48) | ((uint64)(cp)[7] << 56))
155*4882a593Smuzhiyun 
156*4882a593Smuzhiyun #define _NTOH64_UA(cp)	((uint64)(cp)[7] | ((uint64)(cp)[6] << 8) | \
157*4882a593Smuzhiyun 	((uint64)(cp)[5] << 16) | ((uint64)(cp)[4] << 24) | \
158*4882a593Smuzhiyun 	((uint64)(cp)[3] << 32) | ((uint64)(cp)[2] << 40) | \
159*4882a593Smuzhiyun 	((uint64)(cp)[1] << 48) | ((uint64)(cp)[0] << 56))
160*4882a593Smuzhiyun 
161*4882a593Smuzhiyun #define ltoh_ua(ptr) \
162*4882a593Smuzhiyun 	(sizeof(*(ptr)) == sizeof(uint8) ? *(const uint8 *)(ptr) : \
163*4882a593Smuzhiyun 	 sizeof(*(ptr)) == sizeof(uint16) ? (uint16)_LTOH16_UA((const uint8 *)(ptr)) : \
164*4882a593Smuzhiyun 	 sizeof(*(ptr)) == sizeof(uint32) ? (uint32)_LTOH32_UA((const uint8 *)(ptr)) : \
165*4882a593Smuzhiyun 	 *(uint8 *)0)
166*4882a593Smuzhiyun 
167*4882a593Smuzhiyun #define ntoh_ua(ptr) \
168*4882a593Smuzhiyun 	(sizeof(*(ptr)) == sizeof(uint8) ? *(const uint8 *)(ptr) : \
169*4882a593Smuzhiyun 	 sizeof(*(ptr)) == sizeof(uint16) ? (uint16)_NTOH16_UA((const uint8 *)(ptr)) : \
170*4882a593Smuzhiyun 	 sizeof(*(ptr)) == sizeof(uint32) ? (uint32)_NTOH32_UA((const uint8 *)(ptr)) : \
171*4882a593Smuzhiyun 	 *(uint8 *)0)
172*4882a593Smuzhiyun 
173*4882a593Smuzhiyun #ifdef __GNUC__
174*4882a593Smuzhiyun 
175*4882a593Smuzhiyun /* GNU macro versions avoid referencing the argument multiple times, while also
176*4882a593Smuzhiyun  * avoiding the -fno-inline used in ROM builds.
177*4882a593Smuzhiyun  */
178*4882a593Smuzhiyun 
179*4882a593Smuzhiyun #define bcmswap16(val) ({ \
180*4882a593Smuzhiyun 	uint16 _val = (val); \
181*4882a593Smuzhiyun 	BCMSWAP16(_val); \
182*4882a593Smuzhiyun })
183*4882a593Smuzhiyun 
184*4882a593Smuzhiyun #define bcmswap32(val) ({ \
185*4882a593Smuzhiyun 	uint32 _val = (val); \
186*4882a593Smuzhiyun 	BCMSWAP32(_val); \
187*4882a593Smuzhiyun })
188*4882a593Smuzhiyun 
189*4882a593Smuzhiyun #define bcmswap64(val) ({ \
190*4882a593Smuzhiyun 	uint64 _val = (val); \
191*4882a593Smuzhiyun 	BCMSWAP64(_val); \
192*4882a593Smuzhiyun })
193*4882a593Smuzhiyun 
194*4882a593Smuzhiyun #define bcmswap32by16(val) ({ \
195*4882a593Smuzhiyun 	uint32 _val = (val); \
196*4882a593Smuzhiyun 	BCMSWAP32BY16(_val); \
197*4882a593Smuzhiyun })
198*4882a593Smuzhiyun 
199*4882a593Smuzhiyun #define bcmswap16_buf(buf, len) ({ \
200*4882a593Smuzhiyun 	uint16 *_buf = (uint16 *)(buf); \
201*4882a593Smuzhiyun 	uint _wds = (len) / 2; \
202*4882a593Smuzhiyun 	while (_wds--) { \
203*4882a593Smuzhiyun 		*_buf = bcmswap16(*_buf); \
204*4882a593Smuzhiyun 		_buf++; \
205*4882a593Smuzhiyun 	} \
206*4882a593Smuzhiyun })
207*4882a593Smuzhiyun 
208*4882a593Smuzhiyun #define bcmswap32_buf(buf, len) ({ \
209*4882a593Smuzhiyun 	uint32 *_buf = (uint32 *)(buf); \
210*4882a593Smuzhiyun 	uint _wds = (len) / 4; \
211*4882a593Smuzhiyun 	while (_wds--) { \
212*4882a593Smuzhiyun 		*_buf = bcmswap32(*_buf); \
213*4882a593Smuzhiyun 		_buf++; \
214*4882a593Smuzhiyun 	} \
215*4882a593Smuzhiyun })
216*4882a593Smuzhiyun 
217*4882a593Smuzhiyun #define bcmswap64_buf(buf, len) ({ \
218*4882a593Smuzhiyun 	uint64 *_buf = (uint64 *)(buf); \
219*4882a593Smuzhiyun 	uint _wds = (len) / 8; \
220*4882a593Smuzhiyun 	while (_wds--) { \
221*4882a593Smuzhiyun 		*_buf = bcmswap64(*_buf); \
222*4882a593Smuzhiyun 		_buf++; \
223*4882a593Smuzhiyun 	} \
224*4882a593Smuzhiyun })
225*4882a593Smuzhiyun 
226*4882a593Smuzhiyun #define htol16_ua_store(val, bytes) ({ \
227*4882a593Smuzhiyun 	uint16 _val = (val); \
228*4882a593Smuzhiyun 	uint8 *_bytes = (uint8 *)(bytes); \
229*4882a593Smuzhiyun 	_bytes[0] = _val & 0xff; \
230*4882a593Smuzhiyun 	_bytes[1] = _val >> 8; \
231*4882a593Smuzhiyun })
232*4882a593Smuzhiyun 
233*4882a593Smuzhiyun #define htol32_ua_store(val, bytes) ({ \
234*4882a593Smuzhiyun 	uint32 _val = (val); \
235*4882a593Smuzhiyun 	uint8 *_bytes = (uint8 *)(bytes); \
236*4882a593Smuzhiyun 	_bytes[0] = _val & 0xff; \
237*4882a593Smuzhiyun 	_bytes[1] = (_val >> 8) & 0xff; \
238*4882a593Smuzhiyun 	_bytes[2] = (_val >> 16) & 0xff; \
239*4882a593Smuzhiyun 	_bytes[3] = _val >> 24; \
240*4882a593Smuzhiyun })
241*4882a593Smuzhiyun 
242*4882a593Smuzhiyun #define htol64_ua_store(val, bytes) ({ \
243*4882a593Smuzhiyun 	uint64 _val = (val); \
244*4882a593Smuzhiyun 	uint8 *_bytes = (uint8 *)(bytes); \
245*4882a593Smuzhiyun 	int _ii; \
246*4882a593Smuzhiyun 	for (_ii = 0; _ii < (int)sizeof(_val); ++_ii) { \
247*4882a593Smuzhiyun 		*_bytes++ = _val & 0xff; \
248*4882a593Smuzhiyun 		_val >>= 8; \
249*4882a593Smuzhiyun 	} \
250*4882a593Smuzhiyun })
251*4882a593Smuzhiyun 
252*4882a593Smuzhiyun #define hton16_ua_store(val, bytes) ({ \
253*4882a593Smuzhiyun 	uint16 _val = (val); \
254*4882a593Smuzhiyun 	uint8 *_bytes = (uint8 *)(bytes); \
255*4882a593Smuzhiyun 	_bytes[0] = _val >> 8; \
256*4882a593Smuzhiyun 	_bytes[1] = _val & 0xff; \
257*4882a593Smuzhiyun })
258*4882a593Smuzhiyun 
259*4882a593Smuzhiyun #define hton32_ua_store(val, bytes) ({ \
260*4882a593Smuzhiyun 	uint32 _val = (val); \
261*4882a593Smuzhiyun 	uint8 *_bytes = (uint8 *)(bytes); \
262*4882a593Smuzhiyun 	_bytes[0] = _val >> 24; \
263*4882a593Smuzhiyun 	_bytes[1] = (_val >> 16) & 0xff; \
264*4882a593Smuzhiyun 	_bytes[2] = (_val >> 8) & 0xff; \
265*4882a593Smuzhiyun 	_bytes[3] = _val & 0xff; \
266*4882a593Smuzhiyun })
267*4882a593Smuzhiyun 
268*4882a593Smuzhiyun #define ltoh16_ua(bytes) ({ \
269*4882a593Smuzhiyun 	const uint8 *_bytes = (const uint8 *)(bytes); \
270*4882a593Smuzhiyun 	_LTOH16_UA(_bytes); \
271*4882a593Smuzhiyun })
272*4882a593Smuzhiyun 
273*4882a593Smuzhiyun #define ltoh32_ua(bytes) ({ \
274*4882a593Smuzhiyun 	const uint8 *_bytes = (const uint8 *)(bytes); \
275*4882a593Smuzhiyun 	_LTOH32_UA(_bytes); \
276*4882a593Smuzhiyun })
277*4882a593Smuzhiyun 
278*4882a593Smuzhiyun #define ltoh64_ua(bytes) ({ \
279*4882a593Smuzhiyun 	const uint8 *_bytes = (const uint8 *)(bytes); \
280*4882a593Smuzhiyun 	_LTOH64_UA(_bytes); \
281*4882a593Smuzhiyun })
282*4882a593Smuzhiyun 
283*4882a593Smuzhiyun #define ntoh16_ua(bytes) ({ \
284*4882a593Smuzhiyun 	const uint8 *_bytes = (const uint8 *)(bytes); \
285*4882a593Smuzhiyun 	_NTOH16_UA(_bytes); \
286*4882a593Smuzhiyun })
287*4882a593Smuzhiyun 
288*4882a593Smuzhiyun #define ntoh32_ua(bytes) ({ \
289*4882a593Smuzhiyun 	const uint8 *_bytes = (const uint8 *)(bytes); \
290*4882a593Smuzhiyun 	_NTOH32_UA(_bytes); \
291*4882a593Smuzhiyun })
292*4882a593Smuzhiyun 
293*4882a593Smuzhiyun #define ntoh64_ua(bytes) ({ \
294*4882a593Smuzhiyun 	const uint8 *_bytes = (const uint8 *)(bytes); \
295*4882a593Smuzhiyun 	_NTOH64_UA(_bytes); \
296*4882a593Smuzhiyun })
297*4882a593Smuzhiyun 
298*4882a593Smuzhiyun #else /* !__GNUC__ */
299*4882a593Smuzhiyun 
300*4882a593Smuzhiyun /* Inline versions avoid referencing the argument multiple times */
301*4882a593Smuzhiyun static INLINE uint16
bcmswap16(uint16 val)302*4882a593Smuzhiyun bcmswap16(uint16 val)
303*4882a593Smuzhiyun {
304*4882a593Smuzhiyun 	return BCMSWAP16(val);
305*4882a593Smuzhiyun }
306*4882a593Smuzhiyun 
307*4882a593Smuzhiyun static INLINE uint32
bcmswap32(uint32 val)308*4882a593Smuzhiyun bcmswap32(uint32 val)
309*4882a593Smuzhiyun {
310*4882a593Smuzhiyun 	return BCMSWAP32(val);
311*4882a593Smuzhiyun }
312*4882a593Smuzhiyun 
313*4882a593Smuzhiyun static INLINE uint64
bcmswap64(uint64 val)314*4882a593Smuzhiyun bcmswap64(uint64 val)
315*4882a593Smuzhiyun {
316*4882a593Smuzhiyun 	return BCMSWAP64(val);
317*4882a593Smuzhiyun }
318*4882a593Smuzhiyun 
319*4882a593Smuzhiyun static INLINE uint32
bcmswap32by16(uint32 val)320*4882a593Smuzhiyun bcmswap32by16(uint32 val)
321*4882a593Smuzhiyun {
322*4882a593Smuzhiyun 	return BCMSWAP32BY16(val);
323*4882a593Smuzhiyun }
324*4882a593Smuzhiyun 
325*4882a593Smuzhiyun /* Reverse pairs of bytes in a buffer (not for high-performance use) */
326*4882a593Smuzhiyun /* buf	- start of buffer of shorts to swap */
327*4882a593Smuzhiyun /* len  - byte length of buffer */
328*4882a593Smuzhiyun static INLINE void
bcmswap16_buf(uint16 * buf,uint len)329*4882a593Smuzhiyun bcmswap16_buf(uint16 *buf, uint len)
330*4882a593Smuzhiyun {
331*4882a593Smuzhiyun 	len = len / 2;
332*4882a593Smuzhiyun 
333*4882a593Smuzhiyun 	while (len--) {
334*4882a593Smuzhiyun 		*buf = bcmswap16(*buf);
335*4882a593Smuzhiyun 		buf++;
336*4882a593Smuzhiyun 	}
337*4882a593Smuzhiyun }
338*4882a593Smuzhiyun 
339*4882a593Smuzhiyun /*
340*4882a593Smuzhiyun  * Store 16-bit value to unaligned little-endian byte array.
341*4882a593Smuzhiyun  */
342*4882a593Smuzhiyun static INLINE void
htol16_ua_store(uint16 val,uint8 * bytes)343*4882a593Smuzhiyun htol16_ua_store(uint16 val, uint8 *bytes)
344*4882a593Smuzhiyun {
345*4882a593Smuzhiyun 	bytes[0] = val & 0xff;
346*4882a593Smuzhiyun 	bytes[1] = val >> 8;
347*4882a593Smuzhiyun }
348*4882a593Smuzhiyun 
349*4882a593Smuzhiyun /*
350*4882a593Smuzhiyun  * Store 32-bit value to unaligned little-endian byte array.
351*4882a593Smuzhiyun  */
352*4882a593Smuzhiyun static INLINE void
htol32_ua_store(uint32 val,uint8 * bytes)353*4882a593Smuzhiyun htol32_ua_store(uint32 val, uint8 *bytes)
354*4882a593Smuzhiyun {
355*4882a593Smuzhiyun 	bytes[0] = val & 0xff;
356*4882a593Smuzhiyun 	bytes[1] = (val >> 8) & 0xff;
357*4882a593Smuzhiyun 	bytes[2] = (val >> 16) & 0xff;
358*4882a593Smuzhiyun 	bytes[3] = val >> 24;
359*4882a593Smuzhiyun }
360*4882a593Smuzhiyun 
361*4882a593Smuzhiyun /*
362*4882a593Smuzhiyun  * Store 64-bit value to unaligned little-endian byte array.
363*4882a593Smuzhiyun  */
364*4882a593Smuzhiyun static INLINE void
htol64_ua_store(uint64 val,uint8 * bytes)365*4882a593Smuzhiyun htol64_ua_store(uint64 val, uint8 *bytes)
366*4882a593Smuzhiyun {
367*4882a593Smuzhiyun 	int i;
368*4882a593Smuzhiyun 	for (i = 0; i < sizeof(val); ++i) {
369*4882a593Smuzhiyun 		*bytes++ = (uint8)(val & 0xff);
370*4882a593Smuzhiyun 		val >>= 8;
371*4882a593Smuzhiyun 	}
372*4882a593Smuzhiyun }
373*4882a593Smuzhiyun 
374*4882a593Smuzhiyun /*
375*4882a593Smuzhiyun  * Store 16-bit value to unaligned network-(big-)endian byte array.
376*4882a593Smuzhiyun  */
377*4882a593Smuzhiyun static INLINE void
hton16_ua_store(uint16 val,uint8 * bytes)378*4882a593Smuzhiyun hton16_ua_store(uint16 val, uint8 *bytes)
379*4882a593Smuzhiyun {
380*4882a593Smuzhiyun 	bytes[0] = val >> 8;
381*4882a593Smuzhiyun 	bytes[1] = val & 0xff;
382*4882a593Smuzhiyun }
383*4882a593Smuzhiyun 
384*4882a593Smuzhiyun /*
385*4882a593Smuzhiyun  * Store 32-bit value to unaligned network-(big-)endian byte array.
386*4882a593Smuzhiyun  */
387*4882a593Smuzhiyun static INLINE void
hton32_ua_store(uint32 val,uint8 * bytes)388*4882a593Smuzhiyun hton32_ua_store(uint32 val, uint8 *bytes)
389*4882a593Smuzhiyun {
390*4882a593Smuzhiyun 	bytes[0] = val >> 24;
391*4882a593Smuzhiyun 	bytes[1] = (val >> 16) & 0xff;
392*4882a593Smuzhiyun 	bytes[2] = (val >> 8) & 0xff;
393*4882a593Smuzhiyun 	bytes[3] = val & 0xff;
394*4882a593Smuzhiyun }
395*4882a593Smuzhiyun 
396*4882a593Smuzhiyun /*
397*4882a593Smuzhiyun  * Load 16-bit value from unaligned little-endian byte array.
398*4882a593Smuzhiyun  */
399*4882a593Smuzhiyun static INLINE uint16
ltoh16_ua(const void * bytes)400*4882a593Smuzhiyun ltoh16_ua(const void *bytes)
401*4882a593Smuzhiyun {
402*4882a593Smuzhiyun 	return _LTOH16_UA((const uint8 *)bytes);
403*4882a593Smuzhiyun }
404*4882a593Smuzhiyun 
405*4882a593Smuzhiyun /*
406*4882a593Smuzhiyun  * Load 32-bit value from unaligned little-endian byte array.
407*4882a593Smuzhiyun  */
408*4882a593Smuzhiyun static INLINE uint32
ltoh32_ua(const void * bytes)409*4882a593Smuzhiyun ltoh32_ua(const void *bytes)
410*4882a593Smuzhiyun {
411*4882a593Smuzhiyun 	return _LTOH32_UA((const uint8 *)bytes);
412*4882a593Smuzhiyun }
413*4882a593Smuzhiyun 
414*4882a593Smuzhiyun /*
415*4882a593Smuzhiyun  * Load 64-bit value from unaligned little-endian byte array.
416*4882a593Smuzhiyun  */
417*4882a593Smuzhiyun static INLINE uint64
ltoh64_ua(const void * bytes)418*4882a593Smuzhiyun ltoh64_ua(const void *bytes)
419*4882a593Smuzhiyun {
420*4882a593Smuzhiyun 	return _LTOH64_UA((const uint8 *)bytes);
421*4882a593Smuzhiyun }
422*4882a593Smuzhiyun 
423*4882a593Smuzhiyun /*
424*4882a593Smuzhiyun  * Load 16-bit value from unaligned big-(network-)endian byte array.
425*4882a593Smuzhiyun  */
426*4882a593Smuzhiyun static INLINE uint16
ntoh16_ua(const void * bytes)427*4882a593Smuzhiyun ntoh16_ua(const void *bytes)
428*4882a593Smuzhiyun {
429*4882a593Smuzhiyun 	return _NTOH16_UA((const uint8 *)bytes);
430*4882a593Smuzhiyun }
431*4882a593Smuzhiyun 
432*4882a593Smuzhiyun /*
433*4882a593Smuzhiyun  * Load 32-bit value from unaligned big-(network-)endian byte array.
434*4882a593Smuzhiyun  */
435*4882a593Smuzhiyun static INLINE uint32
ntoh32_ua(const void * bytes)436*4882a593Smuzhiyun ntoh32_ua(const void *bytes)
437*4882a593Smuzhiyun {
438*4882a593Smuzhiyun 	return _NTOH32_UA((const uint8 *)bytes);
439*4882a593Smuzhiyun }
440*4882a593Smuzhiyun 
441*4882a593Smuzhiyun /*
442*4882a593Smuzhiyun  * Load 64-bit value from unaligned big-(network-)endian byte array.
443*4882a593Smuzhiyun  */
444*4882a593Smuzhiyun static INLINE uint64
ntoh64_ua(const void * bytes)445*4882a593Smuzhiyun ntoh64_ua(const void *bytes)
446*4882a593Smuzhiyun {
447*4882a593Smuzhiyun 	return _NTOH64_UA((const uint8 *)bytes);
448*4882a593Smuzhiyun }
449*4882a593Smuzhiyun 
450*4882a593Smuzhiyun #endif /* !__GNUC__ */
451*4882a593Smuzhiyun #endif /* !_BCMENDIAN_H_ */
452