1 # --- T2-COPYRIGHT-BEGIN ---
2 # t2/package/*/linux/0000-wifi-ext.patch
3 # Copyright (C) 2025 The T2 SDE Project
4 # SPDX-License-Identifier: GPL-2.0 or patched project license
5 # --- T2-COPYRIGHT-END ---
7 diff --git a/drivers/net/ethernet/toshiba/ps3_gelic_wireless.c b/drivers/net/ethernet/toshiba/ps3_gelic_wireless.c
8 index 4fbe4b7cd12a..44488c153ea2 100644
9 --- a/drivers/net/ethernet/toshiba/ps3_gelic_wireless.c
10 +++ b/drivers/net/ethernet/toshiba/ps3_gelic_wireless.c
11 @@ -2566,6 +2566,7 @@ static void gelic_wl_setup_netdev_ops(struct net_device *netdev)
13 netdev->ethtool_ops = &gelic_wl_ethtool_ops;
14 netdev->netdev_ops = &gelic_wl_netdevice_ops;
15 + netdev->wireless_data = &wl->wireless_data;
16 netdev->wireless_handlers = &gelic_wl_wext_handler_def;
19 diff --git a/drivers/net/ethernet/toshiba/ps3_gelic_wireless.h b/drivers/net/ethernet/toshiba/ps3_gelic_wireless.h
20 index dbabf538e10a..1f203d1ae8db 100644
21 --- a/drivers/net/ethernet/toshiba/ps3_gelic_wireless.h
22 +++ b/drivers/net/ethernet/toshiba/ps3_gelic_wireless.h
23 @@ -276,6 +276,7 @@ struct gelic_wl_info {
24 u8 active_bssid[ETH_ALEN]; /* associated bssid */
25 unsigned int essid_len;
27 + struct iw_public_data wireless_data;
28 struct iw_statistics iwstat;
31 diff --git a/drivers/net/wireless/intel/ipw2x00/ipw2100.c b/drivers/net/wireless/intel/ipw2x00/ipw2100.c
32 index 15bf35f2de2a..a89e06c1b8ee 100644
33 --- a/drivers/net/wireless/intel/ipw2x00/ipw2100.c
34 +++ b/drivers/net/wireless/intel/ipw2x00/ipw2100.c
35 @@ -6022,6 +6022,8 @@ static struct net_device *ipw2100_alloc_device(struct pci_dev *pci_dev,
36 dev->netdev_ops = &ipw2100_netdev_ops;
37 dev->ethtool_ops = &ipw2100_ethtool_ops;
38 dev->wireless_handlers = &ipw2100_wx_handler_def;
39 + priv->wireless_data.libipw = priv->ieee;
40 + dev->wireless_data = &priv->wireless_data;
41 dev->watchdog_timeo = 3 * HZ;
44 diff --git a/drivers/net/wireless/intel/ipw2x00/ipw2100.h b/drivers/net/wireless/intel/ipw2x00/ipw2100.h
45 index 6f81f509b9cb..b34085ade3aa 100644
46 --- a/drivers/net/wireless/intel/ipw2x00/ipw2100.h
47 +++ b/drivers/net/wireless/intel/ipw2x00/ipw2100.h
48 @@ -554,6 +554,8 @@ struct ipw2100_priv {
49 struct net_device *net_dev;
50 struct iw_statistics wstats;
52 + struct iw_public_data wireless_data;
54 struct tasklet_struct irq_tasklet;
56 struct delayed_work reset_work;
57 diff --git a/drivers/net/wireless/intel/ipw2x00/ipw2200.c b/drivers/net/wireless/intel/ipw2x00/ipw2200.c
58 index be1d971b3d32..c0e9d2109e34 100644
59 --- a/drivers/net/wireless/intel/ipw2x00/ipw2200.c
60 +++ b/drivers/net/wireless/intel/ipw2x00/ipw2200.c
61 @@ -11645,6 +11645,7 @@ static int ipw_pci_probe(struct pci_dev *pdev,
63 net_dev->netdev_ops = &ipw_netdev_ops;
64 priv->ieee->spy_enabled = true;
65 + net_dev->wireless_data = &priv->wireless_data;
66 net_dev->wireless_handlers = &ipw_wx_handler_def;
67 net_dev->ethtool_ops = &ipw_ethtool_ops;
69 diff --git a/drivers/net/wireless/intel/ipw2x00/ipw2200.h b/drivers/net/wireless/intel/ipw2x00/ipw2200.h
70 index d3db54e6d37c..46f119123b49 100644
71 --- a/drivers/net/wireless/intel/ipw2x00/ipw2200.h
72 +++ b/drivers/net/wireless/intel/ipw2x00/ipw2200.h
73 @@ -1274,6 +1274,8 @@ struct ipw_priv {
75 struct iw_statistics wstats;
77 + struct iw_public_data wireless_data;
79 int user_requested_scan;
80 u8 direct_scan_ssid[IW_ESSID_MAX_SIZE];
81 u8 direct_scan_ssid_len;
82 diff --git a/drivers/net/wireless/intel/ipw2x00/libipw_spy.c b/drivers/net/wireless/intel/ipw2x00/libipw_spy.c
83 index ba876e92f7f6..979aeb10aeeb 100644
84 --- a/drivers/net/wireless/intel/ipw2x00/libipw_spy.c
85 +++ b/drivers/net/wireless/intel/ipw2x00/libipw_spy.c
88 static struct iw_spy_data *get_spydata(struct net_device *dev)
90 - struct libipw_device *ieee = netdev_priv(dev);
92 - if (ieee->spy_enabled)
93 - return &ieee->spy_data;
94 + if (dev->wireless_data && dev->wireless_data->libipw &&
95 + dev->wireless_data->libipw->spy_enabled)
96 + return &dev->wireless_data->libipw->spy_data;
100 diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
101 index f0abed1e6e45..e87b5e488325 100644
102 --- a/include/linux/netdevice.h
103 +++ b/include/linux/netdevice.h
104 @@ -1773,6 +1773,7 @@ enum netdev_reg_state {
105 * @wireless_handlers: List of functions to handle Wireless Extensions,
107 * see <net/iw_handler.h> for details.
108 + * @wireless_data: Instance data managed by the core of wireless extensions
110 * @netdev_ops: Includes several pointers to callbacks,
111 * if one wants to override the ndo_*() functions
112 @@ -2149,6 +2150,7 @@ struct net_device {
114 #ifdef CONFIG_WIRELESS_EXT
115 const struct iw_handler_def *wireless_handlers;
116 + struct iw_public_data *wireless_data;
118 const struct ethtool_ops *ethtool_ops;
119 #ifdef CONFIG_NET_L3_MASTER_DEV
120 diff --git a/include/net/iw_handler.h b/include/net/iw_handler.h
121 index fc44fcca1d5c..a7b502958d27 100644
122 --- a/include/net/iw_handler.h
123 +++ b/include/net/iw_handler.h
124 @@ -404,6 +404,24 @@ struct iw_spy_data {
125 u_char spy_thr_under[IW_MAX_SPY];
128 +/* --------------------- DEVICE WIRELESS DATA --------------------- */
130 + * This is all the wireless data specific to a device instance that
131 + * is managed by the core of Wireless Extensions or the 802.11 layer.
132 + * We only keep pointer to those structures, so that a driver is free
133 + * to share them between instances.
134 + * This structure should be initialised before registering the device.
135 + * Access to this data follow the same rules as any other struct net_device
136 + * data (i.e. valid as long as struct net_device exist, same locking rules).
138 +/* Forward declaration */
139 +struct libipw_device;
141 +struct iw_public_data {
142 + /* Legacy structure managed by the ipw2x00-specific IEEE 802.11 layer */
143 + struct libipw_device * libipw;
146 /**************************** PROTOTYPES ****************************/
148 * Functions part of the Wireless Extensions (defined in net/wireless/wext-core.c).
149 diff --git a/drivers/net/wireless/intel/ipw2x00/Kconfig b/drivers/net/wireless/intel/ipw2x00/Kconfig
150 index 5e98be664d38..ce34118f1e90 100644
151 --- a/drivers/net/wireless/intel/ipw2x00/Kconfig
152 +++ b/drivers/net/wireless/intel/ipw2x00/Kconfig
153 @@ -65,6 +65,7 @@ config IPW2100_DEBUG
155 tristate "Intel PRO/Wireless 2200BG and 2915ABG Network Connection"
156 depends on PCI && CFG80211
157 + select CFG80211_WEXT_EXPORT
161 diff --git a/drivers/net/wireless/intel/ipw2x00/ipw2200.c b/drivers/net/wireless/intel/ipw2x00/ipw2200.c
162 index c0e9d2109e34..0008b4615731 100644
163 --- a/drivers/net/wireless/intel/ipw2x00/ipw2200.c
164 +++ b/drivers/net/wireless/intel/ipw2x00/ipw2200.c
165 @@ -6463,14 +6463,6 @@ static int ipw_set_rsn_capa(struct ipw_priv *priv,
169 -static int ipw_wx_get_name(struct net_device *dev,
170 - struct iw_request_info *info,
171 - union iwreq_data *wrqu, char *extra)
173 - strcpy(wrqu->name, "IEEE 802.11");
178 static int ipw_wx_set_genie(struct net_device *dev,
179 struct iw_request_info *info,
180 @@ -9834,7 +9826,7 @@ static int ipw_wx_sw_reset(struct net_device *dev,
182 /* Rebase the WE IOCTLs to zero for the handler array */
183 static iw_handler ipw_wx_handlers[] = {
184 - IW_HANDLER(SIOCGIWNAME, ipw_wx_get_name),
185 + IW_HANDLER(SIOCGIWNAME, cfg80211_wext_giwname),
186 IW_HANDLER(SIOCSIWFREQ, ipw_wx_set_freq),
187 IW_HANDLER(SIOCGIWFREQ, ipw_wx_get_freq),
188 IW_HANDLER(SIOCSIWMODE, ipw_wx_set_mode),
189 diff --git a/net/wireless/Kconfig b/net/wireless/Kconfig
190 index 2d67b5f2010e..8c8bd8b75708 100644
191 --- a/net/wireless/Kconfig
192 +++ b/net/wireless/Kconfig
193 @@ -185,12 +185,19 @@ config CFG80211_CRDA_SUPPORT
197 - bool "cfg80211 wireless extensions compatibility"
198 + bool "cfg80211 wireless extensions compatibility" if !CFG80211_WEXT_EXPORT
200 + default y if CFG80211_WEXT_EXPORT
202 Enable this option if you need old userspace for wireless
203 extensions with cfg80211-based drivers.
205 +config CFG80211_WEXT_EXPORT
208 + Drivers should select this option if they require cfg80211's
209 + wext compatibility symbols to be exported.
211 config CFG80211_KUNIT_TEST
212 tristate "KUnit tests for cfg80211" if !KUNIT_ALL_TESTS
214 diff --git a/net/wireless/scan.c b/net/wireless/scan.c
215 index 8ba618f4734f..59a90bf3c0d6 100644
216 --- a/net/wireless/scan.c
217 +++ b/net/wireless/scan.c
218 @@ -3594,6 +3594,7 @@ int cfg80211_wext_siwscan(struct net_device *dev,
222 +EXPORT_WEXT_HANDLER(cfg80211_wext_siwscan);
224 static char *ieee80211_scan_add_ies(struct iw_request_info *info,
225 const struct cfg80211_bss_ies *ies,
226 @@ -3965,4 +3966,5 @@ int cfg80211_wext_giwscan(struct net_device *dev,
230 +EXPORT_WEXT_HANDLER(cfg80211_wext_giwscan);
232 diff --git a/net/wireless/wext-compat.c b/net/wireless/wext-compat.c
233 index 0c8d3797a02e..cd9f8f6e298b 100644
234 --- a/net/wireless/wext-compat.c
235 +++ b/net/wireless/wext-compat.c
236 @@ -30,6 +30,7 @@ int cfg80211_wext_giwname(struct net_device *dev,
237 strcpy(wrqu->name, "IEEE 802.11");
240 +EXPORT_WEXT_HANDLER(cfg80211_wext_giwname);
242 int cfg80211_wext_siwmode(struct net_device *dev, struct iw_request_info *info,
243 union iwreq_data *wrqu, char *extra)
244 @@ -68,6 +69,7 @@ int cfg80211_wext_siwmode(struct net_device *dev, struct iw_request_info *info,
248 +EXPORT_WEXT_HANDLER(cfg80211_wext_siwmode);
250 int cfg80211_wext_giwmode(struct net_device *dev, struct iw_request_info *info,
251 union iwreq_data *wrqu, char *extra)
252 @@ -103,6 +105,7 @@ int cfg80211_wext_giwmode(struct net_device *dev, struct iw_request_info *info,
256 +EXPORT_WEXT_HANDLER(cfg80211_wext_giwmode);
259 int cfg80211_wext_giwrange(struct net_device *dev,
260 @@ -217,6 +220,7 @@ int cfg80211_wext_giwrange(struct net_device *dev,
264 +EXPORT_WEXT_HANDLER(cfg80211_wext_giwrange);
268 @@ -277,6 +281,7 @@ int cfg80211_wext_siwrts(struct net_device *dev,
269 wiphy_unlock(&rdev->wiphy);
272 +EXPORT_WEXT_HANDLER(cfg80211_wext_siwrts);
274 int cfg80211_wext_giwrts(struct net_device *dev,
275 struct iw_request_info *info,
276 @@ -291,6 +296,7 @@ int cfg80211_wext_giwrts(struct net_device *dev,
280 +EXPORT_WEXT_HANDLER(cfg80211_wext_giwrts);
282 int cfg80211_wext_siwfrag(struct net_device *dev,
283 struct iw_request_info *info,
284 @@ -321,6 +327,7 @@ int cfg80211_wext_siwfrag(struct net_device *dev,
288 +EXPORT_WEXT_HANDLER(cfg80211_wext_siwfrag);
290 int cfg80211_wext_giwfrag(struct net_device *dev,
291 struct iw_request_info *info,
292 @@ -335,6 +342,7 @@ int cfg80211_wext_giwfrag(struct net_device *dev,
296 +EXPORT_WEXT_HANDLER(cfg80211_wext_giwfrag);
298 static int cfg80211_wext_siwretry(struct net_device *dev,
299 struct iw_request_info *info,
300 @@ -405,6 +413,7 @@ int cfg80211_wext_giwretry(struct net_device *dev,
304 +EXPORT_WEXT_HANDLER(cfg80211_wext_giwretry);
306 static int cfg80211_set_encryption(struct cfg80211_registered_device *rdev,
307 struct net_device *dev, bool pairwise,
308 diff --git a/net/wireless/wext-compat.h b/net/wireless/wext-compat.h
309 index 8251ca5df8ae..c02eb789e676 100644
310 --- a/net/wireless/wext-compat.h
311 +++ b/net/wireless/wext-compat.h
313 #include <net/iw_handler.h>
314 #include <linux/wireless.h>
316 +#ifdef CONFIG_CFG80211_WEXT_EXPORT
317 +#define EXPORT_WEXT_HANDLER(h) EXPORT_SYMBOL_GPL(h)
319 +#define EXPORT_WEXT_HANDLER(h)
320 +#endif /* CONFIG_CFG80211_WEXT_EXPORT */
322 int cfg80211_ibss_wext_siwfreq(struct net_device *dev,
323 struct iw_request_info *info,
324 struct iw_freq *wextfreq, char *extra);
325 diff --git a/drivers/net/wireless/intel/ipw2x00/Kconfig b/drivers/net/wireless/intel/ipw2x00/Kconfig
326 index ce34118f1e90..d9c042772399 100644
327 --- a/drivers/net/wireless/intel/ipw2x00/Kconfig
328 +++ b/drivers/net/wireless/intel/ipw2x00/Kconfig
329 @@ -7,6 +7,7 @@ config IPW2100
330 tristate "Intel PRO/Wireless 2100 Network Connection"
331 depends on PCI && CFG80211
337 @@ -67,6 +68,7 @@ config IPW2200
338 depends on PCI && CFG80211
339 select CFG80211_WEXT_EXPORT
345 @@ -154,6 +156,7 @@ config LIBIPW
347 depends on PCI && CFG80211
351 select CRYPTO_MICHAEL_MIC
353 diff --git a/drivers/net/wireless/intel/ipw2x00/Makefile b/drivers/net/wireless/intel/ipw2x00/Makefile
354 index 91e6091c4ebf..60c5faccbe15 100644
355 --- a/drivers/net/wireless/intel/ipw2x00/Makefile
356 +++ b/drivers/net/wireless/intel/ipw2x00/Makefile
357 @@ -13,7 +13,6 @@ libipw-objs := \
363 libipw_crypto_ccmp.o \
364 libipw_crypto_tkip.o \
365 diff --git a/drivers/net/wireless/intel/ipw2x00/ipw2200.c b/drivers/net/wireless/intel/ipw2x00/ipw2200.c
366 index 0008b4615731..f4fd1fc784b7 100644
367 --- a/drivers/net/wireless/intel/ipw2x00/ipw2200.c
368 +++ b/drivers/net/wireless/intel/ipw2x00/ipw2200.c
369 @@ -9856,10 +9856,10 @@ static iw_handler ipw_wx_handlers[] = {
370 IW_HANDLER(SIOCGIWENCODE, ipw_wx_get_encode),
371 IW_HANDLER(SIOCSIWPOWER, ipw_wx_set_power),
372 IW_HANDLER(SIOCGIWPOWER, ipw_wx_get_power),
373 - IW_HANDLER(SIOCSIWSPY, ipw_wx_set_spy),
374 - IW_HANDLER(SIOCGIWSPY, ipw_wx_get_spy),
375 - IW_HANDLER(SIOCSIWTHRSPY, ipw_wx_set_thrspy),
376 - IW_HANDLER(SIOCGIWTHRSPY, ipw_wx_get_thrspy),
377 + IW_HANDLER(SIOCSIWSPY, iw_handler_set_spy),
378 + IW_HANDLER(SIOCGIWSPY, iw_handler_get_spy),
379 + IW_HANDLER(SIOCSIWTHRSPY, iw_handler_set_thrspy),
380 + IW_HANDLER(SIOCGIWTHRSPY, iw_handler_get_thrspy),
381 IW_HANDLER(SIOCSIWGENIE, ipw_wx_set_genie),
382 IW_HANDLER(SIOCGIWGENIE, ipw_wx_get_genie),
383 IW_HANDLER(SIOCSIWMLME, ipw_wx_set_mlme),
384 @@ -11636,7 +11636,7 @@ static int ipw_pci_probe(struct pci_dev *pdev,
385 priv->ieee->worst_rssi = -85;
387 net_dev->netdev_ops = &ipw_netdev_ops;
388 - priv->ieee->spy_enabled = true;
389 + priv->wireless_data.spy_data = &priv->ieee->spy_data;
390 net_dev->wireless_data = &priv->wireless_data;
391 net_dev->wireless_handlers = &ipw_wx_handler_def;
392 net_dev->ethtool_ops = &ipw_ethtool_ops;
393 diff --git a/drivers/net/wireless/intel/ipw2x00/libipw.h b/drivers/net/wireless/intel/ipw2x00/libipw.h
394 index 3c20353e5a41..bc727c99ff3c 100644
395 --- a/drivers/net/wireless/intel/ipw2x00/libipw.h
396 +++ b/drivers/net/wireless/intel/ipw2x00/libipw.h
397 @@ -788,7 +788,6 @@ struct libipw_device {
399 int iw_mode; /* operating mode (IW_MODE_*) */
400 struct iw_spy_data spy_data; /* iwspy support */
405 @@ -1084,16 +1083,4 @@ void libipw_crypto_tkip_exit(void);
406 void libipw_crypto_ccmp_exit(void);
407 void libipw_crypto_exit(void);
410 -int ipw_wx_set_spy(struct net_device *dev, struct iw_request_info *info,
411 - union iwreq_data *wrqu, char *extra);
412 -int ipw_wx_get_spy(struct net_device *dev, struct iw_request_info *info,
413 - union iwreq_data *wrqu, char *extra);
414 -int ipw_wx_set_thrspy(struct net_device *dev, struct iw_request_info *info,
415 - union iwreq_data *wrqu, char *extra);
416 -int ipw_wx_get_thrspy(struct net_device *dev, struct iw_request_info *info,
417 - union iwreq_data *wrqu, char *extra);
418 -void libipw_spy_update(struct net_device *dev, unsigned char *address,
419 - struct iw_quality *wstats);
421 #endif /* LIBIPW_H */
422 diff --git a/drivers/net/wireless/intel/ipw2x00/libipw_rx.c b/drivers/net/wireless/intel/ipw2x00/libipw_rx.c
423 index 7e41cb7bbfe0..1fe05e73a17c 100644
424 --- a/drivers/net/wireless/intel/ipw2x00/libipw_rx.c
425 +++ b/drivers/net/wireless/intel/ipw2x00/libipw_rx.c
426 @@ -393,7 +393,7 @@ int libipw_rx(struct libipw_device *ieee, struct sk_buff *skb,
427 wstats.updated |= IW_QUAL_QUAL_INVALID;
429 /* Update spy records */
430 - libipw_spy_update(ieee->dev, hdr->addr2, &wstats);
431 + wireless_spy_update(ieee->dev, hdr->addr2, &wstats);
433 #endif /* IW_WIRELESS_SPY */
434 #endif /* CONFIG_WIRELESS_EXT */
435 diff --git a/include/net/iw_handler.h b/include/net/iw_handler.h
436 index a7b502958d27..7af1082ea9a0 100644
437 --- a/include/net/iw_handler.h
438 +++ b/include/net/iw_handler.h
439 @@ -418,6 +418,8 @@ struct iw_spy_data {
440 struct libipw_device;
442 struct iw_public_data {
443 + /* Driver enhanced spy support */
444 + struct iw_spy_data * spy_data;
445 /* Legacy structure managed by the ipw2x00-specific IEEE 802.11 layer */
446 struct libipw_device * libipw;
448 @@ -441,6 +443,22 @@ static inline void wireless_nlevent_flush(void) {}
449 /* We may need a function to send a stream of events to user space.
450 * More on that later... */
452 +/* Standard handler for SIOCSIWSPY */
453 +int iw_handler_set_spy(struct net_device *dev, struct iw_request_info *info,
454 + union iwreq_data *wrqu, char *extra);
455 +/* Standard handler for SIOCGIWSPY */
456 +int iw_handler_get_spy(struct net_device *dev, struct iw_request_info *info,
457 + union iwreq_data *wrqu, char *extra);
458 +/* Standard handler for SIOCSIWTHRSPY */
459 +int iw_handler_set_thrspy(struct net_device *dev, struct iw_request_info *info,
460 + union iwreq_data *wrqu, char *extra);
461 +/* Standard handler for SIOCGIWTHRSPY */
462 +int iw_handler_get_thrspy(struct net_device *dev, struct iw_request_info *info,
463 + union iwreq_data *wrqu, char *extra);
464 +/* Driver call to update spy records */
465 +void wireless_spy_update(struct net_device *dev, unsigned char *address,
466 + struct iw_quality *wstats);
468 /************************* INLINE FUNCTIONS *************************/
470 * Function that are so simple that it's more efficient inlining them
471 diff --git a/net/wireless/Kconfig b/net/wireless/Kconfig
472 index 8c8bd8b75708..733c53ad4de5 100644
473 --- a/net/wireless/Kconfig
474 +++ b/net/wireless/Kconfig
475 @@ -11,6 +11,9 @@ config WEXT_PROC
485 diff --git a/net/wireless/Makefile b/net/wireless/Makefile
486 index 62a83faf0e07..27f211bd9954 100644
487 --- a/net/wireless/Makefile
488 +++ b/net/wireless/Makefile
489 @@ -4,6 +4,7 @@ obj-y += tests/
491 obj-$(CONFIG_WEXT_CORE) += wext-core.o
492 obj-$(CONFIG_WEXT_PROC) += wext-proc.o
493 +obj-$(CONFIG_WEXT_SPY) += wext-spy.o
494 obj-$(CONFIG_WEXT_PRIV) += wext-priv.o
496 cfg80211-y += core.o sysfs.o radiotap.o util.o reg.o scan.o nl80211.o
497 diff --git a/drivers/net/wireless/intel/ipw2x00/libipw_spy.c b/net/wireless/wext-spy.c
499 rename from drivers/net/wireless/intel/ipw2x00/libipw_spy.c
500 rename to net/wireless/wext-spy.c
501 index 979aeb10aeeb..b379a0371653 100644
502 --- a/drivers/net/wireless/intel/ipw2x00/libipw_spy.c
503 +++ b/net/wireless/wext-spy.c
505 #include <net/iw_handler.h>
507 #include <net/wext.h>
510 -static struct iw_spy_data *get_spydata(struct net_device *dev)
511 +static inline struct iw_spy_data *get_spydata(struct net_device *dev)
513 - if (dev->wireless_data && dev->wireless_data->libipw &&
514 - dev->wireless_data->libipw->spy_enabled)
515 - return &dev->wireless_data->libipw->spy_data;
516 + /* This is the new way */
517 + if (dev->wireless_data)
518 + return dev->wireless_data->spy_data;
522 -int ipw_wx_set_spy(struct net_device * dev,
523 - struct iw_request_info * info,
524 - union iwreq_data * wrqu,
526 +int iw_handler_set_spy(struct net_device * dev,
527 + struct iw_request_info * info,
528 + union iwreq_data * wrqu,
531 struct iw_spy_data * spydata = get_spydata(dev);
532 struct sockaddr * address = (struct sockaddr *) extra;
533 @@ -37,15 +36,15 @@ int ipw_wx_set_spy(struct net_device * dev,
536 /* Disable spy collection while we copy the addresses.
537 - * While we copy addresses, any call to libipw_spy_update()
538 + * While we copy addresses, any call to wireless_spy_update()
539 * will NOP. This is OK, as anyway the addresses are changing. */
540 spydata->spy_number = 0;
542 - /* We want to operate without locking, because libipw_spy_update()
543 + /* We want to operate without locking, because wireless_spy_update()
544 * most likely will happen in the interrupt handler, and therefore
545 * have its own locking constraints and needs performance.
546 * The rtnl_lock() make sure we don't race with the other iw_handlers.
547 - * This make sure libipw_spy_update() "see" that the spy list
548 + * This make sure wireless_spy_update() "see" that the spy list
549 * is temporarily disabled. */
552 @@ -70,12 +69,12 @@ int ipw_wx_set_spy(struct net_device * dev,
556 -EXPORT_SYMBOL(ipw_wx_set_spy);
557 +EXPORT_SYMBOL(iw_handler_set_spy);
559 -int ipw_wx_get_spy(struct net_device * dev,
560 - struct iw_request_info * info,
561 - union iwreq_data * wrqu,
563 +int iw_handler_get_spy(struct net_device * dev,
564 + struct iw_request_info * info,
565 + union iwreq_data * wrqu,
568 struct iw_spy_data * spydata = get_spydata(dev);
569 struct sockaddr * address = (struct sockaddr *) extra;
570 @@ -102,16 +101,16 @@ int ipw_wx_get_spy(struct net_device * dev,
571 spydata->spy_stat[i].updated &= ~IW_QUAL_ALL_UPDATED;
574 -EXPORT_SYMBOL(ipw_wx_get_spy);
575 +EXPORT_SYMBOL(iw_handler_get_spy);
577 /*------------------------------------------------------------------*/
579 * Standard Wireless Handler : set spy threshold
581 -int ipw_wx_set_thrspy(struct net_device * dev,
582 - struct iw_request_info * info,
583 - union iwreq_data * wrqu,
585 +int iw_handler_set_thrspy(struct net_device * dev,
586 + struct iw_request_info *info,
587 + union iwreq_data * wrqu,
590 struct iw_spy_data * spydata = get_spydata(dev);
591 struct iw_thrspy * threshold = (struct iw_thrspy *) extra;
592 @@ -129,16 +128,16 @@ int ipw_wx_set_thrspy(struct net_device * dev,
596 -EXPORT_SYMBOL(ipw_wx_set_thrspy);
597 +EXPORT_SYMBOL(iw_handler_set_thrspy);
599 /*------------------------------------------------------------------*/
601 * Standard Wireless Handler : get spy threshold
603 -int ipw_wx_get_thrspy(struct net_device * dev,
604 - struct iw_request_info * info,
605 - union iwreq_data * wrqu,
607 +int iw_handler_get_thrspy(struct net_device * dev,
608 + struct iw_request_info *info,
609 + union iwreq_data * wrqu,
612 struct iw_spy_data * spydata = get_spydata(dev);
613 struct iw_thrspy * threshold = (struct iw_thrspy *) extra;
614 @@ -153,7 +152,7 @@ int ipw_wx_get_thrspy(struct net_device * dev,
618 -EXPORT_SYMBOL(ipw_wx_get_thrspy);
619 +EXPORT_SYMBOL(iw_handler_get_thrspy);
621 /*------------------------------------------------------------------*/
623 @@ -190,9 +189,9 @@ static void iw_send_thrspy_event(struct net_device * dev,
624 * small, this is good enough. If we wanted to support larger number of
625 * spy addresses, we should use something more efficient...
627 -void libipw_spy_update(struct net_device * dev,
628 - unsigned char * address,
629 - struct iw_quality * wstats)
630 +void wireless_spy_update(struct net_device * dev,
631 + unsigned char * address,
632 + struct iw_quality * wstats)
634 struct iw_spy_data * spydata = get_spydata(dev);
636 @@ -230,3 +229,4 @@ void libipw_spy_update(struct net_device * dev,
640 +EXPORT_SYMBOL(wireless_spy_update);