blob: 7a13fa0691afa051b8ee53f0ecba1fda7294e920 [file] [log] [blame]
/** @file wl_macros.h
*
* @brief Common macros are defined here. Must include "wltypes.h" before this file
*
* Copyright (C) 2014, Marvell International Ltd.
*
* This software file (the "File") is distributed by Marvell International
* Ltd. under the terms of the GNU General Public License Version 2, June 1991
* (the "License"). You may use, redistribute and/or modify this File in
* accordance with the terms and conditions of the License, a copy of which
* is available by writing to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA or on the
* worldwide web at http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
*
* THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE
* IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE
* ARE EXPRESSLY DISCLAIMED. The License provides additional details about
* this warranty disclaimer.
*/
/******************************************************
Change log:
03/07/2014: Initial version
******************************************************/
#if !defined(WL_MACROS_H__)
#define WL_MACROS_H__
#define MACRO_START do {
#define MACRO_END } while (0)
#define WL_REGS8(x) (*(volatile unsigned char *)(x))
#define WL_REGS16(x) (*(volatile unsigned short *)(x))
#define WL_REGS32(x) (*(volatile unsigned int *)(x))
#define WL_READ_REGS8(reg,val) ((val) = WL_REGS8(reg))
#define WL_READ_REGS16(reg,val) ((val) = WL_REGS16(reg))
#define WL_READ_REGS32(reg,val) ((val) = WL_REGS32(reg))
#define WL_READ_BYTE(reg,val) ((val) = WL_REGS8(reg))
#define WL_READ_HWORD(reg,val) ((val) = WL_REGS16(reg)) /* half word; */
/*16bits */
#define WL_READ_WORD(reg,val) ((val) = WL_REGS32(reg)) /* 32 bits */
#define WL_WRITE_REGS8(reg,val) (WL_REGS8(reg) = (val))
#define WL_WRITE_REGS16(reg,val) (WL_REGS16(reg) = (val))
#define WL_WRITE_REGS32(reg,val) (WL_REGS32(reg) = (val))
#define WL_WRITE_BYTE(reg,val) (WL_REGS8(reg) = (val))
#define WL_WRITE_HWORD(reg,val) (WL_REGS16(reg) = (val)) /* half word; */
/*16bits */
#define WL_WRITE_WORD(reg,val) (WL_REGS32(reg) = (val)) /* 32 bits */
#define WL_REGS8_SETBITS(reg, val) (WL_REGS8(reg) |= (UINT8)(val))
#define WL_REGS16_SETBITS(reg, val) (WL_REGS16(reg) |= (UINT16)(val))
#define WL_REGS32_SETBITS(reg, val) (WL_REGS32(reg) |= (val))
#define WL_REGS8_CLRBITS(reg, val) (WL_REGS8(reg) = \
(UINT8)(WL_REGS8(reg)&~(val)))
#define WL_REGS16_CLRBITS(reg, val) (WL_REGS16(reg) = \
(UINT16)(WL_REGS16(reg)&~(val)))
#define WL_REGS32_CLRBITS(reg, val) (WL_REGS32(reg) = \
(WL_REGS32(reg)&~(val)))
#define WL_WRITE_CHUNK(dst, src, length) (memcpy((void*) (dst), \
(void*) (src), (length)))
/*!
* Bitmask macros
*/
#define WL_BITMASK(nbits) ((0x1 << nbits) - 1)
/*!
* Macro to put the WLAN SoC into sleep mode
*/
#define WL_GO_TO_SLEEP asm volatile ("MCR p15, 0, r3, c7, c0, 4;")
/*!
* BE vs. LE macros
*/
#ifdef BE /* Big Endian */
#define SHORT_SWAP(X) (X)
#define WORD_SWAP(X) (X)
#define LONG_SWAP(X) ((l64)(X))
#else /* Little Endian */
#define SHORT_SWAP(X) ((X <<8 ) | (X >> 8)) // !< swap bytes in a 16 bit
// short
#define WORD_SWAP(X) (((X)&0xff)<<24)+ \
(((X)&0xff00)<<8)+ \
(((X)&0xff0000)>>8)+ \
(((X)&0xff000000)>>24) // !< swap bytes in a 32 bit
// word
#define LONG_SWAP(X) ( (l64) (((X)&0xffULL)<<56)+ \
(((X)&0xff00ULL)<<40)+ \
(((X)&0xff0000ULL)<<24)+ \
(((X)&0xff000000ULL)<<8)+ \
(((X)&0xff00000000ULL)>>8)+ \
(((X)&0xff0000000000ULL)>>24)+ \
(((X)&0xff000000000000ULL)>>40)+ \
(((X)&0xff00000000000000ULL)>>56)) // !< swap
// bytes in a
// 64 bit long
#endif
/*!
* Alignment macros
*/
#define ALIGN4(x) (((x) + 3) & ~3)
#define ALIGN4BYTE(x) (x=ALIGN4(x))
#define ROUNDUP4US(x) (ALIGN4(x))
#ifndef min
#define min(a,b) (((a) < (b)) ? (a) : (b))
#endif
#ifndef max
#define max(a,b) (((a) > (b)) ? (a) : (b))
#endif
#ifndef MIN
#define MIN(a,b) (((a) < (b)) ? (a) : (b))
#endif
#ifndef MAX
#define MAX(a,b) (((a) > (b)) ? (a) : (b))
#endif
#ifndef NELEMENTS
#define NELEMENTS(x) (sizeof(x)/sizeof(x[0]))
#endif
#define HWORD_LOW_BYTE(x) ((x) & 0xFF)
#define HWORD_HIGH_BYTE(x) (((x) >> 8) & 0xFF)
#define htons(x) (UINT16)SHORT_SWAP(x)
#define htonl(x) (UINT32)WORD_SWAP(x)
#define ntohs(x) (UINT16)SHORT_SWAP(x)
#define ntohl(x) (UINT32)WORD_SWAP(x)
#define CEIL_aByb(a, b) ((a + b - 1) / b)
#endif /* _WL_MACROS_H_ */