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"
27 u32 rtl8180_rates[] = {1000000,2000000,5500000,11000000,
28 6000000,9000000,12000000,18000000,24000000,36000000,48000000,54000000};
35 static int r8192_wx_get_freq(struct net_device *dev,
36 struct iw_request_info *a,
37 union iwreq_data *wrqu, char *b)
39 struct r8192_priv *priv = ieee80211_priv(dev);
41 return ieee80211_wx_get_freq(priv->ieee80211,a,wrqu,b);
45 static int r8192_wx_get_mode(struct net_device *dev, struct iw_request_info *a,
46 union iwreq_data *wrqu, char *b)
48 struct r8192_priv *priv=ieee80211_priv(dev);
50 return ieee80211_wx_get_mode(priv->ieee80211,a,wrqu,b);
55 static int r8192_wx_get_rate(struct net_device *dev,
56 struct iw_request_info *info,
57 union iwreq_data *wrqu, char *extra)
59 struct r8192_priv *priv = ieee80211_priv(dev);
60 return ieee80211_wx_get_rate(priv->ieee80211,info,wrqu,extra);
65 static int r8192_wx_set_rate(struct net_device *dev,
66 struct iw_request_info *info,
67 union iwreq_data *wrqu, char *extra)
70 struct r8192_priv *priv = ieee80211_priv(dev);
74 ret = ieee80211_wx_set_rate(priv->ieee80211,info,wrqu,extra);
82 static int r8192_wx_set_rts(struct net_device *dev,
83 struct iw_request_info *info,
84 union iwreq_data *wrqu, char *extra)
87 struct r8192_priv *priv = ieee80211_priv(dev);
91 ret = ieee80211_wx_set_rts(priv->ieee80211,info,wrqu,extra);
98 static int r8192_wx_get_rts(struct net_device *dev,
99 struct iw_request_info *info,
100 union iwreq_data *wrqu, char *extra)
102 struct r8192_priv *priv = ieee80211_priv(dev);
103 return ieee80211_wx_get_rts(priv->ieee80211,info,wrqu,extra);
106 static int r8192_wx_set_power(struct net_device *dev,
107 struct iw_request_info *info,
108 union iwreq_data *wrqu, char *extra)
111 struct r8192_priv *priv = ieee80211_priv(dev);
115 ret = ieee80211_wx_set_power(priv->ieee80211,info,wrqu,extra);
122 static int r8192_wx_get_power(struct net_device *dev,
123 struct iw_request_info *info,
124 union iwreq_data *wrqu, char *extra)
126 struct r8192_priv *priv = ieee80211_priv(dev);
127 return ieee80211_wx_get_power(priv->ieee80211,info,wrqu,extra);
130 static int r8192_wx_force_reset(struct net_device *dev,
131 struct iw_request_info *info,
132 union iwreq_data *wrqu, char *extra)
134 struct r8192_priv *priv = ieee80211_priv(dev);
138 printk("%s(): force reset ! extra is %d\n",__FUNCTION__, *extra);
139 priv->force_reset = *extra;
146 static int r8192_wx_set_rawtx(struct net_device *dev,
147 struct iw_request_info *info,
148 union iwreq_data *wrqu, char *extra)
150 struct r8192_priv *priv = ieee80211_priv(dev);
155 ret = ieee80211_wx_set_rawtx(priv->ieee80211, info, wrqu, extra);
163 static int r8192_wx_set_crcmon(struct net_device *dev,
164 struct iw_request_info *info,
165 union iwreq_data *wrqu, char *extra)
167 struct r8192_priv *priv = ieee80211_priv(dev);
168 int *parms = (int *)extra;
169 int enable = (parms[0] > 0);
170 short prev = priv->crcmon;
179 DMESG("bad CRC in monitor mode are %s",
180 priv->crcmon ? "accepted" : "rejected");
182 if(prev != priv->crcmon && priv->up){
192 static int r8192_wx_set_mode(struct net_device *dev, struct iw_request_info *a,
193 union iwreq_data *wrqu, char *b)
195 struct r8192_priv *priv = ieee80211_priv(dev);
199 ret = ieee80211_wx_set_mode(priv->ieee80211,a,wrqu,b);
201 rtl8192_set_rxconf(dev);
207 struct iw_range_with_scan_capa {
208 /* Informative stuff (to choose between different interface) */
209 __u32 throughput; /* To give an idea... */
210 /* In theory this value should be the maximum benchmarked
211 * TCP/IP throughput, because with most of these devices the
212 * bit rate is meaningless (overhead an co) to estimate how
213 * fast the connection will go and pick the fastest one.
214 * I suggest people to play with Netperf or any benchmark...
217 /* NWID (or domain id) */
218 __u32 min_nwid; /* Minimal NWID we are able to set */
219 __u32 max_nwid; /* Maximal NWID we are able to set */
221 /* Old Frequency (backward compat - moved lower ) */
222 __u16 old_num_channels;
223 __u8 old_num_frequency;
225 /* Scan capabilities */
228 static int rtl8180_wx_get_range(struct net_device *dev,
229 struct iw_request_info *info,
230 union iwreq_data *wrqu, char *extra)
232 struct iw_range *range = (struct iw_range *)extra;
233 struct iw_range_with_scan_capa *tmp = (struct iw_range_with_scan_capa *)range;
234 struct r8192_priv *priv = ieee80211_priv(dev);
238 wrqu->data.length = sizeof(*range);
239 memset(range, 0, sizeof(*range));
241 /* Let's try to keep this struct in the same order as in
242 * linux/include/wireless.h
245 /* TODO: See what values we can set, and remove the ones we can't
246 * set, or fill them with some default data.
249 /* ~5 Mb/s real (802.11b) */
250 range->throughput = 5 * 1000 * 1000;
252 // TODO: Not used in 802.11b?
253 // range->min_nwid; /* Minimal NWID we are able to set */
254 // TODO: Not used in 802.11b?
255 // range->max_nwid; /* Maximal NWID we are able to set */
257 /* Old Frequency (backward compat - moved lower ) */
258 // range->old_num_channels;
259 // range->old_num_frequency;
260 // range->old_freq[6]; /* Filler to keep "version" at the same offset */
261 if(priv->rf_set_sens != NULL)
262 range->sensitivity = priv->max_sens; /* signal level threshold range */
264 range->max_qual.qual = 100;
265 /* TODO: Find real max RSSI and stick here */
266 range->max_qual.level = 0;
267 range->max_qual.noise = -98;
268 range->max_qual.updated = 7; /* Updated all three */
270 range->avg_qual.qual = 92; /* > 8% missed beacons is 'bad' */
271 /* TODO: Find real 'good' to 'bad' threshold value for RSSI */
272 range->avg_qual.level = 20 + -98;
273 range->avg_qual.noise = 0;
274 range->avg_qual.updated = 7; /* Updated all three */
276 range->num_bitrates = RATE_COUNT;
278 for (i = 0; i < RATE_COUNT && i < IW_MAX_BITRATES; i++) {
279 range->bitrate[i] = rtl8180_rates[i];
282 range->min_frag = MIN_FRAG_THRESHOLD;
283 range->max_frag = MAX_FRAG_THRESHOLD;
286 range->max_pmp = 5000000;
288 range->max_pmt = 65535*1000;
289 range->pmp_flags = IW_POWER_PERIOD;
290 range->pmt_flags = IW_POWER_TIMEOUT;
291 range->pm_capa = IW_POWER_PERIOD | IW_POWER_TIMEOUT | IW_POWER_ALL_R;
293 range->we_version_compiled = WIRELESS_EXT;
294 range->we_version_source = 16;
296 // range->retry_capa; /* What retry options are supported */
297 // range->retry_flags; /* How to decode max/min retry limit */
298 // range->r_time_flags; /* How to decode max/min retry life */
299 // range->min_retry; /* Minimal number of retries */
300 // range->max_retry; /* Maximal number of retries */
301 // range->min_r_time; /* Minimal retry lifetime */
302 // range->max_r_time; /* Maximal retry lifetime */
305 for (i = 0, val = 0; i < 14; i++) {
307 // Include only legal frequencies for some countries
308 if ((GET_DOT11D_INFO(priv->ieee80211)->channel_map)[i+1]) {
309 range->freq[val].i = i + 1;
310 range->freq[val].m = ieee80211_wlan_frequencies[i] * 100000;
311 range->freq[val].e = 1;
314 // FIXME: do we need to set anything for channels
318 if (val == IW_MAX_FREQUENCIES)
321 range->num_frequency = val;
322 range->num_channels = val;
323 #if WIRELESS_EXT > 17
324 range->enc_capa = IW_ENC_CAPA_WPA|IW_ENC_CAPA_WPA2|
325 IW_ENC_CAPA_CIPHER_TKIP|IW_ENC_CAPA_CIPHER_CCMP;
327 tmp->scan_capa = 0x01;
332 static int r8192_wx_set_scan(struct net_device *dev, struct iw_request_info *a,
333 union iwreq_data *wrqu, char *b)
335 struct r8192_priv *priv = ieee80211_priv(dev);
336 struct ieee80211_device *ieee = priv->ieee80211;
339 if(!priv->up) return -ENETDOWN;
341 if (priv->ieee80211->LinkDetectInfo.bBusyTraffic == true)
343 if (wrqu->data.flags & IW_SCAN_THIS_ESSID)
345 struct iw_scan_req *req = (struct iw_scan_req *)b;
348 //printk("==**&*&*&**===>scan set ssid:%s\n", req->essid);
349 ieee->current_network.ssid_len = req->essid_len;
350 memcpy(ieee->current_network.ssid, req->essid, req->essid_len);
351 //printk("=====>network ssid:%s\n", ieee->current_network.ssid);
356 if(priv->ieee80211->state != IEEE80211_LINKED){
357 priv->ieee80211->scanning = 0;
358 ieee80211_softmac_scan_syncro(priv->ieee80211);
362 ret = ieee80211_wx_set_scan(priv->ieee80211,a,wrqu,b);
368 static int r8192_wx_get_scan(struct net_device *dev, struct iw_request_info *a,
369 union iwreq_data *wrqu, char *b)
373 struct r8192_priv *priv = ieee80211_priv(dev);
375 if(!priv->up) return -ENETDOWN;
379 ret = ieee80211_wx_get_scan(priv->ieee80211,a,wrqu,b);
386 static int r8192_wx_set_essid(struct net_device *dev,
387 struct iw_request_info *a,
388 union iwreq_data *wrqu, char *b)
390 struct r8192_priv *priv = ieee80211_priv(dev);
394 ret = ieee80211_wx_set_essid(priv->ieee80211,a,wrqu,b);
404 static int r8192_wx_get_essid(struct net_device *dev,
405 struct iw_request_info *a,
406 union iwreq_data *wrqu, char *b)
409 struct r8192_priv *priv = ieee80211_priv(dev);
413 ret = ieee80211_wx_get_essid(priv->ieee80211, a, wrqu, b);
421 static int r8192_wx_set_freq(struct net_device *dev, struct iw_request_info *a,
422 union iwreq_data *wrqu, char *b)
425 struct r8192_priv *priv = ieee80211_priv(dev);
429 ret = ieee80211_wx_set_freq(priv->ieee80211, a, wrqu, b);
435 static int r8192_wx_get_name(struct net_device *dev,
436 struct iw_request_info *info,
437 union iwreq_data *wrqu, char *extra)
439 struct r8192_priv *priv = ieee80211_priv(dev);
440 return ieee80211_wx_get_name(priv->ieee80211, info, wrqu, extra);
444 static int r8192_wx_set_frag(struct net_device *dev,
445 struct iw_request_info *info,
446 union iwreq_data *wrqu, char *extra)
448 struct r8192_priv *priv = ieee80211_priv(dev);
450 if (wrqu->frag.disabled)
451 priv->ieee80211->fts = DEFAULT_FRAG_THRESHOLD;
453 if (wrqu->frag.value < MIN_FRAG_THRESHOLD ||
454 wrqu->frag.value > MAX_FRAG_THRESHOLD)
457 priv->ieee80211->fts = wrqu->frag.value & ~0x1;
464 static int r8192_wx_get_frag(struct net_device *dev,
465 struct iw_request_info *info,
466 union iwreq_data *wrqu, char *extra)
468 struct r8192_priv *priv = ieee80211_priv(dev);
470 wrqu->frag.value = priv->ieee80211->fts;
471 wrqu->frag.fixed = 0; /* no auto select */
472 wrqu->frag.disabled = (wrqu->frag.value == DEFAULT_FRAG_THRESHOLD);
478 static int r8192_wx_set_wap(struct net_device *dev,
479 struct iw_request_info *info,
480 union iwreq_data *awrq,
485 struct r8192_priv *priv = ieee80211_priv(dev);
486 // struct sockaddr *temp = (struct sockaddr *)awrq;
489 ret = ieee80211_wx_set_wap(priv->ieee80211,info,awrq,extra);
498 static int r8192_wx_get_wap(struct net_device *dev,
499 struct iw_request_info *info,
500 union iwreq_data *wrqu, char *extra)
502 struct r8192_priv *priv = ieee80211_priv(dev);
504 return ieee80211_wx_get_wap(priv->ieee80211,info,wrqu,extra);
508 static int r8192_wx_get_enc(struct net_device *dev,
509 struct iw_request_info *info,
510 union iwreq_data *wrqu, char *key)
512 struct r8192_priv *priv = ieee80211_priv(dev);
514 return ieee80211_wx_get_encode(priv->ieee80211, info, wrqu, key);
517 static int r8192_wx_set_enc(struct net_device *dev,
518 struct iw_request_info *info,
519 union iwreq_data *wrqu, char *key)
521 struct r8192_priv *priv = ieee80211_priv(dev);
522 struct ieee80211_device *ieee = priv->ieee80211;
526 u32 hwkey[4]={0,0,0,0};
529 //u8 broadcast_addr[6] ={ 0xff,0xff,0xff,0xff,0xff,0xff};
530 u8 zero_addr[4][6] ={ {0x00,0x00,0x00,0x00,0x00,0x00},
531 {0x00,0x00,0x00,0x00,0x00,0x01},
532 {0x00,0x00,0x00,0x00,0x00,0x02},
533 {0x00,0x00,0x00,0x00,0x00,0x03} };
536 if(!priv->up) return -ENETDOWN;
540 RT_TRACE(COMP_SEC, "Setting SW wep key");
541 ret = ieee80211_wx_set_encode(priv->ieee80211,info,wrqu,key);
547 //sometimes, the length is zero while we do not type key value
548 if(wrqu->encoding.length!=0){
550 for(i=0 ; i<4 ; i++){
551 hwkey[i] |= key[4*i+0]&mask;
552 if(i==1&&(4*i+1)==wrqu->encoding.length) mask=0x00;
553 if(i==3&&(4*i+1)==wrqu->encoding.length) mask=0x00;
554 hwkey[i] |= (key[4*i+1]&mask)<<8;
555 hwkey[i] |= (key[4*i+2]&mask)<<16;
556 hwkey[i] |= (key[4*i+3]&mask)<<24;
559 #define CONF_WEP40 0x4
560 #define CONF_WEP104 0x14
562 switch (wrqu->encoding.flags & IW_ENCODE_INDEX){
563 case 0: key_idx = ieee->tx_keyidx; break;
564 case 1: key_idx = 0; break;
565 case 2: key_idx = 1; break;
566 case 3: key_idx = 2; break;
567 case 4: key_idx = 3; break;
571 if(wrqu->encoding.length==0x5){
572 ieee->pairwise_key_type = KEY_TYPE_WEP40;
573 EnableHWSecurityConfig8192(dev);
578 KEY_TYPE_WEP40, //KeyType
585 else if(wrqu->encoding.length==0xd){
586 ieee->pairwise_key_type = KEY_TYPE_WEP104;
587 EnableHWSecurityConfig8192(dev);
592 KEY_TYPE_WEP104, //KeyType
598 else printk("wrong type in WEP, not WEP40 and WEP104\n");
606 static int r8192_wx_set_scan_type(struct net_device *dev, struct iw_request_info *aa, union
607 iwreq_data *wrqu, char *p){
609 struct r8192_priv *priv = ieee80211_priv(dev);
613 priv->ieee80211->active_scan = mode;
620 static int r8192_wx_set_retry(struct net_device *dev,
621 struct iw_request_info *info,
622 union iwreq_data *wrqu, char *extra)
624 struct r8192_priv *priv = ieee80211_priv(dev);
629 if (wrqu->retry.flags & IW_RETRY_LIFETIME ||
630 wrqu->retry.disabled){
634 if (!(wrqu->retry.flags & IW_RETRY_LIMIT)){
639 if(wrqu->retry.value > R8180_MAX_RETRY){
643 if (wrqu->retry.flags & IW_RETRY_MAX) {
644 priv->retry_rts = wrqu->retry.value;
645 DMESG("Setting retry for RTS/CTS data to %d", wrqu->retry.value);
648 priv->retry_data = wrqu->retry.value;
649 DMESG("Setting retry for non RTS/CTS data to %d", wrqu->retry.value);
653 * We might try to write directly the TX config register
654 * or to restart just the (R)TX process.
655 * I'm unsure if whole reset is really needed
661 rtl8180_rtx_disable(dev);
662 rtl8180_rx_enable(dev);
663 rtl8180_tx_enable(dev);
673 static int r8192_wx_get_retry(struct net_device *dev,
674 struct iw_request_info *info,
675 union iwreq_data *wrqu, char *extra)
677 struct r8192_priv *priv = ieee80211_priv(dev);
680 wrqu->retry.disabled = 0; /* can't be disabled */
682 if ((wrqu->retry.flags & IW_RETRY_TYPE) ==
686 if (wrqu->retry.flags & IW_RETRY_MAX) {
687 wrqu->retry.flags = IW_RETRY_LIMIT | IW_RETRY_MAX;
688 wrqu->retry.value = priv->retry_rts;
690 wrqu->retry.flags = IW_RETRY_LIMIT | IW_RETRY_MIN;
691 wrqu->retry.value = priv->retry_data;
693 //printk("returning %d",wrqu->retry.value);
699 static int r8192_wx_get_sens(struct net_device *dev,
700 struct iw_request_info *info,
701 union iwreq_data *wrqu, char *extra)
703 struct r8192_priv *priv = ieee80211_priv(dev);
704 if(priv->rf_set_sens == NULL)
705 return -1; /* we have not this support for this radio */
706 wrqu->sens.value = priv->sens;
711 static int r8192_wx_set_sens(struct net_device *dev,
712 struct iw_request_info *info,
713 union iwreq_data *wrqu, char *extra)
716 struct r8192_priv *priv = ieee80211_priv(dev);
720 //DMESG("attempt to set sensivity to %ddb",wrqu->sens.value);
721 if(priv->rf_set_sens == NULL) {
722 err= -1; /* we have not this support for this radio */
725 if(priv->rf_set_sens(dev, wrqu->sens.value) == 0)
726 priv->sens = wrqu->sens.value;
736 #if (WIRELESS_EXT >= 18)
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;
745 //printk("===>%s()\n", __FUNCTION__);
749 ret = ieee80211_wx_set_encode_ext(priv->ieee80211, info, wrqu, extra);
752 u8 broadcast_addr[6] = {0xff,0xff,0xff,0xff,0xff,0xff};
755 struct iw_encode_ext *ext = (struct iw_encode_ext *)extra;
756 struct iw_point *encoding = &wrqu->encoding;
757 u8 idx = 0, alg = 0, group = 0;
758 if ((encoding->flags & IW_ENCODE_DISABLED) ||
759 ext->alg == IW_ENCODE_ALG_NONE) //none is not allowed to use hwsec WB 2008.07.01
762 alg = (ext->alg == IW_ENCODE_ALG_CCMP)?KEY_TYPE_CCMP:ext->alg; // as IW_ENCODE_ALG_CCMP is defined to be 3 and KEY_TYPE_CCMP is defined to 4;
763 idx = encoding->flags & IW_ENCODE_INDEX;
766 group = ext->ext_flags & IW_ENCODE_EXT_GROUP_KEY;
768 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) )
790 ieee->group_key_type = alg;
795 broadcast_addr, //MacAddr
805 (u8 *)ieee->ap_mac_addr, //MacAddr
819 static int r8192_wx_set_auth(struct net_device *dev,
820 struct iw_request_info *info,
821 union iwreq_data *data, char *extra)
824 //printk("====>%s()\n", __FUNCTION__);
825 struct r8192_priv *priv = ieee80211_priv(dev);
827 ret = ieee80211_wx_set_auth(priv->ieee80211, info, &(data->param), extra);
832 static int r8192_wx_set_mlme(struct net_device *dev,
833 struct iw_request_info *info,
834 union iwreq_data *wrqu, char *extra)
836 //printk("====>%s()\n", __FUNCTION__);
839 struct r8192_priv *priv = ieee80211_priv(dev);
841 ret = ieee80211_wx_set_mlme(priv->ieee80211, info, wrqu, extra);
847 static int r8192_wx_set_gen_ie(struct net_device *dev,
848 struct iw_request_info *info,
849 union iwreq_data *data, char *extra)
851 //printk("====>%s(), len:%d\n", __FUNCTION__, data->length);
853 struct r8192_priv *priv = ieee80211_priv(dev);
855 ret = ieee80211_wx_set_gen_ie(priv->ieee80211, extra, data->data.length);
857 //printk("<======%s(), ret:%d\n", __FUNCTION__, ret);
863 static int dummy(struct net_device *dev, struct iw_request_info *a,
864 union iwreq_data *wrqu,char *b)
870 static iw_handler r8192_wx_handlers[] =
872 NULL, /* SIOCSIWCOMMIT */
873 r8192_wx_get_name, /* SIOCGIWNAME */
874 dummy, /* SIOCSIWNWID */
875 dummy, /* SIOCGIWNWID */
876 r8192_wx_set_freq, /* SIOCSIWFREQ */
877 r8192_wx_get_freq, /* SIOCGIWFREQ */
878 r8192_wx_set_mode, /* SIOCSIWMODE */
879 r8192_wx_get_mode, /* SIOCGIWMODE */
880 r8192_wx_set_sens, /* SIOCSIWSENS */
881 r8192_wx_get_sens, /* SIOCGIWSENS */
882 NULL, /* SIOCSIWRANGE */
883 rtl8180_wx_get_range, /* SIOCGIWRANGE */
884 NULL, /* SIOCSIWPRIV */
885 NULL, /* SIOCGIWPRIV */
886 NULL, /* SIOCSIWSTATS */
887 NULL, /* SIOCGIWSTATS */
888 dummy, /* SIOCSIWSPY */
889 dummy, /* SIOCGIWSPY */
890 NULL, /* SIOCGIWTHRSPY */
891 NULL, /* SIOCWIWTHRSPY */
892 r8192_wx_set_wap, /* SIOCSIWAP */
893 r8192_wx_get_wap, /* SIOCGIWAP */
894 #if (WIRELESS_EXT >= 18)
895 r8192_wx_set_mlme, /* MLME-- */
899 dummy, /* SIOCGIWAPLIST -- deprecated */
900 r8192_wx_set_scan, /* SIOCSIWSCAN */
901 r8192_wx_get_scan, /* SIOCGIWSCAN */
902 r8192_wx_set_essid, /* SIOCSIWESSID */
903 r8192_wx_get_essid, /* SIOCGIWESSID */
904 dummy, /* SIOCSIWNICKN */
905 dummy, /* SIOCGIWNICKN */
906 NULL, /* -- hole -- */
907 NULL, /* -- hole -- */
908 r8192_wx_set_rate, /* SIOCSIWRATE */
909 r8192_wx_get_rate, /* SIOCGIWRATE */
910 r8192_wx_set_rts, /* SIOCSIWRTS */
911 r8192_wx_get_rts, /* SIOCGIWRTS */
912 r8192_wx_set_frag, /* SIOCSIWFRAG */
913 r8192_wx_get_frag, /* SIOCGIWFRAG */
914 dummy, /* SIOCSIWTXPOW */
915 dummy, /* SIOCGIWTXPOW */
916 r8192_wx_set_retry, /* SIOCSIWRETRY */
917 r8192_wx_get_retry, /* SIOCGIWRETRY */
918 r8192_wx_set_enc, /* SIOCSIWENCODE */
919 r8192_wx_get_enc, /* SIOCGIWENCODE */
920 r8192_wx_set_power, /* SIOCSIWPOWER */
921 r8192_wx_get_power, /* SIOCGIWPOWER */
924 r8192_wx_set_gen_ie,//NULL, /* SIOCSIWGENIE */
925 NULL, /* SIOCSIWGENIE */
927 #if (WIRELESS_EXT >= 18)
928 r8192_wx_set_auth,//NULL, /* SIOCSIWAUTH */
929 NULL,//r8192_wx_get_auth,//NULL, /* SIOCSIWAUTH */
930 r8192_wx_set_enc_ext, /* SIOCSIWENCODEEXT */
931 NULL,//r8192_wx_get_enc_ext,//NULL, /* SIOCSIWENCODEEXT */
938 NULL, /* SIOCSIWPMKSA */
944 static const struct iw_priv_args r8192_private_args[] = {
947 SIOCIWFIRSTPRIV + 0x0,
948 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "badcrc"
952 SIOCIWFIRSTPRIV + 0x1,
953 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "activescan"
957 SIOCIWFIRSTPRIV + 0x2,
958 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "rawtx"
961 SIOCIWFIRSTPRIV + 0x3,
962 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "forcereset"
969 static iw_handler r8192_private_handler[] = {
970 // r8192_wx_set_monitor, /* SIOCIWFIRSTPRIV */
971 r8192_wx_set_crcmon, /*SIOCIWSECONDPRIV*/
972 // r8192_wx_set_forceassociate,
973 // r8192_wx_set_beaconinterval,
974 // r8192_wx_set_monitor_type,
975 r8192_wx_set_scan_type,
978 r8192_wx_force_reset,
981 //#if WIRELESS_EXT >= 17
982 struct iw_statistics *r8192_get_wireless_stats(struct net_device *dev)
984 struct r8192_priv *priv = ieee80211_priv(dev);
985 struct ieee80211_device *ieee = priv->ieee80211;
986 struct iw_statistics *wstats = &priv->wstats;
990 if(ieee->state < IEEE80211_LINKED)
992 wstats->qual.qual = 0;
993 wstats->qual.level = 0;
994 wstats->qual.noise = 0;
995 wstats->qual.updated = IW_QUAL_ALL_UPDATED | IW_QUAL_DBM;
999 tmp_level = (&ieee->current_network)->stats.rssi;
1000 tmp_qual = (&ieee->current_network)->stats.signal;
1001 tmp_noise = (&ieee->current_network)->stats.noise;
1002 //printk("level:%d, qual:%d, noise:%d\n", tmp_level, tmp_qual, tmp_noise);
1004 wstats->qual.level = tmp_level;
1005 wstats->qual.qual = tmp_qual;
1006 wstats->qual.noise = tmp_noise;
1007 wstats->qual.updated = IW_QUAL_ALL_UPDATED| IW_QUAL_DBM;
1013 struct iw_handler_def r8192_wx_handlers_def={
1014 .standard = r8192_wx_handlers,
1015 .num_standard = ARRAY_SIZE(r8192_wx_handlers),
1016 .private = r8192_private_handler,
1017 .num_private = ARRAY_SIZE(r8192_private_handler),
1018 .num_private_args = sizeof(r8192_private_args) / sizeof(struct iw_priv_args),
1019 #if WIRELESS_EXT >= 17
1020 .get_wireless_stats = r8192_get_wireless_stats,
1022 .private_args = (struct iw_priv_args *)r8192_private_args,