1a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger/******************************************************************************
2a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger *
3a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
4a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger *
5a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger * This program is free software; you can redistribute it and/or modify it
6a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger * under the terms of version 2 of the GNU General Public License as
7a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger * published by the Free Software Foundation.
8a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger *
9a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger * This program is distributed in the hope that it will be useful, but WITHOUT
10a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger * more details.
13a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger *
14a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger * You should have received a copy of the GNU General Public License along with
15a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger * this program; if not, write to the Free Software Foundation, Inc.,
16a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger *
18a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger *
19a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger ******************************************************************************/
20a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger#ifndef __BASIC_TYPES_H__
21a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger#define __BASIC_TYPES_H__
22a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger
23a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger#define SUCCESS	0
24a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger#define FAIL	(-1)
25a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger
26a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger#include <linux/types.h>
27a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger#define NDIS_OID uint
28a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger
29a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Fingertypedef void (*proc_t)(void *);
30a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger
31a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger#define FIELD_OFFSET(s, field)	((ssize_t)&((s *)(0))->field)
32a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger
33a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger#define MEM_ALIGNMENT_OFFSET	(sizeof(size_t))
34a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger#define MEM_ALIGNMENT_PADDING	(sizeof(size_t) - 1)
35a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger
36a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger/* port from fw */
37a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger/*  TODO: Macros Below are Sync from SD7-Driver. It is necessary
38a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger * to check correctness */
39a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger
40a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger/*
41a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger *	Call endian free function when
42a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger *		1. Read/write packet content.
43a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger *		2. Before write integer to IO.
44a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger *		3. After read integer from IO.
45a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger*/
46a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger
47a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger/* Convert little data endian to host ordering */
48a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger#define EF1BYTE(_val)		\
49a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger	((u8)(_val))
50a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger#define EF2BYTE(_val)		\
51a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger	(le16_to_cpu(_val))
52a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger#define EF4BYTE(_val)		\
53a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger	(le32_to_cpu(_val))
54a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger
55a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger/* Read data from memory */
56a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger#define READEF1BYTE(_ptr)	\
57a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger	EF1BYTE(*((u8 *)(_ptr)))
58a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger/* Read le16 data from memory and convert to host ordering */
59a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger#define READEF2BYTE(_ptr)	\
60a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger	EF2BYTE(*(_ptr))
61a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger#define READEF4BYTE(_ptr)	\
62a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger	EF4BYTE(*(_ptr))
63a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger
64a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger/* Write data to memory */
65a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger#define WRITEEF1BYTE(_ptr, _val)			\
66a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger	do {						\
67a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger		(*((u8 *)(_ptr))) = EF1BYTE(_val)	\
68a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger	} while (0)
69a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger/* Write le data to memory in host ordering */
70a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger#define WRITEEF2BYTE(_ptr, _val)			\
71a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger	do {						\
72a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger		(*((u16 *)(_ptr))) = EF2BYTE(_val)	\
73a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger	} while (0)
74a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger
75a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger#define WRITEEF4BYTE(_ptr, _val)			\
76a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger	do {						\
77a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger		(*((u32 *)(_ptr))) = EF2BYTE(_val)	\
78a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger	} while (0)
79a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger
80a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger/* Create a bit mask
81a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger * Examples:
82a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger * BIT_LEN_MASK_32(0) => 0x00000000
83a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger * BIT_LEN_MASK_32(1) => 0x00000001
84a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger * BIT_LEN_MASK_32(2) => 0x00000003
85a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger * BIT_LEN_MASK_32(32) => 0xFFFFFFFF
86a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger */
87a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger#define BIT_LEN_MASK_32(__bitlen)	 \
88a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger	(0xFFFFFFFF >> (32 - (__bitlen)))
89a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger#define BIT_LEN_MASK_16(__bitlen)	 \
90a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger	(0xFFFF >> (16 - (__bitlen)))
91a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger#define BIT_LEN_MASK_8(__bitlen) \
92a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger	(0xFF >> (8 - (__bitlen)))
93a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger
94a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger/* Create an offset bit mask
95a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger * Examples:
96a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger * BIT_OFFSET_LEN_MASK_32(0, 2) => 0x00000003
97a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger * BIT_OFFSET_LEN_MASK_32(16, 2) => 0x00030000
98a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger */
99a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger#define BIT_OFFSET_LEN_MASK_32(__bitoffset, __bitlen) \
100a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger	(BIT_LEN_MASK_32(__bitlen) << (__bitoffset))
101a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger#define BIT_OFFSET_LEN_MASK_16(__bitoffset, __bitlen) \
102a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger	(BIT_LEN_MASK_16(__bitlen) << (__bitoffset))
103a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger#define BIT_OFFSET_LEN_MASK_8(__bitoffset, __bitlen) \
104a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger	(BIT_LEN_MASK_8(__bitlen) << (__bitoffset))
105a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger
106a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger/*Description:
107a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger * Return 4-byte value in host byte ordering from
108a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger * 4-byte pointer in little-endian system.
109a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger */
110a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger#define LE_P4BYTE_TO_HOST_4BYTE(__pstart) \
111a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger	(EF4BYTE(*((__le32 *)(__pstart))))
112a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger#define LE_P2BYTE_TO_HOST_2BYTE(__pstart) \
113a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger	(EF2BYTE(*((__le16 *)(__pstart))))
114a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger#define LE_P1BYTE_TO_HOST_1BYTE(__pstart) \
115a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger	(EF1BYTE(*((u8 *)(__pstart))))
116a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger
117a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger/*Description:
118a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry FingerTranslate subfield (continuous bits in little-endian) of 4-byte
119a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Fingervalue to host byte ordering.*/
120a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger#define LE_BITS_TO_4BYTE(__pstart, __bitoffset, __bitlen) \
121a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger	( \
122a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger		(LE_P4BYTE_TO_HOST_4BYTE(__pstart) >> (__bitoffset))  & \
123a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger		BIT_LEN_MASK_32(__bitlen) \
124a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger	)
125a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger#define LE_BITS_TO_2BYTE(__pstart, __bitoffset, __bitlen) \
126a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger	( \
127a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger		(LE_P2BYTE_TO_HOST_2BYTE(__pstart) >> (__bitoffset)) & \
128a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger		BIT_LEN_MASK_16(__bitlen) \
129a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger	)
130a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger#define LE_BITS_TO_1BYTE(__pstart, __bitoffset, __bitlen) \
131a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger	( \
132a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger		(LE_P1BYTE_TO_HOST_1BYTE(__pstart) >> (__bitoffset)) & \
133a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger		BIT_LEN_MASK_8(__bitlen) \
134a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger	)
135a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger
136a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger/* Description:
137a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger * Mask subfield (continuous bits in little-endian) of 4-byte value
138a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger * and return the result in 4-byte value in host byte ordering.
139a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger */
140a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger#define LE_BITS_CLEARED_TO_4BYTE(__pstart, __bitoffset, __bitlen) \
141a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger	( \
142a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger		LE_P4BYTE_TO_HOST_4BYTE(__pstart)  & \
143a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger		(~BIT_OFFSET_LEN_MASK_32(__bitoffset, __bitlen)) \
144a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger	)
145a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger#define LE_BITS_CLEARED_TO_2BYTE(__pstart, __bitoffset, __bitlen) \
146a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger	( \
147a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger		LE_P2BYTE_TO_HOST_2BYTE(__pstart) & \
148a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger		(~BIT_OFFSET_LEN_MASK_16(__bitoffset, __bitlen)) \
149a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger	)
150a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger#define LE_BITS_CLEARED_TO_1BYTE(__pstart, __bitoffset, __bitlen) \
151a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger	( \
152a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger		LE_P1BYTE_TO_HOST_1BYTE(__pstart) & \
153a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger		(~BIT_OFFSET_LEN_MASK_8(__bitoffset, __bitlen)) \
154a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger	)
155a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger
156a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger/* Description:
157a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger * Set subfield of little-endian 4-byte value to specified value.
158a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger */
159a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger#define SET_BITS_TO_LE_4BYTE(__pstart, __bitoffset, __bitlen, __val) \
160a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger		*((u32 *)(__pstart)) =				\
161a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger		(							\
162a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger		LE_BITS_CLEARED_TO_4BYTE(__pstart, __bitoffset, __bitlen) | \
163a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger		((((u32)__val) & BIT_LEN_MASK_32(__bitlen)) << (__bitoffset)) \
164a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger		)
165a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger
166a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger#define SET_BITS_TO_LE_2BYTE(__pstart, __bitoffset, __bitlen, __val) \
167a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger		*((u16 *)(__pstart)) =				\
168a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger		(						\
169a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger		LE_BITS_CLEARED_TO_2BYTE(__pstart, __bitoffset, __bitlen) | \
170a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger		((((u16)__val) & BIT_LEN_MASK_16(__bitlen)) << (__bitoffset)) \
171a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger		);
172a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger
173a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger#define SET_BITS_TO_LE_1BYTE(__pstart, __bitoffset, __bitlen, __val) \
174a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger		*((u8 *)(__pstart)) = EF1BYTE			\
175a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger		(						\
176a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger		LE_BITS_CLEARED_TO_1BYTE(__pstart, __bitoffset, __bitlen) | \
177a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger		((((u8)__val) & BIT_LEN_MASK_8(__bitlen)) << (__bitoffset)) \
178a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger		)
179a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger
180a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger/*  Get the N-bytes aligment offset from the current length */
181a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger#define	N_BYTE_ALIGMENT(__value, __aligment) ((__aligment == 1) ? \
182a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger	(__value) : (((__value + __aligment - 1) / __aligment) * __aligment))
183a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger
184a7c947b7f3a4e120e7baadfe7a3b3675088100feLarry Finger#endif /* __BASIC_TYPES_H__ */
185