1
/******************************************************************************
2
* Copyright(c) 2008 - 2010 Realtek Corporation. All rights reserved.
4
* This program is distributed in the hope that it will be useful, but WITHOUT
5
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
6
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
9
* You should have received a copy of the GNU General Public License along with
10
* this program; if not, write to the Free Software Foundation, Inc.,
11
* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
13
* The full GNU General Public License is included in this distribution in the
14
* file called LICENSE.
16
* Contact Information:
17
* wlanfae <wlanfae@realtek.com>
18
******************************************************************************/
20
#include <linux/string.h>
23
#include "rtllib/dot11d.h"
25
#ifdef _RTL8192_EXT_PATCH_
26
#include "../../mshclass/msh_class.h"
30
#include "r8192S_mp.h"
34
u32 rtl8192_rates[] = {1000000,2000000,5500000,11000000,
35
6000000,9000000,12000000,18000000,24000000,36000000,48000000,54000000};
42
#ifdef _RTL8192_EXT_PATCH_
43
int r8192_wx_set_channel(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra);
44
static int r8192_wx_mesh_scan(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra);
45
static int r8192_wx_get_mesh_list(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra);
48
static int r8192_wx_get_freq(struct net_device *dev,
49
struct iw_request_info *a,
50
union iwreq_data *wrqu, char *b)
52
struct r8192_priv *priv = rtllib_priv(dev);
54
#ifdef _RTL8192_EXT_PATCH_
55
return rtllib_wx_get_freq(priv->rtllib,a,wrqu,b,0);
57
return rtllib_wx_get_freq(priv->rtllib,a,wrqu,b);
64
static int r8192_wx_set_beaconinterval(struct net_device *dev, struct iw_request_info *aa,
65
union iwreq_data *wrqu, char *b)
67
int *parms = (int *)b;
70
struct r8192_priv *priv = rtllib_priv(dev);
73
DMESG("setting beacon interval to %x",bi);
75
priv->rtllib->beacon_interval=bi;
83
static int r8192_wx_set_forceassociate(struct net_device *dev, struct iw_request_info *aa,
84
union iwreq_data *wrqu, char *extra)
86
struct r8192_priv *priv=rtllib_priv(dev);
87
int *parms = (int *)extra;
89
priv->rtllib->force_associate = (parms[0] > 0);
96
static int r8192_wx_get_mode(struct net_device *dev, struct iw_request_info *a,
97
union iwreq_data *wrqu, char *b)
99
struct r8192_priv *priv=rtllib_priv(dev);
101
return rtllib_wx_get_mode(priv->rtllib,a,wrqu,b);
104
static int r8192_wx_get_rate(struct net_device *dev,
105
struct iw_request_info *info,
106
union iwreq_data *wrqu, char *extra)
108
struct r8192_priv *priv = rtllib_priv(dev);
109
return rtllib_wx_get_rate(priv->rtllib,info,wrqu,extra);
114
static int r8192_wx_set_rate(struct net_device *dev,
115
struct iw_request_info *info,
116
union iwreq_data *wrqu, char *extra)
119
struct r8192_priv *priv = rtllib_priv(dev);
121
if(priv->bHwRadioOff == true)
126
ret = rtllib_wx_set_rate(priv->rtllib,info,wrqu,extra);
134
static int r8192_wx_set_rts(struct net_device *dev,
135
struct iw_request_info *info,
136
union iwreq_data *wrqu, char *extra)
139
struct r8192_priv *priv = rtllib_priv(dev);
141
if(priv->bHwRadioOff == true)
146
ret = rtllib_wx_set_rts(priv->rtllib,info,wrqu,extra);
153
static int r8192_wx_get_rts(struct net_device *dev,
154
struct iw_request_info *info,
155
union iwreq_data *wrqu, char *extra)
157
struct r8192_priv *priv = rtllib_priv(dev);
158
return rtllib_wx_get_rts(priv->rtllib,info,wrqu,extra);
161
static int r8192_wx_set_power(struct net_device *dev,
162
struct iw_request_info *info,
163
union iwreq_data *wrqu, char *extra)
166
struct r8192_priv *priv = rtllib_priv(dev);
168
if(priv->bHwRadioOff == true){
169
RT_TRACE(COMP_ERR,"%s():Hw is Radio Off, we can't set Power,return\n",__FUNCTION__);
174
ret = rtllib_wx_set_power(priv->rtllib,info,wrqu,extra);
181
static int r8192_wx_get_power(struct net_device *dev,
182
struct iw_request_info *info,
183
union iwreq_data *wrqu, char *extra)
185
struct r8192_priv *priv = rtllib_priv(dev);
186
return rtllib_wx_get_power(priv->rtllib,info,wrqu,extra);
189
static int r8192_wx_set_rawtx(struct net_device *dev,
190
struct iw_request_info *info,
191
union iwreq_data *wrqu, char *extra)
193
struct r8192_priv *priv = rtllib_priv(dev);
196
if(priv->bHwRadioOff == true)
201
ret = rtllib_wx_set_rawtx(priv->rtllib, info, wrqu, extra);
209
static int r8192_wx_force_reset(struct net_device *dev,
210
struct iw_request_info *info,
211
union iwreq_data *wrqu, char *extra)
213
struct r8192_priv *priv = rtllib_priv(dev);
217
printk("%s(): force reset ! extra is %d\n",__FUNCTION__, *extra);
218
priv->force_reset = *extra;
224
static int r8192_wx_force_mic_error(struct net_device *dev,
225
struct iw_request_info *info,
226
union iwreq_data *wrqu, char *extra)
228
struct r8192_priv *priv = rtllib_priv(dev);
229
struct rtllib_device* ieee = priv->rtllib;
233
printk("%s(): force mic error ! \n",__FUNCTION__);
234
ieee->force_mic_error = true;
240
#define MAX_ADHOC_PEER_NUM 64
243
unsigned char MacAddr[ETH_ALEN];
244
unsigned char WirelessMode;
245
unsigned char bCurTxBW40MHz;
246
} adhoc_peer_entry_t, *p_adhoc_peer_entry_t;
249
adhoc_peer_entry_t Entry[MAX_ADHOC_PEER_NUM];
251
} adhoc_peers_info_t, *p_adhoc_peers_info_t;
252
int r8192_wx_get_adhoc_peers(struct net_device *dev,
253
struct iw_request_info *info,
254
union iwreq_data *wrqu, char *extra)
259
struct r8192_priv *priv = rtllib_priv(dev);
260
struct sta_info * psta = NULL;
261
adhoc_peers_info_t adhoc_peers_info;
262
p_adhoc_peers_info_t padhoc_peers_info = &adhoc_peers_info;
263
p_adhoc_peer_entry_t padhoc_peer_entry = NULL;
267
memset(extra, 0, 2047);
268
padhoc_peers_info->num = 0;
272
for(k=0; k<PEER_MAX_ASSOC; k++)
274
psta = priv->rtllib->peer_assoc_list[k];
277
padhoc_peer_entry = &padhoc_peers_info->Entry[padhoc_peers_info->num];
278
memset(padhoc_peer_entry,0, sizeof(adhoc_peer_entry_t));
279
memcpy(padhoc_peer_entry->MacAddr, psta->macaddr, ETH_ALEN);
280
padhoc_peer_entry->WirelessMode = psta->wireless_mode;
281
padhoc_peer_entry->bCurTxBW40MHz = psta->htinfo.bCurTxBW40MHz;
282
padhoc_peers_info->num ++;
283
printk("[%d] MacAddr:"MAC_FMT" \tWirelessMode:%d \tBW40MHz:%d \n", \
284
k, MAC_ARG(padhoc_peer_entry->MacAddr), padhoc_peer_entry->WirelessMode, padhoc_peer_entry->bCurTxBW40MHz);
285
sprintf(extra, "[%d] MacAddr:"MAC_FMT" \tWirelessMode:%d \tBW40MHz:%d \n", \
286
k, MAC_ARG(padhoc_peer_entry->MacAddr), padhoc_peer_entry->WirelessMode, padhoc_peer_entry->bCurTxBW40MHz);
292
wrqu->data.length = strlen(extra);
293
wrqu->data.flags = 0;
300
static int r8191se_wx_get_firm_version(struct net_device *dev,
301
struct iw_request_info *info,
302
struct iw_param *wrqu, char *extra)
304
#if defined RTL8192SE || defined RTL8192CE
305
struct r8192_priv *priv = rtllib_priv(dev);
306
u16 firmware_version;
309
printk("%s(): Just Support 92SE tmp\n", __FUNCTION__);
311
firmware_version = priv->firmware_version;
313
firmware_version = priv->pFirmware->FirmwareVersion;
315
wrqu->value = firmware_version;
323
static int r8192_wx_adapter_power_status(struct net_device *dev,
324
struct iw_request_info *info,
325
union iwreq_data *wrqu, char *extra)
328
struct r8192_priv *priv = rtllib_priv(dev);
329
PRT_POWER_SAVE_CONTROL pPSC = (PRT_POWER_SAVE_CONTROL)(&(priv->rtllib->PowerSaveControl));
330
struct rtllib_device* ieee = priv->rtllib;
334
RT_TRACE(COMP_POWER, "%s(): %s\n",__FUNCTION__, (*extra == 6)?"DC power":"AC power");
335
if(*extra || priv->force_lps) {
336
priv->ps_force = false;
337
pPSC->bLeisurePs = true;
339
if(priv->rtllib->state == RTLLIB_LINKED)
342
priv->ps_force = true;
343
pPSC->bLeisurePs = false;
354
#ifdef _RTL8192_EXT_PATCH_
355
static int r8192_wx_print_reg(struct net_device *dev,
356
struct iw_request_info *info,
357
union iwreq_data *wrqu, char *extra)
359
u8 reg1=0,reg2=0,reg3=0,reg4=0;
360
u32 reg5 = 0, len = 0;
362
memset(extra, 0, 512);
363
sprintf(extra,"\nStart Log: Set 0x08000000 to 0x230\n");
364
write_nic_dword(dev, 0x230 , 0x08000000);
365
reg1 = read_nic_byte(dev, 0xf0);
366
reg2 = read_nic_byte(dev, 0xf4);
367
reg3 = read_nic_byte(dev, 0x140);
368
reg4 = read_nic_byte(dev, 0x124);
370
reg5 = read_nic_dword(dev, 0x230);
372
sprintf(extra+len, "0xf0: %2.2x\n0xf4: %2.2x\n0x140: %2.2x\n0x124: %2.2x\n", reg1,reg2,reg3,reg4);
374
sprintf(extra+len,"After delay 10ms, read 0x230: %8.8x\n", reg5);
376
write_nic_dword(dev, 0x230 , 0x40000000);
377
reg5 = read_nic_dword(dev, 0x230);
379
sprintf(extra+len,"Set 0x40000000 to 0x230. Read 0x230: %8.8x\n", reg5);
381
write_nic_dword(dev, 0x230 , 0x80000000);
382
reg5 = read_nic_dword(dev, 0x230);
384
sprintf(extra+len,"Set 0x80000000 to 0x230. Read 0x230: %8.8x\n", reg5);
386
wrqu->data.length = strlen(extra);
390
static int r8192_wx_resume_firm(struct net_device *dev,
391
struct iw_request_info *info,
392
union iwreq_data *wrqu, char *extra)
395
write_nic_byte(dev, 0x42, 0xFF);
396
write_nic_word(dev, 0x40, 0x77FC);
397
write_nic_word(dev, 0x40, 0x57FC);
398
write_nic_word(dev, 0x40, 0x37FC);
399
write_nic_word(dev, 0x40, 0x77FC);
403
write_nic_word(dev, 0x40, 0x57FC);
404
write_nic_word(dev, 0x40, 0x37FC);
405
write_nic_byte(dev, 0x42, 0x00);
410
static int r8192se_wx_set_radio(struct net_device *dev,
411
struct iw_request_info *info,
412
union iwreq_data *wrqu, char *extra)
414
struct r8192_priv *priv = rtllib_priv(dev);
418
printk("%s(): set radio ! extra is %d\n",__FUNCTION__, *extra);
419
if((*extra != 0) && (*extra != 1))
421
RT_TRACE(COMP_ERR, "%s(): set radio an err value,must 0(radio off) or 1(radio on)\n",__FUNCTION__);
424
priv->sw_radio_on = *extra;
430
static int r8192se_wx_set_lps_awake_interval(struct net_device *dev,
431
struct iw_request_info *info,
432
union iwreq_data *wrqu, char *extra)
434
struct r8192_priv *priv = rtllib_priv(dev);
435
PRT_POWER_SAVE_CONTROL pPSC = (PRT_POWER_SAVE_CONTROL)(&(priv->rtllib->PowerSaveControl));
439
printk("%s(): set lps awake interval ! extra is %d\n",__FUNCTION__, *extra);
441
pPSC->RegMaxLPSAwakeIntvl = *extra;
447
static int r8192se_wx_set_force_lps(struct net_device *dev,
448
struct iw_request_info *info,
449
union iwreq_data *wrqu, char *extra)
451
struct r8192_priv *priv = rtllib_priv(dev);
455
printk("%s(): force LPS ! extra is %d (1 is open 0 is close)\n",__FUNCTION__, *extra);
456
priv->force_lps = *extra;
462
#ifdef _RTL8192_EXT_PATCH_
463
static int r8192_wx_get_drv_version(struct net_device *dev,
464
struct iw_request_info *info,
465
union iwreq_data *wrqu, char *extra)
467
memset(extra, 0, 64);
468
sprintf(extra, "Support Mesh");
470
((struct iw_point *)wrqu)->length = strlen(extra);
475
static int r8192_wx_set_debugflag(struct net_device *dev,
476
struct iw_request_info *info,
477
union iwreq_data *wrqu, char *extra)
479
struct r8192_priv *priv = rtllib_priv(dev);
482
if(priv->bHwRadioOff == true)
485
printk("=====>%s(), *extra:%x, debugflag:%x\n", __FUNCTION__, *extra, rt_global_debug_component);
487
rt_global_debug_component |= (1<<c);
489
rt_global_debug_component &= BIT31;
494
static int r8192_wx_set_mode(struct net_device *dev, struct iw_request_info *a,
495
union iwreq_data *wrqu, char *b)
497
struct r8192_priv *priv = rtllib_priv(dev);
499
struct rtllib_device* ieee = netdev_priv_rsl(dev);
502
RT_RF_POWER_STATE rtState;
505
if(priv->bHwRadioOff == true)
507
#ifdef _RTL8192_EXT_PATCH_
508
if (priv->mshobj && (priv->rtllib->iw_mode==IW_MODE_MESH)) {
512
rtState = priv->rtllib->eRFPowerState;
515
if(wrqu->mode == IW_MODE_ADHOC || wrqu->mode == IW_MODE_MONITOR
516
|| ieee->bNetPromiscuousMode )
518
if(priv->rtllib->PowerSaveControl.bInactivePs){
519
if(rtState == eRfOff){
520
if(priv->rtllib->RfOffReason > RF_CHANGE_BY_IPS)
522
RT_TRACE(COMP_ERR, "%s(): RF is OFF.\n",__FUNCTION__);
526
printk("=========>%s(): IPSLeave\n",__FUNCTION__);
527
down(&priv->rtllib->ips_sem);
529
up(&priv->rtllib->ips_sem);
535
ret = rtllib_wx_set_mode(priv->rtllib,a,wrqu,b);
540
#if defined (RTL8192S_WAPI_SUPPORT)
541
int wapi_ioctl_set_mode(struct net_device *dev, struct iw_request_info *a,
542
union iwreq_data *wrqu, char *b)
544
struct r8192_priv *priv = rtllib_priv(dev);
545
RT_RF_POWER_STATE rtState;
548
printk("===============================>%s\n", __FUNCTION__);
549
if(priv->bHwRadioOff == true)
551
#ifdef _RTL8192_EXT_PATCH_
552
if (priv->mshobj && (priv->rtllib->iw_mode==IW_MODE_MESH)) {
556
rtState = priv->rtllib->eRFPowerState;
558
if(wrqu->mode == IW_MODE_ADHOC){
559
if(priv->rtllib->PowerSaveControl.bInactivePs){
560
if(rtState == eRfOff){
561
if(priv->rtllib->RfOffReason > RF_CHANGE_BY_IPS)
563
RT_TRACE(COMP_ERR, "%s(): RF is OFF.\n",__FUNCTION__);
567
printk("=========>%s(): IPSLeave\n",__FUNCTION__);
568
down(&priv->rtllib->ips_sem);
570
up(&priv->rtllib->ips_sem);
576
ret = rtllib_wx_set_mode(priv->rtllib,a,wrqu,b);
581
struct iw_range_with_scan_capa
583
/* Informative stuff (to choose between different interface) */
584
__u32 throughput; /* To give an idea... */
585
/* In theory this value should be the maximum benchmarked
586
* TCP/IP throughput, because with most of these devices the
587
* bit rate is meaningless (overhead an co) to estimate how
588
* fast the connection will go and pick the fastest one.
589
* I suggest people to play with Netperf or any benchmark...
592
/* NWID (or domain id) */
593
__u32 min_nwid; /* Minimal NWID we are able to set */
594
__u32 max_nwid; /* Maximal NWID we are able to set */
596
/* Old Frequency (backward compat - moved lower ) */
597
__u16 old_num_channels;
598
__u8 old_num_frequency;
600
/* Scan capabilities */
604
static int rtl8192_wx_get_range(struct net_device *dev,
605
struct iw_request_info *info,
606
union iwreq_data *wrqu, char *extra)
608
struct iw_range *range = (struct iw_range *)extra;
609
struct r8192_priv *priv = rtllib_priv(dev);
613
wrqu->data.length = sizeof(*range);
614
memset(range, 0, sizeof(*range));
616
/* ~130 Mb/s real (802.11n) */
617
range->throughput = 130 * 1000 * 1000;
619
if(priv->rf_set_sens != NULL)
620
range->sensitivity = priv->max_sens; /* signal level threshold range */
622
range->max_qual.qual = 100;
623
range->max_qual.level = 0;
624
range->max_qual.noise = 0;
625
range->max_qual.updated = 7; /* Updated all three */
627
range->avg_qual.qual = 70; /* > 8% missed beacons is 'bad' */
628
range->avg_qual.level = 0;
629
range->avg_qual.noise = 0;
630
range->avg_qual.updated = 7; /* Updated all three */
632
range->num_bitrates = min(RATE_COUNT, IW_MAX_BITRATES);
634
for (i = 0; i < range->num_bitrates; i++) {
635
range->bitrate[i] = rtl8192_rates[i];
638
range->max_rts = DEFAULT_RTS_THRESHOLD;
639
range->min_frag = MIN_FRAG_THRESHOLD;
640
range->max_frag = MAX_FRAG_THRESHOLD;
643
range->max_pmp = 5000000;
645
range->max_pmt = 65535*1000;
646
range->pmp_flags = IW_POWER_PERIOD;
647
range->pmt_flags = IW_POWER_TIMEOUT;
648
range->pm_capa = IW_POWER_PERIOD | IW_POWER_TIMEOUT | IW_POWER_ALL_R;
649
range->we_version_compiled = WIRELESS_EXT;
650
range->we_version_source = 18;
652
for (i = 0, val = 0; i < 14; i++) {
653
if ((priv->rtllib->active_channel_map)[i+1]) {
654
range->freq[val].i = i + 1;
655
range->freq[val].m = rtllib_wlan_frequencies[i] * 100000;
656
range->freq[val].e = 1;
661
if (val == IW_MAX_FREQUENCIES)
664
range->num_frequency = val;
665
range->num_channels = val;
666
#if WIRELESS_EXT > 17
667
range->enc_capa = IW_ENC_CAPA_WPA|IW_ENC_CAPA_WPA2|
668
IW_ENC_CAPA_CIPHER_TKIP|IW_ENC_CAPA_CIPHER_CCMP;
670
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,25)
672
struct iw_range_with_scan_capa* tmp = (struct iw_range_with_scan_capa*)range;
673
tmp->scan_capa = 0x01;
676
range->scan_capa = IW_SCAN_CAPA_ESSID | IW_SCAN_CAPA_TYPE;
679
/* Event capability (kernel + driver) */
684
static int r8192_wx_set_scan(struct net_device *dev, struct iw_request_info *a,
685
union iwreq_data *wrqu, char *b)
687
struct r8192_priv *priv = rtllib_priv(dev);
688
struct rtllib_device* ieee = priv->rtllib;
689
RT_RF_POWER_STATE rtState;
693
printk("######################%s(): In MP Test Can not Scan\n",__FUNCTION__);
696
if (!(ieee->softmac_features & IEEE_SOFTMAC_SCAN)){
697
if((ieee->state >= RTLLIB_ASSOCIATING) && (ieee->state <= RTLLIB_ASSOCIATING_AUTHENTICATED)){
700
if((priv->rtllib->state == RTLLIB_LINKED) && (priv->rtllib->CntAfterLink<2)){
705
if(priv->bHwRadioOff == true){
706
printk("================>%s(): hwradio off\n",__FUNCTION__);
709
rtState = priv->rtllib->eRFPowerState;
710
if(!priv->up) return -ENETDOWN;
711
if (priv->rtllib->LinkDetectInfo.bBusyTraffic == true)
714
#ifdef _RTL8192_EXT_PATCH_
715
if((ieee->iw_mode == IW_MODE_MESH)&&(ieee->mesh_state == RTLLIB_MESH_LINKED))
720
#if WIRELESS_EXT > 17
721
if (wrqu->data.flags & IW_SCAN_THIS_ESSID)
723
struct iw_scan_req* req = (struct iw_scan_req*)b;
726
ieee->current_network.ssid_len = req->essid_len;
727
memcpy(ieee->current_network.ssid, req->essid, req->essid_len);
734
priv->rtllib->FirstIe_InScan = true;
736
if(priv->rtllib->state != RTLLIB_LINKED){
738
if(priv->rtllib->PowerSaveControl.bInactivePs){
739
if(rtState == eRfOff){
740
if(priv->rtllib->RfOffReason > RF_CHANGE_BY_IPS){
741
RT_TRACE(COMP_ERR, "%s(): RF is OFF.\n",__FUNCTION__);
745
RT_TRACE(COMP_PS, "=========>%s(): IPSLeave\n",__FUNCTION__);
746
down(&priv->rtllib->ips_sem);
748
up(&priv->rtllib->ips_sem);
753
rtllib_stop_scan(priv->rtllib);
754
if(priv->rtllib->LedControlHandler)
755
priv->rtllib->LedControlHandler(dev, LED_CTL_SITE_SURVEY);
757
if(priv->rtllib->eRFPowerState != eRfOff){
758
priv->rtllib->actscanning = true;
760
if(ieee->ScanOperationBackupHandler)
761
ieee->ScanOperationBackupHandler(ieee->dev,SCAN_OPT_BACKUP);
763
rtllib_start_scan_syncro(priv->rtllib, 0);
765
if(ieee->ScanOperationBackupHandler)
766
ieee->ScanOperationBackupHandler(ieee->dev,SCAN_OPT_RESTORE);
770
priv->rtllib->actscanning = true;
771
ret = rtllib_wx_set_scan(priv->rtllib,a,wrqu,b);
779
static int r8192_wx_get_scan(struct net_device *dev, struct iw_request_info *a,
780
union iwreq_data *wrqu, char *b)
784
struct r8192_priv *priv = rtllib_priv(dev);
786
if(!priv->up) return -ENETDOWN;
788
if(priv->bHwRadioOff == true)
794
ret = rtllib_wx_get_scan(priv->rtllib,a,wrqu,b);
801
static int r8192_wx_set_essid(struct net_device *dev,
802
struct iw_request_info *a,
803
union iwreq_data *wrqu, char *b)
805
struct r8192_priv *priv = rtllib_priv(dev);
808
if ((rtllib_act_scanning(priv->rtllib, false)) && !(priv->rtllib->softmac_features & IEEE_SOFTMAC_SCAN)){
812
printk("######################%s(): In MP Test Can not Set Essid\n",__FUNCTION__);
815
if(priv->bHwRadioOff == true){
816
printk("=========>%s():hw radio off,or Rf state is eRfOff, return\n",__FUNCTION__);
820
ret = rtllib_wx_set_essid(priv->rtllib,a,wrqu,b);
827
static int r8192_wx_get_essid(struct net_device *dev,
828
struct iw_request_info *a,
829
union iwreq_data *wrqu, char *b)
832
struct r8192_priv *priv = rtllib_priv(dev);
836
ret = rtllib_wx_get_essid(priv->rtllib, a, wrqu, b);
843
static int r8192_wx_set_nick(struct net_device *dev,
844
struct iw_request_info *info,
845
union iwreq_data *wrqu, char *extra)
847
struct r8192_priv *priv = rtllib_priv(dev);
849
if (wrqu->data.length > IW_ESSID_MAX_SIZE)
852
wrqu->data.length = min((size_t) wrqu->data.length, sizeof(priv->nick));
853
memset(priv->nick, 0, sizeof(priv->nick));
854
memcpy(priv->nick, extra, wrqu->data.length);
860
static int r8192_wx_get_nick(struct net_device *dev,
861
struct iw_request_info *info,
862
union iwreq_data *wrqu, char *extra)
864
struct r8192_priv *priv = rtllib_priv(dev);
867
wrqu->data.length = strlen(priv->nick);
868
memcpy(extra, priv->nick, wrqu->data.length);
869
wrqu->data.flags = 1; /* active */
874
static int r8192_wx_set_freq(struct net_device *dev, struct iw_request_info *a,
875
union iwreq_data *wrqu, char *b)
878
struct r8192_priv *priv = rtllib_priv(dev);
880
if(priv->bHwRadioOff == true)
885
ret = rtllib_wx_set_freq(priv->rtllib, a, wrqu, b);
891
static int r8192_wx_get_name(struct net_device *dev,
892
struct iw_request_info *info,
893
union iwreq_data *wrqu, char *extra)
895
struct r8192_priv *priv = rtllib_priv(dev);
896
return rtllib_wx_get_name(priv->rtllib, info, wrqu, extra);
900
static int r8192_wx_set_frag(struct net_device *dev,
901
struct iw_request_info *info,
902
union iwreq_data *wrqu, char *extra)
904
struct r8192_priv *priv = rtllib_priv(dev);
906
if(priv->bHwRadioOff == true)
909
if (wrqu->frag.disabled)
910
priv->rtllib->fts = DEFAULT_FRAG_THRESHOLD;
912
if (wrqu->frag.value < MIN_FRAG_THRESHOLD ||
913
wrqu->frag.value > MAX_FRAG_THRESHOLD)
916
priv->rtllib->fts = wrqu->frag.value & ~0x1;
923
static int r8192_wx_get_frag(struct net_device *dev,
924
struct iw_request_info *info,
925
union iwreq_data *wrqu, char *extra)
927
struct r8192_priv *priv = rtllib_priv(dev);
929
wrqu->frag.value = priv->rtllib->fts;
930
wrqu->frag.fixed = 0; /* no auto select */
931
wrqu->frag.disabled = (wrqu->frag.value == DEFAULT_FRAG_THRESHOLD);
937
static int r8192_wx_set_wap(struct net_device *dev,
938
struct iw_request_info *info,
939
union iwreq_data *awrq,
944
struct r8192_priv *priv = rtllib_priv(dev);
946
if ((rtllib_act_scanning(priv->rtllib, false)) && !(priv->rtllib->softmac_features & IEEE_SOFTMAC_SCAN)){
950
if(priv->bHwRadioOff == true)
953
#ifdef _RTL8192_EXT_PATCH_
954
if (priv->mshobj && (priv->rtllib->iw_mode==IW_MODE_MESH)){
960
ret = rtllib_wx_set_wap(priv->rtllib,info,awrq,extra);
969
static int r8192_wx_get_wap(struct net_device *dev,
970
struct iw_request_info *info,
971
union iwreq_data *wrqu, char *extra)
973
struct r8192_priv *priv = rtllib_priv(dev);
975
return rtllib_wx_get_wap(priv->rtllib,info,wrqu,extra);
979
static int r8192_wx_get_enc(struct net_device *dev,
980
struct iw_request_info *info,
981
union iwreq_data *wrqu, char *key)
983
struct r8192_priv *priv = rtllib_priv(dev);
985
#ifdef _RTL8192_EXT_PATCH_
986
return rtllib_wx_get_encode(priv->rtllib, info, wrqu, key,0);
988
return rtllib_wx_get_encode(priv->rtllib, info, wrqu, key);
992
static int r8192_wx_set_enc(struct net_device *dev,
993
struct iw_request_info *info,
994
union iwreq_data *wrqu, char *key)
996
struct r8192_priv *priv = rtllib_priv(dev);
999
struct rtllib_device *ieee = priv->rtllib;
1000
u32 hwkey[4]={0,0,0,0};
1003
u8 zero_addr[4][6] ={ {0x00,0x00,0x00,0x00,0x00,0x00},
1004
{0x00,0x00,0x00,0x00,0x00,0x01},
1005
{0x00,0x00,0x00,0x00,0x00,0x02},
1006
{0x00,0x00,0x00,0x00,0x00,0x03} };
1009
if ((rtllib_act_scanning(priv->rtllib, false)) && !(priv->rtllib->softmac_features & IEEE_SOFTMAC_SCAN)){
1013
printk("######################%s(): In MP Test Can not Set Enc\n",__FUNCTION__);
1016
if(priv->bHwRadioOff == true)
1019
if(!priv->up) return -ENETDOWN;
1021
priv->rtllib->wx_set_enc = 1;
1023
down(&priv->rtllib->ips_sem);
1025
up(&priv->rtllib->ips_sem);
1027
down(&priv->wx_sem);
1029
RT_TRACE(COMP_SEC, "Setting SW wep key");
1030
#ifdef _RTL8192_EXT_PATCH_
1031
ret = rtllib_wx_set_encode(priv->rtllib,info,wrqu,key,0);
1033
ret = rtllib_wx_set_encode(priv->rtllib,info,wrqu,key);
1038
if (wrqu->encoding.flags & IW_ENCODE_DISABLED) {
1039
ieee->pairwise_key_type = ieee->group_key_type = KEY_TYPE_NA;
1040
CamResetAllEntry(dev);
1041
#ifdef _RTL8192_EXT_PATCH_
1042
CamRestoreEachIFEntry(dev,1);
1043
reset_IFswcam(dev,0);
1044
priv->rtllib->wx_set_enc = 0;
1046
memset(priv->rtllib->swcamtable,0,sizeof(SW_CAM_TABLE)*32);
1050
if(wrqu->encoding.length!=0){
1052
for(i=0 ; i<4 ; i++){
1053
hwkey[i] |= key[4*i+0]&mask;
1054
if(i==1&&(4*i+1)==wrqu->encoding.length) mask=0x00;
1055
if(i==3&&(4*i+1)==wrqu->encoding.length) mask=0x00;
1056
hwkey[i] |= (key[4*i+1]&mask)<<8;
1057
hwkey[i] |= (key[4*i+2]&mask)<<16;
1058
hwkey[i] |= (key[4*i+3]&mask)<<24;
1061
#define CONF_WEP40 0x4
1062
#define CONF_WEP104 0x14
1064
switch(wrqu->encoding.flags & IW_ENCODE_INDEX){
1065
case 0: key_idx = ieee->tx_keyidx; break;
1066
case 1: key_idx = 0; break;
1067
case 2: key_idx = 1; break;
1068
case 3: key_idx = 2; break;
1069
case 4: key_idx = 3; break;
1072
if(wrqu->encoding.length==0x5){
1073
ieee->pairwise_key_type = KEY_TYPE_WEP40;
1074
EnableHWSecurityConfig8192(dev);
1075
#ifndef _RTL8192_EXT_PATCH_
1096
else if(wrqu->encoding.length==0xd){
1097
ieee->pairwise_key_type = KEY_TYPE_WEP104;
1098
EnableHWSecurityConfig8192(dev);
1099
#ifndef _RTL8192_EXT_PATCH_
1117
else printk("wrong type in WEP, not WEP40 and WEP104\n");
1118
#ifdef _RTL8192_EXT_PATCH_
1119
if(ieee->state == RTLLIB_LINKED){
1120
if(ieee->iw_mode == IW_MODE_ADHOC)
1126
ieee->pairwise_key_type,
1133
ieee->pairwise_key_type,
1143
ieee->pairwise_key_type,
1150
ieee->pairwise_key_type,
1161
if(wrqu->encoding.length==0 && (wrqu->encoding.flags >>8) == 0x8 ){
1163
EnableHWSecurityConfig8192(dev);
1164
key_idx = (wrqu->encoding.flags & 0xf)-1 ;
1165
write_cam(dev, (4*6), 0xffff0000|read_cam(dev, key_idx*6) );
1166
write_cam(dev, (4*6)+1, 0xffffffff);
1167
write_cam(dev, (4*6)+2, read_cam(dev, (key_idx*6)+2) );
1168
write_cam(dev, (4*6)+3, read_cam(dev, (key_idx*6)+3) );
1169
write_cam(dev, (4*6)+4, read_cam(dev, (key_idx*6)+4) );
1170
write_cam(dev, (4*6)+5, read_cam(dev, (key_idx*6)+5) );
1173
#ifdef _RTL8192_EXT_PATCH_
1174
priv->rtllib->wx_set_enc = 0;
1175
printk("===================>%s():set ieee->wx_set_enc 0\n",__FUNCTION__);
1179
priv->rtllib->wx_set_enc = 0;
1185
static int r8192_wx_set_scan_type(struct net_device *dev, struct iw_request_info *aa, union
1186
iwreq_data *wrqu, char *p){
1188
struct r8192_priv *priv = rtllib_priv(dev);
1192
if(priv->bHwRadioOff == true)
1195
priv->rtllib->active_scan = mode;
1202
#define R8192_MAX_RETRY 255
1203
static int r8192_wx_set_retry(struct net_device *dev,
1204
struct iw_request_info *info,
1205
union iwreq_data *wrqu, char *extra)
1207
struct r8192_priv *priv = rtllib_priv(dev);
1210
if(priv->bHwRadioOff == true)
1213
down(&priv->wx_sem);
1215
if (wrqu->retry.flags & IW_RETRY_LIFETIME ||
1216
wrqu->retry.disabled){
1220
if (!(wrqu->retry.flags & IW_RETRY_LIMIT)){
1225
if(wrqu->retry.value > R8192_MAX_RETRY){
1229
if (wrqu->retry.flags & IW_RETRY_MAX) {
1230
priv->retry_rts = wrqu->retry.value;
1231
DMESG("Setting retry for RTS/CTS data to %d", wrqu->retry.value);
1234
priv->retry_data = wrqu->retry.value;
1235
DMESG("Setting retry for non RTS/CTS data to %d", wrqu->retry.value);
1239
rtl8192_commit(dev);
1242
rtl8180_halt_adapter(dev);
1243
rtl8180_rx_enable(dev);
1244
rtl8180_tx_enable(dev);
1254
static int r8192_wx_get_retry(struct net_device *dev,
1255
struct iw_request_info *info,
1256
union iwreq_data *wrqu, char *extra)
1258
struct r8192_priv *priv = rtllib_priv(dev);
1261
wrqu->retry.disabled = 0; /* can't be disabled */
1263
if ((wrqu->retry.flags & IW_RETRY_TYPE) ==
1267
if (wrqu->retry.flags & IW_RETRY_MAX) {
1268
wrqu->retry.flags = IW_RETRY_LIMIT & IW_RETRY_MAX;
1269
wrqu->retry.value = priv->retry_rts;
1271
wrqu->retry.flags = IW_RETRY_LIMIT & IW_RETRY_MIN;
1272
wrqu->retry.value = priv->retry_data;
1279
static int r8192_wx_get_sens(struct net_device *dev,
1280
struct iw_request_info *info,
1281
union iwreq_data *wrqu, char *extra)
1283
struct r8192_priv *priv = rtllib_priv(dev);
1284
if(priv->rf_set_sens == NULL)
1285
return -1; /* we have not this support for this radio */
1286
wrqu->sens.value = priv->sens;
1291
static int r8192_wx_set_sens(struct net_device *dev,
1292
struct iw_request_info *info,
1293
union iwreq_data *wrqu, char *extra)
1296
struct r8192_priv *priv = rtllib_priv(dev);
1300
if(priv->bHwRadioOff == true)
1303
down(&priv->wx_sem);
1304
if(priv->rf_set_sens == NULL) {
1305
err= -1; /* we have not this support for this radio */
1308
if(priv->rf_set_sens(dev, wrqu->sens.value) == 0)
1309
priv->sens = wrqu->sens.value;
1319
#if (WIRELESS_EXT >= 18)
1321
static int r8192_wx_get_enc_ext(struct net_device *dev,
1322
struct iw_request_info *info,
1323
union iwreq_data *wrqu, char *extra)
1325
struct r8192_priv *priv = rtllib_priv(dev);
1327
#ifdef _RTL8192_EXT_PATCH_
1328
ret = rtllib_wx_get_encode_ext(priv->rtllib, info, wrqu, extra,0);
1330
ret = rtllib_wx_get_encode_ext(priv->rtllib, info, wrqu, extra);
1336
#ifdef _RTL8192_EXT_PATCH_
1337
static int meshdev_set_key_for_linked_peers(struct net_device *dev, u8 KeyIndex,u16 KeyType, u32 *KeyContent );
1338
static int r8192_set_hw_enc(struct net_device *dev,
1339
struct iw_request_info *info,
1340
union iwreq_data *wrqu, char *extra, u8 is_mesh)
1343
struct r8192_priv *priv = rtllib_priv(dev);
1344
struct rtllib_device* ieee = priv->rtllib;
1346
struct iw_encode_ext *ext = (struct iw_encode_ext *)extra;
1347
struct iw_point *encoding = &wrqu->encoding;
1348
u8 idx = 0, alg = 0, group = 0;
1349
u8 broadcast_addr[6] = {0xff,0xff,0xff,0xff,0xff,0xff};
1351
priv->rtllib->wx_set_enc = 1;
1353
down(&priv->rtllib->ips_sem);
1355
up(&priv->rtllib->ips_sem);
1358
static u8 CAM_CONST_ADDR[4][6] = {
1359
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
1360
{0x00, 0x00, 0x00, 0x00, 0x00, 0x01},
1361
{0x00, 0x00, 0x00, 0x00, 0x00, 0x02},
1362
{0x00, 0x00, 0x00, 0x00, 0x00, 0x03}};
1364
if ((encoding->flags & IW_ENCODE_DISABLED) ||
1365
ext->alg == IW_ENCODE_ALG_NONE)
1368
ieee->mesh_pairwise_key_type = ieee->mesh_pairwise_key_type = KEY_TYPE_NA;
1370
ieee->pairwise_key_type = ieee->group_key_type = KEY_TYPE_NA;
1371
CamResetAllEntry(dev);
1373
CamRestoreEachIFEntry(dev,0);
1375
CamRestoreEachIFEntry(dev,1);
1376
reset_IFswcam(dev,is_mesh);
1379
alg = (ext->alg == IW_ENCODE_ALG_CCMP)?KEY_TYPE_CCMP:ext->alg;
1380
idx = encoding->flags & IW_ENCODE_INDEX;
1383
group = ext->ext_flags & IW_ENCODE_EXT_GROUP_KEY;
1384
printk("====>group is %x\n",group);
1385
if ((!group) || (IW_MODE_ADHOC == ieee->iw_mode) || (alg == KEY_TYPE_WEP40) || (IW_MODE_MESH == ieee->iw_mode))
1387
if ((ext->key_len == 13) && (alg == KEY_TYPE_WEP40) )
1388
alg = KEY_TYPE_WEP104;
1390
ieee->mesh_pairwise_key_type = alg;
1392
ieee->pairwise_key_type = alg;
1393
EnableHWSecurityConfig8192(dev);
1395
memcpy((u8*)key, ext->key, 16);
1396
if ((alg & KEY_TYPE_WEP40) && (ieee->auth_mode !=2) )
1398
printk("=====>set WEP key\n");
1399
if (ext->key_len == 13){
1401
ieee->mesh_pairwise_key_type = alg = KEY_TYPE_WEP104;
1403
ieee->pairwise_key_type = alg = KEY_TYPE_WEP104;
1405
if(ieee->iw_mode == IW_MODE_ADHOC){
1424
if(ieee->state == RTLLIB_LINKED){
1428
ieee->pairwise_key_type,
1435
ieee->pairwise_key_type,
1445
printk("set group key\n");
1447
ieee->mesh_group_key_type = alg;
1449
ieee->group_key_type = alg;
1450
if(ieee->iw_mode == IW_MODE_ADHOC){
1469
meshdev_set_key_for_linked_peers(dev,
1476
printk("=============>set pairwise key\n");
1478
if ((ieee->pairwise_key_type == KEY_TYPE_CCMP) && ieee->pHTInfo->bCurrentHTSupport){
1479
write_nic_byte(dev, 0x173, 1);
1486
(u8*)ieee->ap_mac_addr,
1494
(u8*)ieee->ap_mac_addr,
1500
priv->rtllib->wx_set_enc = 0;
1504
int rtl8192_set_key_for_AP(struct rtllib_device *ieee)
1506
struct rtllib_crypt_data **crypt;
1509
u16 keytype = IW_ENCODE_ALG_NONE;
1510
#ifdef _RTL8192_EXT_PATCH_
1511
crypt = &ieee->sta_crypt[ieee->tx_keyidx];
1513
crypt = &ieee->crypt[ieee->tx_keyidx];
1515
if (*crypt == NULL || (*crypt)->ops == NULL)
1517
printk("%s():no encrypt now\n",__FUNCTION__);
1520
if (!((*crypt)->ops->set_key && (*crypt)->ops->get_key))
1523
key_len = (*crypt)->ops->get_key(key, 32, NULL, (*crypt)->priv);
1524
if (strcmp((*crypt)->ops->name, "WEP") == 0 )
1527
keytype = KEY_TYPE_WEP40;
1529
keytype = KEY_TYPE_WEP104;
1531
else if (strcmp((*crypt)->ops->name, "TKIP") == 0)
1533
else if (strcmp((*crypt)->ops->name, "CCMP") == 0)
1536
set_swcam( ieee->dev,
1556
static int r8192_wx_set_enc_ext(struct net_device *dev,
1557
struct iw_request_info *info,
1558
union iwreq_data *wrqu, char *extra)
1561
#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)
1562
struct r8192_priv *priv = rtllib_priv(dev);
1563
struct rtllib_device* ieee = priv->rtllib;
1565
if(priv->bHwRadioOff == true)
1568
SEM_DOWN_PRIV_WX(&priv->wx_sem);
1569
ret = rtllib_wx_set_encode_ext(ieee, info, wrqu, extra, 0);
1571
ret |= r8192_set_hw_enc(dev,info,wrqu,extra, 0);
1572
SEM_UP_PRIV_WX(&priv->wx_sem);
1578
* set key for mesh, not a wireless extension handler.
1579
* place it here because of porting from r8192_wx_set_enc_ext().
1581
int r8192_mesh_set_enc_ext(struct net_device *dev,
1582
struct iw_point *encoding, struct iw_encode_ext *ext, u8 *addr)
1586
u8 broadcast_addr[6] = {0xff,0xff,0xff,0xff,0xff,0xff};
1587
#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)
1588
struct r8192_priv *priv = rtllib_priv(dev);
1589
struct rtllib_device* ieee = priv->rtllib;
1591
down(&priv->wx_sem);
1592
if(memcmp(addr,broadcast_addr,6))
1594
if ((i=rtllib_find_MP(ieee, addr, 0)) < 0)
1596
i = rtllib_find_MP(ieee, addr, 1);
1601
ret = rtllib_mesh_set_encode_ext(ieee, encoding, ext, i);
1602
if ((-EINVAL == ret) || (-ENOMEM == ret)) {
1610
u8 idx = 0, alg = 0, group = 0;
1611
if ((encoding->flags & IW_ENCODE_DISABLED) ||
1612
ext->alg == IW_ENCODE_ALG_NONE)
1614
CamResetAllEntry(dev);
1615
CamRestoreEachIFEntry(dev,0);
1616
reset_IFswcam(dev,1);
1619
alg = (ext->alg == IW_ENCODE_ALG_CCMP)?KEY_TYPE_CCMP:ext->alg;
1620
idx = encoding->flags & IW_ENCODE_INDEX;
1623
group = ext->ext_flags & IW_ENCODE_EXT_GROUP_KEY;
1627
ieee->mesh_pairwise_key_type = alg;
1628
EnableHWSecurityConfig8192(dev);
1631
memcpy((u8*)key, ext->key, 16);
1635
ieee->mesh_group_key_type = alg;
1649
if ((ieee->mesh_pairwise_key_type == KEY_TYPE_CCMP) && ieee->pHTInfo->bCurrentHTSupport){
1650
write_nic_byte(dev, 0x173, 1);
1653
entry_idx = rtl8192_get_free_hwsec_cam_entry(ieee,addr);
1655
printk("%s(): Can't find free hw security cam entry\n",__FUNCTION__);
1658
if (entry_idx >= TOTAL_CAM_ENTRY-1) {
1659
printk("%s(): Can't find free hw security cam entry\n",__FUNCTION__);
1692
static int r8192_wx_set_enc_ext(struct net_device *dev,
1693
struct iw_request_info *info,
1694
union iwreq_data *wrqu, char *extra)
1698
#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)
1699
struct r8192_priv *priv = rtllib_priv(dev);
1700
struct rtllib_device* ieee = priv->rtllib;
1702
if(priv->bHwRadioOff == true)
1705
down(&priv->wx_sem);
1707
priv->rtllib->wx_set_enc = 1;
1709
down(&priv->rtllib->ips_sem);
1711
up(&priv->rtllib->ips_sem);
1714
ret = rtllib_wx_set_encode_ext(ieee, info, wrqu, extra);
1717
u8 broadcast_addr[6] = {0xff,0xff,0xff,0xff,0xff,0xff};
1720
struct iw_encode_ext *ext = (struct iw_encode_ext *)extra;
1721
struct iw_point *encoding = &wrqu->encoding;
1723
static u8 CAM_CONST_ADDR[4][6] = {
1724
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
1725
{0x00, 0x00, 0x00, 0x00, 0x00, 0x01},
1726
{0x00, 0x00, 0x00, 0x00, 0x00, 0x02},
1727
{0x00, 0x00, 0x00, 0x00, 0x00, 0x03}};
1729
u8 idx = 0, alg = 0, group = 0;
1730
if ((encoding->flags & IW_ENCODE_DISABLED) ||
1731
ext->alg == IW_ENCODE_ALG_NONE)
1733
ieee->pairwise_key_type = ieee->group_key_type = KEY_TYPE_NA;
1734
CamResetAllEntry(dev);
1735
memset(priv->rtllib->swcamtable,0,sizeof(SW_CAM_TABLE)*32);
1738
alg = (ext->alg == IW_ENCODE_ALG_CCMP)?KEY_TYPE_CCMP:ext->alg;
1739
idx = encoding->flags & IW_ENCODE_INDEX;
1742
group = ext->ext_flags & IW_ENCODE_EXT_GROUP_KEY;
1744
if ((!group) || (IW_MODE_ADHOC == ieee->iw_mode) || (alg == KEY_TYPE_WEP40))
1746
if ((ext->key_len == 13) && (alg == KEY_TYPE_WEP40) )
1747
alg = KEY_TYPE_WEP104;
1748
ieee->pairwise_key_type = alg;
1749
EnableHWSecurityConfig8192(dev);
1751
memcpy((u8*)key, ext->key, 16);
1753
if ((alg & KEY_TYPE_WEP40) && (ieee->auth_mode !=2) )
1755
if (ext->key_len == 13)
1756
ieee->pairwise_key_type = alg = KEY_TYPE_WEP104;
1775
ieee->group_key_type = alg;
1795
if ((ieee->pairwise_key_type == KEY_TYPE_CCMP) && ieee->pHTInfo->bCurrentHTSupport){
1796
write_nic_byte(dev, 0x173, 1);
1803
(u8*)ieee->ap_mac_addr,
1810
(u8*)ieee->ap_mac_addr,
1820
priv->rtllib->wx_set_enc = 0;
1827
static int r8192_wx_set_auth(struct net_device *dev,
1828
struct iw_request_info *info,
1829
union iwreq_data *data, char *extra)
1833
#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)
1834
struct r8192_priv *priv = rtllib_priv(dev);
1836
if(priv->bHwRadioOff == true)
1839
down(&priv->wx_sem);
1840
ret = rtllib_wx_set_auth(priv->rtllib, info, &(data->param), extra);
1846
static int r8192_wx_set_mlme(struct net_device *dev,
1847
struct iw_request_info *info,
1848
union iwreq_data *wrqu, char *extra)
1853
#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)
1854
struct r8192_priv *priv = rtllib_priv(dev);
1856
if(priv->bHwRadioOff == true)
1859
down(&priv->wx_sem);
1860
ret = rtllib_wx_set_mlme(priv->rtllib, info, wrqu, extra);
1867
static int r8192_wx_set_gen_ie(struct net_device *dev,
1868
struct iw_request_info *info,
1869
union iwreq_data *data, char *extra)
1873
#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)
1874
struct r8192_priv *priv = rtllib_priv(dev);
1876
if(priv->bHwRadioOff == true)
1879
down(&priv->wx_sem);
1880
ret = rtllib_wx_set_gen_ie(priv->rtllib, extra, data->data.length);
1886
static int r8192_wx_get_gen_ie(struct net_device *dev,
1887
struct iw_request_info *info,
1888
union iwreq_data *data, char *extra)
1891
#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)
1892
struct r8192_priv *priv = rtllib_priv(dev);
1893
struct rtllib_device* ieee = priv->rtllib;
1895
if (ieee->wpa_ie_len == 0 || ieee->wpa_ie == NULL) {
1896
data->data.length = 0;
1900
if (data->data.length < ieee->wpa_ie_len) {
1904
data->data.length = ieee->wpa_ie_len;
1905
memcpy(extra, ieee->wpa_ie, ieee->wpa_ie_len);
1910
#ifdef _RTL8192_EXT_PATCH_
1913
(case 1) Mesh: Enable. MESHID=[%s] (max length of %s is 32 bytes).
1914
(case 2) Mesh: Disable.
1916
static int r8192_wx_get_meshinfo(struct net_device *dev,
1917
struct iw_request_info *info,
1918
union iwreq_data *wrqu, char *extra)
1920
struct r8192_priv *priv = rtllib_priv(dev);
1922
if( ! priv->mshobj || !priv->mshobj->ext_patch_r819x_wx_get_meshinfo )
1924
return priv->mshobj->ext_patch_r819x_wx_get_meshinfo(dev, info, wrqu, extra);
1928
static int r8192_wx_enable_mesh(struct net_device *dev,
1929
struct iw_request_info *info,
1930
union iwreq_data *wrqu, char *extra)
1932
struct r8192_priv *priv = rtllib_priv(dev);
1933
struct rtllib_device *ieee = priv->rtllib;
1934
RT_RF_POWER_STATE rtState;
1936
rtState = priv->rtllib->eRFPowerState;
1938
if( ! priv->mshobj || !priv->mshobj->ext_patch_r819x_wx_enable_mesh )
1941
SEM_DOWN_PRIV_WX(&priv->wx_sem);
1942
if(priv->mshobj->ext_patch_r819x_wx_enable_mesh(dev))
1944
union iwreq_data tmprqu;
1946
if(priv->rtllib->PowerSaveControl.bInactivePs){
1947
if(rtState == eRfOff){
1948
if(priv->rtllib->RfOffReason > RF_CHANGE_BY_IPS)
1950
RT_TRACE(COMP_ERR, "%s(): RF is OFF.\n",__FUNCTION__);
1951
SEM_UP_PRIV_WX(&priv->wx_sem);
1955
printk("=========>%s(): IPSLeave\n",__FUNCTION__);
1961
if(ieee->only_mesh == 0)
1963
tmprqu.mode = ieee->iw_mode;
1965
ret = rtllib_wx_set_mode(ieee, info, &tmprqu, extra);
1969
SEM_UP_PRIV_WX(&priv->wx_sem);
1975
static int r8192_wx_disable_mesh(struct net_device *dev,
1976
struct iw_request_info *info,
1977
union iwreq_data *wrqu, char *extra)
1979
struct r8192_priv *priv = rtllib_priv(dev);
1980
struct rtllib_device *ieee = priv->rtllib;
1983
if( ! priv->mshobj || !priv->mshobj->ext_patch_r819x_wx_disable_mesh )
1986
SEM_DOWN_PRIV_WX(&priv->wx_sem);
1987
if(priv->mshobj->ext_patch_r819x_wx_disable_mesh(dev))
1989
union iwreq_data tmprqu;
1990
tmprqu.mode = ieee->iw_mode;
1991
ieee->iw_mode = 999;
1992
ret = rtllib_wx_set_mode(ieee, info, &tmprqu, extra);
1995
SEM_UP_PRIV_WX(&priv->wx_sem);
2001
int r8192_wx_set_channel(struct net_device *dev,
2002
struct iw_request_info *info,
2003
union iwreq_data *wrqu, char *extra)
2006
struct r8192_priv *priv = rtllib_priv(dev);
2007
struct rtllib_device *ieee = priv->rtllib;
2009
if (!priv->mshobj || (ieee->iw_mode != IW_MODE_MESH) || !priv->mshobj->ext_patch_r819x_wx_set_channel || !ieee->only_mesh)
2014
rtllib_start_scan(ieee);
2015
ieee->meshScanMode =2;
2019
ieee->meshScanMode =0;
2020
if(priv->mshobj->ext_patch_r819x_wx_set_channel)
2022
priv->mshobj->ext_patch_r819x_wx_set_channel(ieee, ch);
2023
priv->mshobj->ext_patch_r819x_wx_set_mesh_chan(dev,ch);
2025
queue_work_rsl(ieee->wq, &ieee->ext_stop_scan_wq);
2026
ieee->set_chan(ieee->dev, ch);
2027
printk("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!set current mesh network channel %d\n", ch);
2028
ieee->current_mesh_network.channel = ch;
2030
ieee->current_network.channel = ch;
2032
ieee->current_network.channel = ieee->current_mesh_network.channel;
2033
if(ieee->pHTInfo->bCurBW40MHz)
2034
HTSetConnectBwMode(ieee, HT_CHANNEL_WIDTH_20_40, (ieee->current_mesh_network.channel<=6)?HT_EXTCHNL_OFFSET_UPPER:HT_EXTCHNL_OFFSET_LOWER);
2036
HTSetConnectBwMode(ieee, HT_CHANNEL_WIDTH_20, (ieee->current_mesh_network.channel<=6)?HT_EXTCHNL_OFFSET_UPPER:HT_EXTCHNL_OFFSET_LOWER);
2037
if(rtllib_act_scanning(ieee,true) == true)
2038
rtllib_stop_scan_syncro(ieee);
2044
static int r8192_wx_set_meshID(struct net_device *dev,
2045
struct iw_request_info *info,
2046
union iwreq_data *wrqu, char *extra)
2048
struct r8192_priv *priv = rtllib_priv(dev);
2049
if( ! priv->mshobj || !priv->mshobj->ext_patch_r819x_wx_set_meshID )
2052
return priv->mshobj->ext_patch_r819x_wx_set_meshID(dev, wrqu->data.pointer);
2056
/* reserved for future
2057
static int r8192_wx_add_mac_deny(struct net_device *dev,
2058
struct iw_request_info *info,
2059
union iwreq_data *wrqu, char *extra)
2061
struct r8192_priv *priv = rtllib_priv(dev);
2063
if( ! priv->mshobj || !priv->mshobj->ext_patch_r819x_wx_set_add_mac_deny )
2066
return priv->mshobj->ext_patch_r819x_wx_set_add_mac_deny(dev, info, wrqu, extra);
2069
static int r8192_wx_del_mac_deny(struct net_device *dev,
2070
struct iw_request_info *info,
2071
union iwreq_data *wrqu, char *extra)
2073
struct r8192_priv *priv = rtllib_priv(dev);
2075
if( ! priv->mshobj || !priv->mshobj->ext_patch_r819x_wx_set_del_mac_deny )
2078
return priv->mshobj->ext_patch_r819x_wx_set_del_mac_deny(dev, info, wrqu, extra);
2081
/* reserved for future
2082
static int r8192_wx_get_mac_deny(struct net_device *dev,
2083
struct iw_request_info *info,
2084
union iwreq_data *wrqu, char *extra)
2086
struct r8192_priv *priv = rtllib_priv(dev);
2088
if( ! priv->mshobj || !priv->mshobj->ext_patch_r819x_wx_get_mac_deny )
2091
return priv->mshobj->ext_patch_r819x_wx_get_mac_deny(dev, info, wrqu, extra);
2093
static int r8192_wx_join_mesh(struct net_device *dev,
2094
struct iw_request_info *info,
2095
union iwreq_data *wrqu, char *extra)
2097
struct r8192_priv *priv = rtllib_priv(dev);
2100
if(priv->rtllib->iw_mode == IW_MODE_MESH) {
2101
printk("join mesh %s\n",extra);
2102
if (wrqu->essid.length > IW_ESSID_MAX_SIZE){
2106
if((wrqu->essid.length == 1) && (wrqu->essid.flags == 1)){
2110
if (wrqu->essid.flags && wrqu->essid.length) {
2111
if(priv->mshobj->ext_patch_r819x_wx_get_selected_mesh_channel(dev, extra, &ch))
2113
priv->mshobj->ext_patch_r819x_wx_set_meshID(dev, extra);
2114
priv->mshobj->ext_patch_r819x_wx_set_mesh_chan(dev,ch);
2115
r8192_wx_set_channel(dev, NULL, NULL, &ch);
2118
printk("invalid mesh #\n");
2126
static int r8192_wx_get_mesh_list(struct net_device *dev,
2127
struct iw_request_info *info,
2128
union iwreq_data *wrqu, char *extra)
2130
struct r8192_priv *priv = rtllib_priv(dev);
2132
if( ! priv->mshobj || !priv->mshobj->ext_patch_r819x_wx_get_mesh_list )
2134
return priv->mshobj->ext_patch_r819x_wx_get_mesh_list(dev, info, wrqu, extra);
2137
static int r8192_wx_mesh_scan(struct net_device *dev,
2138
struct iw_request_info *info,
2139
union iwreq_data *wrqu, char *extra)
2141
struct r8192_priv *priv = rtllib_priv(dev);
2143
if( ! priv->mshobj || !priv->mshobj->ext_patch_r819x_wx_mesh_scan )
2145
return priv->mshobj->ext_patch_r819x_wx_mesh_scan(dev, info, wrqu, extra);
2148
static int r8192_wx_set_meshmode(struct net_device *dev,
2149
struct iw_request_info *info,
2150
union iwreq_data *wrqu, char *extra)
2152
struct r8192_priv *priv = rtllib_priv(dev);
2154
SEM_DOWN_PRIV_WX(&priv->wx_sem);
2156
printk("%s(): set mesh mode ! extra is %d\n",__FUNCTION__, *extra);
2157
if((*extra != WIRELESS_MODE_A) && (*extra != WIRELESS_MODE_B) &&
2158
(*extra != WIRELESS_MODE_G) && (*extra != WIRELESS_MODE_AUTO) &&
2159
(*extra != WIRELESS_MODE_N_24G) && (*extra != WIRELESS_MODE_N_5G))
2161
printk("ERR!! you should input 1 | 2 | 4 | 8 | 16 | 32\n");
2162
SEM_UP_PRIV_WX(&priv->wx_sem);
2165
if(priv->rtllib->state == RTLLIB_LINKED)
2167
if((priv->rtllib->mode != WIRELESS_MODE_N_5G) && (priv->rtllib->mode != WIRELESS_MODE_N_24G)){
2168
printk("===>wlan0 is linked,and ieee->mode is not N mode ,do not need to set mode,return\n");
2169
SEM_UP_PRIV_WX(&priv->wx_sem);
2173
priv->rtllib->mode = *extra;
2174
if(priv->ResetProgress == RESET_TYPE_NORESET)
2175
rtl8192_SetWirelessMode(dev, priv->rtllib->mode);
2176
HTUseDefaultSetting(priv->rtllib);
2177
SEM_UP_PRIV_WX(&priv->wx_sem);
2182
static int r8192_wx_set_meshBW(struct net_device *dev,
2183
struct iw_request_info *info,
2184
union iwreq_data *wrqu, char *extra)
2186
struct r8192_priv *priv = rtllib_priv(dev);
2188
SEM_DOWN_PRIV_WX(&priv->wx_sem);
2190
printk("%s(): set mesh BW ! extra is %d\n",__FUNCTION__, *extra);
2191
priv->rtllib->pHTInfo->bRegBW40MHz = *extra;
2192
SEM_UP_PRIV_WX(&priv->wx_sem);
2195
static int r8192_wx_set_mesh_security(struct net_device *dev,
2196
struct iw_request_info *info,
2197
union iwreq_data *wrqu, char *extra)
2199
struct r8192_priv *priv = rtllib_priv(dev);
2200
struct rtllib_device* ieee = priv->rtllib;
2202
down(&priv->wx_sem);
2204
printk("%s(): set mesh security! extra is %d\n",__FUNCTION__, *extra);
2205
ieee->mesh_security_setting = *extra;
2207
if (0 == ieee->mesh_security_setting)
2209
ieee->mesh_pairwise_key_type = ieee->mesh_group_key_type = KEY_TYPE_NA;
2210
CamResetAllEntry(dev);
2211
CamRestoreEachIFEntry(dev,0);
2212
reset_IFswcam(dev,1);
2216
ieee->mesh_pairwise_key_type = KEY_TYPE_CCMP;
2217
ieee->mesh_group_key_type = KEY_TYPE_CCMP;
2224
static int r8192_wx_set_mkdd_id(struct net_device *dev,
2225
struct iw_request_info *info,
2226
union iwreq_data *wrqu, char *extra)
2228
struct r8192_priv *priv = rtllib_priv(dev);
2229
printk("===>%s()\n",__FUNCTION__);
2230
if( ! priv->mshobj || !priv->mshobj->ext_patch_r819x_wx_set_mkdd_id)
2233
return priv->mshobj->ext_patch_r819x_wx_set_mkdd_id(dev, wrqu->data.pointer);
2236
static int r8192_wx_set_mesh_key(struct net_device *dev,
2237
struct iw_request_info *info,
2238
union iwreq_data *wrqu, char *extra)
2240
struct r8192_priv *priv = rtllib_priv(dev);
2241
printk("===>%s()\n",__FUNCTION__);
2242
if( ! priv->mshobj || !priv->mshobj->ext_patch_r819x_wx_set_mesh_key)
2244
return priv->mshobj->ext_patch_r819x_wx_set_mesh_key(dev, wrqu->data.pointer);
2247
static int r8192_wx_set_mesh_sec_type(struct net_device *dev,
2248
struct iw_request_info *info,
2249
union iwreq_data *wrqu, char *extra)
2251
struct r8192_priv *priv = rtllib_priv(dev);
2252
struct rtllib_device* ieee = priv->rtllib;
2254
printk("%s(): set mesh security type! extra is %d\n",__FUNCTION__, *extra);
2255
if (ieee->mesh_sec_type == 1 && *extra != 1 && ieee->mesh_security_setting == 3) {
2256
rtl8192_abbr_handshk_disable_key(ieee);
2258
if(priv->mshobj->ext_patch_r819x_wx_release_sae_info)
2259
priv->mshobj->ext_patch_r819x_wx_release_sae_info(ieee);
2261
down(&priv->wx_sem);
2263
ieee->mesh_sec_type = *extra;
2265
if(ieee->mesh_sec_type == 0)
2266
ieee->mesh_pairwise_key_type = ieee->mesh_group_key_type = KEY_TYPE_NA;
2274
#define OID_RT_INTEL_PROMISCUOUS_MODE 0xFF0101F6
2276
static int r8192_wx_set_PromiscuousMode(struct net_device *dev,
2277
struct iw_request_info *info,
2278
union iwreq_data *wrqu, char *extra)
2280
struct r8192_priv *priv = rtllib_priv(dev);
2281
struct rtllib_device* ieee = priv->rtllib;
2283
u32 *info_buf = (u32*)(wrqu->data.pointer);
2285
u32 oid = info_buf[0];
2286
u32 bPromiscuousOn = info_buf[1];
2287
u32 bFilterSourceStationFrame = info_buf[2];
2289
if (OID_RT_INTEL_PROMISCUOUS_MODE == oid)
2291
ieee->IntelPromiscuousModeInfo.bPromiscuousOn =
2292
(bPromiscuousOn)? (true) : (false);
2293
ieee->IntelPromiscuousModeInfo.bFilterSourceStationFrame =
2294
(bFilterSourceStationFrame)? (true) : (false);
2296
(bPromiscuousOn) ? (rtllib_EnableIntelPromiscuousMode(dev, false)) :
2297
(rtllib_DisableIntelPromiscuousMode(dev, false));
2299
printk("=======>%s(), on = %d, filter src sta = %d\n", __FUNCTION__,
2300
bPromiscuousOn, bFilterSourceStationFrame);
2309
static int r8192_wx_get_PromiscuousMode(struct net_device *dev,
2310
struct iw_request_info *info,
2311
union iwreq_data *wrqu, char *extra)
2313
struct r8192_priv *priv = rtllib_priv(dev);
2314
struct rtllib_device* ieee = priv->rtllib;
2316
down(&priv->wx_sem);
2318
snprintf(extra, 45, "PromiscuousMode:%d, FilterSrcSTAFrame:%d",\
2319
ieee->IntelPromiscuousModeInfo.bPromiscuousOn,\
2320
ieee->IntelPromiscuousModeInfo.bFilterSourceStationFrame);
2321
wrqu->data.length = strlen(extra) + 1;
2329
static int r8192_wx_creat_physical_link(
2330
struct net_device *dev,
2331
struct iw_request_info *info,
2332
union iwreq_data *wrqu,
2335
u32 *info_buf = (u32*)(wrqu->data.pointer);
2337
struct r8192_priv* priv = rtllib_priv(dev);
2338
PBT30Info pBTInfo = &priv->BtInfo;
2339
PPACKET_IRP_HCICMD_DATA pHciCmd = NULL;
2340
u8 joinaddr[6] = {0x00, 0xe0, 0x4c, 0x76, 0x00, 0x33};
2344
joinaddr[i] = (u8)(info_buf[i]);
2346
printk("===++===++===> RemoteJoinerAddr: %02x:%02x:%02x:%02x:%02x:%02x\n",
2347
joinaddr[0],joinaddr[1],joinaddr[2],joinaddr[3],joinaddr[4],joinaddr[5]);
2349
pHciCmd = (PPACKET_IRP_HCICMD_DATA)kmalloc(sizeof(PACKET_IRP_HCICMD_DATA)+4, GFP_KERNEL);
2351
BT_HCI_RESET(dev, false);
2352
BT_HCI_CREATE_PHYSICAL_LINK(dev, pHciCmd);
2354
memcpy(priv->BtInfo.BtAsocEntry[0].BTRemoteMACAddr, joinaddr, 6);
2356
bt_wifi_set_enc(dev, type_Pairwise, 0, 1);
2357
BT_HCI_StartBeaconAndConnect(dev, pHciCmd, 0);
2364
static int r8192_wx_accept_physical_link(
2365
struct net_device *dev,
2366
struct iw_request_info *info,
2367
union iwreq_data *wrqu,
2370
struct r8192_priv* priv = rtllib_priv(dev);
2371
PBT30Info pBTInfo = &priv->BtInfo;
2372
PPACKET_IRP_HCICMD_DATA pHciCmd = NULL;
2374
u8 amp_ssid[32] = {0};
2375
u8 amp_len = strlen(wrqu->data.pointer);
2377
memcpy(amp_ssid, wrqu->data.pointer, amp_len);
2379
pHciCmd = (PPACKET_IRP_HCICMD_DATA)kmalloc(sizeof(PACKET_IRP_HCICMD_DATA)+4, GFP_KERNEL);
2381
BT_HCI_RESET(dev, false);
2382
BT_HCI_ACCEPT_PHYSICAL_LINK(dev, pHciCmd);
2384
snprintf(pBTInfo->BtAsocEntry[0].BTSsidBuf, 32, "AMP-%02x-%02x-%02x-%02x-%02x-%02x", 0x00,0xe0,0x4c,0x78,0x00,0x00);
2385
pBTInfo->BtAsocEntry[0].BTSsid.Octet = pBTInfo->BtAsocEntry[0].BTSsidBuf;
2386
pBTInfo->BtAsocEntry[0].BTSsid.Length = 21;
2387
printk("==++==++==++==>%s() AMP-SSID:%s:%s, len:%d\n", __func__, amp_ssid, pBTInfo->BtAsocEntry[0].BTSsid.Octet, amp_len);
2391
unsigned long flags;
2392
struct rtllib_network *target;
2394
spin_lock_irqsave(&priv->rtllib->lock, flags);
2396
list_for_each_entry(target, &priv->rtllib->network_list, list) {
2398
if(!CompareSSID(pBTInfo->BtAsocEntry[0].BTSsidBuf, pBTInfo->BtAsocEntry[0].BTSsid.Length,
2399
target->ssid,target->ssid_len)){
2403
printk("===++===++===> CreaterBssid: %02x:%02x:%02x:%02x:%02x:%02x\n",
2404
target->bssid[0],target->bssid[1],target->bssid[2],
2405
target->bssid[3],target->bssid[4],target->bssid[5]);
2406
memcpy(pBTInfo->BtAsocEntry[0].BTRemoteMACAddr, target->bssid, 6);
2409
spin_unlock_irqrestore(&priv->rtllib->lock, flags);
2413
BT_HCI_StartBeaconAndConnect(dev, pHciCmd, 0);
2418
snprintf(pBTInfo->BtAsocEntry[0].BTSsidBuf, 32, "AMP-%02x-%02x-%02x-%02x-%02x-%02x", 0x00,0xe0,0x4c,0x78,0x00,0x00);
2419
pBTInfo->BtAsocEntry[0].BTSsid.Octet = pBTInfo->BtAsocEntry[0].BTSsidBuf;
2420
pBTInfo->BtAsocEntry[0].BTSsid.Length = 21;
2422
bt_wifi_set_enc(dev, type_Pairwise, 0, 1);
2423
BT_ConnectProcedure(dev, 0);
2432
#define IW_IOCTL(x) [(x)-SIOCSIWCOMMIT]
2433
static iw_handler r8192_wx_handlers[] =
2435
IW_IOCTL(SIOCGIWNAME) = r8192_wx_get_name,
2436
IW_IOCTL(SIOCSIWFREQ) = r8192_wx_set_freq,
2437
IW_IOCTL(SIOCGIWFREQ) = r8192_wx_get_freq,
2438
IW_IOCTL(SIOCSIWMODE) = r8192_wx_set_mode,
2439
IW_IOCTL(SIOCGIWMODE) = r8192_wx_get_mode,
2440
IW_IOCTL(SIOCSIWSENS) = r8192_wx_set_sens,
2441
IW_IOCTL(SIOCGIWSENS) = r8192_wx_get_sens,
2442
IW_IOCTL(SIOCGIWRANGE) = rtl8192_wx_get_range,
2443
IW_IOCTL(SIOCSIWAP) = r8192_wx_set_wap,
2444
IW_IOCTL(SIOCGIWAP) = r8192_wx_get_wap,
2445
IW_IOCTL(SIOCSIWSCAN) = r8192_wx_set_scan,
2446
IW_IOCTL(SIOCGIWSCAN) = r8192_wx_get_scan,
2447
IW_IOCTL(SIOCSIWESSID) = r8192_wx_set_essid,
2448
IW_IOCTL(SIOCGIWESSID) = r8192_wx_get_essid,
2449
IW_IOCTL(SIOCSIWNICKN) = r8192_wx_set_nick,
2450
IW_IOCTL(SIOCGIWNICKN) = r8192_wx_get_nick,
2451
IW_IOCTL(SIOCSIWRATE) = r8192_wx_set_rate,
2452
IW_IOCTL(SIOCGIWRATE) = r8192_wx_get_rate,
2453
IW_IOCTL(SIOCSIWRTS) = r8192_wx_set_rts,
2454
IW_IOCTL(SIOCGIWRTS) = r8192_wx_get_rts,
2455
IW_IOCTL(SIOCSIWFRAG) = r8192_wx_set_frag,
2456
IW_IOCTL(SIOCGIWFRAG) = r8192_wx_get_frag,
2457
IW_IOCTL(SIOCSIWRETRY) = r8192_wx_set_retry,
2458
IW_IOCTL(SIOCGIWRETRY) = r8192_wx_get_retry,
2459
IW_IOCTL(SIOCSIWENCODE) = r8192_wx_set_enc,
2460
IW_IOCTL(SIOCGIWENCODE) = r8192_wx_get_enc,
2461
IW_IOCTL(SIOCSIWPOWER) = r8192_wx_set_power,
2462
IW_IOCTL(SIOCGIWPOWER) = r8192_wx_get_power,
2463
#if (WIRELESS_EXT >= 18)
2464
IW_IOCTL(SIOCSIWGENIE) = r8192_wx_set_gen_ie,
2465
IW_IOCTL(SIOCGIWGENIE) = r8192_wx_get_gen_ie,
2466
IW_IOCTL(SIOCSIWMLME) = r8192_wx_set_mlme,
2467
IW_IOCTL(SIOCSIWAUTH) = r8192_wx_set_auth,
2468
IW_IOCTL(SIOCSIWENCODEEXT) = r8192_wx_set_enc_ext,
2473
* the following rule need to be follwing,
2474
* Odd : get (world access),
2475
* even : set (root access)
2477
static const struct iw_priv_args r8192_private_args[] = {
2479
SIOCIWFIRSTPRIV + 0x0,
2480
IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "set_debugflag"
2483
SIOCIWFIRSTPRIV + 0x1,
2484
IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "activescan"
2487
SIOCIWFIRSTPRIV + 0x2,
2488
IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "rawtx"
2492
SIOCIWFIRSTPRIV + 0x3,
2493
IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "forcereset"
2497
SIOCIWFIRSTPRIV + 0x4,
2498
IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "force_mic_error"
2502
SIOCIWFIRSTPRIV + 0x5,
2503
IW_PRIV_TYPE_NONE, IW_PRIV_TYPE_INT|IW_PRIV_SIZE_FIXED|1,
2508
SIOCIWFIRSTPRIV + 0x6,
2509
IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED|1, IW_PRIV_TYPE_NONE,
2512
#ifdef _RTL8192_EXT_PATCH_
2515
SIOCIWFIRSTPRIV + 0x7,
2516
IW_PRIV_TYPE_NONE, IW_PRIV_TYPE_CHAR|512,
2521
SIOCIWFIRSTPRIV + 0x8,
2522
IW_PRIV_TYPE_NONE, IW_PRIV_TYPE_CHAR|64,
2528
SIOCIWFIRSTPRIV + 0x9,
2529
IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED|1, IW_PRIV_TYPE_NONE,
2534
SIOCIWFIRSTPRIV + 0xa,
2535
IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED|1, IW_PRIV_TYPE_NONE,
2540
SIOCIWFIRSTPRIV + 0xb,
2541
IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED|1, IW_PRIV_TYPE_NONE,
2546
SIOCIWFIRSTPRIV + 0xc,
2547
0, IW_PRIV_TYPE_CHAR|2047, "adhoc_peer_list"
2549
#ifdef _RTL8192_EXT_PATCH_
2552
SIOCIWFIRSTPRIV + 0xd,
2553
IW_PRIV_TYPE_NONE, IW_PRIV_TYPE_CHAR|64,
2560
SIOCIWFIRSTPRIV + 0xe,
2561
IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "SetChan"
2565
SIOCIWFIRSTPRIV + 0xf,
2566
IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "SetRate"
2570
SIOCIWFIRSTPRIV + 0x10,
2571
IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "SetTxPower"
2575
SIOCIWFIRSTPRIV + 0x11,
2576
IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "SetBW"
2580
SIOCIWFIRSTPRIV + 0x12,
2581
IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "TxStart"
2585
SIOCIWFIRSTPRIV + 0x13,
2586
IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,0, "SetSingleCarrier"
2590
SIOCIWFIRSTPRIV + 0x14,
2591
IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 3, 0, "WriteRF"
2595
SIOCIWFIRSTPRIV + 0x15,
2596
IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 3, 0, "WriteMAC"
2601
SIOCIWFIRSTPRIV + 0x16,
2602
IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 3, 0, "setpromisc"
2606
SIOCIWFIRSTPRIV + 0x17,
2607
0,IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_FIXED | 45, "getpromisc"
2612
SIOCIWFIRSTPRIV + 0x18,
2613
IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 6, 0, "amp_creater"
2617
SIOCIWFIRSTPRIV + 0x19,
2618
IW_PRIV_TYPE_CHAR | 64, 0, "amp_joiner"
2623
static iw_handler r8192_private_handler[] = {
2624
(iw_handler)r8192_wx_set_debugflag, /*SIOCIWSECONDPRIV*/
2625
(iw_handler)r8192_wx_set_scan_type,
2626
(iw_handler)r8192_wx_set_rawtx,
2627
(iw_handler)r8192_wx_force_reset,
2628
(iw_handler)r8192_wx_force_mic_error,
2629
(iw_handler)r8191se_wx_get_firm_version,
2630
(iw_handler)r8192_wx_adapter_power_status,
2631
#ifdef _RTL8192_EXT_PATCH_
2632
(iw_handler)r8192_wx_print_reg,
2633
(iw_handler)r8192_wx_resume_firm,
2638
(iw_handler)r8192se_wx_set_radio,
2639
(iw_handler)r8192se_wx_set_lps_awake_interval,
2640
(iw_handler)r8192se_wx_set_force_lps,
2641
(iw_handler)r8192_wx_get_adhoc_peers,
2642
#ifdef _RTL8192_EXT_PATCH_
2643
(iw_handler)r8192_wx_get_drv_version,
2648
(iw_handler)r8192_wx_mp_set_chan,
2649
(iw_handler)r8192_wx_mp_set_txrate,
2650
(iw_handler)r8192_wx_mp_set_txpower,
2651
(iw_handler)r8192_wx_mp_set_bw,
2652
(iw_handler)r8192_wx_mp_set_txstart,
2653
(iw_handler)r8192_wx_mp_set_singlecarrier,
2654
(iw_handler)r8192_wx_mp_write_rf,
2655
(iw_handler)r8192_wx_mp_write_mac,
2666
(iw_handler)r8192_wx_set_PromiscuousMode,
2667
(iw_handler)r8192_wx_get_PromiscuousMode,
2669
(iw_handler)r8192_wx_creat_physical_link,
2670
(iw_handler)r8192_wx_accept_physical_link,
2677
struct iw_statistics *r8192_get_wireless_stats(struct net_device *dev)
2679
struct r8192_priv *priv = rtllib_priv(dev);
2680
struct rtllib_device* ieee = priv->rtllib;
2681
struct iw_statistics* wstats = &priv->wstats;
2685
if(ieee->state < RTLLIB_LINKED)
2687
wstats->qual.qual = 10;
2688
wstats->qual.level = 0;
2689
wstats->qual.noise = -100;
2690
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,14))
2691
wstats->qual.updated = IW_QUAL_ALL_UPDATED | IW_QUAL_DBM;
2693
wstats->qual.updated = 0x0f;
2698
tmp_level = (&ieee->current_network)->stats.rssi;
2699
tmp_qual = (&ieee->current_network)->stats.signal;
2700
tmp_noise = (&ieee->current_network)->stats.noise;
2702
wstats->qual.level = tmp_level;
2703
wstats->qual.qual = tmp_qual;
2704
wstats->qual.noise = tmp_noise;
2705
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,14))
2706
wstats->qual.updated = IW_QUAL_ALL_UPDATED | IW_QUAL_DBM;
2708
wstats->qual.updated = 0x0f;
2713
#if defined RTL8192SE || defined RTL8192CE
2714
u8 SS_Rate_Map_G[6][2] = {{40, MGN_54M}, {30, MGN_48M}, {20, MGN_36M},
2715
{12, MGN_24M}, {7, MGN_18M}, {0, MGN_12M}};
2716
u8 SS_Rate_Map_G_MRC_OFF[6][2]= {{17, MGN_54M}, {15, MGN_48M},
2717
{13, MGN_36M}, {10, MGN_24M}, {3, MGN_18M}, {0, MGN_12M}};
2718
u8 MSI_SS_Rate_Map_G[6][2] = {{40, MGN_54M}, {30, MGN_54M}, {20, MGN_54M},
2719
{12, MGN_48M}, {7, MGN_36M}, {0, MGN_24M}};
2720
u8 SS_Rate_Map_B[2][2] = {{7, MGN_11M}, {0, MGN_5_5M}};
2721
u8 SS_Rate_Map_N_MCS7[7][2] = {{40, MGN_MCS7}, {30, MGN_MCS5}, {25, MGN_MCS4},
2722
{23, MGN_MCS3}, {19, MGN_MCS2}, {8, MGN_MCS1}, {0, MGN_MCS0}};
2723
u8 SS_Rate_Map_N_MCS15[7][2] = {{40, MGN_MCS15}, {35, MGN_MCS14}, {31, MGN_MCS12},
2724
{28, MGN_MCS7}, {25, MGN_MCS5}, {23, MGN_MCS3}, {20, MGN_MCS0}};
2725
#define TxRateTypeNormal 0
2726
#define TxRateTypeCurrent 1
2727
#define TxRateTypeStartRate 2
2729
u8 rtl8192_decorate_txrate_by_singalstrength(u32 SignalStrength, u8 *SS_Rate_Map, u8 MapSize)
2733
for (index = 0; index < (MapSize * 2); index += 2) {
2734
if (SignalStrength > SS_Rate_Map[index])
2735
return SS_Rate_Map[index+1];
2741
u16 rtl8192_11n_user_show_rates(struct net_device* dev)
2743
struct r8192_priv *priv = rtllib_priv(dev);
2744
static u8 TimesForReportingFullRxSpeedAfterConnected = 100;
2747
bool TxorRx = priv->rtllib->bForcedShowRxRate;
2750
priv->rtllib->GetHwRegHandler(dev, HW_VAR_MRC, (u8*)(&bCurrentMRC));
2755
return CONVERT_RATE(priv->rtllib, priv->rtllib->softmac_stats.CurrentShowTxate);
2759
if(priv->rtllib->bForcedShowRateStill) {
2762
Sgstrength = priv->undecorated_smoothed_pwdb;
2765
if (priv->rtllib->mode == WIRELESS_MODE_A ||
2766
priv->rtllib->mode == WIRELESS_MODE_G ||
2767
priv->rtllib->mode == (WIRELESS_MODE_G | WIRELESS_MODE_B )) {
2768
if (priv->CustomerID == RT_CID_819x_MSI) {
2769
rate = rtl8192_decorate_txrate_by_singalstrength(Sgstrength,
2770
(u8*)MSI_SS_Rate_Map_G, sizeof(MSI_SS_Rate_Map_G)/2);
2773
rate = rtl8192_decorate_txrate_by_singalstrength(Sgstrength,
2774
(u8*)SS_Rate_Map_G_MRC_OFF, sizeof(SS_Rate_Map_G_MRC_OFF)/2);
2776
rate = rtl8192_decorate_txrate_by_singalstrength(Sgstrength,
2777
(u8*)SS_Rate_Map_G, sizeof(SS_Rate_Map_G)/2);
2779
} else if (priv->rtllib->mode == WIRELESS_MODE_B) {
2780
rate = rtl8192_decorate_txrate_by_singalstrength(Sgstrength, (u8*)SS_Rate_Map_B,
2781
sizeof(SS_Rate_Map_B)/2);
2782
} else if(priv->rtllib->mode == WIRELESS_MODE_N_24G) {
2784
bool b1SSSupport = priv->rtllib->b1x1RecvCombine;
2785
u8 rftype = priv->rf_type;
2786
if (((!TxorRx) && (rftype==RF_1T1R || rftype==RF_1T2R)) ||
2787
(TxorRx && (rftype==RF_1T1R || (rftype==RF_1T2R && b1SSSupport))) ||
2788
(rftype==RF_2T2R && priv->rtllib->HTHighestOperaRate<=MGN_MCS7))
2789
bMaxRateMcs15 = false;
2791
bMaxRateMcs15 = true;
2793
if((priv->rtllib->state == RTLLIB_LINKED) && !(priv->rtllib->pHTInfo->bCurBW40MHz))
2794
bMaxRateMcs15 = false;
2796
if(priv->rtllib->state != RTLLIB_LINKED)
2797
priv->rtllib->SystemQueryDataRateCount = 0;
2798
if (TimesForReportingFullRxSpeedAfterConnected > priv->rtllib->SystemQueryDataRateCount) {
2799
priv->rtllib->SystemQueryDataRateCount++;
2807
rate = rtl8192_decorate_txrate_by_singalstrength(Sgstrength, (u8*)SS_Rate_Map_N_MCS15,
2808
sizeof(SS_Rate_Map_N_MCS15)/2);
2810
rate = rtl8192_decorate_txrate_by_singalstrength(Sgstrength, (u8*)SS_Rate_Map_N_MCS7,
2811
sizeof(SS_Rate_Map_N_MCS7)/2);
2812
} else if (priv->rtllib->mode == WIRELESS_MODE_N_5G) {
2818
if (priv->rtllib->GetHalfNmodeSupportByAPsHandler(dev)) {
2822
return HTHalfMcsToDataRate(priv->rtllib, rate);
2824
return CONVERT_RATE(priv->rtllib, rate);
2829
struct iw_handler_def r8192_wx_handlers_def={
2830
.standard = r8192_wx_handlers,
2831
.num_standard = sizeof(r8192_wx_handlers) / sizeof(iw_handler),
2832
.private = r8192_private_handler,
2833
.num_private = sizeof(r8192_private_handler) / sizeof(iw_handler),
2834
.num_private_args = sizeof(r8192_private_args) / sizeof(struct iw_priv_args),
2835
#if WIRELESS_EXT >= 17
2836
.get_wireless_stats = r8192_get_wireless_stats,
2838
.private_args = (struct iw_priv_args *)r8192_private_args,
2841
#ifdef _RTL8192_EXT_PATCH_
2842
#define OID_802_11_MESH_SECURITY_INFO 0x0651
2843
#define OID_802_11_MESH_ID 0x0652
2844
#define OID_802_11_MESH_AUTO_LINK 0x0653
2845
#define OID_802_11_MESH_LINK_STATUS 0x0654
2846
#define OID_802_11_MESH_LIST 0x0655
2847
#define OID_802_11_MESH_ROUTE_LIST 0x0656
2848
#define OID_802_11_MESH_ADD_LINK 0x0657
2849
#define OID_802_11_MESH_DEL_LINK 0x0658
2850
#define OID_802_11_MESH_MAX_TX_RATE 0x0659
2851
#define OID_802_11_MESH_CHANNEL 0x065A
2852
#define OID_802_11_MESH_HOSTNAME 0x065B
2853
#define OID_802_11_MESH_ONLY_MODE 0x065C
2855
#define OID_GET_SET_TOGGLE 0x8000
2856
#define RTL_OID_802_11_MESH_SECURITY_INFO (OID_GET_SET_TOGGLE + OID_802_11_MESH_SECURITY_INFO)
2857
#define RTL_OID_802_11_MESH_ID (OID_GET_SET_TOGGLE + OID_802_11_MESH_ID)
2858
#define RTL_OID_802_11_MESH_AUTO_LINK (OID_GET_SET_TOGGLE + OID_802_11_MESH_AUTO_LINK)
2859
#define RTL_OID_802_11_MESH_ADD_LINK (OID_GET_SET_TOGGLE + OID_802_11_MESH_ADD_LINK)
2860
#define RTL_OID_802_11_MESH_DEL_LINK (OID_GET_SET_TOGGLE + OID_802_11_MESH_DEL_LINK)
2861
#define RTL_OID_802_11_MESH_MAX_TX_RATE (OID_GET_SET_TOGGLE + OID_802_11_MESH_MAX_TX_RATE)
2862
#define RTL_OID_802_11_MESH_CHANNEL (OID_GET_SET_TOGGLE + OID_802_11_MESH_CHANNEL)
2863
#define RTL_OID_802_11_MESH_HOSTNAME (OID_GET_SET_TOGGLE + OID_802_11_MESH_HOSTNAME)
2864
#define RTL_OID_802_11_MESH_ONLY_MODE (OID_GET_SET_TOGGLE + OID_802_11_MESH_ONLY_MODE)
2866
#define MAX_NEIGHBOR_NUM 64
2867
typedef struct _MESH_NEIGHBOR_ENTRY
2870
unsigned char HostName[MAX_HOST_NAME_LENGTH];
2871
unsigned char MacAddr[ETH_ALEN];
2872
unsigned char MeshId[MAX_MESH_ID_LEN];
2873
unsigned char Channel;
2874
unsigned char Status;
2875
unsigned char MeshEncrypType;
2876
} MESH_NEIGHBOR_ENTRY, *PMESH_NEIGHBOR_ENTRY;
2877
typedef struct _MESH_NEIGHBOR_INFO
2879
MESH_NEIGHBOR_ENTRY Entry[MAX_NEIGHBOR_NUM];
2881
} MESH_NEIGHBOR_INFO, *PMESH_NEIGHBOR_INFO;
2883
static int meshdev_set_key_for_linked_peers(struct net_device *dev, u8 KeyIndex,
2884
u16 KeyType, u32 *KeyContent )
2886
struct r8192_priv *priv = rtllib_priv(dev);
2887
struct rtllib_device* ieee = priv->rtllib;
2888
struct mshclass *mshobj = priv->mshobj;
2889
PMESH_NEIGHBOR_INFO pmesh_neighbor = NULL;
2890
PMESH_NEIGHBOR_ENTRY pneighbor_entry = NULL;
2893
int found_idx = MAX_MP-1;
2894
pmesh_neighbor = (PMESH_NEIGHBOR_INFO)kmalloc(sizeof(MESH_NEIGHBOR_INFO), GFP_KERNEL);
2895
if(NULL == pmesh_neighbor)
2898
if(mshobj->ext_patch_r819x_get_peers)
2899
mshobj->ext_patch_r819x_get_peers(dev, (void*)pmesh_neighbor);
2901
for (i=0; i<pmesh_neighbor->num; i++) {
2902
pneighbor_entry = (PMESH_NEIGHBOR_ENTRY)&pmesh_neighbor->Entry[i];
2903
if (mshobj->ext_patch_r819x_insert_linking_crypt_peer_queue)
2904
found_idx = mshobj->ext_patch_r819x_insert_linking_crypt_peer_queue(ieee,pneighbor_entry->MacAddr);
2905
if (found_idx == -1) {
2906
printk("%s(): found_idx is -1 , something is wrong, return\n",__FUNCTION__);
2908
} else if (found_idx == (MAX_MP - 1)) {
2909
printk("%s(): found_idx is MAX_MP-1, peer entry is full, return\n",__FUNCTION__);
2912
if ((((ieee->LinkingPeerBitMap>>found_idx) & (BIT0)) == BIT0) && ((ieee->LinkingPeerSecState[found_idx] == USED) )) {
2913
entry_idx = rtl8192_get_free_hwsec_cam_entry(ieee, pneighbor_entry->MacAddr);
2915
printk("%s: Can not find free hw security cam entry, use software encryption entry(%d)\n", __FUNCTION__,entry_idx);
2916
if (mshobj->ext_patch_r819x_set_msh_peer_entry_sec_info)
2917
mshobj->ext_patch_r819x_set_msh_peer_entry_sec_info(ieee,pneighbor_entry->MacAddr,SW_SEC);
2918
ieee->LinkingPeerSecState[found_idx] = SW_SEC;
2920
if (entry_idx >= TOTAL_CAM_ENTRY-1) {
2921
printk("%s: Can not find free hw security cam entry, use software encryption entry(%d)\n", __FUNCTION__,entry_idx);
2922
if (mshobj->ext_patch_r819x_set_msh_peer_entry_sec_info)
2923
mshobj->ext_patch_r819x_set_msh_peer_entry_sec_info(ieee,pneighbor_entry->MacAddr,SW_SEC);
2924
ieee->LinkingPeerSecState[found_idx] = SW_SEC;
2926
printk("==========>%s():entry_idx is %d,set HW CAM\n",__FUNCTION__,entry_idx);
2931
pneighbor_entry->MacAddr,
2939
pneighbor_entry->MacAddr,
2942
if (mshobj->ext_patch_r819x_set_msh_peer_entry_sec_info)
2943
mshobj->ext_patch_r819x_set_msh_peer_entry_sec_info(ieee,pneighbor_entry->MacAddr,HW_SEC);
2944
ieee->LinkingPeerSecState[found_idx] = HW_SEC;
2950
kfree(pmesh_neighbor);
2954
int meshdev_set_key_for_peer(struct net_device *dev,
2960
struct r8192_priv *priv = rtllib_priv(dev);
2961
struct rtllib_device* ieee = priv->rtllib;
2964
entry_idx = rtl8192_get_free_hwsec_cam_entry(ieee, Addr);
2966
printk("%s: Can not find free hw security cam entry\n", __FUNCTION__);
2969
if (entry_idx >= TOTAL_CAM_ENTRY-1) {
2970
printk("%s: Can not find free hw security cam entry\n", __FUNCTION__);
2993
static struct net_device_stats *meshdev_stats(struct net_device *meshdev)
2995
#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)
2996
return &((struct meshdev_priv*)netdev_priv(meshdev))->stats;
2998
return &((struct meshdev_priv*)meshdev->priv)->stats;
3002
static int meshdev_wx_get_name(struct net_device *meshdev,
3003
struct iw_request_info *info,
3004
union iwreq_data *wrqu, char *extra)
3006
struct meshdev_priv *mpriv = (struct meshdev_priv *)netdev_priv_rsl(meshdev);
3007
struct rtllib_device *ieee = mpriv->rtllib;
3008
struct net_device *dev = ieee->dev;
3010
return r8192_wx_get_name(dev, info, wrqu, extra);
3012
static int meshdev_wx_get_freq(struct net_device *meshdev,
3013
struct iw_request_info *info,
3014
union iwreq_data *wrqu, char *extra)
3016
struct meshdev_priv *mpriv = (struct meshdev_priv *)netdev_priv_rsl(meshdev);
3017
struct rtllib_device *ieee = mpriv->rtllib;
3018
struct net_device *dev = ieee->dev;
3019
struct r8192_priv *priv = rtllib_priv(dev);
3021
return rtllib_wx_get_freq(priv->rtllib,info,wrqu,extra,1);
3023
static int meshdev_wx_get_mode(struct net_device *meshdev,
3024
struct iw_request_info *info,
3025
union iwreq_data *wrqu, char *extra)
3027
struct meshdev_priv *mpriv = (struct meshdev_priv *)netdev_priv_rsl(meshdev);
3028
struct rtllib_device *ieee = mpriv->rtllib;
3029
struct net_device *dev = ieee->dev;
3032
return r8192_wx_get_mode(dev, info, wrqu, extra);
3036
static int meshdev_wx_get_sens(struct net_device *meshdev,
3037
struct iw_request_info *info,
3038
union iwreq_data *wrqu, char *extra)
3040
struct meshdev_priv *mpriv = (struct meshdev_priv *)netdev_priv_rsl(meshdev);
3041
struct rtllib_device *ieee = mpriv->rtllib;
3042
struct net_device *dev = ieee->dev;
3044
return r8192_wx_get_sens(dev, info, wrqu, extra);
3046
static int meshdev_wx_get_range(struct net_device *meshdev,
3047
struct iw_request_info *info,
3048
union iwreq_data *wrqu, char *extra)
3050
struct meshdev_priv *mpriv = (struct meshdev_priv *)netdev_priv_rsl(meshdev);
3051
struct rtllib_device *ieee = mpriv->rtllib;
3052
struct net_device *dev = ieee->dev;
3054
return rtl8192_wx_get_range(dev, info, wrqu, extra);
3056
static int meshdev_wx_get_wap(struct net_device *meshdev,
3057
struct iw_request_info *info,
3058
union iwreq_data *wrqu, char *extra)
3060
struct meshdev_priv *mpriv = (struct meshdev_priv *)netdev_priv_rsl(meshdev);
3061
struct rtllib_device *ieee = mpriv->rtllib;
3062
struct net_device *dev = ieee->dev;
3064
return r8192_wx_get_wap(dev, info, wrqu, extra);
3066
static int meshdev_wx_get_essid(struct net_device *meshdev,
3067
struct iw_request_info *info,
3068
union iwreq_data *wrqu, char *extra)
3070
struct meshdev_priv *mpriv = (struct meshdev_priv *)netdev_priv_rsl(meshdev);
3071
struct rtllib_device *ieee = mpriv->rtllib;
3072
struct net_device *dev = ieee->dev;
3073
struct r8192_priv *priv = rtllib_priv(dev);
3074
struct mshclass *mshobj = priv->mshobj;
3077
if(mshobj->ext_patch_r819x_wx_get_meshid)
3078
ret = mshobj->ext_patch_r819x_wx_get_meshid(dev, info, wrqu, extra);
3082
static int meshdev_wx_get_rate(struct net_device *meshdev,
3083
struct iw_request_info *info,
3084
union iwreq_data *wrqu, char *extra)
3086
struct meshdev_priv *mpriv = (struct meshdev_priv *)netdev_priv_rsl(meshdev);
3087
struct rtllib_device *ieee = mpriv->rtllib;
3088
struct net_device *dev = ieee->dev;
3090
return r8192_wx_get_rate(dev, info, wrqu, extra);
3093
static int meshdev_wx_set_freq(struct net_device *meshdev,
3094
struct iw_request_info *info,
3095
union iwreq_data *wrqu, char *extra)
3097
struct meshdev_priv *mpriv = (struct meshdev_priv *)netdev_priv_rsl(meshdev);
3098
struct rtllib_device *ieee = mpriv->rtllib;
3099
struct net_device *dev = ieee->dev;
3101
return r8192_wx_set_freq(dev, info, wrqu, extra);
3103
static int meshdev_wx_set_rate(struct net_device *meshdev,
3104
struct iw_request_info *info,
3105
union iwreq_data *wrqu, char *extra)
3107
struct meshdev_priv *mpriv = (struct meshdev_priv *)netdev_priv_rsl(meshdev);
3108
struct rtllib_device *ieee = mpriv->rtllib;
3109
struct net_device *dev = ieee->dev;
3111
return r8192_wx_set_rate(dev, info, wrqu, extra);
3113
static int meshdev_wx_set_sens(struct net_device *meshdev,
3114
struct iw_request_info *info,
3115
union iwreq_data *wrqu, char *extra)
3117
struct meshdev_priv *mpriv = (struct meshdev_priv *)netdev_priv_rsl(meshdev);
3118
struct rtllib_device *ieee = mpriv->rtllib;
3119
struct net_device *dev = ieee->dev;
3121
return r8192_wx_set_sens(dev, info, wrqu, extra);
3123
static int meshdev_wx_set_scan(struct net_device *meshdev,
3124
struct iw_request_info *info,
3125
union iwreq_data *wrqu, char *extra)
3127
struct meshdev_priv *mpriv = (struct meshdev_priv *)netdev_priv_rsl(meshdev);
3128
struct rtllib_device *ieee = mpriv->rtllib;
3129
struct net_device *dev = ieee->dev;
3131
return r8192_wx_set_scan(dev, info, wrqu, extra);
3133
static int meshdev_wx_get_scan(struct net_device *meshdev,
3134
struct iw_request_info *info,
3135
union iwreq_data *wrqu, char *extra)
3137
struct meshdev_priv *mpriv = (struct meshdev_priv *)netdev_priv_rsl(meshdev);
3138
struct rtllib_device *ieee = mpriv->rtllib;
3139
struct net_device *dev = ieee->dev;
3141
return r8192_wx_get_scan(dev, info, wrqu, extra);
3144
static int meshdev_wx_set_enc(struct net_device *meshdev,
3145
struct iw_request_info *info,
3146
union iwreq_data *wrqu, char *key)
3148
struct meshdev_priv *mpriv = (struct meshdev_priv *)netdev_priv_rsl(meshdev);
3149
struct rtllib_device *ieee = mpriv->rtllib;
3150
struct net_device *dev = ieee->dev;
3151
struct r8192_priv *priv = (struct r8192_priv *)ieee->priv;
3153
u32 hwkey[4]={0,0,0,0};
3157
u8 zero_addr[4][6] ={ {0x00,0x00,0x00,0x00,0x00,0x00},
3158
{0x00,0x00,0x00,0x00,0x00,0x01},
3159
{0x00,0x00,0x00,0x00,0x00,0x02},
3160
{0x00,0x00,0x00,0x00,0x00,0x03} };
3164
if(!priv->mesh_up) return -ENETDOWN;
3166
SEM_DOWN_PRIV_WX(&priv->wx_sem);
3168
RT_TRACE(COMP_SEC, "Setting SW wep key");
3169
ret = rtllib_wx_set_encode(priv->rtllib,info,wrqu,key,1);
3171
SEM_UP_PRIV_WX(&priv->wx_sem);
3174
if(wrqu->encoding.length!=0){
3176
for(i=0 ; i<4 ; i++){
3177
hwkey[i] |= key[4*i+0]&mask;
3178
if(i==1&&(4*i+1)==wrqu->encoding.length) mask=0x00;
3179
if(i==3&&(4*i+1)==wrqu->encoding.length) mask=0x00;
3180
hwkey[i] |= (key[4*i+1]&mask)<<8;
3181
hwkey[i] |= (key[4*i+2]&mask)<<16;
3182
hwkey[i] |= (key[4*i+3]&mask)<<24;
3185
#define CONF_WEP40 0x4
3186
#define CONF_WEP104 0x14
3188
switch(wrqu->encoding.flags & IW_ENCODE_INDEX){
3189
case 0: key_idx = ieee->mesh_txkeyidx; break;
3190
case 1: key_idx = 0; break;
3191
case 2: key_idx = 1; break;
3192
case 3: key_idx = 2; break;
3193
case 4: key_idx = 3; break;
3197
if(wrqu->encoding.length==0x5){
3198
ieee->mesh_pairwise_key_type = KEY_TYPE_WEP40;
3199
EnableHWSecurityConfig8192(dev);
3202
else if(wrqu->encoding.length==0xd){
3203
ieee->mesh_pairwise_key_type = KEY_TYPE_WEP104;
3204
EnableHWSecurityConfig8192(dev);
3207
printk("wrong type in WEP, not WEP40 and WEP104\n");
3209
meshdev_set_key_for_linked_peers(dev,
3211
ieee->mesh_pairwise_key_type,
3217
if(wrqu->encoding.length==0 && (wrqu->encoding.flags >>8) == 0x8 ){
3219
EnableHWSecurityConfig8192(dev);
3220
key_idx = (wrqu->encoding.flags & 0xf)-1 ;
3221
write_cam(dev, (4*6), 0xffff0000|read_cam(dev, key_idx*6) );
3222
write_cam(dev, (4*6)+1, 0xffffffff);
3223
write_cam(dev, (4*6)+2, read_cam(dev, (key_idx*6)+2) );
3224
write_cam(dev, (4*6)+3, read_cam(dev, (key_idx*6)+3) );
3225
write_cam(dev, (4*6)+4, read_cam(dev, (key_idx*6)+4) );
3226
write_cam(dev, (4*6)+5, read_cam(dev, (key_idx*6)+5) );
3232
static int meshdev_wx_get_enc(struct net_device *meshdev,
3233
struct iw_request_info *info,
3234
union iwreq_data *wrqu, char *extra)
3236
struct meshdev_priv *mpriv = (struct meshdev_priv *)netdev_priv_rsl(meshdev);
3237
struct rtllib_device *ieee = mpriv->rtllib;
3238
struct net_device * dev = ieee->dev;
3239
struct r8192_priv* priv = rtllib_priv(dev);
3244
return rtllib_wx_get_encode(ieee, info, wrqu, extra,1);
3247
static int meshdev_wx_set_frag(struct net_device *meshdev,
3248
struct iw_request_info *info,
3249
union iwreq_data *wrqu, char *extra)
3251
struct meshdev_priv *mpriv = (struct meshdev_priv *)netdev_priv_rsl(meshdev);
3252
struct rtllib_device *ieee = mpriv->rtllib;
3253
struct net_device *dev = ieee->dev;
3255
return r8192_wx_set_frag(dev, info, wrqu, extra);
3257
static int meshdev_wx_get_frag(struct net_device *meshdev,
3258
struct iw_request_info *info,
3259
union iwreq_data *wrqu, char *extra)
3261
struct meshdev_priv *mpriv = (struct meshdev_priv *)netdev_priv_rsl(meshdev);
3262
struct rtllib_device *ieee = mpriv->rtllib;
3263
struct net_device *dev = ieee->dev;
3265
return r8192_wx_get_frag(dev, info, wrqu, extra);
3267
static int meshdev_wx_set_retry(struct net_device *meshdev,
3268
struct iw_request_info *info,
3269
union iwreq_data *wrqu, char *extra)
3271
struct meshdev_priv *mpriv = (struct meshdev_priv *)netdev_priv_rsl(meshdev);
3272
struct rtllib_device *ieee = mpriv->rtllib;
3273
struct net_device *dev = ieee->dev;
3275
return r8192_wx_set_retry(dev, info, wrqu, extra);
3277
static int meshdev_wx_get_retry(struct net_device *meshdev,
3278
struct iw_request_info *info,
3279
union iwreq_data *wrqu, char *extra)
3281
struct meshdev_priv *mpriv = (struct meshdev_priv *)netdev_priv_rsl(meshdev);
3282
struct rtllib_device *ieee = mpriv->rtllib;
3283
struct net_device *dev = ieee->dev;
3285
return r8192_wx_get_retry(dev, info, wrqu, extra);
3288
static int meshdev_wx_set_mode(struct net_device *meshdev,
3289
struct iw_request_info *info,
3290
union iwreq_data *wrqu, char *extra)
3293
struct meshdev_priv *mpriv = (struct meshdev_priv *)netdev_priv_rsl(meshdev);
3294
struct rtllib_device *ieee = mpriv->rtllib;
3295
struct net_device *dev = ieee->dev;
3297
return r8192_wx_set_mode(dev, info, wrqu, extra);
3301
static int meshdev_wx_set_wap(struct net_device *meshdev,
3302
struct iw_request_info *info,
3303
union iwreq_data *wrqu, char *extra)
3306
struct meshdev_priv *mpriv = (struct meshdev_priv *)netdev_priv_rsl(meshdev);
3307
struct rtllib_device *ieee = mpriv->rtllib;
3308
struct net_device *dev = ieee->dev;
3310
return r8192_wx_set_wap(dev, info, wrqu, extra);
3314
static int meshdev_wx_set_mlme(struct net_device *meshdev,
3315
struct iw_request_info *info,
3316
union iwreq_data *wrqu, char *extra)
3319
struct meshdev_priv *mpriv = (struct meshdev_priv *)netdev_priv_rsl(meshdev);
3320
struct rtllib_device *ieee = mpriv->rtllib;
3321
struct net_device *dev = ieee->dev;
3323
return r8192_wx_set_mlme(dev, info, wrqu, extra);
3327
static int meshdev_wx_set_essid(struct net_device *meshdev,
3328
struct iw_request_info *info,
3329
union iwreq_data *wrqu, char *extra)
3332
struct meshdev_priv *mpriv = (struct meshdev_priv *)netdev_priv_rsl(meshdev);
3333
struct rtllib_device *ieee = mpriv->rtllib;
3334
struct net_device *dev = ieee->dev;
3336
return r8192_wx_set_essid(dev, info, wrqu, extra);
3340
static int meshdev_wx_set_gen_ie(struct net_device *meshdev,
3341
struct iw_request_info *info,
3342
union iwreq_data *wrqu, char *extra)
3345
struct meshdev_priv *mpriv = (struct meshdev_priv *)netdev_priv_rsl(meshdev);
3346
struct rtllib_device *ieee = mpriv->rtllib;
3347
struct net_device *dev = ieee->dev;
3349
return r8192_wx_set_gen_ie(dev, info, wrqu, extra);
3353
static int meshdev_wx_set_auth(struct net_device *meshdev,
3354
struct iw_request_info *info,
3355
union iwreq_data *wrqu, char *extra)
3358
struct meshdev_priv *mpriv = (struct meshdev_priv *)netdev_priv_rsl(meshdev);
3359
struct rtllib_device *ieee = mpriv->rtllib;
3360
struct net_device *dev = ieee->dev;
3362
return r8192_wx_set_auth(dev, info, wrqu, extra);
3366
static int meshdev_wx_set_enc_ext(struct net_device *meshdev,
3367
struct iw_request_info *info,
3368
union iwreq_data *wrqu, char *extra)
3371
#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)
3372
struct meshdev_priv *mpriv = (struct meshdev_priv *)netdev_priv_rsl(meshdev);
3373
struct rtllib_device *ieee = mpriv->rtllib;
3374
struct net_device *dev = ieee->dev;
3375
struct r8192_priv *priv = (struct r8192_priv *)ieee->priv;
3377
printk("============================================================>%s\n", __FUNCTION__);
3378
SEM_DOWN_PRIV_WX(&priv->wx_sem);
3379
ret = rtllib_wx_set_encode_ext(ieee, info, wrqu, extra, 1);
3381
ret |= r8192_set_hw_enc(dev,info,wrqu,extra, 1);
3382
SEM_UP_PRIV_WX(&priv->wx_sem);
3388
static int dummy(struct net_device *dev, struct iw_request_info *a,
3389
union iwreq_data *wrqu,char *b)
3394
int rt_ioctl_siwpmksa(struct net_device *dev,
3395
struct iw_request_info *info,
3396
union iwreq_data *wrqu,
3402
static iw_handler meshdev_wx_handlers[] =
3404
NULL, /* SIOCSIWCOMMIT */
3405
meshdev_wx_get_name, /* SIOCGIWNAME */
3406
dummy, /* SIOCSIWNWID */
3407
dummy, /* SIOCGIWNWID */
3409
meshdev_wx_get_freq, /* SIOCGIWFREQ */
3410
meshdev_wx_set_mode, /* SIOCSIWMODE */
3411
meshdev_wx_get_mode, /* SIOCGIWMODE */
3413
meshdev_wx_get_sens, /* SIOCGIWSENS */
3414
NULL, /* SIOCSIWRANGE */
3415
meshdev_wx_get_range, /* SIOCGIWRANGE */
3416
NULL, /* SIOCSIWPRIV */
3417
NULL, /* SIOCGIWPRIV */
3418
NULL, /* SIOCSIWSTATS */
3419
NULL, /* SIOCGIWSTATS */
3420
dummy, /* SIOCSIWSPY */
3421
dummy, /* SIOCGIWSPY */
3422
NULL, /* SIOCGIWTHRSPY */
3423
NULL, /* SIOCWIWTHRSPY */
3424
meshdev_wx_set_wap, /* SIOCSIWAP */
3425
meshdev_wx_get_wap, /* SIOCGIWAP */
3426
meshdev_wx_set_mlme,
3427
dummy, /* SIOCGIWAPLIST -- depricated */
3430
meshdev_wx_set_essid, /* SIOCSIWESSID */
3431
meshdev_wx_get_essid, /* SIOCGIWESSID */
3432
dummy, /* SIOCSIWNICKN */
3433
dummy, /* SIOCGIWNICKN */
3434
NULL, /* -- hole -- */
3435
NULL, /* -- hole -- */
3437
meshdev_wx_get_rate, /* SIOCGIWRATE */
3438
dummy, /* SIOCSIWRTS */
3439
dummy, /* SIOCGIWRTS */
3442
dummy, /* SIOCSIWTXPOW */
3443
dummy, /* SIOCGIWTXPOW */
3446
meshdev_wx_set_enc, /* SIOCSIWENCODE */
3447
meshdev_wx_get_enc, /* SIOCGIWENCODE */
3448
dummy, /* SIOCSIWPOWER */
3449
dummy, /* SIOCGIWPOWER */
3450
NULL, /*---hole---*/
3451
NULL, /*---hole---*/
3452
meshdev_wx_set_gen_ie,
3453
NULL, /* SIOCSIWGENIE */
3454
meshdev_wx_set_auth,
3456
meshdev_wx_set_enc_ext, /* SIOCSIWENCODEEXT */
3458
(iw_handler) rt_ioctl_siwpmksa,
3459
NULL, /*---hole---*/
3462
static struct iw_priv_args meshdev_private_args[] = {
3464
SIOCIWFIRSTPRIV + 0x0,
3468
SIOCIWFIRSTPRIV + 0x1,
3469
0, IW_PRIV_TYPE_CHAR | 64, "getmeshinfo"
3472
SIOCIWFIRSTPRIV + 0x2,
3476
SIOCIWFIRSTPRIV + 0x3,
3477
IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "setch"
3480
SIOCIWFIRSTPRIV + 0x4,
3481
IW_PRIV_TYPE_CHAR | 64 , 0, "setmeshid"
3483
{ SIOCIWFIRSTPRIV + 0x5,
3484
0,IW_PRIV_TYPE_CHAR | 64 , "getmeshlist"
3486
{ SIOCIWFIRSTPRIV + 0x6,
3487
IW_PRIV_TYPE_CHAR | 64,0 , "meshscan"
3490
SIOCIWFIRSTPRIV + 0x7,
3491
IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "setmode"
3495
SIOCIWFIRSTPRIV + 0x8,
3496
IW_PRIV_TYPE_CHAR | 64, 0, "sethostname"
3499
SIOCIWFIRSTPRIV + 0x9,
3500
IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "setBW"
3504
SIOCIWFIRSTPRIV + 0xa,
3505
IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "updateBW"
3507
{ SIOCIWFIRSTPRIV + 0xb,
3508
0,IW_PRIV_TYPE_CHAR | 256 , "macdenyget"
3510
{ SIOCIWFIRSTPRIV + 0xc,
3511
IW_PRIV_TYPE_CHAR | 64,0 , "macdenyadd"
3515
SIOCIWFIRSTPRIV + 0xe,
3516
IW_PRIV_TYPE_INT | IW_PRIV_SIZE_MASK, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_MASK, ""
3518
{ SIOCIWFIRSTPRIV + 0xf,
3519
0, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_MASK , "getneighborlist"
3521
/* Sub-ioctls definitions*/
3525
IW_PRIV_TYPE_INT | 2047, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_MASK, "meshid"
3528
OID_802_11_MESH_LIST,
3529
IW_PRIV_TYPE_INT | 2047, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_MASK, "meshlist"
3531
{ SIOCIWFIRSTPRIV + 0x10,
3532
IW_PRIV_TYPE_CHAR | 64, 0, "set"
3534
{ SIOCIWFIRSTPRIV + 0x12,
3535
IW_PRIV_TYPE_CHAR | 64,0 , "macdenydel"
3538
SIOCIWFIRSTPRIV + 0x14,
3539
IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "setmeshsec"
3542
SIOCIWFIRSTPRIV + 0x15,
3543
IW_PRIV_TYPE_CHAR | 6, 0, "setmkddid"
3546
SIOCIWFIRSTPRIV + 0x16,
3547
IW_PRIV_TYPE_CHAR | 64, 0, "setkey"
3550
SIOCIWFIRSTPRIV + 0x17,
3551
IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "setsectype"
3555
int meshdev_wx_mesh(struct net_device *meshdev,
3556
struct iw_request_info *info,
3557
union iwreq_data *wrqu, char *extra)
3559
struct meshdev_priv *meshpriv = (struct meshdev_priv *)netdev_priv_rsl(meshdev);
3560
struct rtllib_device * ieee = meshpriv->rtllib;
3561
struct net_device *dev = ieee->dev;
3562
struct r8192_priv *priv = rtllib_priv(dev);
3563
struct mshclass *mshobj = priv->mshobj;
3566
printk("@@@@@%s: ", __FUNCTION__);
3569
switch(wrqu->data.flags)
3571
case OID_802_11_MESH_SECURITY_INFO:
3573
printk("OID_802_11_MESH_SECURITY_INFO \n");
3574
if(mshobj->ext_patch_r819x_wx_get_security_info)
3575
ret = mshobj->ext_patch_r819x_wx_get_security_info(dev, info, wrqu, extra);
3578
case OID_802_11_MESH_ID:
3580
printk("OID_802_11_MESH_ID \n");
3581
if(mshobj->ext_patch_r819x_wx_get_meshid)
3582
ret = mshobj->ext_patch_r819x_wx_get_meshid(dev, info, wrqu, extra);
3585
case OID_802_11_MESH_AUTO_LINK:
3587
printk("OID_802_11_MESH_AUTO_LINK \n");
3588
if(mshobj->ext_patch_r819x_wx_get_auto_link)
3589
ret = mshobj->ext_patch_r819x_wx_get_auto_link(dev, info, wrqu, extra);
3592
case OID_802_11_MESH_LINK_STATUS:
3594
printk("OID_802_11_MESH_LINK_STATUS \n");
3595
if(mshobj->ext_patch_r819x_wx_get_link_status)
3596
ret = mshobj->ext_patch_r819x_wx_get_link_status(dev, info, wrqu, extra);
3599
case OID_802_11_MESH_LIST:
3601
printk("OID_802_11_MESH_LIST \n");
3602
if(mshobj->ext_patch_r819x_wx_get_neighbor_list)
3603
ret = mshobj->ext_patch_r819x_wx_get_neighbor_list(dev, info, wrqu, extra);
3606
case OID_802_11_MESH_ROUTE_LIST:
3608
printk("OID_802_11_MESH_ROUTE_LIST \n");
3609
if(mshobj->ext_patch_r819x_wx_get_route_list)
3610
ret = mshobj->ext_patch_r819x_wx_get_route_list(dev, info, wrqu, extra);
3613
case OID_802_11_MESH_MAX_TX_RATE:
3615
printk("OID_802_11_MESH_MAX_TX_RATE \n");
3616
if(mshobj->ext_patch_r819x_wx_get_maxrate)
3617
ret = mshobj->ext_patch_r819x_wx_get_maxrate(dev, info, wrqu, extra);
3620
case OID_802_11_MESH_CHANNEL:
3622
printk("OID_802_11_MESH_CHANNEL \n");
3623
if(mshobj->ext_patch_r819x_wx_get_channel)
3624
ret = mshobj->ext_patch_r819x_wx_get_channel(dev, info, wrqu, extra);
3627
case OID_802_11_MESH_HOSTNAME:
3629
printk("OID_802_11_MESH_HOSTNAME \n");
3630
if(mshobj->ext_patch_r819x_wx_get_host_name)
3631
ret = mshobj->ext_patch_r819x_wx_get_host_name(dev, info, wrqu, extra);
3634
case OID_802_11_MESH_ONLY_MODE:
3636
printk("OID_802_11_MESH_ONLY_MODE \n");
3637
if(mshobj->ext_patch_r819x_wx_get_mesh_only_mode)
3638
ret = mshobj->ext_patch_r819x_wx_get_mesh_only_mode(dev, info, wrqu, extra);
3641
case RTL_OID_802_11_MESH_SECURITY_INFO:
3643
printk("RTL_OID_802_11_MESH_SECURITY_INFO \n");
3644
if(mshobj->ext_patch_r819x_wx_set_security_info)
3645
ret = mshobj->ext_patch_r819x_wx_set_security_info(dev, info, wrqu, extra);
3648
case RTL_OID_802_11_MESH_ID:
3650
printk("RTL_OID_802_11_MESH_ID \n");
3651
if(mshobj->ext_patch_r819x_wx_set_meshID)
3652
ret = mshobj->ext_patch_r819x_wx_set_meshID(dev, (u8*)wrqu->data.pointer);
3655
case RTL_OID_802_11_MESH_AUTO_LINK:
3657
printk("RTL_OID_802_11_MESH_AUTO_LINK \n");
3658
if(mshobj->ext_patch_r819x_wx_set_auto_link)
3659
ret = mshobj->ext_patch_r819x_wx_set_auto_link(dev, info, wrqu, extra);
3662
case RTL_OID_802_11_MESH_ADD_LINK:
3664
printk("RTL_OID_802_11_MESH_ADD_LINK \n");
3665
if(mshobj->ext_patch_r819x_wx_set_add_link)
3666
ret = mshobj->ext_patch_r819x_wx_set_add_link(dev, info, wrqu, extra);
3669
case RTL_OID_802_11_MESH_DEL_LINK:
3671
printk("RTL_OID_802_11_MESH_DEL_LINK \n");
3672
if(mshobj->ext_patch_r819x_wx_set_del_link)
3673
ret = mshobj->ext_patch_r819x_wx_set_del_link(dev, info, wrqu, extra);
3676
case RTL_OID_802_11_MESH_MAX_TX_RATE:
3678
printk("RTL_OID_802_11_MESH_MAX_TX_RATE \n");
3679
if(mshobj->ext_patch_r819x_wx_set_maxrate)
3680
ret = mshobj->ext_patch_r819x_wx_set_maxrate(dev, info, wrqu, extra);
3683
case RTL_OID_802_11_MESH_CHANNEL:
3685
printk("RTL_OID_802_11_MESH_CHANNEL \n");
3686
printk("channel = %d\n",*(u8*)wrqu->data.pointer);
3687
r8192_wx_set_channel(dev, info, wrqu, wrqu->data.pointer);
3690
case RTL_OID_802_11_MESH_HOSTNAME:
3692
printk("RTL_OID_802_11_MESH_HOSTNAME \n");
3693
if(mshobj->ext_patch_r819x_wx_set_host_name)
3694
ret = mshobj->ext_patch_r819x_wx_set_host_name(dev, info, wrqu, extra);
3697
case RTL_OID_802_11_MESH_ONLY_MODE:
3699
printk("RTL_OID_802_11_MESH_ONLY_MODE \n");
3700
if(mshobj->ext_patch_r819x_wx_set_mesh_only_mode)
3701
ret = mshobj->ext_patch_r819x_wx_set_mesh_only_mode(dev, info, wrqu, extra);
3705
printk("Default \n");
3712
static int meshdev_wx_get_meshinfo(struct net_device *meshdev,
3713
struct iw_request_info *info,
3714
union iwreq_data *wrqu, char *extra)
3716
struct meshdev_priv *mpriv = (struct meshdev_priv *)netdev_priv_rsl(meshdev);
3717
struct net_device *dev = mpriv->rtllib->dev;
3719
printk("++++++======%s: dev=%p length=%d extra=%p\n", __FUNCTION__, dev, wrqu->data.length,extra);
3720
return r8192_wx_get_meshinfo(dev, info, wrqu, extra);
3723
static int meshdev_wx_enable_mesh(struct net_device *meshdev,
3724
struct iw_request_info *info,
3725
union iwreq_data *wrqu, char *extra)
3727
struct meshdev_priv *mpriv = (struct meshdev_priv *)netdev_priv_rsl(meshdev);
3728
struct rtllib_device *ieee = mpriv->rtllib;
3729
struct net_device *dev = ieee->dev;
3731
printk("++++++======%s\n", __FUNCTION__);
3732
return r8192_wx_enable_mesh(dev, info, wrqu, extra);
3736
static int meshdev_wx_disable_mesh(struct net_device *meshdev,
3737
struct iw_request_info *info,
3738
union iwreq_data *wrqu, char *extra)
3740
struct meshdev_priv *mpriv = (struct meshdev_priv *)netdev_priv_rsl(meshdev);
3741
struct rtllib_device *ieee = mpriv->rtllib;
3742
struct net_device *dev = ieee->dev;
3744
printk("++++++======%s\n", __FUNCTION__);
3745
return r8192_wx_disable_mesh(dev, info, wrqu, extra);
3749
int meshdev_wx_set_channel(struct net_device *meshdev,
3750
struct iw_request_info *info,
3751
union iwreq_data *wrqu, char *extra)
3753
struct meshdev_priv *mpriv = (struct meshdev_priv *)netdev_priv_rsl(meshdev);
3754
struct rtllib_device *ieee = mpriv->rtllib;
3755
struct net_device *dev = ieee->dev;
3756
printk("++++++======%s\n", __FUNCTION__);
3758
return r8192_wx_set_channel(dev, info, wrqu, extra);
3761
static int meshdev_wx_set_meshid(struct net_device *meshdev,
3762
struct iw_request_info *info,
3763
union iwreq_data *wrqu, char *extra)
3765
struct meshdev_priv *mpriv = (struct meshdev_priv *)netdev_priv_rsl(meshdev);
3766
struct rtllib_device *ieee = mpriv->rtllib;
3767
struct net_device *dev = ieee->dev;
3768
printk("++++++======%s\n", __FUNCTION__);
3770
return r8192_wx_set_meshID(dev, info, wrqu, extra);
3773
static int meshdev_wx_mesh_scan(struct net_device *meshdev,
3774
struct iw_request_info *info,
3775
union iwreq_data *wrqu, char *extra)
3777
struct meshdev_priv *mpriv = (struct meshdev_priv *)netdev_priv_rsl(meshdev);
3778
struct rtllib_device *ieee = mpriv->rtllib;
3779
struct net_device *dev = ieee->dev;
3781
printk("++++++======%s\n", __FUNCTION__);
3782
return r8192_wx_mesh_scan(dev, info, wrqu, extra);
3784
static int meshdev_wx_get_mesh_list(struct net_device *meshdev,
3785
struct iw_request_info *info,
3786
union iwreq_data *wrqu, char *extra)
3788
struct meshdev_priv *mpriv = (struct meshdev_priv *)netdev_priv_rsl(meshdev);
3789
struct rtllib_device *ieee = mpriv->rtllib;
3790
struct net_device *dev = ieee->dev;
3791
printk("++++++======%s\n", __FUNCTION__);
3793
return r8192_wx_get_mesh_list(dev, info, wrqu, extra);
3795
static int meshdev_wx_set_meshmode(struct net_device *meshdev,
3796
struct iw_request_info *info,
3797
union iwreq_data *wrqu, char *extra)
3799
struct meshdev_priv *mpriv = (struct meshdev_priv *)netdev_priv_rsl(meshdev);
3800
struct rtllib_device *ieee = mpriv->rtllib;
3801
struct net_device *dev = ieee->dev;
3803
printk("++++++======%s\n", __FUNCTION__);
3804
return r8192_wx_set_meshmode(dev, info, wrqu, extra);
3806
static int meshdev_wx_set_meshbw(struct net_device *meshdev,
3807
struct iw_request_info *info,
3808
union iwreq_data *wrqu, char *extra)
3810
struct meshdev_priv *mpriv = (struct meshdev_priv *)netdev_priv_rsl(meshdev);
3811
struct rtllib_device *ieee = mpriv->rtllib;
3812
struct net_device *dev = ieee->dev;
3814
printk("++++++======%s\n", __FUNCTION__);
3815
return r8192_wx_set_meshBW(dev, info, wrqu, extra);
3817
static int meshdev_wx_update_beacon(struct net_device *meshdev,
3818
struct iw_request_info *info,
3819
union iwreq_data *wrqu, char *extra)
3821
struct meshdev_priv *mpriv = (struct meshdev_priv *)netdev_priv_rsl(meshdev);
3822
struct rtllib_device *ieee = mpriv->rtllib;
3823
struct net_device *dev = ieee->dev;
3824
struct r8192_priv *priv = rtllib_priv(dev);
3825
struct mshclass *mshobj= (priv)->mshobj;
3829
printk("++++++======%s\n", __FUNCTION__);
3833
ieee->current_network.channel = ieee->current_mesh_network.channel;
3834
if(ieee->state!=RTLLIB_LINKED){
3835
if(ieee->pHTInfo->bCurBW40MHz)
3836
HTSetConnectBwMode(ieee, HT_CHANNEL_WIDTH_20_40, (ieee->current_mesh_network.channel<=6)?HT_EXTCHNL_OFFSET_UPPER:HT_EXTCHNL_OFFSET_LOWER);
3838
HTSetConnectBwMode(ieee, HT_CHANNEL_WIDTH_20, (ieee->current_mesh_network.channel<=6)?HT_EXTCHNL_OFFSET_UPPER:HT_EXTCHNL_OFFSET_LOWER);
3844
updateBW=mshobj->ext_patch_r819x_wx_update_beacon(dev,&bserverHT);
3845
printk("$$$$$$ Cur_networ.chan=%d, cur_mesh_net.chan=%d,bserverHT=%d\n", ieee->current_network.channel,ieee->current_mesh_network.channel,bserverHT);
3850
printk("===>server is not HT supported,set 20M\n");
3851
HTSetConnectBwMode(ieee, HT_CHANNEL_WIDTH_20, HT_EXTCHNL_OFFSET_NO_EXT);
3855
printk("===>updateBW is 1,bCurBW40MHz is %d,ieee->serverExtChlOffset is %d\n",ieee->pHTInfo->bCurBW40MHz,ieee->serverExtChlOffset);
3856
if(ieee->pHTInfo->bCurBW40MHz)
3857
HTSetConnectBwMode(ieee, HT_CHANNEL_WIDTH_20_40, ieee->serverExtChlOffset);
3859
HTSetConnectBwMode(ieee, HT_CHANNEL_WIDTH_20, ieee->serverExtChlOffset);
3864
printk("===>there is no same hostname server, ERR!!!\n");
3869
write_nic_dword(dev,BSSIDR,((u32*)priv->rtllib->current_mesh_network.bssid)[0]);
3870
write_nic_word(dev,BSSIDR+4,((u16*)priv->rtllib->current_mesh_network.bssid)[2]);
3871
#elif defined RTL8192CE
3872
write_nic_dword(dev,REG_BSSID,((u32*)priv->rtllib->current_mesh_network.bssid)[0]);
3873
write_nic_word(dev,REG_BSSID+4,((u16*)priv->rtllib->current_mesh_network.bssid)[2]);
3878
static int meshdev_wx_add_mac_deny(struct net_device *meshdev,
3879
struct iw_request_info *info,
3880
union iwreq_data *wrqu, char *extra)
3882
struct meshdev_priv *mpriv = (struct meshdev_priv *)netdev_priv_rsl(meshdev);
3883
struct rtllib_device *ieee = mpriv->rtllib;
3884
struct net_device *dev = ieee->dev;
3885
struct r8192_priv *priv = rtllib_priv(dev);
3888
if( ! priv->mshobj || !priv->mshobj->ext_patch_r819x_wx_set_add_mac_deny )
3891
return priv->mshobj->ext_patch_r819x_wx_set_add_mac_deny(dev, info, wrqu, extra);
3894
static int meshdev_wx_del_mac_deny(struct net_device *meshdev,
3895
struct iw_request_info *info,
3896
union iwreq_data *wrqu, char *extra)
3898
struct meshdev_priv *mpriv = (struct meshdev_priv *)netdev_priv_rsl(meshdev);
3899
struct rtllib_device *ieee = mpriv->rtllib;
3900
struct net_device *dev = ieee->dev;
3901
struct r8192_priv *priv = rtllib_priv(dev);
3903
if( ! priv->mshobj || !priv->mshobj->ext_patch_r819x_wx_set_del_mac_deny )
3906
return priv->mshobj->ext_patch_r819x_wx_set_del_mac_deny(dev, info, wrqu, extra);
3909
static int meshdev_wx_get_neighbor_list(struct net_device *meshdev,
3910
struct iw_request_info *info,
3911
union iwreq_data *wrqu, char *extra)
3913
struct meshdev_priv *mpriv = (struct meshdev_priv *)netdev_priv_rsl(meshdev);
3914
struct rtllib_device *ieee = mpriv->rtllib;
3915
struct net_device *dev = ieee->dev;
3916
struct r8192_priv *priv = rtllib_priv(dev);
3919
if( ! priv->mshobj || !priv->mshobj->ext_patch_r819x_wx_get_neighbor_list )
3921
ret = priv->mshobj->ext_patch_r819x_wx_get_neighbor_list(dev, info, wrqu, extra);
3922
#ifdef MESH_AUTO_TEST
3923
ret |= r8192_wx_set_channel(dev, info, wrqu, &ieee->current_network.channel);
3928
/* reserved for future
3929
static int r819x_wx_get_mac_allow(struct net_device *dev,
3930
struct iw_request_info *info,
3931
union iwreq_data *wrqu, char *extra)
3935
return priv->mshobj->ext_patch_r819x_wx_get_mac_allow(dev, info, wrqu, extra);
3939
static int meshdev_wx_get_mac_deny(struct net_device *meshdev,
3940
struct iw_request_info *info,
3941
union iwreq_data *wrqu, char *extra)
3943
struct meshdev_priv *mpriv = (struct meshdev_priv *)netdev_priv_rsl(meshdev);
3944
struct rtllib_device *ieee = mpriv->rtllib;
3945
struct net_device *dev = ieee->dev;
3946
struct r8192_priv *priv = rtllib_priv(dev);
3948
if( ! priv->mshobj || !priv->mshobj->ext_patch_r819x_wx_get_mac_deny )
3951
return priv->mshobj->ext_patch_r819x_wx_get_mac_deny(dev, info, wrqu, extra);
3955
static int meshdev_wx_set_hostname(struct net_device *meshdev,
3956
struct iw_request_info *info,
3957
union iwreq_data *wrqu, char *extra)
3959
struct meshdev_priv *mpriv = (struct meshdev_priv *)netdev_priv_rsl(meshdev);
3960
struct rtllib_device *ieee = mpriv->rtllib;
3962
if(wrqu->data.length > MAX_HOST_NAME_LENGTH)
3964
printk("%s: Host name is too long. len=%d\n", __FUNCTION__, wrqu->data.length);
3968
ieee->hostname_len = wrqu->data.length;
3969
memcpy(ieee->hostname, extra, wrqu->data.length);
3971
printk("++++++======%s: %s\n", __FUNCTION__, ieee->hostname);
3975
static int meshdev_wx_set_mesh_security(struct net_device *meshdev,
3976
struct iw_request_info *info,
3977
union iwreq_data *wrqu, char *extra)
3979
struct meshdev_priv *mpriv = netdev_priv(meshdev);
3980
struct rtllib_device *ieee = mpriv->rtllib;
3981
struct net_device *dev = ieee->dev;
3983
printk("++++++======%s\n", __FUNCTION__);
3984
return r8192_wx_set_mesh_security(dev, info, wrqu, extra);
3986
static int meshdev_wx_set_mkdd_id(struct net_device *meshdev,
3987
struct iw_request_info *info,
3988
union iwreq_data *wrqu, char *extra)
3990
struct meshdev_priv *mpriv = netdev_priv(meshdev);
3991
struct rtllib_device *ieee = mpriv->rtllib;
3992
struct net_device *dev = ieee->dev;
3995
printk("++++++======%s\n", __FUNCTION__);
3996
return r8192_wx_set_mkdd_id(dev, info, wrqu, extra);
3998
static int meshdev_wx_set_mesh_key(struct net_device *meshdev,
3999
struct iw_request_info *info,
4000
union iwreq_data *wrqu, char *extra)
4002
struct meshdev_priv *mpriv = netdev_priv(meshdev);
4003
struct rtllib_device *ieee = mpriv->rtllib;
4004
struct net_device *dev = ieee->dev;
4006
printk("++++++======%s\n", __FUNCTION__);
4007
return r8192_wx_set_mesh_key(dev, info, wrqu, extra);
4009
static int meshdev_wx_set_sec_type(struct net_device *meshdev,
4010
struct iw_request_info *info,
4011
union iwreq_data *wrqu, char *extra)
4013
struct meshdev_priv *mpriv = netdev_priv(meshdev);
4014
struct rtllib_device *ieee = mpriv->rtllib;
4015
struct net_device *dev = ieee->dev;
4017
printk("++++++======%s\n", __FUNCTION__);
4018
return r8192_wx_set_mesh_sec_type(dev, info, wrqu, extra);
4020
static u8 my_atoi(const char *arg)
4026
val = 10*val + (*arg-'0');
4035
static int Set_Channel_Proc(struct net_device *meshdev, char *arg)
4037
int ch = my_atoi(arg);
4038
struct meshdev_priv *mpriv = (struct meshdev_priv *)netdev_priv_rsl(meshdev);
4039
struct rtllib_device *ieee = mpriv->rtllib;
4040
struct r8192_priv *priv = (void *)ieee->priv;
4041
struct net_device *dev = ieee->dev;
4043
if (!priv->mshobj || !priv->mshobj->ext_patch_r819x_wx_set_channel || !ieee->only_mesh)
4046
printk("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!set current mesh network channel %d\n", ch);
4049
rtllib_start_scan(ieee);
4050
ieee->meshScanMode =2;
4054
ieee->meshScanMode =0;
4055
if(priv->mshobj->ext_patch_r819x_wx_set_channel)
4057
priv->mshobj->ext_patch_r819x_wx_set_channel(ieee, ch);
4058
priv->mshobj->ext_patch_r819x_wx_set_mesh_chan(dev,ch);
4060
queue_work_rsl(ieee->wq, &ieee->ext_stop_scan_wq);
4061
ieee->set_chan(ieee->dev, ch);
4062
ieee->current_mesh_network.channel = ch;
4064
ieee->current_network.channel = ch;
4065
ieee->current_network.channel = ieee->current_mesh_network.channel;
4066
if(ieee->pHTInfo->bCurBW40MHz)
4067
HTSetConnectBwMode(ieee, HT_CHANNEL_WIDTH_20_40, (ieee->current_mesh_network.channel<=6)?HT_EXTCHNL_OFFSET_UPPER:HT_EXTCHNL_OFFSET_LOWER);
4069
HTSetConnectBwMode(ieee, HT_CHANNEL_WIDTH_20, (ieee->current_mesh_network.channel<=6)?HT_EXTCHNL_OFFSET_UPPER:HT_EXTCHNL_OFFSET_LOWER);
4070
if(rtllib_act_scanning(ieee,true) == true)
4071
rtllib_stop_scan_syncro(ieee);
4075
static int Set_MeshID_Proc(struct net_device *meshdev, char *arg)
4077
struct meshdev_priv *mpriv = (struct meshdev_priv *)netdev_priv_rsl(meshdev);
4078
struct rtllib_device *ieee = mpriv->rtllib;
4079
struct net_device *dev = ieee->dev;
4080
struct r8192_priv *priv = rtllib_priv(dev);
4081
RT_RF_POWER_STATE rtState;
4083
rtState = priv->rtllib->eRFPowerState;
4085
if(!priv->mshobj || !priv->mshobj->ext_patch_r819x_wx_enable_mesh || !priv->mshobj->ext_patch_r819x_wx_set_meshID)
4088
if(rtllib_act_scanning(ieee,true) == true)
4089
rtllib_stop_scan_syncro(ieee);
4092
ret = priv->mshobj->ext_patch_r819x_wx_set_meshID(dev, arg);
4097
SEM_DOWN_PRIV_WX(&priv->wx_sem);
4098
ret = priv->mshobj->ext_patch_r819x_wx_enable_mesh(dev);
4102
if(priv->rtllib->PowerSaveControl.bInactivePs){
4103
if(rtState == eRfOff){
4104
if(priv->rtllib->RfOffReason > RF_CHANGE_BY_IPS)
4106
RT_TRACE(COMP_ERR, "%s(): RF is OFF.\n",__FUNCTION__);
4107
SEM_UP_PRIV_WX(&priv->wx_sem);
4111
printk("=========>%s(): IPSLeave\n",__FUNCTION__);
4118
SEM_UP_PRIV_WX(&priv->wx_sem);
4120
if (ieee->mesh_sec_type == 1) {
4121
rtl8192_abbr_handshk_set_GTK(ieee,1);
4124
if (ieee->mesh_sec_type == 1)
4125
rtl8192_abbr_handshk_set_key(ieee);
4130
static int Set_Bw40MHz_Proc(struct net_device *meshdev, char *arg)
4132
struct meshdev_priv *mpriv = (struct meshdev_priv *)netdev_priv_rsl(meshdev);
4133
struct rtllib_device *ieee = mpriv->rtllib;
4134
struct r8192_priv *priv = (void *)ieee->priv;
4135
u8 bBw40MHz = my_atoi(arg);
4137
SEM_DOWN_PRIV_WX(&priv->wx_sem);
4138
printk("%s(): set mesh BW ! extra is %d\n",__FUNCTION__, bBw40MHz);
4139
priv->rtllib->pHTInfo->bRegBW40MHz = bBw40MHz;
4140
SEM_UP_PRIV_WX(&priv->wx_sem);
4144
static int Set_WirelessMode_Proc(struct net_device *meshdev, char *arg)
4146
struct meshdev_priv *mpriv = (struct meshdev_priv *)netdev_priv_rsl(meshdev);
4147
struct rtllib_device *ieee = mpriv->rtllib;
4148
struct r8192_priv *priv = (void *)ieee->priv;
4149
struct net_device *dev = ieee->dev;
4150
u8 wirelessmode = my_atoi(arg);
4152
SEM_DOWN_PRIV_WX(&priv->wx_sem);
4154
printk("%s(): set mesh mode ! extra is %d\n",__FUNCTION__, wirelessmode);
4155
if((wirelessmode != WIRELESS_MODE_A) && (wirelessmode != WIRELESS_MODE_B) &&
4156
(wirelessmode != WIRELESS_MODE_G) && (wirelessmode != WIRELESS_MODE_AUTO) &&
4157
(wirelessmode != WIRELESS_MODE_N_24G) && (wirelessmode != WIRELESS_MODE_N_5G))
4159
printk("ERR!! you should input 1 | 2 | 4 | 8 | 16 | 32\n");
4160
SEM_UP_PRIV_WX(&priv->wx_sem);
4163
if(priv->rtllib->state == RTLLIB_LINKED)
4165
if((priv->rtllib->mode != WIRELESS_MODE_N_5G) && (priv->rtllib->mode != WIRELESS_MODE_N_24G)){
4166
printk("===>wlan0 is linked,and ieee->mode is not N mode ,do not need to set mode,return\n");
4167
SEM_UP_PRIV_WX(&priv->wx_sem);
4171
priv->rtllib->mode = wirelessmode;
4172
if(priv->ResetProgress == RESET_TYPE_NORESET)
4173
rtl8192_SetWirelessMode(dev, priv->rtllib->mode);
4174
HTUseDefaultSetting(priv->rtllib);
4175
SEM_UP_PRIV_WX(&priv->wx_sem);
4178
static int Set_ExtChnOffset_Proc(struct net_device *meshdev, char *arg)
4180
struct meshdev_priv *mpriv = (struct meshdev_priv *)netdev_priv_rsl(meshdev);
4181
struct rtllib_device *ieee = mpriv->rtllib;
4183
struct r8192_priv *priv = (void *)ieee->priv;
4184
struct net_device *dev = ieee->dev;
4185
struct mshclass *mshobj= priv->mshobj;
4191
updateBW=mshobj->ext_patch_r819x_wx_update_beacon(dev,&bserverHT);
4192
printk("$$$$$$ Cur_networ.chan=%d, cur_mesh_net.chan=%d,bserverHT=%d\n", ieee->current_network.channel,ieee->current_mesh_network.channel,bserverHT);
4197
printk("===>server is not HT supported,set 20M\n");
4198
HTSetConnectBwMode(ieee, HT_CHANNEL_WIDTH_20, HT_EXTCHNL_OFFSET_NO_EXT);
4202
printk("===>updateBW is 1,bCurBW40MHz is %d,ieee->serverExtChlOffset is %d\n",ieee->pHTInfo->bCurBW40MHz,ieee->serverExtChlOffset);
4203
if(ieee->pHTInfo->bCurBW40MHz)
4204
HTSetConnectBwMode(ieee, HT_CHANNEL_WIDTH_20_40, ieee->serverExtChlOffset);
4206
HTSetConnectBwMode(ieee, HT_CHANNEL_WIDTH_20, ieee->serverExtChlOffset);
4211
printk("===>there is no same hostname server, ERR!!!\n");
4217
static int Set_OnlyMesh_Proc(struct net_device *meshdev, char *arg)
4219
struct meshdev_priv *mpriv = (struct meshdev_priv *)netdev_priv_rsl(meshdev);
4220
struct rtllib_device *ieee = mpriv->rtllib;
4221
union iwreq_data tmprqu;
4225
ieee->only_mesh = my_atoi(arg);
4226
printk("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!mesh only = %d, p2pmode = %d\n", ieee->only_mesh, ieee->p2pmode);
4228
ieee->current_network.channel = ieee->current_mesh_network.channel;
4229
if(ieee->only_mesh == 0)
4231
tmprqu.mode = ieee->iw_mode;
4232
ieee->iw_mode = IW_MODE_INFRA;
4233
ret = rtllib_wx_set_mode(ieee, NULL, &tmprqu, NULL);
4237
static int Set_AsPortal_Proc(struct net_device *meshdev, char *arg)
4239
struct meshdev_priv *mpriv = (struct meshdev_priv *)netdev_priv_rsl(meshdev);
4240
struct rtllib_device *ieee = mpriv->rtllib;
4241
struct net_device *dev = ieee->dev;
4242
struct r8192_priv *priv = (void *)ieee->priv;
4243
u8 val = my_atoi(arg);
4246
SEM_DOWN_PRIV_WX(&priv->wx_sem);
4247
ret = priv->mshobj->ext_patch_r819x_wx_set_AsPortal(dev, val);
4248
SEM_UP_PRIV_WX(&priv->wx_sem);
4252
static int Set_AsRoot_Proc(struct net_device *meshdev, char *arg)
4254
struct meshdev_priv *mpriv = (struct meshdev_priv *)netdev_priv_rsl(meshdev);
4255
struct rtllib_device *ieee = mpriv->rtllib;
4256
struct net_device *dev = ieee->dev;
4257
struct r8192_priv *priv = (void *)ieee->priv;
4258
u8 val = my_atoi(arg);
4261
SEM_DOWN_PRIV_WX(&priv->wx_sem);
4262
ret = priv->mshobj->ext_patch_r819x_wx_set_AsRoot(dev, val);
4263
SEM_UP_PRIV_WX(&priv->wx_sem);
4270
int (*set_proc)(struct net_device *dev, char *arg);
4271
} *private_set_proc, private_support_proc[] = {
4273
{"Channel", Set_Channel_Proc},
4274
{"MeshId", Set_MeshID_Proc},
4275
{"Bw40MHz", Set_Bw40MHz_Proc},
4276
{"WirelessMode", Set_WirelessMode_Proc},
4277
{"ExtChnOffset", Set_ExtChnOffset_Proc},
4278
{"OnlyMesh", Set_OnlyMesh_Proc},
4279
{"AsPortal", Set_AsPortal_Proc},
4280
{"AsRoot", Set_AsRoot_Proc},
4281
{"MeshAuthMode", NULL},
4282
{"MeshEncrypType", NULL},
4286
static char *rtlstrchr(const char *s, int c)
4288
for(; *s!=(char)c; ++s)
4294
static int meshdev_wx_set_param(struct net_device *dev, struct iw_request_info *info,
4295
union iwreq_data *w, char *extra)
4297
char * this_char = extra;
4301
printk("=======>%s: extra=%s\n", __FUNCTION__,extra);
4305
if ((value = rtlstrchr(this_char, '=')) != NULL)
4308
for (private_set_proc = private_support_proc; strcmp(private_set_proc->name, "<NULL>"); private_set_proc++)
4310
if (strcmp(this_char, private_set_proc->name) == 0)
4312
if(private_set_proc->set_proc)
4314
if(private_set_proc->set_proc(dev, value))
4323
if(strcmp(private_set_proc->name, "<NULL>") == 0)
4326
printk("===>%s: (iwpriv) Not Support Set Command [%s]", __FUNCTION__, this_char);
4328
printk(" value=%s\n", value);
4337
static iw_handler meshdev_private_handler[] = {
4338
meshdev_wx_enable_mesh,
4339
meshdev_wx_get_meshinfo,
4340
meshdev_wx_disable_mesh,
4341
meshdev_wx_set_channel,
4342
meshdev_wx_set_meshid,
4343
meshdev_wx_get_mesh_list,
4344
meshdev_wx_mesh_scan,
4345
meshdev_wx_set_meshmode,
4346
meshdev_wx_set_hostname,
4347
meshdev_wx_set_meshbw,
4348
meshdev_wx_update_beacon,
4349
meshdev_wx_get_mac_deny,
4350
meshdev_wx_add_mac_deny,
4353
meshdev_wx_get_neighbor_list,
4354
meshdev_wx_set_param,
4356
meshdev_wx_del_mac_deny,
4358
meshdev_wx_set_mesh_security,
4359
meshdev_wx_set_mkdd_id,
4360
meshdev_wx_set_mesh_key,
4361
meshdev_wx_set_sec_type,
4364
struct iw_handler_def meshdev_wx_handlers_def={
4365
.standard = meshdev_wx_handlers,
4366
.num_standard = sizeof(meshdev_wx_handlers) / sizeof(iw_handler),
4367
.private = meshdev_private_handler,
4368
.num_private = sizeof(meshdev_private_handler) / sizeof(iw_handler),
4369
.num_private_args = sizeof(meshdev_private_args) / sizeof(struct iw_priv_args),
4370
#if WIRELESS_EXT >= 17
4371
.get_wireless_stats = (void*)meshdev_stats,
4373
.private_args = (struct iw_priv_args *)meshdev_private_args,