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