2 This file contains wireless extension handlers.
4 This is part of rtl8180 OpenSource driver.
5 Copyright (C) Andrea Merello 2004-2005 <andreamrl@tiscali.it>
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 tanks 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
);
131 u16
read_rtl8225(struct net_device
*dev
, u8 addr
);
132 void write_rtl8225(struct net_device
*dev
, u8 adr
, u16 data
);
133 u32
john_read_rtl8225(struct net_device
*dev
, u8 adr
);
134 void _write_rtl8225(struct net_device
*dev
, u8 adr
, u16 data
);
136 static int r8192_wx_read_regs(struct net_device
*dev
,
137 struct iw_request_info
*info
,
138 union iwreq_data
*wrqu
, char *extra
)
140 struct r8192_priv
*priv
= ieee80211_priv(dev
);
147 get_user(addr
,(u8
*)wrqu
->data
.pointer
);
148 data1
= read_rtl8225(dev
, addr
);
149 wrqu
->data
.length
= data1
;
156 static int r8192_wx_write_regs(struct net_device
*dev
,
157 struct iw_request_info
*info
,
158 union iwreq_data
*wrqu
, char *extra
)
160 struct r8192_priv
*priv
= ieee80211_priv(dev
);
165 get_user(addr
, (u8
*)wrqu
->data
.pointer
);
166 write_rtl8225(dev
, addr
, wrqu
->data
.length
);
173 void rtl8187_write_phy(struct net_device
*dev
, u8 adr
, u32 data
);
174 u8
rtl8187_read_phy(struct net_device
*dev
,u8 adr
, u32 data
);
176 static int r8192_wx_read_bb(struct net_device
*dev
,
177 struct iw_request_info
*info
,
178 union iwreq_data
*wrqu
, char *extra
)
180 struct r8192_priv
*priv
= ieee80211_priv(dev
);
185 databb
= rtl8187_read_phy(dev
, (u8
)wrqu
->data
.length
, 0x00000000);
186 wrqu
->data
.length
= databb
;
192 void rtl8187_write_phy(struct net_device
*dev
, u8 adr
, u32 data
);
193 static int r8192_wx_write_bb(struct net_device
*dev
,
194 struct iw_request_info
*info
,
195 union iwreq_data
*wrqu
, char *extra
)
197 struct r8192_priv
*priv
= ieee80211_priv(dev
);
202 get_user(databb
, (u8
*)wrqu
->data
.pointer
);
203 rtl8187_write_phy(dev
, wrqu
->data
.length
, databb
);
211 static int r8192_wx_write_nicb(struct net_device
*dev
,
212 struct iw_request_info
*info
,
213 union iwreq_data
*wrqu
, char *extra
)
215 struct r8192_priv
*priv
= ieee80211_priv(dev
);
220 get_user(addr
, (u32
*)wrqu
->data
.pointer
);
221 write_nic_byte(dev
, addr
, wrqu
->data
.length
);
227 static int r8192_wx_read_nicb(struct net_device
*dev
,
228 struct iw_request_info
*info
,
229 union iwreq_data
*wrqu
, char *extra
)
231 struct r8192_priv
*priv
= ieee80211_priv(dev
);
237 get_user(addr
,(u32
*)wrqu
->data
.pointer
);
238 data1
= read_nic_byte(dev
, addr
);
239 wrqu
->data
.length
= data1
;
245 static int r8192_wx_get_ap_status(struct net_device
*dev
,
246 struct iw_request_info
*info
,
247 union iwreq_data
*wrqu
, char *extra
)
249 struct r8192_priv
*priv
= ieee80211_priv(dev
);
250 struct ieee80211_device
*ieee
= priv
->ieee80211
;
251 struct ieee80211_network
*target
;
256 //count the length of input ssid
257 for(name_len
=0 ; ((char*)wrqu
->data
.pointer
)[name_len
]!='\0' ; name_len
++);
259 //search for the correspoding info which is received
260 list_for_each_entry(target
, &ieee
->network_list
, list
) {
261 if ( (target
->ssid_len
== name_len
) &&
262 (strncmp(target
->ssid
, (char*)wrqu
->data
.pointer
, name_len
)==0)){
263 if(target
->wpa_ie_len
>0 || target
->rsn_ie_len
>0 )
264 //set flags=1 to indicate this ap is WPA
265 wrqu
->data
.flags
= 1;
266 else wrqu
->data
.flags
= 0;
280 static int r8192_wx_force_reset(struct net_device
*dev
,
281 struct iw_request_info
*info
,
282 union iwreq_data
*wrqu
, char *extra
)
284 struct r8192_priv
*priv
= ieee80211_priv(dev
);
288 printk("%s(): force reset ! extra is %d\n",__FUNCTION__
, *extra
);
289 priv
->force_reset
= *extra
;
296 static int r8192_wx_set_rawtx(struct net_device
*dev
,
297 struct iw_request_info
*info
,
298 union iwreq_data
*wrqu
, char *extra
)
300 struct r8192_priv
*priv
= ieee80211_priv(dev
);
305 ret
= ieee80211_wx_set_rawtx(priv
->ieee80211
, info
, wrqu
, extra
);
313 static int r8192_wx_set_crcmon(struct net_device
*dev
,
314 struct iw_request_info
*info
,
315 union iwreq_data
*wrqu
, char *extra
)
317 struct r8192_priv
*priv
= ieee80211_priv(dev
);
318 int *parms
= (int *)extra
;
319 int enable
= (parms
[0] > 0);
320 short prev
= priv
->crcmon
;
329 DMESG("bad CRC in monitor mode are %s",
330 priv
->crcmon
? "accepted" : "rejected");
332 if(prev
!= priv
->crcmon
&& priv
->up
){
342 static int r8192_wx_set_mode(struct net_device
*dev
, struct iw_request_info
*a
,
343 union iwreq_data
*wrqu
, char *b
)
345 struct r8192_priv
*priv
= ieee80211_priv(dev
);
349 ret
= ieee80211_wx_set_mode(priv
->ieee80211
,a
,wrqu
,b
);
351 rtl8192_set_rxconf(dev
);
357 struct iw_range_with_scan_capa
359 /* Informative stuff (to choose between different interface) */
360 __u32 throughput
; /* To give an idea... */
361 /* In theory this value should be the maximum benchmarked
362 * TCP/IP throughput, because with most of these devices the
363 * bit rate is meaningless (overhead an co) to estimate how
364 * fast the connection will go and pick the fastest one.
365 * I suggest people to play with Netperf or any benchmark...
368 /* NWID (or domain id) */
369 __u32 min_nwid
; /* Minimal NWID we are able to set */
370 __u32 max_nwid
; /* Maximal NWID we are able to set */
372 /* Old Frequency (backward compat - moved lower ) */
373 __u16 old_num_channels
;
374 __u8 old_num_frequency
;
376 /* Scan capabilities */
379 static int rtl8180_wx_get_range(struct net_device
*dev
,
380 struct iw_request_info
*info
,
381 union iwreq_data
*wrqu
, char *extra
)
383 struct iw_range
*range
= (struct iw_range
*)extra
;
384 struct iw_range_with_scan_capa
* tmp
= (struct iw_range_with_scan_capa
*)range
;
385 struct r8192_priv
*priv
= ieee80211_priv(dev
);
389 wrqu
->data
.length
= sizeof(*range
);
390 memset(range
, 0, sizeof(*range
));
392 /* Let's try to keep this struct in the same order as in
393 * linux/include/wireless.h
396 /* TODO: See what values we can set, and remove the ones we can't
397 * set, or fill them with some default data.
400 /* ~5 Mb/s real (802.11b) */
401 range
->throughput
= 5 * 1000 * 1000;
403 // TODO: Not used in 802.11b?
404 // range->min_nwid; /* Minimal NWID we are able to set */
405 // TODO: Not used in 802.11b?
406 // range->max_nwid; /* Maximal NWID we are able to set */
408 /* Old Frequency (backward compat - moved lower ) */
409 // range->old_num_channels;
410 // range->old_num_frequency;
411 // range->old_freq[6]; /* Filler to keep "version" at the same offset */
412 if(priv
->rf_set_sens
!= NULL
)
413 range
->sensitivity
= priv
->max_sens
; /* signal level threshold range */
415 range
->max_qual
.qual
= 100;
416 /* TODO: Find real max RSSI and stick here */
417 range
->max_qual
.level
= 0;
418 range
->max_qual
.noise
= -98;
419 range
->max_qual
.updated
= 7; /* Updated all three */
421 range
->avg_qual
.qual
= 92; /* > 8% missed beacons is 'bad' */
422 /* TODO: Find real 'good' to 'bad' threshol value for RSSI */
423 range
->avg_qual
.level
= 20 + -98;
424 range
->avg_qual
.noise
= 0;
425 range
->avg_qual
.updated
= 7; /* Updated all three */
427 range
->num_bitrates
= RATE_COUNT
;
429 for (i
= 0; i
< RATE_COUNT
&& i
< IW_MAX_BITRATES
; i
++) {
430 range
->bitrate
[i
] = rtl8180_rates
[i
];
433 range
->min_frag
= MIN_FRAG_THRESHOLD
;
434 range
->max_frag
= MAX_FRAG_THRESHOLD
;
437 range
->max_pmp
= 5000000;
439 range
->max_pmt
= 65535*1000;
440 range
->pmp_flags
= IW_POWER_PERIOD
;
441 range
->pmt_flags
= IW_POWER_TIMEOUT
;
442 range
->pm_capa
= IW_POWER_PERIOD
| IW_POWER_TIMEOUT
| IW_POWER_ALL_R
;
444 range
->we_version_compiled
= WIRELESS_EXT
;
445 range
->we_version_source
= 16;
447 // range->retry_capa; /* What retry options are supported */
448 // range->retry_flags; /* How to decode max/min retry limit */
449 // range->r_time_flags; /* How to decode max/min retry life */
450 // range->min_retry; /* Minimal number of retries */
451 // range->max_retry; /* Maximal number of retries */
452 // range->min_r_time; /* Minimal retry lifetime */
453 // range->max_r_time; /* Maximal retry lifetime */
456 for (i
= 0, val
= 0; i
< 14; i
++) {
458 // Include only legal frequencies for some countries
459 if ((GET_DOT11D_INFO(priv
->ieee80211
)->channel_map
)[i
+1]) {
460 range
->freq
[val
].i
= i
+ 1;
461 range
->freq
[val
].m
= ieee80211_wlan_frequencies
[i
] * 100000;
462 range
->freq
[val
].e
= 1;
465 // FIXME: do we need to set anything for channels
469 if (val
== IW_MAX_FREQUENCIES
)
472 range
->num_frequency
= val
;
473 range
->num_channels
= val
;
474 #if WIRELESS_EXT > 17
475 range
->enc_capa
= IW_ENC_CAPA_WPA
|IW_ENC_CAPA_WPA2
|
476 IW_ENC_CAPA_CIPHER_TKIP
|IW_ENC_CAPA_CIPHER_CCMP
;
478 tmp
->scan_capa
= 0x01;
483 static int r8192_wx_set_scan(struct net_device
*dev
, struct iw_request_info
*a
,
484 union iwreq_data
*wrqu
, char *b
)
486 struct r8192_priv
*priv
= ieee80211_priv(dev
);
487 struct ieee80211_device
* ieee
= priv
->ieee80211
;
490 if(!priv
->up
) return -ENETDOWN
;
492 if (priv
->ieee80211
->LinkDetectInfo
.bBusyTraffic
== true)
494 if (wrqu
->data
.flags
& IW_SCAN_THIS_ESSID
)
496 struct iw_scan_req
* req
= (struct iw_scan_req
*)b
;
499 //printk("==**&*&*&**===>scan set ssid:%s\n", req->essid);
500 ieee
->current_network
.ssid_len
= req
->essid_len
;
501 memcpy(ieee
->current_network
.ssid
, req
->essid
, req
->essid_len
);
502 //printk("=====>network ssid:%s\n", ieee->current_network.ssid);
507 if(priv
->ieee80211
->state
!= IEEE80211_LINKED
){
508 priv
->ieee80211
->scanning
= 0;
509 ieee80211_softmac_scan_syncro(priv
->ieee80211
);
513 ret
= ieee80211_wx_set_scan(priv
->ieee80211
,a
,wrqu
,b
);
519 static int r8192_wx_get_scan(struct net_device
*dev
, struct iw_request_info
*a
,
520 union iwreq_data
*wrqu
, char *b
)
524 struct r8192_priv
*priv
= ieee80211_priv(dev
);
526 if(!priv
->up
) return -ENETDOWN
;
530 ret
= ieee80211_wx_get_scan(priv
->ieee80211
,a
,wrqu
,b
);
537 static int r8192_wx_set_essid(struct net_device
*dev
,
538 struct iw_request_info
*a
,
539 union iwreq_data
*wrqu
, char *b
)
541 struct r8192_priv
*priv
= ieee80211_priv(dev
);
545 ret
= ieee80211_wx_set_essid(priv
->ieee80211
,a
,wrqu
,b
);
555 static int r8192_wx_get_essid(struct net_device
*dev
,
556 struct iw_request_info
*a
,
557 union iwreq_data
*wrqu
, char *b
)
560 struct r8192_priv
*priv
= ieee80211_priv(dev
);
564 ret
= ieee80211_wx_get_essid(priv
->ieee80211
, a
, wrqu
, b
);
572 static int r8192_wx_set_freq(struct net_device
*dev
, struct iw_request_info
*a
,
573 union iwreq_data
*wrqu
, char *b
)
576 struct r8192_priv
*priv
= ieee80211_priv(dev
);
580 ret
= ieee80211_wx_set_freq(priv
->ieee80211
, a
, wrqu
, b
);
586 static int r8192_wx_get_name(struct net_device
*dev
,
587 struct iw_request_info
*info
,
588 union iwreq_data
*wrqu
, char *extra
)
590 struct r8192_priv
*priv
= ieee80211_priv(dev
);
591 return ieee80211_wx_get_name(priv
->ieee80211
, info
, wrqu
, extra
);
595 static int r8192_wx_set_frag(struct net_device
*dev
,
596 struct iw_request_info
*info
,
597 union iwreq_data
*wrqu
, char *extra
)
599 struct r8192_priv
*priv
= ieee80211_priv(dev
);
601 if (wrqu
->frag
.disabled
)
602 priv
->ieee80211
->fts
= DEFAULT_FRAG_THRESHOLD
;
604 if (wrqu
->frag
.value
< MIN_FRAG_THRESHOLD
||
605 wrqu
->frag
.value
> MAX_FRAG_THRESHOLD
)
608 priv
->ieee80211
->fts
= wrqu
->frag
.value
& ~0x1;
615 static int r8192_wx_get_frag(struct net_device
*dev
,
616 struct iw_request_info
*info
,
617 union iwreq_data
*wrqu
, char *extra
)
619 struct r8192_priv
*priv
= ieee80211_priv(dev
);
621 wrqu
->frag
.value
= priv
->ieee80211
->fts
;
622 wrqu
->frag
.fixed
= 0; /* no auto select */
623 wrqu
->frag
.disabled
= (wrqu
->frag
.value
== DEFAULT_FRAG_THRESHOLD
);
629 static int r8192_wx_set_wap(struct net_device
*dev
,
630 struct iw_request_info
*info
,
631 union iwreq_data
*awrq
,
636 struct r8192_priv
*priv
= ieee80211_priv(dev
);
637 // struct sockaddr *temp = (struct sockaddr *)awrq;
640 ret
= ieee80211_wx_set_wap(priv
->ieee80211
,info
,awrq
,extra
);
649 static int r8192_wx_get_wap(struct net_device
*dev
,
650 struct iw_request_info
*info
,
651 union iwreq_data
*wrqu
, char *extra
)
653 struct r8192_priv
*priv
= ieee80211_priv(dev
);
655 return ieee80211_wx_get_wap(priv
->ieee80211
,info
,wrqu
,extra
);
659 static int r8192_wx_get_enc(struct net_device
*dev
,
660 struct iw_request_info
*info
,
661 union iwreq_data
*wrqu
, char *key
)
663 struct r8192_priv
*priv
= ieee80211_priv(dev
);
665 return ieee80211_wx_get_encode(priv
->ieee80211
, info
, wrqu
, key
);
668 static int r8192_wx_set_enc(struct net_device
*dev
,
669 struct iw_request_info
*info
,
670 union iwreq_data
*wrqu
, char *key
)
672 struct r8192_priv
*priv
= ieee80211_priv(dev
);
673 struct ieee80211_device
*ieee
= priv
->ieee80211
;
677 u32 hwkey
[4]={0,0,0,0};
680 //u8 broadcast_addr[6] ={ 0xff,0xff,0xff,0xff,0xff,0xff};
681 u8 zero_addr
[4][6] ={ {0x00,0x00,0x00,0x00,0x00,0x00},
682 {0x00,0x00,0x00,0x00,0x00,0x01},
683 {0x00,0x00,0x00,0x00,0x00,0x02},
684 {0x00,0x00,0x00,0x00,0x00,0x03} };
687 if(!priv
->up
) return -ENETDOWN
;
691 RT_TRACE(COMP_SEC
, "Setting SW wep key");
692 ret
= ieee80211_wx_set_encode(priv
->ieee80211
,info
,wrqu
,key
);
698 //sometimes, the length is zero while we do not type key value
699 if(wrqu
->encoding
.length
!=0){
701 for(i
=0 ; i
<4 ; i
++){
702 hwkey
[i
] |= key
[4*i
+0]&mask
;
703 if(i
==1&&(4*i
+1)==wrqu
->encoding
.length
) mask
=0x00;
704 if(i
==3&&(4*i
+1)==wrqu
->encoding
.length
) mask
=0x00;
705 hwkey
[i
] |= (key
[4*i
+1]&mask
)<<8;
706 hwkey
[i
] |= (key
[4*i
+2]&mask
)<<16;
707 hwkey
[i
] |= (key
[4*i
+3]&mask
)<<24;
710 #define CONF_WEP40 0x4
711 #define CONF_WEP104 0x14
713 switch(wrqu
->encoding
.flags
& IW_ENCODE_INDEX
){
714 case 0: key_idx
= ieee
->tx_keyidx
; break;
715 case 1: key_idx
= 0; break;
716 case 2: key_idx
= 1; break;
717 case 3: key_idx
= 2; break;
718 case 4: key_idx
= 3; break;
722 if(wrqu
->encoding
.length
==0x5){
723 ieee
->pairwise_key_type
= KEY_TYPE_WEP40
;
724 EnableHWSecurityConfig8192(dev
);
729 KEY_TYPE_WEP40
, //KeyType
736 else if(wrqu
->encoding
.length
==0xd){
737 ieee
->pairwise_key_type
= KEY_TYPE_WEP104
;
738 EnableHWSecurityConfig8192(dev
);
743 KEY_TYPE_WEP104
, //KeyType
749 else printk("wrong type in WEP, not WEP40 and WEP104\n");
757 static int r8192_wx_set_scan_type(struct net_device
*dev
, struct iw_request_info
*aa
, union
758 iwreq_data
*wrqu
, char *p
){
760 struct r8192_priv
*priv
= ieee80211_priv(dev
);
764 priv
->ieee80211
->active_scan
= mode
;
771 static int r8192_wx_set_retry(struct net_device
*dev
,
772 struct iw_request_info
*info
,
773 union iwreq_data
*wrqu
, char *extra
)
775 struct r8192_priv
*priv
= ieee80211_priv(dev
);
780 if (wrqu
->retry
.flags
& IW_RETRY_LIFETIME
||
781 wrqu
->retry
.disabled
){
785 if (!(wrqu
->retry
.flags
& IW_RETRY_LIMIT
)){
790 if(wrqu
->retry
.value
> R8180_MAX_RETRY
){
794 if (wrqu
->retry
.flags
& IW_RETRY_MAX
) {
795 priv
->retry_rts
= wrqu
->retry
.value
;
796 DMESG("Setting retry for RTS/CTS data to %d", wrqu
->retry
.value
);
799 priv
->retry_data
= wrqu
->retry
.value
;
800 DMESG("Setting retry for non RTS/CTS data to %d", wrqu
->retry
.value
);
804 * We might try to write directly the TX config register
805 * or to restart just the (R)TX process.
806 * I'm unsure if whole reset is really needed
812 rtl8180_rtx_disable(dev);
813 rtl8180_rx_enable(dev);
814 rtl8180_tx_enable(dev);
824 static int r8192_wx_get_retry(struct net_device
*dev
,
825 struct iw_request_info
*info
,
826 union iwreq_data
*wrqu
, char *extra
)
828 struct r8192_priv
*priv
= ieee80211_priv(dev
);
831 wrqu
->retry
.disabled
= 0; /* can't be disabled */
833 if ((wrqu
->retry
.flags
& IW_RETRY_TYPE
) ==
837 if (wrqu
->retry
.flags
& IW_RETRY_MAX
) {
838 wrqu
->retry
.flags
= IW_RETRY_LIMIT
| IW_RETRY_MAX
;
839 wrqu
->retry
.value
= priv
->retry_rts
;
841 wrqu
->retry
.flags
= IW_RETRY_LIMIT
| IW_RETRY_MIN
;
842 wrqu
->retry
.value
= priv
->retry_data
;
844 //printk("returning %d",wrqu->retry.value);
850 static int r8192_wx_get_sens(struct net_device
*dev
,
851 struct iw_request_info
*info
,
852 union iwreq_data
*wrqu
, char *extra
)
854 struct r8192_priv
*priv
= ieee80211_priv(dev
);
855 if(priv
->rf_set_sens
== NULL
)
856 return -1; /* we have not this support for this radio */
857 wrqu
->sens
.value
= priv
->sens
;
862 static int r8192_wx_set_sens(struct net_device
*dev
,
863 struct iw_request_info
*info
,
864 union iwreq_data
*wrqu
, char *extra
)
867 struct r8192_priv
*priv
= ieee80211_priv(dev
);
871 //DMESG("attempt to set sensivity to %ddb",wrqu->sens.value);
872 if(priv
->rf_set_sens
== NULL
) {
873 err
= -1; /* we have not this support for this radio */
876 if(priv
->rf_set_sens(dev
, wrqu
->sens
.value
) == 0)
877 priv
->sens
= wrqu
->sens
.value
;
887 #if (WIRELESS_EXT >= 18)
888 //hw security need to reorganized.
889 static int r8192_wx_set_enc_ext(struct net_device
*dev
,
890 struct iw_request_info
*info
,
891 union iwreq_data
*wrqu
, char *extra
)
894 struct r8192_priv
*priv
= ieee80211_priv(dev
);
895 struct ieee80211_device
* ieee
= priv
->ieee80211
;
896 //printk("===>%s()\n", __FUNCTION__);
900 ret
= ieee80211_wx_set_encode_ext(priv
->ieee80211
, info
, wrqu
, extra
);
903 u8 broadcast_addr
[6] = {0xff,0xff,0xff,0xff,0xff,0xff};
906 struct iw_encode_ext
*ext
= (struct iw_encode_ext
*)extra
;
907 struct iw_point
*encoding
= &wrqu
->encoding
;
908 u8 idx
= 0, alg
= 0, group
= 0;
909 if ((encoding
->flags
& IW_ENCODE_DISABLED
) ||
910 ext
->alg
== IW_ENCODE_ALG_NONE
) //none is not allowed to use hwsec WB 2008.07.01
913 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;
914 idx
= encoding
->flags
& IW_ENCODE_INDEX
;
917 group
= ext
->ext_flags
& IW_ENCODE_EXT_GROUP_KEY
;
919 if ((!group
) || (IW_MODE_ADHOC
== ieee
->iw_mode
) || (alg
== KEY_TYPE_WEP40
))
921 if ((ext
->key_len
== 13) && (alg
== KEY_TYPE_WEP40
) )
922 alg
= KEY_TYPE_WEP104
;
923 ieee
->pairwise_key_type
= alg
;
924 EnableHWSecurityConfig8192(dev
);
926 memcpy((u8
*)key
, ext
->key
, 16); //we only get 16 bytes key.why? WB 2008.7.1
928 if ((alg
& KEY_TYPE_WEP40
) && (ieee
->auth_mode
!=2) )
941 ieee
->group_key_type
= alg
;
946 broadcast_addr
, //MacAddr
956 (u8
*)ieee
->ap_mac_addr
, //MacAddr
970 static int r8192_wx_set_auth(struct net_device
*dev
,
971 struct iw_request_info
*info
,
972 union iwreq_data
*data
, char *extra
)
975 //printk("====>%s()\n", __FUNCTION__);
976 struct r8192_priv
*priv
= ieee80211_priv(dev
);
978 ret
= ieee80211_wx_set_auth(priv
->ieee80211
, info
, &(data
->param
), extra
);
983 static int r8192_wx_set_mlme(struct net_device
*dev
,
984 struct iw_request_info
*info
,
985 union iwreq_data
*wrqu
, char *extra
)
987 //printk("====>%s()\n", __FUNCTION__);
990 struct r8192_priv
*priv
= ieee80211_priv(dev
);
992 ret
= ieee80211_wx_set_mlme(priv
->ieee80211
, info
, wrqu
, extra
);
998 static int r8192_wx_set_gen_ie(struct net_device
*dev
,
999 struct iw_request_info
*info
,
1000 union iwreq_data
*data
, char *extra
)
1002 //printk("====>%s(), len:%d\n", __FUNCTION__, data->length);
1004 struct r8192_priv
*priv
= ieee80211_priv(dev
);
1005 down(&priv
->wx_sem
);
1006 ret
= ieee80211_wx_set_gen_ie(priv
->ieee80211
, extra
, data
->data
.length
);
1008 //printk("<======%s(), ret:%d\n", __FUNCTION__, ret);
1014 static int dummy(struct net_device
*dev
, struct iw_request_info
*a
,
1015 union iwreq_data
*wrqu
,char *b
)
1021 static iw_handler r8192_wx_handlers
[] =
1023 NULL
, /* SIOCSIWCOMMIT */
1024 r8192_wx_get_name
, /* SIOCGIWNAME */
1025 dummy
, /* SIOCSIWNWID */
1026 dummy
, /* SIOCGIWNWID */
1027 r8192_wx_set_freq
, /* SIOCSIWFREQ */
1028 r8192_wx_get_freq
, /* SIOCGIWFREQ */
1029 r8192_wx_set_mode
, /* SIOCSIWMODE */
1030 r8192_wx_get_mode
, /* SIOCGIWMODE */
1031 r8192_wx_set_sens
, /* SIOCSIWSENS */
1032 r8192_wx_get_sens
, /* SIOCGIWSENS */
1033 NULL
, /* SIOCSIWRANGE */
1034 rtl8180_wx_get_range
, /* SIOCGIWRANGE */
1035 NULL
, /* SIOCSIWPRIV */
1036 NULL
, /* SIOCGIWPRIV */
1037 NULL
, /* SIOCSIWSTATS */
1038 NULL
, /* SIOCGIWSTATS */
1039 dummy
, /* SIOCSIWSPY */
1040 dummy
, /* SIOCGIWSPY */
1041 NULL
, /* SIOCGIWTHRSPY */
1042 NULL
, /* SIOCWIWTHRSPY */
1043 r8192_wx_set_wap
, /* SIOCSIWAP */
1044 r8192_wx_get_wap
, /* SIOCGIWAP */
1045 #if (WIRELESS_EXT >= 18)
1046 r8192_wx_set_mlme
, /* MLME-- */
1050 dummy
, /* SIOCGIWAPLIST -- depricated */
1051 r8192_wx_set_scan
, /* SIOCSIWSCAN */
1052 r8192_wx_get_scan
, /* SIOCGIWSCAN */
1053 r8192_wx_set_essid
, /* SIOCSIWESSID */
1054 r8192_wx_get_essid
, /* SIOCGIWESSID */
1055 dummy
, /* SIOCSIWNICKN */
1056 dummy
, /* SIOCGIWNICKN */
1057 NULL
, /* -- hole -- */
1058 NULL
, /* -- hole -- */
1059 r8192_wx_set_rate
, /* SIOCSIWRATE */
1060 r8192_wx_get_rate
, /* SIOCGIWRATE */
1061 r8192_wx_set_rts
, /* SIOCSIWRTS */
1062 r8192_wx_get_rts
, /* SIOCGIWRTS */
1063 r8192_wx_set_frag
, /* SIOCSIWFRAG */
1064 r8192_wx_get_frag
, /* SIOCGIWFRAG */
1065 dummy
, /* SIOCSIWTXPOW */
1066 dummy
, /* SIOCGIWTXPOW */
1067 r8192_wx_set_retry
, /* SIOCSIWRETRY */
1068 r8192_wx_get_retry
, /* SIOCGIWRETRY */
1069 r8192_wx_set_enc
, /* SIOCSIWENCODE */
1070 r8192_wx_get_enc
, /* SIOCGIWENCODE */
1071 r8192_wx_set_power
, /* SIOCSIWPOWER */
1072 r8192_wx_get_power
, /* SIOCGIWPOWER */
1073 NULL
, /*---hole---*/
1074 NULL
, /*---hole---*/
1075 r8192_wx_set_gen_ie
,//NULL, /* SIOCSIWGENIE */
1076 NULL
, /* SIOCSIWGENIE */
1078 #if (WIRELESS_EXT >= 18)
1079 r8192_wx_set_auth
,//NULL, /* SIOCSIWAUTH */
1080 NULL
,//r8192_wx_get_auth,//NULL, /* SIOCSIWAUTH */
1081 r8192_wx_set_enc_ext
, /* SIOCSIWENCODEEXT */
1082 NULL
,//r8192_wx_get_enc_ext,//NULL, /* SIOCSIWENCODEEXT */
1089 NULL
, /* SIOCSIWPMKSA */
1090 NULL
, /*---hole---*/
1095 static const struct iw_priv_args r8192_private_args
[] = {
1098 SIOCIWFIRSTPRIV
+ 0x0,
1099 IW_PRIV_TYPE_INT
| IW_PRIV_SIZE_FIXED
| 1, 0, "badcrc"
1103 SIOCIWFIRSTPRIV
+ 0x1,
1104 IW_PRIV_TYPE_INT
| IW_PRIV_SIZE_FIXED
| 1, 0, "activescan"
1108 SIOCIWFIRSTPRIV
+ 0x2,
1109 IW_PRIV_TYPE_INT
| IW_PRIV_SIZE_FIXED
| 1, 0, "rawtx"
1114 SIOCIWFIRSTPRIV
+ 0x3,
1115 IW_PRIV_TYPE_INT
| IW_PRIV_SIZE_FIXED
| 1, 0, "readRF"
1119 SIOCIWFIRSTPRIV
+ 0x4,
1120 IW_PRIV_TYPE_INT
| IW_PRIV_SIZE_FIXED
| 1, 0, "writeRF"
1124 SIOCIWFIRSTPRIV
+ 0x5,
1125 IW_PRIV_TYPE_INT
| IW_PRIV_SIZE_FIXED
| 1, 0, "readBB"
1129 SIOCIWFIRSTPRIV
+ 0x6,
1130 IW_PRIV_TYPE_INT
| IW_PRIV_SIZE_FIXED
| 1, 0, "writeBB"
1134 SIOCIWFIRSTPRIV
+ 0x7,
1135 IW_PRIV_TYPE_INT
| IW_PRIV_SIZE_FIXED
| 1, 0, "readnicb"
1139 SIOCIWFIRSTPRIV
+ 0x8,
1140 IW_PRIV_TYPE_INT
| IW_PRIV_SIZE_FIXED
| 1, 0, "writenicb"
1144 SIOCIWFIRSTPRIV
+ 0x9,
1145 IW_PRIV_TYPE_INT
| IW_PRIV_SIZE_FIXED
| 1, 0, "apinfo"
1151 SIOCIWFIRSTPRIV
+ 0x3,
1152 IW_PRIV_TYPE_INT
| IW_PRIV_SIZE_FIXED
| 1, 0, "forcereset"
1159 static iw_handler r8192_private_handler
[] = {
1160 // r8192_wx_set_monitor, /* SIOCIWFIRSTPRIV */
1161 r8192_wx_set_crcmon
, /*SIOCIWSECONDPRIV*/
1162 // r8192_wx_set_forceassociate,
1163 // r8192_wx_set_beaconinterval,
1164 // r8192_wx_set_monitor_type,
1165 r8192_wx_set_scan_type
,
1169 r8192_wx_write_regs
,
1173 r8192_wx_write_nicb
,
1174 r8192_wx_get_ap_status
,
1177 r8192_wx_force_reset
,
1180 //#if WIRELESS_EXT >= 17
1181 struct iw_statistics
*r8192_get_wireless_stats(struct net_device
*dev
)
1183 struct r8192_priv
*priv
= ieee80211_priv(dev
);
1184 struct ieee80211_device
* ieee
= priv
->ieee80211
;
1185 struct iw_statistics
* wstats
= &priv
->wstats
;
1189 if(ieee
->state
< IEEE80211_LINKED
)
1191 wstats
->qual
.qual
= 0;
1192 wstats
->qual
.level
= 0;
1193 wstats
->qual
.noise
= 0;
1194 wstats
->qual
.updated
= IW_QUAL_ALL_UPDATED
| IW_QUAL_DBM
;
1198 tmp_level
= (&ieee
->current_network
)->stats
.rssi
;
1199 tmp_qual
= (&ieee
->current_network
)->stats
.signal
;
1200 tmp_noise
= (&ieee
->current_network
)->stats
.noise
;
1201 //printk("level:%d, qual:%d, noise:%d\n", tmp_level, tmp_qual, tmp_noise);
1203 wstats
->qual
.level
= tmp_level
;
1204 wstats
->qual
.qual
= tmp_qual
;
1205 wstats
->qual
.noise
= tmp_noise
;
1206 wstats
->qual
.updated
= IW_QUAL_ALL_UPDATED
| IW_QUAL_DBM
;
1212 struct iw_handler_def r8192_wx_handlers_def
={
1213 .standard
= r8192_wx_handlers
,
1214 .num_standard
= sizeof(r8192_wx_handlers
) / sizeof(iw_handler
),
1215 .private = r8192_private_handler
,
1216 .num_private
= sizeof(r8192_private_handler
) / sizeof(iw_handler
),
1217 .num_private_args
= sizeof(r8192_private_args
) / sizeof(struct iw_priv_args
),
1218 #if WIRELESS_EXT >= 17
1219 .get_wireless_stats
= r8192_get_wireless_stats
,
1221 .private_args
= (struct iw_priv_args
*)r8192_private_args
,