aboutsummaryrefslogtreecommitdiffstats
path: root/package/madwifi/patches/432-netdev_ops.patch
blob: af829b164a7401d881e8560e718732bbca9143e8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
Convert to net_device_ops for Linux 2.6.29+
http://madwifi-project.org/changeset/4005
--- a/ath/if_ath.c
+++ b/ath/if_ath.c
@@ -566,6 +566,20 @@ static inline int rate_factor(int mode)
 
 /* Initialize ath_softc structure */
 
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,29)
+static const struct net_device_ops ath_netdev_ops = {
+	.ndo_open		= ath_init,
+	.ndo_stop		= ath_stop,
+	.ndo_start_xmit		= ath_hardstart,
+	.ndo_tx_timeout 	= ath_tx_timeout,
+	.ndo_set_multicast_list = ath_mode_init,
+	.ndo_do_ioctl		= ath_ioctl,
+	.ndo_get_stats		= ath_getstats,
+	.ndo_set_mac_address	= ath_set_mac_address,
+	.ndo_change_mtu 	= ath_change_mtu,
+};
+#endif
+
 int
 ath_attach(u_int16_t devid, struct net_device *dev, HAL_BUS_TAG tag)
 {
@@ -865,16 +879,20 @@ ath_attach(u_int16_t devid, struct net_d
 	}
 
 	/* NB: ether_setup is done by bus-specific code */
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,29)
 	dev->open = ath_init;
 	dev->stop = ath_stop;
 	dev->hard_start_xmit = ath_hardstart;
 	dev->tx_timeout = ath_tx_timeout;
-	dev->watchdog_timeo = 5 * HZ;
 	dev->set_multicast_list = ath_mode_init;
 	dev->do_ioctl = ath_ioctl;
 	dev->get_stats = ath_getstats;
 	dev->set_mac_address = ath_set_mac_address;
 	dev->change_mtu = ath_change_mtu;
+#else
+	dev->netdev_ops = &ath_netdev_ops;
+#endif
+	dev->watchdog_timeo = 5 * HZ;
 	dev->tx_queue_len = ATH_TXBUF - ATH_TXBUF_MGT_RESERVED;
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)
 	netif_napi_add(dev, &sc->sc_napi, ath_rx_poll, 64);
@@ -1257,7 +1275,6 @@ ath_detach(struct net_device *dev)
 	ath_dynamic_sysctl_unregister(sc);
 	ATH_LOCK_DESTROY(sc);
 	ATH_HAL_LOCK_DESTROY(sc);
-	dev->stop = NULL; /* prevent calling ath_stop again */
 	unregister_netdev(dev);
 	return 0;
 }
@@ -12732,8 +12749,13 @@ ath_rcv_dev_event(struct notifier_block
 	struct net_device *dev = (struct net_device *)ptr;
 	struct ath_softc *sc = (struct ath_softc *)netdev_priv(dev);
 
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,29)
 	if (!dev || !sc || dev->open != &ath_init)
 		return 0;
+#else
+	if (!dev || !sc || dev->netdev_ops->ndo_open != &ath_init)
+		return 0;
+#endif
 
 	switch (event) {
 	case NETDEV_CHANGENAME:
--- a/net80211/ieee80211.c
+++ b/net80211/ieee80211.c
@@ -451,6 +451,18 @@ ieee80211_ifdetach(struct ieee80211com *
 }
 EXPORT_SYMBOL(ieee80211_ifdetach);
 
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,29)
+static const struct net_device_ops ieee80211_netdev_ops = {
+	.ndo_get_stats		= ieee80211_getstats,
+	.ndo_open		= ieee80211_open,
+	.ndo_stop		= ieee80211_stop,
+	.ndo_start_xmit		= ieee80211_hardstart,
+	.ndo_set_multicast_list = ieee80211_set_multicast_list,
+	.ndo_change_mtu 	= ieee80211_change_mtu,
+	.ndo_do_ioctl		= ieee80211_ioctl,
+};
+#endif
+
 int
 ieee80211_vap_setup(struct ieee80211com *ic, struct net_device *dev,
 	const char *name, int opmode, int flags, struct ieee80211vap *master)
@@ -471,16 +483,21 @@ ieee80211_vap_setup(struct ieee80211com
 		} else
 			strncpy(dev->name, name, sizeof(dev->name));
 	}
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,29)
 
 	dev->get_stats = ieee80211_getstats;
 	dev->open = ieee80211_open;
 	dev->stop = ieee80211_stop;
 	dev->hard_start_xmit = ieee80211_hardstart;
 	dev->set_multicast_list = ieee80211_set_multicast_list;
+	dev->do_ioctl = ieee80211_ioctl;
 #if 0
 	dev->set_mac_address = ieee80211_set_mac_address;
 #endif
  	dev->change_mtu = ieee80211_change_mtu;
+#else
+	dev->netdev_ops = &ieee80211_netdev_ops;
+#endif
 	dev->tx_queue_len = 0;			/* NB: bypass queuing */
 	dev->hard_header_len = parent->hard_header_len;
 	/*
@@ -1824,7 +1841,11 @@ ieee80211_set_multicast_list(struct net_
 	IEEE80211_UNLOCK_IRQ(ic);
 
 	/* XXX: Merge multicast list into parent device */
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,29)
 	parent->set_multicast_list(ic->ic_dev);
+#else
+	parent->netdev_ops->ndo_set_multicast_list(ic->ic_dev);
+#endif
 }
 
 void
--- a/net80211/ieee80211_linux.c
+++ b/net80211/ieee80211_linux.c
@@ -984,8 +984,14 @@ ieee80211_rcv_dev_event(struct notifier_
 	void *ptr)
 {
 	struct net_device *dev = (struct net_device *) ptr;
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,29)
 	if (!dev || dev->open != &ieee80211_open)
 		return 0;
+#else
+	if (!dev || dev->netdev_ops->ndo_open != &ieee80211_open)
+		return 0;
+#endif
 
 	switch (event) {
 	case NETDEV_CHANGENAME:
--- a/net80211/ieee80211_var.h
+++ b/net80211/ieee80211_var.h
@@ -739,6 +739,7 @@ void ieee80211_build_sc_ie(struct ieee80
 void ieee80211_dfs_action(struct ieee80211com *);
 void ieee80211_expire_channel_excl_restrictions(struct ieee80211com *);
 void ieee80211_setpuregbasicrates(struct ieee80211_rateset *rs);
+int ieee80211_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd);
 
 /*
  * Iterate through ic_channels to enumerate all distinct ic_ieee channel numbers.
--- a/net80211/ieee80211_wireless.c
+++ b/net80211/ieee80211_wireless.c
@@ -5954,7 +5954,7 @@ static struct iw_handler_def ieee80211_i
 /*
  * Handle private ioctl requests.
  */
-static int
+int
 ieee80211_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
 {
 	struct ieee80211vap *vap = netdev_priv(dev);
@@ -6044,7 +6044,6 @@ ieee80211_ioctl_vattach(struct ieee80211
 {
 	struct net_device *dev = vap->iv_dev;
 
-	dev->do_ioctl = ieee80211_ioctl;
 #if IW_HANDLER_VERSION < 7
 	dev->get_wireless_stats = ieee80211_iw_getstats;
 #endif
--- a/net80211/ieee80211_input.c
+++ b/net80211/ieee80211_input.c
@@ -1188,7 +1188,11 @@ ieee80211_deliver_data(struct ieee80211_
 			skb1->protocol = __constant_htons(ETH_P_802_2);
 			/* XXX insert vlan tag before queue it? */
 			ni_tmp = SKB_CB(skb1)->ni; /* remember node so we can free it */
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,29)
 			ret = dev->hard_start_xmit(skb1, dev);
+#else
+			ret = dev->netdev_ops->ndo_start_xmit(skb1, dev);
+#endif
 
 			if (ret == NETDEV_TX_BUSY)
 				ieee80211_dev_kfree_skb(&skb1);