Add initial 2.6.22 support
[~emulex/for-vlad/old/compat.git] / include / linux / compat-2.6.23.h
1 #ifndef LINUX_26_23_COMPAT_H
2 #define LINUX_26_23_COMPAT_H
3
4 #include <linux/autoconf.h>
5 #include <linux/version.h>
6
7 /* Compat work for < 2.6.23 */
8 #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,23))
9
10 #include <linux/netdevice.h>
11 #include <linux/sched.h>
12 #include <linux/workqueue.h>
13 #include <linux/genetlink.h>
14 #include <net/sch_generic.h>
15
16 /*
17  * Tell gcc if a function is cold. The compiler will assume any path
18  * directly leading to the call is unlikely.
19  */
20
21 #if !(__GNUC__ == 4 && __GNUC_MINOR__ < 3)
22 /* Mark functions as cold. gcc will assume any path leading to a call
23  * to them will be unlikely.  This means a lot of manual unlikely()s
24  * are unnecessary now for any paths leading to the usual suspects
25  * like BUG(), printk(), panic() etc. [but let's keep them for now for
26  * older compilers]
27  *
28  * Early snapshots of gcc 4.3 don't support this and we can't detect this
29  * in the preprocessor, but we can live with this because they're unreleased.
30  * Maketime probing would be overkill here.
31  *
32  * gcc also has a __attribute__((__hot__)) to move hot functions into
33  * a special section, but I don't see any sense in this right now in
34  * the kernel context */
35 #define __cold                  __attribute__((__cold__))
36 #endif /* gcc 4.3 check */
37
38 #ifndef __cold
39 #define __cold
40 #endif
41
42 /* Added as of 2.6.23 in include/linux/netdevice.h */
43 #define alloc_netdev_mq(sizeof_priv, name, setup, queue) \
44         alloc_netdev(sizeof_priv, name, setup)
45 #define NETIF_F_MULTI_QUEUE 16384
46
47 /* Added as of 2.6.23 on include/linux/netdevice.h */
48 static inline int netif_is_multiqueue(const struct net_device *dev)
49 {
50         return (!!(NETIF_F_MULTI_QUEUE & dev->features));
51 }
52
53 /* 2.6.23 fixed a bug in tcf_destroy_chain and the parameter changed */
54 static inline void tcf_destroy_chain_compat(struct tcf_proto **fl)
55 {
56         struct tcf_proto *tp;
57
58         while ((tp = *fl) != NULL) {
59                 *fl = tp->next;
60                 tp->ops->destroy(tp);
61                 module_put(tp->ops->owner);
62                 kfree(tp);
63         }
64 }
65
66 /* dev_mc_list was replaced with dev_addr_list as of 2.6.23,
67  * only new member added is da_synced. */
68 #define dev_addr_list   dev_mc_list
69 #define da_addr         dmi_addr
70 #define da_addrlen      dmi_addrlen
71 #define da_users        dmi_users
72 #define da_gusers       dmi_gusers
73
74 /* dev_set_promiscuity() was moved to __dev_set_promiscuity() on 2.6.23 and
75  * dev_set_promiscuity() became a wrapper. */
76 #define __dev_set_promiscuity dev_set_promiscuity
77
78 /* Our own 2.6.22 port on compat.c */
79 extern void     dev_mc_unsync(struct net_device *to, struct net_device *from);
80 extern int      dev_mc_sync(struct net_device *to, struct net_device *from);
81
82 /* Our own 2.6.22 port on compat.c */
83 extern void     __dev_set_rx_mode(struct net_device *dev);
84
85 /* Simple to add this */
86 extern int cancel_delayed_work_sync(struct delayed_work *work);
87
88 #define cancel_delayed_work_sync cancel_rearming_delayed_work
89
90 #define debugfs_rename(a, b, c, d) 1
91
92 /* nl80211 requires multicast group support which is new and added on
93  * 2.6.23. We can't add support for it for older kernels to support it
94  * genl_family structure was changed. Lets just let through the
95  * genl_register_mc_group call. This means no multicast group suppport */
96
97 #define genl_register_mc_group(a, b) 0
98
99 /**
100  * struct genl_multicast_group - generic netlink multicast group
101  * @name: name of the multicast group, names are per-family
102  * @id: multicast group ID, assigned by the core, to use with
103  *      genlmsg_multicast().
104  * @list: list entry for linking
105  * @family: pointer to family, need not be set before registering
106  */
107 struct genl_multicast_group
108 {
109         struct genl_family      *family;        /* private */
110         struct list_head        list;           /* private */
111         char                    name[GENL_NAMSIZ];
112         u32                     id;
113 };
114
115
116 /* Added as of 2.6.23 */
117 int pci_try_set_mwi(struct pci_dev *dev);
118
119 /* Added as of 2.6.23 */
120 #ifdef CONFIG_PM_SLEEP
121 /*
122  * Tell the freezer that the current task should be frozen by it
123  */
124 static inline void set_freezable(void)
125 {
126         current->flags &= ~PF_NOFREEZE;
127 }
128
129 #else
130 static inline void set_freezable(void) {}
131 #endif /* CONFIG_PM_SLEEP */
132
133 #else
134 #define tcf_destroy_chain_compat tcf_destroy_chain
135 #endif /* (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,23)) */
136
137 #endif /* LINUX_26_23_COMPAT_H */