compat: add ndo_do_ioctl()
[~tnikolova/compat/.git] / include / linux / compat-2.6.29.h
1 #ifndef LINUX_26_29_COMPAT_H
2 #define LINUX_26_29_COMPAT_H
3
4 #include <linux/version.h>
5 #include <linux/netdevice.h>
6 #include <linux/if_link.h>
7
8 /*
9  * I kow this looks odd.. but 2.6.32 added the netdev_tx_t
10  * and we backport that there so inlcude that header first
11  * as we need it for the netdev ops.
12  */
13 #include <linux/compat-2.6.32.h>
14
15 #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,29))
16
17 #include <linux/skbuff.h>
18 #include <linux/usb.h>
19 #include <linux/types.h>
20
21 /* backports  */
22 static inline void usb_autopm_put_interface_async(struct usb_interface *intf)
23 { }
24 static inline int usb_autopm_get_interface_async(struct usb_interface *intf)
25 { return 0; }
26
27 #if \
28         defined(CONFIG_ALPHA) || defined(CONFIG_AVR32) || \
29         defined(CONFIG_BLACKFIN) || defined(CONFIG_CRIS) || \
30         defined(CONFIG_H8300) || defined(CONFIG_IA64) || \
31         defined(CONFIG_M68K) ||  defined(CONFIG_MIPS) || \
32         defined(CONFIG_PARISC) || defined(CONFIG_S390) || \
33         defined(CONFIG_PPC64) || defined(CONFIG_PPC32) || \
34         defined(CONFIG_SUPERH) || defined(CONFIG_SPARC) || \
35         defined(CONFIG_FRV) || defined(CONFIG_X86) || \
36         defined(CONFIG_M32R) || defined(CONFIG_M68K) || \
37         defined(CONFIG_MN10300) || defined(CONFIG_XTENSA)
38 #include <asm/atomic.h>
39 #else
40 typedef struct {
41         volatile int counter;
42 } atomic_t;
43
44 #ifdef CONFIG_64BIT
45 typedef struct {
46         volatile long counter;
47 } atomic64_t;
48 #endif /* CONFIG_64BIT */
49
50 #endif
51
52 #define  PCI_EXP_LNKCTL_ES     0x0080  /* Extended Synch */
53
54 /*
55  * Older kernels do not have struct net_device_ops but what we can
56  * do is just define the data structure and use a caller to let us
57  * set the data structure's routines onto the old netdev, essentially
58  * doing it the old way. This avoids huge deltas on our backports.
59  */
60
61 /*
62  * This structure defines the management hooks for network devices.
63  * The following hooks can be defined; unless noted otherwise, they are
64  * optional and can be filled with a null pointer.
65  *
66  * int (*ndo_init)(struct net_device *dev);
67  *     This function is called once when network device is registered.
68  *     The network device can use this to any late stage initializaton
69  *     or semantic validattion. It can fail with an error code which will
70  *     be propogated back to register_netdev
71  *
72  * void (*ndo_uninit)(struct net_device *dev);
73  *     This function is called when device is unregistered or when registration
74  *     fails. It is not called if init fails.
75  *
76  * int (*ndo_open)(struct net_device *dev);
77  *     This function is called when network device transistions to the up
78  *     state.
79  *
80  * int (*ndo_stop)(struct net_device *dev);
81  *     This function is called when network device transistions to the down
82  *     state.
83  *
84  * netdev_tx_t (*ndo_start_xmit)(struct sk_buff *skb,
85  *                               struct net_device *dev);
86  *      Called when a packet needs to be transmitted.
87  *      Must return NETDEV_TX_OK , NETDEV_TX_BUSY.
88  *        (can also return NETDEV_TX_LOCKED iff NETIF_F_LLTX)
89  *      Required can not be NULL.
90  *
91  * u16 (*ndo_select_queue)(struct net_device *dev, struct sk_buff *skb);
92  *      Called to decide which queue to when device supports multiple
93  *      transmit queues.
94  *
95  * void (*ndo_change_rx_flags)(struct net_device *dev, int flags);
96  *      This function is called to allow device receiver to make
97  *      changes to configuration when multicast or promiscious is enabled.
98  *
99  * void (*ndo_set_rx_mode)(struct net_device *dev);
100  *      This function is called device changes address list filtering.
101  *
102  * void (*ndo_set_multicast_list)(struct net_device *dev);
103  *      This function is called when the multicast address list changes.
104  *
105  * int (*ndo_set_mac_address)(struct net_device *dev, void *addr);
106  *      This function  is called when the Media Access Control address
107  *      needs to be changed. If this interface is not defined, the
108  *      mac address can not be changed.
109  *
110  * int (*ndo_validate_addr)(struct net_device *dev);
111  *      Test if Media Access Control address is valid for the device.
112  *
113  * int (*ndo_do_ioctl)(struct net_device *dev, struct ifreq *ifr, int cmd);
114  *      Called when a user request an ioctl which can't be handled by
115  *      the generic interface code. If not defined ioctl's return
116  *      not supported error code.
117  *
118  * int (*ndo_set_config)(struct net_device *dev, struct ifmap *map);
119  *      Used to set network devices bus interface parameters. This interface
120  *      is retained for legacy reason, new devices should use the bus
121  *      interface (PCI) for low level management.
122  *
123  * int (*ndo_change_mtu)(struct net_device *dev, int new_mtu);
124  *      Called when a user wants to change the Maximum Transfer Unit
125  *      of a device. If not defined, any request to change MTU will
126  *      will return an error.
127  *
128  * void (*ndo_tx_timeout)(struct net_device *dev);
129  *      Callback uses when the transmitter has not made any progress
130  *      for dev->watchdog ticks.
131  *
132  * struct net_device_stats* (*ndo_get_stats)(struct net_device *dev);
133  *      Called when a user wants to get the network device usage
134  *      statistics. If not defined, the counters in dev->stats will
135  *      be used.
136  *
137  * void (*ndo_vlan_rx_register)(struct net_device *dev, struct vlan_group *grp);
138  *      If device support VLAN receive accleration
139  *      (ie. dev->features & NETIF_F_HW_VLAN_RX), then this function is called
140  *      when vlan groups for the device changes.  Note: grp is NULL
141  *      if no vlan's groups are being used.
142  *
143  * void (*ndo_vlan_rx_add_vid)(struct net_device *dev, unsigned short vid);
144  *      If device support VLAN filtering (dev->features & NETIF_F_HW_VLAN_FILTER)
145  *      this function is called when a VLAN id is registered.
146  *
147  * void (*ndo_vlan_rx_kill_vid)(struct net_device *dev, unsigned short vid);
148  *      If device support VLAN filtering (dev->features & NETIF_F_HW_VLAN_FILTER)
149  *      this function is called when a VLAN id is unregistered.
150  *
151  * void (*ndo_poll_controller)(struct net_device *dev);
152  *
153  *      SR-IOV management functions.
154  * int (*ndo_set_vf_mac)(struct net_device *dev, int vf, u8* mac);
155  * int (*ndo_set_vf_vlan)(struct net_device *dev, int vf, u16 vlan, u8 qos);
156  * int (*ndo_set_vf_tx_rate)(struct net_device *dev, int vf, int rate);
157  * int (*ndo_get_vf_config)(struct net_device *dev,
158  *                          int vf, struct ifla_vf_info *ivf);
159  */
160 #define HAVE_NET_DEVICE_OPS
161 struct net_device_ops {
162         int                     (*ndo_init)(struct net_device *dev);
163         void                    (*ndo_uninit)(struct net_device *dev);
164         int                     (*ndo_open)(struct net_device *dev);
165         int                     (*ndo_stop)(struct net_device *dev);
166         netdev_tx_t             (*ndo_start_xmit) (struct sk_buff *skb,
167                                                    struct net_device *dev);
168         u16                     (*ndo_select_queue)(struct net_device *dev,
169                                                     struct sk_buff *skb);
170         void                    (*ndo_change_rx_flags)(struct net_device *dev,
171                                                        int flags);
172         void                    (*ndo_set_rx_mode)(struct net_device *dev);
173         void                    (*ndo_set_multicast_list)(struct net_device *dev);
174         int                     (*ndo_set_mac_address)(struct net_device *dev,
175                                                        void *addr);
176         int                     (*ndo_validate_addr)(struct net_device *dev);
177         int                     (*ndo_do_ioctl)(struct net_device *dev,
178                                                 struct ifreq *ifr, int cmd);
179         int                     (*ndo_set_config)(struct net_device *dev,
180                                                   struct ifmap *map);
181         int                     (*ndo_change_mtu)(struct net_device *dev,
182                                                   int new_mtu);
183         int                     (*ndo_neigh_setup)(struct net_device *dev,
184                                                    struct neigh_parms *);
185         void                    (*ndo_tx_timeout) (struct net_device *dev);
186
187         struct net_device_stats* (*ndo_get_stats)(struct net_device *dev);
188
189         void                    (*ndo_vlan_rx_register)(struct net_device *dev,
190                                                         struct vlan_group *grp);
191         void                    (*ndo_vlan_rx_add_vid)(struct net_device *dev,
192                                                        unsigned short vid);
193         void                    (*ndo_vlan_rx_kill_vid)(struct net_device *dev,
194                                                         unsigned short vid);
195 #ifdef CONFIG_NET_POLL_CONTROLLER
196         void                    (*ndo_poll_controller)(struct net_device *dev);
197 #endif
198         int                     (*ndo_set_vf_mac)(struct net_device *dev,
199                                                   int queue, u8 *mac);
200         int                     (*ndo_set_vf_vlan)(struct net_device *dev,
201                                                    int queue, u16 vlan, u8 qos);
202         int                     (*ndo_set_vf_tx_rate)(struct net_device *dev,
203                                                       int vf, int rate);
204 /*
205  * The struct ifla_vf_info was added via b280da8d54b8d82b52f368a8703b7ada6c1744d5
206  * on the v2.6.34-rc1~233^2~338 release
207  */
208 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,34))
209         int                     (*ndo_get_vf_config)(struct net_device *dev,
210                                                      int vf,
211                                                      struct ifla_vf_info *ivf);
212 #endif
213 #if defined(CONFIG_FCOE) || defined(CONFIG_FCOE_MODULE)
214         int                     (*ndo_fcoe_enable)(struct net_device *dev);
215         int                     (*ndo_fcoe_disable)(struct net_device *dev);
216         int                     (*ndo_fcoe_ddp_setup)(struct net_device *dev,
217                                                       u16 xid,
218                                                       struct scatterlist *sgl,
219                                                       unsigned int sgc);
220         int                     (*ndo_fcoe_ddp_done)(struct net_device *dev,
221                                                      u16 xid);
222 #define NETDEV_FCOE_WWNN 0
223 #define NETDEV_FCOE_WWPN 1
224         int                     (*ndo_fcoe_get_wwn)(struct net_device *dev,
225                                                     u64 *wwn, int type);
226 #endif
227 };
228
229 static inline int ndo_do_ioctl(struct net_device *dev,
230                                struct ifreq *ifr,
231                                int cmd)
232 {
233         if (dev->do_ioctl)
234                 return dev->do_ioctl(dev, ifr, cmd);
235         return -EOPNOTSUPP;
236 }
237
238
239 void netdev_attach_ops(struct net_device *dev,
240                        const struct net_device_ops *ops);
241
242 /**
243  *      skb_queue_is_first - check if skb is the first entry in the queue
244  *      @list: queue head
245  *      @skb: buffer
246  *
247  *      Returns true if @skb is the first buffer on the list.
248  */
249 static inline bool skb_queue_is_first(const struct sk_buff_head *list,
250                                       const struct sk_buff *skb)
251 {
252         return (skb->prev == (struct sk_buff *) list);
253 }
254
255 /**
256  *      skb_queue_prev - return the prev packet in the queue
257  *      @list: queue head
258  *      @skb: current buffer
259  *
260  *      Return the prev packet in @list before @skb.  It is only valid to
261  *      call this if skb_queue_is_first() evaluates to false.
262  */
263 static inline struct sk_buff *skb_queue_prev(const struct sk_buff_head *list,
264                                              const struct sk_buff *skb)
265 {
266         /* This BUG_ON may seem severe, but if we just return then we
267          * are going to dereference garbage.
268          */
269         BUG_ON(skb_queue_is_first(list, skb));
270         return skb->prev;
271 }
272
273
274 static inline struct net_device_stats *dev_get_stats(struct net_device *dev)
275 {
276         return dev->get_stats(dev);
277 }
278
279 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,23))
280 #if defined(CONFIG_USB) || defined(CONFIG_USB_MODULE)
281 extern void usb_unpoison_anchored_urbs(struct usb_anchor *anchor);
282 #endif /* CONFIG_USB */
283 #endif
284
285 #define DIV_ROUND_CLOSEST(x, divisor)(                  \
286 {                                                       \
287         typeof(divisor) __divisor = divisor;            \
288         (((x) + ((__divisor) / 2)) / (__divisor));      \
289 }                                                       \
290 )
291
292 extern int eth_mac_addr(struct net_device *dev, void *p);
293 extern int eth_change_mtu(struct net_device *dev, int new_mtu);
294 extern int eth_validate_addr(struct net_device *dev);
295
296 #ifdef CONFIG_NET_NS
297
298 static inline void write_pnet(struct net **pnet, struct net *net)
299 {
300         *pnet = net;
301 }
302
303 static inline struct net *read_pnet(struct net * const *pnet)
304 {
305         return *pnet;
306 }
307
308 #else
309
310 #define write_pnet(pnet, net)   do { (void)(net);} while (0)
311 #define read_pnet(pnet)         (&init_net)
312
313 /*
314  * swap - swap value of @a and @b
315  */
316 #define swap(a, b) \
317         do { typeof(a) __tmp = (a); (a) = (b); (b) = __tmp; } while (0)
318
319 #endif
320
321 extern int              init_dummy_netdev(struct net_device *dev);
322
323 #define compat_pci_suspend(fn)                                          \
324         int fn##_compat(struct pci_dev *pdev, pm_message_t state)       \
325         {                                                               \
326                 int r;                                                  \
327                                                                         \
328                 r = fn(&pdev->dev);                                     \
329                 if (r)                                                  \
330                         return r;                                       \
331                                                                         \
332                 pci_save_state(pdev);                                   \
333                 pci_disable_device(pdev);                               \
334                 pci_set_power_state(pdev, PCI_D3hot);                   \
335                                                                         \
336                 return 0;                                               \
337         }
338
339 #define compat_pci_resume(fn)                                           \
340         int fn##_compat(struct pci_dev *pdev)                           \
341         {                                                               \
342                 int r;                                                  \
343                                                                         \
344                 pci_set_power_state(pdev, PCI_D0);                      \
345                 r = pci_enable_device(pdev);                            \
346                 if (r)                                                  \
347                         return r;                                       \
348                 pci_restore_state(pdev);                                \
349                                                                         \
350                 return fn(&pdev->dev);                                  \
351         }
352
353 #else /* (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,29)) */
354
355 /* Kernels >= 2.6.29 follows */
356
357 /* XXX: this can probably just go upstream ! */
358 static inline void netdev_attach_ops(struct net_device *dev,
359                        const struct net_device_ops *ops)
360 {
361         dev->netdev_ops = ops;
362 }
363
364 /* XXX: this can probably just go upstream! */
365 static inline int ndo_do_ioctl(struct net_device *dev,
366                                struct ifreq *ifr,
367                                int cmd)
368 {
369         if (dev->netdev_ops && dev->netdev_ops->ndo_do_ioctl)
370                 return dev->netdev_ops->ndo_do_ioctl(dev, ifr, cmd);
371         return -EOPNOTSUPP;
372 }
373
374 #define compat_pci_suspend(fn)
375 #define compat_pci_resume(fn)
376
377 #endif /* (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,29)) */
378
379 #endif /*  LINUX_26_29_COMPAT_H */