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