[svn-upgrade] new version madwifi (0.9.4+r4133.20100922)
[debian/madwifi.git] / include / compat.h
1 /*-
2  * Copyright (c) 2002-2005 Sam Leffler, Errno Consulting
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer,
10  *    without modification.
11  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
12  *    similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any
13  *    redistribution must be conditioned upon including a substantially
14  *    similar Disclaimer requirement for further binary redistribution.
15  * 3. Neither the names of the above-listed copyright holders nor the names
16  *    of any contributors may be used to endorse or promote products derived
17  *    from this software without specific prior written permission.
18  *
19  * Alternatively, this software may be distributed under the terms of the
20  * GNU General Public License ("GPL") version 2 as published by the Free
21  * Software Foundation.
22  *
23  * NO WARRANTY
24  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
25  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
26  * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY
27  * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
28  * THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY,
29  * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
30  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
31  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
32  * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
33  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
34  * THE POSSIBILITY OF SUCH DAMAGES.
35  *
36  * $Id: compat.h 4133 2010-06-20 12:13:10Z proski $
37  */
38 #ifndef _ATH_COMPAT_H_
39 #define _ATH_COMPAT_H_
40
41 /* Compatibility with older Linux kernels */
42 #ifdef __KERNEL__
43 #include <linux/types.h>
44 #include <linux/time.h>
45 #include <linux/netdevice.h>
46 #include <linux/kernel.h>
47 #include <linux/kmod.h>
48 #endif
49
50 #include <linux/version.h>
51
52 #if !defined(__KERNEL__) || !defined (__bitwise)
53 #define __le16 u_int16_t
54 #define __le32 u_int32_t
55 #define __le64 u_int64_t
56 #define __be16 u_int16_t
57 #define __be32 u_int32_t
58 #define __be64 u_int64_t
59 #define __force
60 #endif
61
62 #ifndef container_of
63 #define container_of(ptr, type, member) ({                      \
64         const typeof( ((type *)0)->member ) *__mptr = (ptr);    \
65         (type *)( (char *)__mptr - offsetof(type,member) );})
66 #endif
67
68 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,34)
69 #define netdev_for_each_mc_addr(mclist, dev) \
70         for (mclist = dev->mc_list; mclist; mclist = mclist->next)
71 #endif
72
73 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,35)
74 #define ath_netdev_hw_addr dev_mc_list
75 #define ath_ha_addr(ha) ha->dmi_addr
76 #else
77 #define ath_netdev_hw_addr netdev_hw_addr
78 #define ath_ha_addr(ha) ha->addr
79 #endif
80
81 /*
82  * BSD/Linux compatibility shims.  These are used mainly to
83  * minimize differences when importing necesary BSD code.
84  */
85 #define NBBY    8                       /* number of bits/byte */
86
87 /* roundup() appears in Linux 2.6.18 */
88 #ifndef roundup
89 #define roundup(x, y)   ((((x)+((y)-1))/(y))*(y))  /* to any y */ 
90 #endif
91
92 #define howmany(x, y)   (((x)+((y)-1))/(y))
93
94 /* Bit map related macros. */
95 #define setbit(a,i)     ((a)[(i)/NBBY] |= 1<<((i)%NBBY))
96 #define clrbit(a,i)     ((a)[(i)/NBBY] &= ~(1<<((i)%NBBY)))
97 #define isset(a,i)      ((a)[(i)/NBBY] & (1<<((i)%NBBY)))
98 #define isclr(a,i)      (((a)[(i)/NBBY] & (1<<((i)%NBBY))) == 0)
99
100 #ifndef __packed
101 #define __packed        __attribute__((__packed__))
102 #endif
103
104 #define __printflike(_a,_b) \
105         __attribute__ ((__format__ (__printf__, _a, _b)))
106 #define __offsetof(t,m) offsetof(t,m)
107
108 #ifndef ALIGNED_POINTER
109 /*
110  * ALIGNED_POINTER is a boolean macro that checks whether an address
111  * is valid to fetch data elements of type t from on this architecture.
112  * This does not reflect the optimal alignment, just the possibility
113  * (within reasonable limits). 
114  *
115  */
116 #define ALIGNED_POINTER(p,t)    1
117 #endif
118
119 #ifdef __KERNEL__
120 #define KASSERT(exp, msg) do {                  \
121         if (unlikely(!(exp))) {                 \
122                 printk msg;                     \
123                 BUG();                          \
124         }                                       \
125 } while (0)
126 #endif /* __KERNEL__ */
127
128 /*
129  * NetBSD/FreeBSD defines for file version.
130  */
131 #define __FBSDID(_s)
132 #define __KERNEL_RCSID(_n,_s)
133
134 /*
135  * Fixes for Linux API changes
136  */
137 #ifdef __KERNEL__
138
139 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,14)
140 #define gfp_t unsigned int
141
142 static inline void *_kzalloc(size_t size, gfp_t flags)
143 {
144         void *p = kmalloc(size, flags);
145         if (likely(p != NULL))
146                 memset(p, 0, size);
147         return p;
148 }
149
150 #define kzalloc(size, flags) _kzalloc(size, flags)
151 #endif
152
153 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21)
154 #define ATH_REGISTER_SYSCTL_TABLE(t) register_sysctl_table(t, 1)
155 #else
156 #define ATH_REGISTER_SYSCTL_TABLE(t) register_sysctl_table(t)
157 #endif
158
159 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,9)
160 #define __user
161 #define __kernel
162 #define __iomem
163 #endif
164
165 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18)
166 #define IRQF_SHARED SA_SHIRQ
167 #endif
168
169 #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,4,27)) || \
170     ((LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)) && \
171      ((LINUX_VERSION_CODE < KERNEL_VERSION(2,6,3))))
172 #define netdev_priv(_netdev) ((_netdev)->priv)
173 #endif
174
175 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,22)
176 #define skb_end_pointer(_skb) ((_skb)->end)
177 #define skb_tail_pointer(_skb) ((_skb)->tail)
178 #define skb_set_network_header(_skb, _offset) \
179         do { (_skb)->nh.raw = (_skb)->data + (_offset); } while (0)
180 #define skb_reset_network_header(_skb) \
181         do { (_skb)->nh.raw = (_skb)->data; } while (0)
182 #define skb_mac_header(_skb) ((_skb)->mac.raw)
183 #define skb_reset_mac_header(_skb) \
184         do { (_skb)->mac.raw = (_skb)->data; } while (0)
185 #endif
186
187 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)
188 #define CTL_AUTO -2
189 #define DEV_ATH 9
190 #else
191 #define CTL_AUTO CTL_UNNUMBERED
192 #define DEV_ATH CTL_UNNUMBERED
193 #endif
194
195 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,33)
196 #define ATH_INIT_CTL_NAME(val)
197 #define ATH_SET_CTL_NAME(ctl, val)
198 #else
199 #define ATH_INIT_CTL_NAME(val) .ctl_name = val,
200 #define ATH_SET_CTL_NAME(ctl, val) ctl.ctl_name = val
201 #endif
202
203 /* __skb_append got a third parameter in 2.6.14 */
204 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,14)
205 #define __skb_queue_after(_list, _old, _new)    __skb_append(_old, _new)
206 #elif LINUX_VERSION_CODE < KERNEL_VERSION(2,6,25)
207 #define __skb_queue_after(_list, _old, _new)    __skb_append(_old, _new, _list)
208 #endif
209
210 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
211 #define request_module(_fmt, _modname) request_module(_modname)
212 #endif
213
214 #endif /* __KERNEL__ */
215
216 #endif /* _ATH_COMPAT_H_ */