Rearrange module order for easy placement on external builds
[~emulex/for-vlad/old/compat.git] / include / linux / compat-2.6.27.h
1 #ifndef LINUX_26_27_COMPAT_H
2 #define LINUX_26_27_COMPAT_H
3
4 #include <linux/autoconf.h>
5 #include <linux/version.h>
6
7 #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27))
8
9 #include <linux/list.h>
10 #include <linux/pci.h>
11 #include <linux/dma-mapping.h>
12 #include <linux/mmc/sdio.h>
13 #include <linux/mmc/sdio_func.h>
14 #include <linux/netdevice.h>
15 #include <linux/workqueue.h>
16 #include <net/iw_handler.h>
17 #include <asm-generic/bug.h>
18
19 #define PCI_PM_CAP_PME_SHIFT    11
20
21 /* I can't find a more suitable replacement... */
22 #define flush_work(work) cancel_work_sync(work)
23
24 /*
25  * On older kernels we do not have net_device Multi Queue support, but
26  * since we no longer use MQ on mac80211 we can simply use the 0 queue.
27  * Note that if other fullmac drivers make use of this they then need
28  * to be backported somehow or deal with just 1 queueue from MQ.
29  */
30 static inline void netif_tx_wake_all_queues(struct net_device *dev)
31 {
32         netif_wake_queue(dev);
33 }
34 static inline void netif_tx_start_all_queues(struct net_device *dev)
35 {
36         netif_start_queue(dev);
37 }
38 static inline void netif_tx_stop_all_queues(struct net_device *dev)
39 {
40         netif_stop_queue(dev);
41 }
42
43 bool pci_pme_capable(struct pci_dev *dev, pci_power_t state);
44
45 /*
46  * The net_device has a spin_lock on newer kernels, on older kernels we're out of luck
47  */
48 #define netif_addr_lock_bh
49 #define netif_addr_unlock_bh
50
51 /*
52  * To port this properly we'd have to port warn_slowpath_null(),
53  * which I'm lazy to do so just do a regular print for now. If you
54  * want to port this read kernel/panic.c
55  */
56 #define __WARN_printf(arg...)   do { printk(arg); __WARN(); } while (0)
57
58 /* This is ported directly as-is on newer kernels */
59 #ifndef WARN
60 #define WARN(condition, format...) ({                                   \
61         int __ret_warn_on = !!(condition);                              \
62         if (unlikely(__ret_warn_on))                                    \
63                 __WARN_printf(format);                                  \
64         unlikely(__ret_warn_on);                                        \
65 })
66 #endif
67
68 /* On 2.6.27 a second argument was added, on older kernels we ignore it */
69 #define dma_mapping_error(pdev, dma_addr) dma_mapping_error(dma_addr)
70 #define pci_dma_mapping_error(pdev, dma_addr) dma_mapping_error(pdev, dma_addr)
71
72 /* This is from include/linux/ieee80211.h */
73 #define IEEE80211_HT_CAP_DSSSCCK40              0x1000
74
75 /* New link list changes added as of 2.6.27, needed for ath9k */
76
77 static inline void __list_cut_position(struct list_head *list,
78                 struct list_head *head, struct list_head *entry)
79 {
80         struct list_head *new_first = entry->next;
81         list->next = head->next;
82         list->next->prev = list;
83         list->prev = entry;
84         entry->next = list;
85         head->next = new_first;
86         new_first->prev = head;
87 }
88
89 /**
90  * list_cut_position - cut a list into two
91  * @list: a new list to add all removed entries
92  * @head: a list with entries
93  * @entry: an entry within head, could be the head itself
94  *      and if so we won't cut the list
95  *
96  * This helper moves the initial part of @head, up to and
97  * including @entry, from @head to @list. You should
98  * pass on @entry an element you know is on @head. @list
99  * should be an empty list or a list you do not care about
100  * losing its data.
101  *
102  */
103 static inline void list_cut_position(struct list_head *list,
104                 struct list_head *head, struct list_head *entry)
105 {
106         if (list_empty(head))
107                 return;
108         if (list_is_singular(head) &&
109                 (head->next != entry && head != entry))
110                 return;
111         if (entry == head)
112                 INIT_LIST_HEAD(list);
113         else
114                 __list_cut_position(list, head, entry);
115 }
116
117
118 /* __list_splice as re-implemented on 2.6.27, we backport it */
119 static inline void __compat_list_splice_new_27(const struct list_head *list,
120                                  struct list_head *prev,
121                                  struct list_head *next)
122 {
123         struct list_head *first = list->next;
124         struct list_head *last = list->prev;
125
126         first->prev = prev;
127         prev->next = first;
128
129         last->next = next;
130         next->prev = last;
131 }
132
133 /**
134  * list_splice_tail - join two lists, each list being a queue
135  * @list: the new list to add.
136  * @head: the place to add it in the first list.
137  */
138 static inline void list_splice_tail(struct list_head *list,
139                                 struct list_head *head)
140 {
141         if (!list_empty(list))
142                 __compat_list_splice_new_27(list, head->prev, head);
143 }
144
145 /**
146  * list_splice_tail_init - join two lists and reinitialise the emptied list
147  * @list: the new list to add.
148  * @head: the place to add it in the first list.
149  *
150  * Each of the lists is a queue.
151  * The list at @list is reinitialised
152  */
153 static inline void list_splice_tail_init(struct list_head *list,
154                                          struct list_head *head)
155 {
156         if (!list_empty(list)) {
157                 __compat_list_splice_new_27(list, head->prev, head);
158                 INIT_LIST_HEAD(list);
159         }
160 }
161
162 extern unsigned int mmc_align_data_size(struct mmc_card *, unsigned int);
163 extern unsigned int sdio_align_size(struct sdio_func *func, unsigned int sz);
164
165 #define iwe_stream_add_value(info, event, value, ends, iwe, event_len) iwe_stream_add_value(event, value, ends, iwe, event_len)
166 #define iwe_stream_add_point(info, stream, ends, iwe, extra) iwe_stream_add_point(stream, ends, iwe, extra)
167 #define iwe_stream_add_event(info, stream, ends, iwe, event_len) iwe_stream_add_event(stream, ends, iwe, event_len)
168
169 /* Flags available in struct iw_request_info */
170 #define IW_REQUEST_FLAG_COMPAT  0x0001  /* Compat ioctl call */
171
172 static inline int iwe_stream_lcp_len(struct iw_request_info *info)
173 {
174 #ifdef CONFIG_COMPAT
175         if (info->flags & IW_REQUEST_FLAG_COMPAT)
176                 return IW_EV_COMPAT_LCP_LEN;
177 #endif
178         return IW_EV_LCP_LEN;
179 }
180
181 #endif /* (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27)) */
182
183 #endif /* LINUX_26_27_COMPAT_H */