8c725ee73151386c8a5e6304b0594dda4e7ca087
[~tnikolova/compat/.git] / compat / compat-2.6.29.c
1 /*
2  * Copyright 2007-2010  Luis R. Rodriguez <mcgrof@winlab.rutgers.edu>
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License version 2 as
6  * published by the Free Software Foundation.
7  *
8  * Compatibility file for Linux wireless for kernels 2.6.29.
9  */
10
11 #include <linux/compat.h>
12
13 #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,29))
14
15 #include <linux/usb.h>
16 #include <linux/etherdevice.h>
17
18 /*
19  * If you don't see your net_device_ops implemented on
20  * netdev_attach_ops() then you are shit out of luck and
21  * you must do the nasty ifdef magic, unless you figure
22  * out a way to squeze your hacks into this routine :)
23  */
24 void netdev_attach_ops(struct net_device *dev,
25                        const struct net_device_ops *ops)
26 {
27 #define SET_NETDEVOP(_op) (_op ? _op : NULL)
28         dev->open = SET_NETDEVOP(ops->ndo_open);
29         dev->stop = SET_NETDEVOP(ops->ndo_stop);
30         dev->hard_start_xmit = SET_NETDEVOP(ops->ndo_start_xmit);
31         dev->change_rx_flags = SET_NETDEVOP(ops->ndo_change_rx_flags);
32         dev->set_multicast_list = SET_NETDEVOP(ops->ndo_set_multicast_list);
33         dev->validate_addr = SET_NETDEVOP(ops->ndo_validate_addr);
34         dev->do_ioctl = SET_NETDEVOP(ops->ndo_do_ioctl);
35         dev->set_config = SET_NETDEVOP(ops->ndo_set_config);
36         dev->change_mtu = SET_NETDEVOP(ops->ndo_change_mtu);
37         dev->set_mac_address = SET_NETDEVOP(ops->ndo_set_mac_address);
38         dev->tx_timeout = SET_NETDEVOP(ops->ndo_tx_timeout);
39         dev->get_stats = SET_NETDEVOP(ops->ndo_get_stats);
40         dev->vlan_rx_register = SET_NETDEVOP(ops->ndo_vlan_rx_register);
41         dev->vlan_rx_add_vid = SET_NETDEVOP(ops->ndo_vlan_rx_add_vid);
42         dev->vlan_rx_kill_vid = SET_NETDEVOP(ops->ndo_vlan_rx_kill_vid);
43 #ifdef CONFIG_NET_POLL_CONTROLLER
44         dev->poll_controller = SET_NETDEVOP(ops->ndo_poll_controller);
45 #endif
46
47 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27))
48         dev->select_queue = SET_NETDEVOP(ops->ndo_select_queue);
49 #endif
50
51 #undef SET_NETDEVOP
52 }
53 EXPORT_SYMBOL(netdev_attach_ops);
54
55 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,23))
56 #if defined(CONFIG_USB) || defined(CONFIG_USB_MODULE)
57 /**
58  * usb_unpoison_anchored_urbs - let an anchor be used successfully again
59  * @anchor: anchor the requests are bound to
60  *
61  * Reverses the effect of usb_poison_anchored_urbs
62  * the anchor can be used normally after it returns
63  */
64 void usb_unpoison_anchored_urbs(struct usb_anchor *anchor)
65 {
66         unsigned long flags;
67         struct urb *lazarus;
68
69         spin_lock_irqsave(&anchor->lock, flags);
70         list_for_each_entry(lazarus, &anchor->urb_list, anchor_list) {
71                 usb_unpoison_urb(lazarus);
72         }
73         //anchor->poisoned = 0; /* XXX: cannot backport */
74         spin_unlock_irqrestore(&anchor->lock, flags);
75 }
76 EXPORT_SYMBOL_GPL(usb_unpoison_anchored_urbs);
77 #endif /* CONFIG_USB */
78 #endif
79
80 /**
81  * eth_mac_addr - set new Ethernet hardware address
82  * @dev: network device
83  * @p: socket address
84  * Change hardware address of device.
85  *
86  * This doesn't change hardware matching, so needs to be overridden
87  * for most real devices.
88  */
89 int eth_mac_addr(struct net_device *dev, void *p)
90 {
91         struct sockaddr *addr = p;
92
93         if (netif_running(dev))
94                 return -EBUSY;
95         if (!is_valid_ether_addr(addr->sa_data))
96                 return -EADDRNOTAVAIL;
97         memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN);
98         return 0;
99 }
100 EXPORT_SYMBOL(eth_mac_addr);
101
102 /**
103  * eth_change_mtu - set new MTU size
104  * @dev: network device
105  * @new_mtu: new Maximum Transfer Unit
106  *
107  * Allow changing MTU size. Needs to be overridden for devices
108  * supporting jumbo frames.
109  */
110 int eth_change_mtu(struct net_device *dev, int new_mtu)
111 {
112         if (new_mtu < 68 || new_mtu > ETH_DATA_LEN)
113                 return -EINVAL;
114         dev->mtu = new_mtu;
115         return 0;
116 }
117 EXPORT_SYMBOL(eth_change_mtu);
118
119 int eth_validate_addr(struct net_device *dev)
120 {
121         if (!is_valid_ether_addr(dev->dev_addr))
122                 return -EADDRNOTAVAIL;
123
124         return 0;
125 }
126 EXPORT_SYMBOL(eth_validate_addr);
127 /* Source: net/ethernet/eth.c */
128
129
130 #endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2,6,29) */
131