Added support for RHEL6.5
[compat-rdma/compat.git] / include / linux / compat-3.0.h
1 #ifndef LINUX_3_0_COMPAT_H
2 #define LINUX_3_0_COMPAT_H
3
4 #include <linux/version.h>
5
6 #if (LINUX_VERSION_CODE < KERNEL_VERSION(3,0,0))
7
8 #include <linux/rcupdate.h>
9
10 /*
11  * since commit 1c5cae815d19ffe02bdfda1260949ef2b1806171
12  * "net: call dev_alloc_name from register_netdevice" dev_alloc_name is
13  * called automatically. This is not implemented in older kernel
14  * versions so it will result in device wrong names.
15  */
16 static inline int register_netdevice_name(struct net_device *dev)
17 {
18         int err;
19
20         if (strchr(dev->name, '%')) {
21                 err = dev_alloc_name(dev, dev->name);
22                 if (err < 0)
23                         return err;
24         }
25
26         return register_netdevice(dev);
27 }
28
29 #define register_netdevice(dev) register_netdevice_name(dev)
30
31 /* BCMA core, see drivers/bcma/ */
32 #ifndef BCMA_CORE
33 /* Broadcom's specific AMBA core, see drivers/bcma/ */
34 struct bcma_device_id {
35         __u16   manuf;
36         __u16   id;
37         __u8    rev;
38         __u8    class;
39 };
40 #define BCMA_CORE(_manuf, _id, _rev, _class)  \
41         { .manuf = _manuf, .id = _id, .rev = _rev, .class = _class, }
42 #define BCMA_CORETABLE_END  \
43         { 0, },
44
45 #define BCMA_ANY_MANUF          0xFFFF
46 #define BCMA_ANY_ID             0xFFFF
47 #define BCMA_ANY_REV            0xFF
48 #define BCMA_ANY_CLASS          0xFF
49 #endif /* BCMA_CORE */
50
51 #define mac_pton LINUX_BACKPORT(mac_pton)
52 int mac_pton(const char *s, u8 *mac);
53
54 #ifndef CONFIG_COMPAT_IS_KSTRTOX
55 int __must_check kstrtoull_from_user(const char __user *s, size_t count, unsigned int base, unsigned long long *res);
56 int __must_check kstrtoll_from_user(const char __user *s, size_t count, unsigned int base, long long *res);
57 int __must_check kstrtoul_from_user(const char __user *s, size_t count, unsigned int base, unsigned long *res);
58 int __must_check kstrtol_from_user(const char __user *s, size_t count, unsigned int base, long *res);
59 int __must_check kstrtouint_from_user(const char __user *s, size_t count, unsigned int base, unsigned int *res);
60 int __must_check kstrtoint_from_user(const char __user *s, size_t count, unsigned int base, int *res);
61 int __must_check kstrtou16_from_user(const char __user *s, size_t count, unsigned int base, u16 *res);
62 int __must_check kstrtos16_from_user(const char __user *s, size_t count, unsigned int base, s16 *res);
63 int __must_check kstrtou8_from_user(const char __user *s, size_t count, unsigned int base, u8 *res);
64 int __must_check kstrtos8_from_user(const char __user *s, size_t count, unsigned int base, s8 *res);
65
66 static inline int __must_check kstrtou64_from_user(const char __user *s, size_t count, unsigned int base, u64 *res)
67 {
68         return kstrtoull_from_user(s, count, base, res);
69 }
70
71 static inline int __must_check kstrtos64_from_user(const char __user *s, size_t count, unsigned int base, s64 *res)
72 {
73         return kstrtoll_from_user(s, count, base, res);
74 }
75
76 static inline int __must_check kstrtou32_from_user(const char __user *s, size_t count, unsigned int base, u32 *res)
77 {
78         return kstrtouint_from_user(s, count, base, res);
79 }
80
81 static inline int __must_check kstrtos32_from_user(const char __user *s, size_t count, unsigned int base, s32 *res)
82 {
83         return kstrtoint_from_user(s, count, base, res);
84 }
85 #endif
86
87 #ifndef kfree_rcu
88 /* 
89  * This adds a nested function everywhere kfree_rcu() was called. This
90  * function frees the memory and is given as a function to call_rcu().
91  * The rcu callback could happen every time also after the module was
92  *  unloaded and this will cause problems.
93  */
94 #define kfree_rcu(data, rcuhead)                do {                    \
95                 void __kfree_rcu_fn(struct rcu_head *rcu_head)          \
96                 {                                                       \
97                         void *___ptr;                                   \
98                         ___ptr = container_of(rcu_head, typeof(*(data)), rcuhead);\
99                         kfree(___ptr);                                  \
100                 }                                                       \
101                 call_rcu(&(data)->rcuhead, __kfree_rcu_fn);             \
102         } while (0)
103 #endif
104
105 #ifdef MODULE
106
107 /*
108  * The define overwriting module_exit is based on the original module_exit
109  * which looks like this:
110  * #define module_exit(exitfn)                                    \
111  *         static inline exitcall_t __exittest(void)               \
112  *         { return exitfn; }                                      \
113  *         void cleanup_module(void) __attribute__((alias(#exitfn)));
114  *
115  * We replaced the call to the actual function exitfn() with a call to our
116  * function which calls the original exitfn() and then rcu_barrier()
117  *
118  * As a module will not be unloaded that ofter it should not have a big
119  * performance impact when rcu_barrier() is called on every module exit,
120  * also when no kfree_rcu() backport is used in that module.
121  */
122 #undef module_exit
123 #define module_exit(exitfn)                                             \
124         static void __exit __exit_compat(void)                          \
125         {                                                               \
126                 exitfn();                                               \
127                 rcu_barrier();                                          \
128         }                                                               \
129         void cleanup_module(void) __attribute__((alias("__exit_compat")));
130
131 #endif
132
133 #ifndef CONFIG_COMPAT_IS_PHYS_ID_STATE
134 /*
135  * enum ethtool_phys_id_state - indicator state for physical identification
136  * @ETHTOOL_ID_INACTIVE: Physical ID indicator should be deactivated
137  * @ETHTOOL_ID_ACTIVE: Physical ID indicator should be activated
138  * @ETHTOOL_ID_ON: LED should be turned on (used iff %ETHTOOL_ID_ACTIVE
139  *      is not supported)
140  * @ETHTOOL_ID_OFF: LED should be turned off (used iff %ETHTOOL_ID_ACTIVE
141  *      is not supported)
142  */
143 enum ethtool_phys_id_state {
144     ETHTOOL_ID_INACTIVE,
145     ETHTOOL_ID_ACTIVE,
146     ETHTOOL_ID_ON,
147     ETHTOOL_ID_OFF
148 };
149 #endif
150
151 #ifndef NETLINK_RDMA
152 #define NETLINK_RDMA            20
153 #endif
154
155 #endif /* (LINUX_VERSION_CODE < KERNEL_VERSION(3,0,0)) */
156
157 #endif /* LINUX_3_0_COMPAT_H */