2 This file contains wireless extension handlers.
4 This is part of rtl8180 OpenSource driver.
5 Copyright (C) Andrea Merello 2004-2005 <andrea.merello@gmail.com>
6 Released under the terms of GPL (General Public Licence)
8 Parts of this driver are based on the GPL part
9 of the official realtek driver.
11 Parts of this driver are based on the rtl8180 driver skeleton
12 from Patric Schenke & Andres Salomon.
14 Parts of this driver are based on the Intel Pro Wireless 2100 GPL driver.
16 We want to thank the Authors of those projects and the Ndiswrapper
20 #include <linux/string.h>
22 #include "r8192U_hw.h"
25 #include "r8192U_wx.h"
28 static const u32 rtl8180_rates
[] = {1000000, 2000000, 5500000, 11000000,
29 6000000, 9000000, 12000000, 18000000, 24000000, 36000000, 48000000, 54000000};
36 static int r8192_wx_get_freq(struct net_device
*dev
,
37 struct iw_request_info
*a
,
38 union iwreq_data
*wrqu
, char *b
)
40 struct r8192_priv
*priv
= ieee80211_priv(dev
);
42 return ieee80211_wx_get_freq(priv
->ieee80211
, a
, wrqu
, b
);
46 static int r8192_wx_get_mode(struct net_device
*dev
, struct iw_request_info
*a
,
47 union iwreq_data
*wrqu
, char *b
)
49 struct r8192_priv
*priv
= ieee80211_priv(dev
);
51 return ieee80211_wx_get_mode(priv
->ieee80211
, a
, wrqu
, b
);
56 static int r8192_wx_get_rate(struct net_device
*dev
,
57 struct iw_request_info
*info
,
58 union iwreq_data
*wrqu
, char *extra
)
60 struct r8192_priv
*priv
= ieee80211_priv(dev
);
62 return ieee80211_wx_get_rate(priv
->ieee80211
, info
, wrqu
, extra
);
67 static int r8192_wx_set_rate(struct net_device
*dev
,
68 struct iw_request_info
*info
,
69 union iwreq_data
*wrqu
, char *extra
)
72 struct r8192_priv
*priv
= ieee80211_priv(dev
);
76 ret
= ieee80211_wx_set_rate(priv
->ieee80211
, info
, wrqu
, extra
);
84 static int r8192_wx_set_rts(struct net_device
*dev
,
85 struct iw_request_info
*info
,
86 union iwreq_data
*wrqu
, char *extra
)
89 struct r8192_priv
*priv
= ieee80211_priv(dev
);
93 ret
= ieee80211_wx_set_rts(priv
->ieee80211
, info
, wrqu
, extra
);
100 static int r8192_wx_get_rts(struct net_device
*dev
,
101 struct iw_request_info
*info
,
102 union iwreq_data
*wrqu
, char *extra
)
104 struct r8192_priv
*priv
= ieee80211_priv(dev
);
106 return ieee80211_wx_get_rts(priv
->ieee80211
, info
, wrqu
, extra
);
109 static int r8192_wx_set_power(struct net_device
*dev
,
110 struct iw_request_info
*info
,
111 union iwreq_data
*wrqu
, char *extra
)
114 struct r8192_priv
*priv
= ieee80211_priv(dev
);
118 ret
= ieee80211_wx_set_power(priv
->ieee80211
, info
, wrqu
, extra
);
125 static int r8192_wx_get_power(struct net_device
*dev
,
126 struct iw_request_info
*info
,
127 union iwreq_data
*wrqu
, char *extra
)
129 struct r8192_priv
*priv
= ieee80211_priv(dev
);
131 return ieee80211_wx_get_power(priv
->ieee80211
, info
, wrqu
, extra
);
134 static int r8192_wx_force_reset(struct net_device
*dev
,
135 struct iw_request_info
*info
,
136 union iwreq_data
*wrqu
, char *extra
)
138 struct r8192_priv
*priv
= ieee80211_priv(dev
);
142 printk("%s(): force reset ! extra is %d\n", __func__
, *extra
);
143 priv
->force_reset
= *extra
;
150 static int r8192_wx_set_rawtx(struct net_device
*dev
,
151 struct iw_request_info
*info
,
152 union iwreq_data
*wrqu
, char *extra
)
154 struct r8192_priv
*priv
= ieee80211_priv(dev
);
159 ret
= ieee80211_wx_set_rawtx(priv
->ieee80211
, info
, wrqu
, extra
);
167 static int r8192_wx_set_crcmon(struct net_device
*dev
,
168 struct iw_request_info
*info
,
169 union iwreq_data
*wrqu
, char *extra
)
171 struct r8192_priv
*priv
= ieee80211_priv(dev
);
172 int *parms
= (int *)extra
;
173 int enable
= (parms
[0] > 0);
182 DMESG("bad CRC in monitor mode are %s",
183 priv
->crcmon
? "accepted" : "rejected");
190 static int r8192_wx_set_mode(struct net_device
*dev
, struct iw_request_info
*a
,
191 union iwreq_data
*wrqu
, char *b
)
193 struct r8192_priv
*priv
= ieee80211_priv(dev
);
198 ret
= ieee80211_wx_set_mode(priv
->ieee80211
, a
, wrqu
, b
);
200 rtl8192_set_rxconf(dev
);
206 struct iw_range_with_scan_capa
{
207 /* Informative stuff (to choose between different interface) */
208 __u32 throughput
; /* To give an idea... */
209 /* In theory this value should be the maximum benchmarked
210 * TCP/IP throughput, because with most of these devices the
211 * bit rate is meaningless (overhead an co) to estimate how
212 * fast the connection will go and pick the fastest one.
213 * I suggest people to play with Netperf or any benchmark...
216 /* NWID (or domain id) */
217 __u32 min_nwid
; /* Minimal NWID we are able to set */
218 __u32 max_nwid
; /* Maximal NWID we are able to set */
220 /* Old Frequency (backward compat - moved lower ) */
221 __u16 old_num_channels
;
222 __u8 old_num_frequency
;
224 /* Scan capabilities */
227 static int rtl8180_wx_get_range(struct net_device
*dev
,
228 struct iw_request_info
*info
,
229 union iwreq_data
*wrqu
, char *extra
)
231 struct iw_range
*range
= (struct iw_range
*)extra
;
232 struct iw_range_with_scan_capa
*tmp
= (struct iw_range_with_scan_capa
*)range
;
233 struct r8192_priv
*priv
= ieee80211_priv(dev
);
237 wrqu
->data
.length
= sizeof(*range
);
238 memset(range
, 0, sizeof(*range
));
240 /* Let's try to keep this struct in the same order as in
241 * linux/include/wireless.h
244 /* TODO: See what values we can set, and remove the ones we can't
245 * set, or fill them with some default data.
248 /* ~5 Mb/s real (802.11b) */
249 range
->throughput
= 5 * 1000 * 1000;
251 /* TODO: Not used in 802.11b? */
252 /* range->min_nwid; */ /* Minimal NWID we are able to set */
253 /* TODO: Not used in 802.11b? */
254 /* range->max_nwid; */ /* Maximal NWID we are able to set */
256 /* Old Frequency (backward compat - moved lower ) */
257 /* range->old_num_channels; */
258 /* range->old_num_frequency; */
259 /* range->old_freq[6]; */ /* Filler to keep "version" at the same offset */
260 if (priv
->rf_set_sens
!= NULL
)
261 range
->sensitivity
= priv
->max_sens
; /* signal level threshold range */
263 range
->max_qual
.qual
= 100;
264 /* TODO: Find real max RSSI and stick here */
265 range
->max_qual
.level
= 0;
266 range
->max_qual
.noise
= -98;
267 range
->max_qual
.updated
= 7; /* Updated all three */
269 range
->avg_qual
.qual
= 92; /* > 8% missed beacons is 'bad' */
270 /* TODO: Find real 'good' to 'bad' threshold value for RSSI */
271 range
->avg_qual
.level
= 20 + -98;
272 range
->avg_qual
.noise
= 0;
273 range
->avg_qual
.updated
= 7; /* Updated all three */
275 range
->num_bitrates
= RATE_COUNT
;
277 for (i
= 0; i
< RATE_COUNT
&& i
< IW_MAX_BITRATES
; i
++)
278 range
->bitrate
[i
] = rtl8180_rates
[i
];
280 range
->min_frag
= MIN_FRAG_THRESHOLD
;
281 range
->max_frag
= MAX_FRAG_THRESHOLD
;
284 range
->max_pmp
= 5000000;
286 range
->max_pmt
= 65535*1000;
287 range
->pmp_flags
= IW_POWER_PERIOD
;
288 range
->pmt_flags
= IW_POWER_TIMEOUT
;
289 range
->pm_capa
= IW_POWER_PERIOD
| IW_POWER_TIMEOUT
| IW_POWER_ALL_R
;
291 range
->we_version_compiled
= WIRELESS_EXT
;
292 range
->we_version_source
= 16;
294 /* range->retry_capa; */ /* What retry options are supported */
295 /* range->retry_flags; */ /* How to decode max/min retry limit */
296 /* range->r_time_flags; */ /* How to decode max/min retry life */
297 /* range->min_retry; */ /* Minimal number of retries */
298 /* range->max_retry; */ /* Maximal number of retries */
299 /* range->min_r_time; */ /* Minimal retry lifetime */
300 /* range->max_r_time; */ /* Maximal retry lifetime */
303 for (i
= 0, val
= 0; i
< 14; i
++) {
305 /* Include only legal frequencies for some countries */
306 if ((GET_DOT11D_INFO(priv
->ieee80211
)->channel_map
)[i
+1]) {
307 range
->freq
[val
].i
= i
+ 1;
308 range
->freq
[val
].m
= ieee80211_wlan_frequencies
[i
] * 100000;
309 range
->freq
[val
].e
= 1;
312 /* FIXME: do we need to set anything for channels */
316 if (val
== IW_MAX_FREQUENCIES
)
319 range
->num_frequency
= val
;
320 range
->num_channels
= val
;
321 range
->enc_capa
= IW_ENC_CAPA_WPA
|IW_ENC_CAPA_WPA2
|
322 IW_ENC_CAPA_CIPHER_TKIP
|IW_ENC_CAPA_CIPHER_CCMP
;
323 tmp
->scan_capa
= 0x01;
328 static int r8192_wx_set_scan(struct net_device
*dev
, struct iw_request_info
*a
,
329 union iwreq_data
*wrqu
, char *b
)
331 struct r8192_priv
*priv
= ieee80211_priv(dev
);
332 struct ieee80211_device
*ieee
= priv
->ieee80211
;
338 if (priv
->ieee80211
->LinkDetectInfo
.bBusyTraffic
== true)
340 if (wrqu
->data
.flags
& IW_SCAN_THIS_ESSID
) {
341 struct iw_scan_req
*req
= (struct iw_scan_req
*)b
;
343 if (req
->essid_len
) {
344 ieee
->current_network
.ssid_len
= req
->essid_len
;
345 memcpy(ieee
->current_network
.ssid
, req
->essid
, req
->essid_len
);
350 if (priv
->ieee80211
->state
!= IEEE80211_LINKED
) {
351 priv
->ieee80211
->scanning
= 0;
352 ieee80211_softmac_scan_syncro(priv
->ieee80211
);
355 ret
= ieee80211_wx_set_scan(priv
->ieee80211
, a
, wrqu
, b
);
362 static int r8192_wx_get_scan(struct net_device
*dev
, struct iw_request_info
*a
,
363 union iwreq_data
*wrqu
, char *b
)
367 struct r8192_priv
*priv
= ieee80211_priv(dev
);
374 ret
= ieee80211_wx_get_scan(priv
->ieee80211
, a
, wrqu
, b
);
381 static int r8192_wx_set_essid(struct net_device
*dev
,
382 struct iw_request_info
*a
,
383 union iwreq_data
*wrqu
, char *b
)
385 struct r8192_priv
*priv
= ieee80211_priv(dev
);
390 ret
= ieee80211_wx_set_essid(priv
->ieee80211
, a
, wrqu
, b
);
400 static int r8192_wx_get_essid(struct net_device
*dev
,
401 struct iw_request_info
*a
,
402 union iwreq_data
*wrqu
, char *b
)
405 struct r8192_priv
*priv
= ieee80211_priv(dev
);
409 ret
= ieee80211_wx_get_essid(priv
->ieee80211
, a
, wrqu
, b
);
417 static int r8192_wx_set_freq(struct net_device
*dev
, struct iw_request_info
*a
,
418 union iwreq_data
*wrqu
, char *b
)
421 struct r8192_priv
*priv
= ieee80211_priv(dev
);
425 ret
= ieee80211_wx_set_freq(priv
->ieee80211
, a
, wrqu
, b
);
431 static int r8192_wx_get_name(struct net_device
*dev
,
432 struct iw_request_info
*info
,
433 union iwreq_data
*wrqu
, char *extra
)
435 struct r8192_priv
*priv
= ieee80211_priv(dev
);
437 return ieee80211_wx_get_name(priv
->ieee80211
, info
, wrqu
, extra
);
441 static int r8192_wx_set_frag(struct net_device
*dev
,
442 struct iw_request_info
*info
,
443 union iwreq_data
*wrqu
, char *extra
)
445 struct r8192_priv
*priv
= ieee80211_priv(dev
);
447 if (wrqu
->frag
.disabled
)
448 priv
->ieee80211
->fts
= DEFAULT_FRAG_THRESHOLD
;
450 if (wrqu
->frag
.value
< MIN_FRAG_THRESHOLD
||
451 wrqu
->frag
.value
> MAX_FRAG_THRESHOLD
)
454 priv
->ieee80211
->fts
= wrqu
->frag
.value
& ~0x1;
461 static int r8192_wx_get_frag(struct net_device
*dev
,
462 struct iw_request_info
*info
,
463 union iwreq_data
*wrqu
, char *extra
)
465 struct r8192_priv
*priv
= ieee80211_priv(dev
);
467 wrqu
->frag
.value
= priv
->ieee80211
->fts
;
468 wrqu
->frag
.fixed
= 0; /* no auto select */
469 wrqu
->frag
.disabled
= (wrqu
->frag
.value
== DEFAULT_FRAG_THRESHOLD
);
475 static int r8192_wx_set_wap(struct net_device
*dev
,
476 struct iw_request_info
*info
,
477 union iwreq_data
*awrq
,
482 struct r8192_priv
*priv
= ieee80211_priv(dev
);
483 /* struct sockaddr *temp = (struct sockaddr *)awrq; */
486 ret
= ieee80211_wx_set_wap(priv
->ieee80211
, info
, awrq
, extra
);
495 static int r8192_wx_get_wap(struct net_device
*dev
,
496 struct iw_request_info
*info
,
497 union iwreq_data
*wrqu
, char *extra
)
499 struct r8192_priv
*priv
= ieee80211_priv(dev
);
501 return ieee80211_wx_get_wap(priv
->ieee80211
, info
, wrqu
, extra
);
505 static int r8192_wx_get_enc(struct net_device
*dev
,
506 struct iw_request_info
*info
,
507 union iwreq_data
*wrqu
, char *key
)
509 struct r8192_priv
*priv
= ieee80211_priv(dev
);
511 return ieee80211_wx_get_encode(priv
->ieee80211
, info
, wrqu
, key
);
514 static int r8192_wx_set_enc(struct net_device
*dev
,
515 struct iw_request_info
*info
,
516 union iwreq_data
*wrqu
, char *key
)
518 struct r8192_priv
*priv
= ieee80211_priv(dev
);
519 struct ieee80211_device
*ieee
= priv
->ieee80211
;
521 u32 hwkey
[4] = {0, 0, 0, 0};
524 u8 zero_addr
[4][6] = { {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
525 {0x00, 0x00, 0x00, 0x00, 0x00, 0x01},
526 {0x00, 0x00, 0x00, 0x00, 0x00, 0x02},
527 {0x00, 0x00, 0x00, 0x00, 0x00, 0x03} };
535 RT_TRACE(COMP_SEC
, "Setting SW wep key");
536 ret
= ieee80211_wx_set_encode(priv
->ieee80211
, info
, wrqu
, key
);
542 /* sometimes, the length is zero while we do not type key value */
543 if (wrqu
->encoding
.length
!= 0) {
545 for (i
= 0; i
< 4; i
++) {
546 hwkey
[i
] |= key
[4*i
+0]&mask
;
547 if (i
== 1 && (4*i
+1) == wrqu
->encoding
.length
)
549 if (i
== 3 && (4*i
+1) == wrqu
->encoding
.length
)
551 hwkey
[i
] |= (key
[4*i
+1]&mask
)<<8;
552 hwkey
[i
] |= (key
[4*i
+2]&mask
)<<16;
553 hwkey
[i
] |= (key
[4*i
+3]&mask
)<<24;
556 #define CONF_WEP40 0x4
557 #define CONF_WEP104 0x14
559 switch (wrqu
->encoding
.flags
& IW_ENCODE_INDEX
) {
561 key_idx
= ieee
->tx_keyidx
;
579 if (wrqu
->encoding
.length
== 0x5) {
580 ieee
->pairwise_key_type
= KEY_TYPE_WEP40
;
581 EnableHWSecurityConfig8192(dev
);
584 key_idx
, /* EntryNo */
585 key_idx
, /* KeyIndex */
586 KEY_TYPE_WEP40
, /* KeyType */
589 hwkey
); /* KeyContent */
593 else if (wrqu
->encoding
.length
== 0xd) {
594 ieee
->pairwise_key_type
= KEY_TYPE_WEP104
;
595 EnableHWSecurityConfig8192(dev
);
598 key_idx
, /* EntryNo */
599 key_idx
, /* KeyIndex */
600 KEY_TYPE_WEP104
, /* KeyType */
603 hwkey
); /* KeyContent */
606 printk("wrong type in WEP, not WEP40 and WEP104\n");
615 static int r8192_wx_set_scan_type(struct net_device
*dev
, struct iw_request_info
*aa
,
616 union iwreq_data
*wrqu
, char *p
)
619 struct r8192_priv
*priv
= ieee80211_priv(dev
);
620 int *parms
= (int *)p
;
623 priv
->ieee80211
->active_scan
= mode
;
630 static int r8192_wx_set_retry(struct net_device
*dev
,
631 struct iw_request_info
*info
,
632 union iwreq_data
*wrqu
, char *extra
)
634 struct r8192_priv
*priv
= ieee80211_priv(dev
);
639 if (wrqu
->retry
.flags
& IW_RETRY_LIFETIME
||
640 wrqu
->retry
.disabled
){
644 if (!(wrqu
->retry
.flags
& IW_RETRY_LIMIT
)) {
649 if (wrqu
->retry
.value
> R8180_MAX_RETRY
) {
653 if (wrqu
->retry
.flags
& IW_RETRY_MAX
) {
654 priv
->retry_rts
= wrqu
->retry
.value
;
655 DMESG("Setting retry for RTS/CTS data to %d", wrqu
->retry
.value
);
658 priv
->retry_data
= wrqu
->retry
.value
;
659 DMESG("Setting retry for non RTS/CTS data to %d", wrqu
->retry
.value
);
663 * We might try to write directly the TX config register
664 * or to restart just the (R)TX process.
665 * I'm unsure if whole reset is really needed
675 static int r8192_wx_get_retry(struct net_device
*dev
,
676 struct iw_request_info
*info
,
677 union iwreq_data
*wrqu
, char *extra
)
679 struct r8192_priv
*priv
= ieee80211_priv(dev
);
682 wrqu
->retry
.disabled
= 0; /* can't be disabled */
684 if ((wrqu
->retry
.flags
& IW_RETRY_TYPE
) ==
688 if (wrqu
->retry
.flags
& IW_RETRY_MAX
) {
689 wrqu
->retry
.flags
= IW_RETRY_LIMIT
| IW_RETRY_MAX
;
690 wrqu
->retry
.value
= priv
->retry_rts
;
692 wrqu
->retry
.flags
= IW_RETRY_LIMIT
| IW_RETRY_MIN
;
693 wrqu
->retry
.value
= priv
->retry_data
;
700 static int r8192_wx_get_sens(struct net_device
*dev
,
701 struct iw_request_info
*info
,
702 union iwreq_data
*wrqu
, char *extra
)
704 struct r8192_priv
*priv
= ieee80211_priv(dev
);
706 if (priv
->rf_set_sens
== NULL
)
707 return -1; /* we have not this support for this radio */
708 wrqu
->sens
.value
= priv
->sens
;
713 static int r8192_wx_set_sens(struct net_device
*dev
,
714 struct iw_request_info
*info
,
715 union iwreq_data
*wrqu
, char *extra
)
718 struct r8192_priv
*priv
= ieee80211_priv(dev
);
722 if (priv
->rf_set_sens
== NULL
) {
723 err
= -1; /* we have not this support for this radio */
726 if (priv
->rf_set_sens(dev
, wrqu
->sens
.value
) == 0)
727 priv
->sens
= wrqu
->sens
.value
;
737 /* hw security need to reorganized. */
738 static int r8192_wx_set_enc_ext(struct net_device
*dev
,
739 struct iw_request_info
*info
,
740 union iwreq_data
*wrqu
, char *extra
)
743 struct r8192_priv
*priv
= ieee80211_priv(dev
);
744 struct ieee80211_device
*ieee
= priv
->ieee80211
;
748 ret
= ieee80211_wx_set_encode_ext(priv
->ieee80211
, info
, wrqu
, extra
);
751 u8 broadcast_addr
[6] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
754 struct iw_encode_ext
*ext
= (struct iw_encode_ext
*)extra
;
755 struct iw_point
*encoding
= &wrqu
->encoding
;
756 u8 idx
= 0, alg
= 0, group
= 0;
758 if ((encoding
->flags
& IW_ENCODE_DISABLED
) || ext
->alg
== IW_ENCODE_ALG_NONE
)
759 /* none is not allowed to use hwsec WB 2008.07.01 */
762 /* as IW_ENCODE_ALG_CCMP is defined to be 3 and KEY_TYPE_CCMP is defined to 4; */
763 alg
= (ext
->alg
== IW_ENCODE_ALG_CCMP
)?KEY_TYPE_CCMP
:ext
->alg
;
764 idx
= encoding
->flags
& IW_ENCODE_INDEX
;
767 group
= ext
->ext_flags
& IW_ENCODE_EXT_GROUP_KEY
;
769 if ((!group
) || (IW_MODE_ADHOC
== ieee
->iw_mode
) || (alg
== KEY_TYPE_WEP40
)) {
770 if ((ext
->key_len
== 13) && (alg
== KEY_TYPE_WEP40
))
771 alg
= KEY_TYPE_WEP104
;
772 ieee
->pairwise_key_type
= alg
;
773 EnableHWSecurityConfig8192(dev
);
775 memcpy((u8
*)key
, ext
->key
, 16); /* we only get 16 bytes key.why? WB 2008.7.1 */
777 if ((alg
& KEY_TYPE_WEP40
) && (ieee
->auth_mode
!= 2)) {
785 key
); /* KeyContent */
787 ieee
->group_key_type
= alg
;
792 broadcast_addr
, /* MacAddr */
794 key
); /* KeyContent */
795 } else { /* pairwise key */
800 (u8
*)ieee
->ap_mac_addr
,/* MacAddr */
802 key
); /* KeyContent */
814 static int r8192_wx_set_auth(struct net_device
*dev
,
815 struct iw_request_info
*info
,
816 union iwreq_data
*data
, char *extra
)
819 struct r8192_priv
*priv
= ieee80211_priv(dev
);
822 ret
= ieee80211_wx_set_auth(priv
->ieee80211
, info
, &(data
->param
), extra
);
827 static int r8192_wx_set_mlme(struct net_device
*dev
,
828 struct iw_request_info
*info
,
829 union iwreq_data
*wrqu
, char *extra
)
833 struct r8192_priv
*priv
= ieee80211_priv(dev
);
836 ret
= ieee80211_wx_set_mlme(priv
->ieee80211
, info
, wrqu
, extra
);
842 static int r8192_wx_set_gen_ie(struct net_device
*dev
,
843 struct iw_request_info
*info
,
844 union iwreq_data
*data
, char *extra
)
847 struct r8192_priv
*priv
= ieee80211_priv(dev
);
850 ret
= ieee80211_wx_set_gen_ie(priv
->ieee80211
, extra
, data
->data
.length
);
857 static int dummy(struct net_device
*dev
, struct iw_request_info
*a
,
858 union iwreq_data
*wrqu
, char *b
)
864 static iw_handler r8192_wx_handlers
[] = {
865 NULL
, /* SIOCSIWCOMMIT */
866 r8192_wx_get_name
, /* SIOCGIWNAME */
867 dummy
, /* SIOCSIWNWID */
868 dummy
, /* SIOCGIWNWID */
869 r8192_wx_set_freq
, /* SIOCSIWFREQ */
870 r8192_wx_get_freq
, /* SIOCGIWFREQ */
871 r8192_wx_set_mode
, /* SIOCSIWMODE */
872 r8192_wx_get_mode
, /* SIOCGIWMODE */
873 r8192_wx_set_sens
, /* SIOCSIWSENS */
874 r8192_wx_get_sens
, /* SIOCGIWSENS */
875 NULL
, /* SIOCSIWRANGE */
876 rtl8180_wx_get_range
, /* SIOCGIWRANGE */
877 NULL
, /* SIOCSIWPRIV */
878 NULL
, /* SIOCGIWPRIV */
879 NULL
, /* SIOCSIWSTATS */
880 NULL
, /* SIOCGIWSTATS */
881 dummy
, /* SIOCSIWSPY */
882 dummy
, /* SIOCGIWSPY */
883 NULL
, /* SIOCGIWTHRSPY */
884 NULL
, /* SIOCWIWTHRSPY */
885 r8192_wx_set_wap
, /* SIOCSIWAP */
886 r8192_wx_get_wap
, /* SIOCGIWAP */
887 r8192_wx_set_mlme
, /* MLME-- */
888 dummy
, /* SIOCGIWAPLIST -- deprecated */
889 r8192_wx_set_scan
, /* SIOCSIWSCAN */
890 r8192_wx_get_scan
, /* SIOCGIWSCAN */
891 r8192_wx_set_essid
, /* SIOCSIWESSID */
892 r8192_wx_get_essid
, /* SIOCGIWESSID */
893 dummy
, /* SIOCSIWNICKN */
894 dummy
, /* SIOCGIWNICKN */
895 NULL
, /* -- hole -- */
896 NULL
, /* -- hole -- */
897 r8192_wx_set_rate
, /* SIOCSIWRATE */
898 r8192_wx_get_rate
, /* SIOCGIWRATE */
899 r8192_wx_set_rts
, /* SIOCSIWRTS */
900 r8192_wx_get_rts
, /* SIOCGIWRTS */
901 r8192_wx_set_frag
, /* SIOCSIWFRAG */
902 r8192_wx_get_frag
, /* SIOCGIWFRAG */
903 dummy
, /* SIOCSIWTXPOW */
904 dummy
, /* SIOCGIWTXPOW */
905 r8192_wx_set_retry
, /* SIOCSIWRETRY */
906 r8192_wx_get_retry
, /* SIOCGIWRETRY */
907 r8192_wx_set_enc
, /* SIOCSIWENCODE */
908 r8192_wx_get_enc
, /* SIOCGIWENCODE */
909 r8192_wx_set_power
, /* SIOCSIWPOWER */
910 r8192_wx_get_power
, /* SIOCGIWPOWER */
913 r8192_wx_set_gen_ie
, /* NULL, */ /* SIOCSIWGENIE */
914 NULL
, /* SIOCSIWGENIE */
916 r8192_wx_set_auth
,/* NULL, */ /* SIOCSIWAUTH */
917 NULL
,/* r8192_wx_get_auth, */ /* NULL, */ /* SIOCSIWAUTH */
918 r8192_wx_set_enc_ext
, /* SIOCSIWENCODEEXT */
919 NULL
,/* r8192_wx_get_enc_ext, *//* NULL, */ /* SIOCSIWENCODEEXT */
920 NULL
, /* SIOCSIWPMKSA */
926 static const struct iw_priv_args r8192_private_args
[] = {
929 SIOCIWFIRSTPRIV
+ 0x0,
930 IW_PRIV_TYPE_INT
| IW_PRIV_SIZE_FIXED
| 1, 0, "badcrc"
934 SIOCIWFIRSTPRIV
+ 0x1,
935 IW_PRIV_TYPE_INT
| IW_PRIV_SIZE_FIXED
| 1, 0, "activescan"
939 SIOCIWFIRSTPRIV
+ 0x2,
940 IW_PRIV_TYPE_INT
| IW_PRIV_SIZE_FIXED
| 1, 0, "rawtx"
943 SIOCIWFIRSTPRIV
+ 0x3,
944 IW_PRIV_TYPE_INT
| IW_PRIV_SIZE_FIXED
| 1, 0, "forcereset"
951 static iw_handler r8192_private_handler
[] = {
953 r8192_wx_set_scan_type
,
955 r8192_wx_force_reset
,
958 struct iw_statistics
*r8192_get_wireless_stats(struct net_device
*dev
)
960 struct r8192_priv
*priv
= ieee80211_priv(dev
);
961 struct ieee80211_device
*ieee
= priv
->ieee80211
;
962 struct iw_statistics
*wstats
= &priv
->wstats
;
967 if (ieee
->state
< IEEE80211_LINKED
) {
968 wstats
->qual
.qual
= 0;
969 wstats
->qual
.level
= 0;
970 wstats
->qual
.noise
= 0;
971 wstats
->qual
.updated
= IW_QUAL_ALL_UPDATED
| IW_QUAL_DBM
;
975 tmp_level
= (&ieee
->current_network
)->stats
.rssi
;
976 tmp_qual
= (&ieee
->current_network
)->stats
.signal
;
977 tmp_noise
= (&ieee
->current_network
)->stats
.noise
;
979 wstats
->qual
.level
= tmp_level
;
980 wstats
->qual
.qual
= tmp_qual
;
981 wstats
->qual
.noise
= tmp_noise
;
982 wstats
->qual
.updated
= IW_QUAL_ALL_UPDATED
| IW_QUAL_DBM
;
987 struct iw_handler_def r8192_wx_handlers_def
= {
988 .standard
= r8192_wx_handlers
,
989 .num_standard
= ARRAY_SIZE(r8192_wx_handlers
),
990 .private = r8192_private_handler
,
991 .num_private
= ARRAY_SIZE(r8192_private_handler
),
992 .num_private_args
= sizeof(r8192_private_args
) / sizeof(struct iw_priv_args
),
993 .get_wireless_stats
= r8192_get_wireless_stats
,
994 .private_args
= (struct iw_priv_args
*)r8192_private_args
,