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