Added support for RHEL6.5
[compat-rdma/compat.git] / include / linux / compat-2.6.38.h
1 #ifndef LINUX_26_38_COMPAT_H
2 #define LINUX_26_38_COMPAT_H
3
4 #include <linux/version.h>
5
6 #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,38))
7
8 #include <linux/kernel.h>
9 #include <linux/skbuff.h>
10 #include <linux/etherdevice.h>
11 #include <net/sch_generic.h>
12
13 #define __DEFERRED_WORK_INITIALIZER(n, f) {                     \
14         .work = __WORK_INITIALIZER((n).work, (f)),              \
15         .timer = TIMER_DEFERRED_INITIALIZER(NULL, 0, 0),        \
16         }
17
18 #define DECLARE_DEFERRED_WORK(n, f)                            \
19         struct delayed_work n = __DEFERRED_WORK_INITIALIZER(n, f)
20
21 #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,30))
22 static inline void bstats_update(struct gnet_stats_basic_packed *bstats,
23                                  const struct sk_buff *skb)
24 {
25         bstats->bytes += qdisc_pkt_len((struct sk_buff *) skb);
26         bstats->packets += skb_is_gso(skb) ? skb_shinfo(skb)->gso_segs : 1;
27 }
28 static inline void qdisc_bstats_update(struct Qdisc *sch,
29                                        const struct sk_buff *skb)
30 {
31         bstats_update(&sch->bstats, skb);
32 }
33 #else
34 /*
35  * kernels <= 2.6.30 do not pass a const skb to qdisc_pkt_len, and
36  * gnet_stats_basic_packed did not exist (see c1a8f1f1c8)
37  */
38 static inline void bstats_update(struct gnet_stats_basic *bstats,
39                                  struct sk_buff *skb)
40 {
41         bstats->bytes += qdisc_pkt_len(skb);
42         bstats->packets += skb_is_gso(skb) ? skb_shinfo(skb)->gso_segs : 1;
43 }
44 static inline void qdisc_bstats_update(struct Qdisc *sch,
45                                        struct sk_buff *skb)
46 {
47         bstats_update(&sch->bstats, skb);
48 }
49 #endif
50
51
52 /* rename member in struct mmc_host in include/linux/mmc/host.h */
53 #define max_segs        max_hw_segs
54
55
56 /* Exponentially weighted moving average (EWMA) */
57
58 /* For more documentation see lib/average.c */
59
60 struct ewma {
61         unsigned long internal;
62         unsigned long factor;
63         unsigned long weight;
64 };
65
66 #define ewma_init LINUX_BACKPORT(ewma_init)
67 extern void ewma_init(struct ewma *avg, unsigned long factor,
68                       unsigned long weight);
69
70 #define ewma_add LINUX_BACKPORT(ewma_add)
71 extern struct ewma *ewma_add(struct ewma *avg, unsigned long val);
72
73 #define ewma_read LINUX_BACKPORT(ewma_read)
74 /**
75  * ewma_read() - Get average value
76  * @avg: Average structure
77  *
78  * Returns the average value held in @avg.
79  */
80 static inline unsigned long ewma_read(const struct ewma *avg)
81 {
82         return DIV_ROUND_CLOSEST(avg->internal, avg->factor);
83 }
84
85 #define pr_warn pr_warning
86 #ifndef create_freezable_workqueue
87 #define create_freezable_workqueue create_freezeable_workqueue
88 #endif
89
90 /* mask skb_checksum_start_offset as RHEL6.4 backports this */
91 #define skb_checksum_start_offset(a) compat_skb_checksum_start_offset(a)
92 static inline int skb_checksum_start_offset(const struct sk_buff *skb)
93 {
94         return skb->csum_start - skb_headroom(skb);
95 }
96
97 /* from include/linux/printk.h */ 
98 #define pr_emerg_once(fmt, ...)                                 \
99         printk_once(KERN_EMERG pr_fmt(fmt), ##__VA_ARGS__)
100 #define pr_alert_once(fmt, ...)                                 \
101         printk_once(KERN_ALERT pr_fmt(fmt), ##__VA_ARGS__)
102 #define pr_crit_once(fmt, ...)                                  \
103         printk_once(KERN_CRIT pr_fmt(fmt), ##__VA_ARGS__)
104 #define pr_err_once(fmt, ...)                                   \
105         printk_once(KERN_ERR pr_fmt(fmt), ##__VA_ARGS__)
106 #define pr_warn_once(fmt, ...)                                  \
107         printk_once(KERN_WARNING pr_fmt(fmt), ##__VA_ARGS__)
108 #define pr_notice_once(fmt, ...)                                \
109         printk_once(KERN_NOTICE pr_fmt(fmt), ##__VA_ARGS__)
110 #define pr_info_once(fmt, ...)                                  \
111         printk_once(KERN_INFO pr_fmt(fmt), ##__VA_ARGS__)
112 #define pr_cont_once(fmt, ...)                                  \
113         printk_once(KERN_CONT pr_fmt(fmt), ##__VA_ARGS__)
114 #if defined(DEBUG)
115 #define pr_debug_once(fmt, ...)                                 \
116         printk_once(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__)
117 #else
118 #define pr_debug_once(fmt, ...)                                 \
119         no_printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__)
120 #endif
121
122 /* include/linux/netdevice.h */
123 #define alloc_netdev_mqs(sizeof_priv, name, setup, txqs, rxqs) \
124         alloc_netdev_mq(sizeof_priv, name, setup, \
125                         max_t(unsigned int, txqs, rxqs))
126
127 #define ETH_P_LINK_CTL  0x886c          /* HPNA, wlan link local tunnel */
128
129 /**
130  * is_unicast_ether_addr - Determine if the Ethernet address is unicast
131  * @addr: Pointer to a six-byte array containing the Ethernet address
132  *
133  * Return true if the address is a unicast address.
134  */
135 #define is_unicast_ether_addr LINUX_BACKPORT(is_unicast_ether_addr)
136 static inline int is_unicast_ether_addr(const u8 *addr)
137 {
138         return !is_multicast_ether_addr(addr);
139 }
140
141 static inline int netdev_queue_numa_node_read(const struct netdev_queue *q)
142 {
143 #if defined(CONFIG_XPS) && defined(CONFIG_NUMA)
144     return q->numa_node;
145 #else
146     return NUMA_NO_NODE;
147 #endif
148 }
149
150 #endif /* (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,38)) */
151
152 #endif /* LINUX_26_38_COMPAT_H */