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",__func__, *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];
281 range->min_frag = MIN_FRAG_THRESHOLD;
282 range->max_frag = MAX_FRAG_THRESHOLD;
285 range->max_pmp = 5000000;
287 range->max_pmt = 65535*1000;
288 range->pmp_flags = IW_POWER_PERIOD;
289 range->pmt_flags = IW_POWER_TIMEOUT;
290 range->pm_capa = IW_POWER_PERIOD | IW_POWER_TIMEOUT | IW_POWER_ALL_R;
292 range->we_version_compiled = WIRELESS_EXT;
293 range->we_version_source = 16;
295 // range->retry_capa; /* What retry options are supported */
296 // range->retry_flags; /* How to decode max/min retry limit */
297 // range->r_time_flags; /* How to decode max/min retry life */
298 // range->min_retry; /* Minimal number of retries */
299 // range->max_retry; /* Maximal number of retries */
300 // range->min_r_time; /* Minimal retry lifetime */
301 // range->max_r_time; /* Maximal retry lifetime */
304 for (i = 0, val = 0; i < 14; i++) {
306 // Include only legal frequencies for some countries
307 if ((GET_DOT11D_INFO(priv->ieee80211)->channel_map)[i+1]) {
308 range->freq[val].i = i + 1;
309 range->freq[val].m = ieee80211_wlan_frequencies[i] * 100000;
310 range->freq[val].e = 1;
313 // FIXME: do we need to set anything for channels
317 if (val == IW_MAX_FREQUENCIES)
320 range->num_frequency = val;
321 range->num_channels = val;
322 range->enc_capa = IW_ENC_CAPA_WPA|IW_ENC_CAPA_WPA2|
323 IW_ENC_CAPA_CIPHER_TKIP|IW_ENC_CAPA_CIPHER_CCMP;
324 tmp->scan_capa = 0x01;
329 static int r8192_wx_set_scan(struct net_device *dev, struct iw_request_info *a,
330 union iwreq_data *wrqu, char *b)
332 struct r8192_priv *priv = ieee80211_priv(dev);
333 struct ieee80211_device *ieee = priv->ieee80211;
336 if(!priv->up) return -ENETDOWN;
338 if (priv->ieee80211->LinkDetectInfo.bBusyTraffic == true)
340 if (wrqu->data.flags & IW_SCAN_THIS_ESSID)
342 struct iw_scan_req *req = (struct iw_scan_req *)b;
345 //printk("==**&*&*&**===>scan set ssid:%s\n", req->essid);
346 ieee->current_network.ssid_len = req->essid_len;
347 memcpy(ieee->current_network.ssid, req->essid, req->essid_len);
348 //printk("=====>network ssid:%s\n", ieee->current_network.ssid);
353 if(priv->ieee80211->state != IEEE80211_LINKED){
354 priv->ieee80211->scanning = 0;
355 ieee80211_softmac_scan_syncro(priv->ieee80211);
359 ret = ieee80211_wx_set_scan(priv->ieee80211,a,wrqu,b);
365 static int r8192_wx_get_scan(struct net_device *dev, struct iw_request_info *a,
366 union iwreq_data *wrqu, char *b)
370 struct r8192_priv *priv = ieee80211_priv(dev);
372 if(!priv->up) return -ENETDOWN;
376 ret = ieee80211_wx_get_scan(priv->ieee80211,a,wrqu,b);
383 static int r8192_wx_set_essid(struct net_device *dev,
384 struct iw_request_info *a,
385 union iwreq_data *wrqu, char *b)
387 struct r8192_priv *priv = ieee80211_priv(dev);
391 ret = ieee80211_wx_set_essid(priv->ieee80211,a,wrqu,b);
401 static int r8192_wx_get_essid(struct net_device *dev,
402 struct iw_request_info *a,
403 union iwreq_data *wrqu, char *b)
406 struct r8192_priv *priv = ieee80211_priv(dev);
410 ret = ieee80211_wx_get_essid(priv->ieee80211, a, wrqu, b);
418 static int r8192_wx_set_freq(struct net_device *dev, struct iw_request_info *a,
419 union iwreq_data *wrqu, char *b)
422 struct r8192_priv *priv = ieee80211_priv(dev);
426 ret = ieee80211_wx_set_freq(priv->ieee80211, a, wrqu, b);
432 static int r8192_wx_get_name(struct net_device *dev,
433 struct iw_request_info *info,
434 union iwreq_data *wrqu, char *extra)
436 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;
523 u32 hwkey[4]={0,0,0,0};
526 //u8 broadcast_addr[6] ={ 0xff,0xff,0xff,0xff,0xff,0xff};
527 u8 zero_addr[4][6] ={ {0x00,0x00,0x00,0x00,0x00,0x00},
528 {0x00,0x00,0x00,0x00,0x00,0x01},
529 {0x00,0x00,0x00,0x00,0x00,0x02},
530 {0x00,0x00,0x00,0x00,0x00,0x03} };
533 if(!priv->up) return -ENETDOWN;
537 RT_TRACE(COMP_SEC, "Setting SW wep key");
538 ret = ieee80211_wx_set_encode(priv->ieee80211,info,wrqu,key);
544 //sometimes, the length is zero while we do not type key value
545 if(wrqu->encoding.length!=0){
547 for(i=0 ; i<4 ; i++){
548 hwkey[i] |= key[4*i+0]&mask;
549 if(i==1&&(4*i+1)==wrqu->encoding.length) mask=0x00;
550 if(i==3&&(4*i+1)==wrqu->encoding.length) mask=0x00;
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){
560 case 0: key_idx = ieee->tx_keyidx; break;
561 case 1: key_idx = 0; break;
562 case 2: key_idx = 1; break;
563 case 3: key_idx = 2; break;
564 case 4: key_idx = 3; break;
568 if(wrqu->encoding.length==0x5){
569 ieee->pairwise_key_type = KEY_TYPE_WEP40;
570 EnableHWSecurityConfig8192(dev);
575 KEY_TYPE_WEP40, //KeyType
582 else if(wrqu->encoding.length==0xd){
583 ieee->pairwise_key_type = KEY_TYPE_WEP104;
584 EnableHWSecurityConfig8192(dev);
589 KEY_TYPE_WEP104, //KeyType
595 else printk("wrong type in WEP, not WEP40 and WEP104\n");
603 static int r8192_wx_set_scan_type(struct net_device *dev, struct iw_request_info *aa, union
604 iwreq_data *wrqu, char *p){
606 struct r8192_priv *priv = ieee80211_priv(dev);
610 priv->ieee80211->active_scan = mode;
617 static int r8192_wx_set_retry(struct net_device *dev,
618 struct iw_request_info *info,
619 union iwreq_data *wrqu, char *extra)
621 struct r8192_priv *priv = ieee80211_priv(dev);
626 if (wrqu->retry.flags & IW_RETRY_LIFETIME ||
627 wrqu->retry.disabled){
631 if (!(wrqu->retry.flags & IW_RETRY_LIMIT)){
636 if(wrqu->retry.value > R8180_MAX_RETRY){
640 if (wrqu->retry.flags & IW_RETRY_MAX) {
641 priv->retry_rts = wrqu->retry.value;
642 DMESG("Setting retry for RTS/CTS data to %d", wrqu->retry.value);
645 priv->retry_data = wrqu->retry.value;
646 DMESG("Setting retry for non RTS/CTS data to %d", wrqu->retry.value);
650 * We might try to write directly the TX config register
651 * or to restart just the (R)TX process.
652 * I'm unsure if whole reset is really needed
658 rtl8180_rtx_disable(dev);
659 rtl8180_rx_enable(dev);
660 rtl8180_tx_enable(dev);
670 static int r8192_wx_get_retry(struct net_device *dev,
671 struct iw_request_info *info,
672 union iwreq_data *wrqu, char *extra)
674 struct r8192_priv *priv = ieee80211_priv(dev);
677 wrqu->retry.disabled = 0; /* can't be disabled */
679 if ((wrqu->retry.flags & IW_RETRY_TYPE) ==
683 if (wrqu->retry.flags & IW_RETRY_MAX) {
684 wrqu->retry.flags = IW_RETRY_LIMIT | IW_RETRY_MAX;
685 wrqu->retry.value = priv->retry_rts;
687 wrqu->retry.flags = IW_RETRY_LIMIT | IW_RETRY_MIN;
688 wrqu->retry.value = priv->retry_data;
690 //printk("returning %d",wrqu->retry.value);
696 static int r8192_wx_get_sens(struct net_device *dev,
697 struct iw_request_info *info,
698 union iwreq_data *wrqu, char *extra)
700 struct r8192_priv *priv = ieee80211_priv(dev);
701 if(priv->rf_set_sens == NULL)
702 return -1; /* we have not this support for this radio */
703 wrqu->sens.value = priv->sens;
708 static int r8192_wx_set_sens(struct net_device *dev,
709 struct iw_request_info *info,
710 union iwreq_data *wrqu, char *extra)
713 struct r8192_priv *priv = ieee80211_priv(dev);
717 //DMESG("attempt to set sensivity to %ddb",wrqu->sens.value);
718 if(priv->rf_set_sens == NULL) {
719 err= -1; /* we have not this support for this radio */
722 if(priv->rf_set_sens(dev, wrqu->sens.value) == 0)
723 priv->sens = wrqu->sens.value;
733 //hw security need to reorganized.
734 static int r8192_wx_set_enc_ext(struct net_device *dev,
735 struct iw_request_info *info,
736 union iwreq_data *wrqu, char *extra)
739 struct r8192_priv *priv = ieee80211_priv(dev);
740 struct ieee80211_device *ieee = priv->ieee80211;
741 //printk("===>%s()\n", __func__);
745 ret = ieee80211_wx_set_encode_ext(priv->ieee80211, info, wrqu, extra);
748 u8 broadcast_addr[6] = {0xff,0xff,0xff,0xff,0xff,0xff};
751 struct iw_encode_ext *ext = (struct iw_encode_ext *)extra;
752 struct iw_point *encoding = &wrqu->encoding;
753 u8 idx = 0, alg = 0, group = 0;
754 if ((encoding->flags & IW_ENCODE_DISABLED) ||
755 ext->alg == IW_ENCODE_ALG_NONE) //none is not allowed to use hwsec WB 2008.07.01
758 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;
759 idx = encoding->flags & IW_ENCODE_INDEX;
762 group = ext->ext_flags & IW_ENCODE_EXT_GROUP_KEY;
764 if ((!group) || (IW_MODE_ADHOC == ieee->iw_mode) || (alg == KEY_TYPE_WEP40))
766 if ((ext->key_len == 13) && (alg == KEY_TYPE_WEP40) )
767 alg = KEY_TYPE_WEP104;
768 ieee->pairwise_key_type = alg;
769 EnableHWSecurityConfig8192(dev);
771 memcpy((u8 *)key, ext->key, 16); //we only get 16 bytes key.why? WB 2008.7.1
773 if ((alg & KEY_TYPE_WEP40) && (ieee->auth_mode !=2) )
786 ieee->group_key_type = alg;
791 broadcast_addr, //MacAddr
801 (u8 *)ieee->ap_mac_addr, //MacAddr
815 static int r8192_wx_set_auth(struct net_device *dev,
816 struct iw_request_info *info,
817 union iwreq_data *data, char *extra)
820 //printk("====>%s()\n", __func__);
821 struct r8192_priv *priv = ieee80211_priv(dev);
823 ret = ieee80211_wx_set_auth(priv->ieee80211, info, &(data->param), extra);
828 static int r8192_wx_set_mlme(struct net_device *dev,
829 struct iw_request_info *info,
830 union iwreq_data *wrqu, char *extra)
832 //printk("====>%s()\n", __func__);
835 struct r8192_priv *priv = ieee80211_priv(dev);
837 ret = ieee80211_wx_set_mlme(priv->ieee80211, info, wrqu, extra);
843 static int r8192_wx_set_gen_ie(struct net_device *dev,
844 struct iw_request_info *info,
845 union iwreq_data *data, char *extra)
847 //printk("====>%s(), len:%d\n", __func__, data->length);
849 struct r8192_priv *priv = ieee80211_priv(dev);
851 ret = ieee80211_wx_set_gen_ie(priv->ieee80211, extra, data->data.length);
853 //printk("<======%s(), ret:%d\n", __func__, ret);
859 static int dummy(struct net_device *dev, struct iw_request_info *a,
860 union iwreq_data *wrqu,char *b)
866 static iw_handler r8192_wx_handlers[] =
868 NULL, /* SIOCSIWCOMMIT */
869 r8192_wx_get_name, /* SIOCGIWNAME */
870 dummy, /* SIOCSIWNWID */
871 dummy, /* SIOCGIWNWID */
872 r8192_wx_set_freq, /* SIOCSIWFREQ */
873 r8192_wx_get_freq, /* SIOCGIWFREQ */
874 r8192_wx_set_mode, /* SIOCSIWMODE */
875 r8192_wx_get_mode, /* SIOCGIWMODE */
876 r8192_wx_set_sens, /* SIOCSIWSENS */
877 r8192_wx_get_sens, /* SIOCGIWSENS */
878 NULL, /* SIOCSIWRANGE */
879 rtl8180_wx_get_range, /* SIOCGIWRANGE */
880 NULL, /* SIOCSIWPRIV */
881 NULL, /* SIOCGIWPRIV */
882 NULL, /* SIOCSIWSTATS */
883 NULL, /* SIOCGIWSTATS */
884 dummy, /* SIOCSIWSPY */
885 dummy, /* SIOCGIWSPY */
886 NULL, /* SIOCGIWTHRSPY */
887 NULL, /* SIOCWIWTHRSPY */
888 r8192_wx_set_wap, /* SIOCSIWAP */
889 r8192_wx_get_wap, /* SIOCGIWAP */
890 r8192_wx_set_mlme, /* MLME-- */
891 dummy, /* SIOCGIWAPLIST -- deprecated */
892 r8192_wx_set_scan, /* SIOCSIWSCAN */
893 r8192_wx_get_scan, /* SIOCGIWSCAN */
894 r8192_wx_set_essid, /* SIOCSIWESSID */
895 r8192_wx_get_essid, /* SIOCGIWESSID */
896 dummy, /* SIOCSIWNICKN */
897 dummy, /* SIOCGIWNICKN */
898 NULL, /* -- hole -- */
899 NULL, /* -- hole -- */
900 r8192_wx_set_rate, /* SIOCSIWRATE */
901 r8192_wx_get_rate, /* SIOCGIWRATE */
902 r8192_wx_set_rts, /* SIOCSIWRTS */
903 r8192_wx_get_rts, /* SIOCGIWRTS */
904 r8192_wx_set_frag, /* SIOCSIWFRAG */
905 r8192_wx_get_frag, /* SIOCGIWFRAG */
906 dummy, /* SIOCSIWTXPOW */
907 dummy, /* SIOCGIWTXPOW */
908 r8192_wx_set_retry, /* SIOCSIWRETRY */
909 r8192_wx_get_retry, /* SIOCGIWRETRY */
910 r8192_wx_set_enc, /* SIOCSIWENCODE */
911 r8192_wx_get_enc, /* SIOCGIWENCODE */
912 r8192_wx_set_power, /* SIOCSIWPOWER */
913 r8192_wx_get_power, /* SIOCGIWPOWER */
916 r8192_wx_set_gen_ie,//NULL, /* SIOCSIWGENIE */
917 NULL, /* SIOCSIWGENIE */
919 r8192_wx_set_auth,//NULL, /* SIOCSIWAUTH */
920 NULL,//r8192_wx_get_auth,//NULL, /* SIOCSIWAUTH */
921 r8192_wx_set_enc_ext, /* SIOCSIWENCODEEXT */
922 NULL,//r8192_wx_get_enc_ext,//NULL, /* SIOCSIWENCODEEXT */
923 NULL, /* SIOCSIWPMKSA */
929 static const struct iw_priv_args r8192_private_args[] = {
932 SIOCIWFIRSTPRIV + 0x0,
933 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "badcrc"
937 SIOCIWFIRSTPRIV + 0x1,
938 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "activescan"
942 SIOCIWFIRSTPRIV + 0x2,
943 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "rawtx"
946 SIOCIWFIRSTPRIV + 0x3,
947 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "forcereset"
954 static iw_handler r8192_private_handler[] = {
955 // r8192_wx_set_monitor, /* SIOCIWFIRSTPRIV */
956 r8192_wx_set_crcmon, /*SIOCIWSECONDPRIV*/
957 // r8192_wx_set_forceassociate,
958 // r8192_wx_set_beaconinterval,
959 // r8192_wx_set_monitor_type,
960 r8192_wx_set_scan_type,
963 r8192_wx_force_reset,
966 struct iw_statistics *r8192_get_wireless_stats(struct net_device *dev)
968 struct r8192_priv *priv = ieee80211_priv(dev);
969 struct ieee80211_device *ieee = priv->ieee80211;
970 struct iw_statistics *wstats = &priv->wstats;
974 if(ieee->state < IEEE80211_LINKED)
976 wstats->qual.qual = 0;
977 wstats->qual.level = 0;
978 wstats->qual.noise = 0;
979 wstats->qual.updated = IW_QUAL_ALL_UPDATED | IW_QUAL_DBM;
983 tmp_level = (&ieee->current_network)->stats.rssi;
984 tmp_qual = (&ieee->current_network)->stats.signal;
985 tmp_noise = (&ieee->current_network)->stats.noise;
986 //printk("level:%d, qual:%d, noise:%d\n", tmp_level, tmp_qual, tmp_noise);
988 wstats->qual.level = tmp_level;
989 wstats->qual.qual = tmp_qual;
990 wstats->qual.noise = tmp_noise;
991 wstats->qual.updated = IW_QUAL_ALL_UPDATED| IW_QUAL_DBM;
996 struct iw_handler_def r8192_wx_handlers_def={
997 .standard = r8192_wx_handlers,
998 .num_standard = ARRAY_SIZE(r8192_wx_handlers),
999 .private = r8192_private_handler,
1000 .num_private = ARRAY_SIZE(r8192_private_handler),
1001 .num_private_args = sizeof(r8192_private_args) / sizeof(struct iw_priv_args),
1002 .get_wireless_stats = r8192_get_wireless_stats,
1003 .private_args = (struct iw_priv_args *)r8192_private_args,