Merge branch 'topic/hda' into for-linus
[linux-2.6] / drivers / staging / rt2860 / common / cmm_info.c
1 /*
2  *************************************************************************
3  * Ralink Tech Inc.
4  * 5F., No.36, Taiyuan St., Jhubei City,
5  * Hsinchu County 302,
6  * Taiwan, R.O.C.
7  *
8  * (c) Copyright 2002-2007, Ralink Technology, Inc.
9  *
10  * This program is free software; you can redistribute it and/or modify  *
11  * it under the terms of the GNU General Public License as published by  *
12  * the Free Software Foundation; either version 2 of the License, or     *
13  * (at your option) any later version.                                   *
14  *                                                                       *
15  * This program is distributed in the hope that it will be useful,       *
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of        *
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
18  * GNU General Public License for more details.                          *
19  *                                                                       *
20  * You should have received a copy of the GNU General Public License     *
21  * along with this program; if not, write to the                         *
22  * Free Software Foundation, Inc.,                                       *
23  * 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
24  *                                                                       *
25  *************************************************************************
26 */
27
28 #include "../rt_config.h"
29
30 INT     Show_SSID_Proc(
31         IN      PRTMP_ADAPTER   pAd,
32         OUT     PUCHAR                  pBuf);
33
34 INT     Show_WirelessMode_Proc(
35         IN      PRTMP_ADAPTER   pAd,
36         OUT     PUCHAR                  pBuf);
37
38 INT     Show_TxBurst_Proc(
39         IN      PRTMP_ADAPTER   pAd,
40         OUT     PUCHAR                  pBuf);
41
42 INT     Show_TxPreamble_Proc(
43         IN      PRTMP_ADAPTER   pAd,
44         OUT     PUCHAR                  pBuf);
45
46 INT     Show_TxPower_Proc(
47         IN      PRTMP_ADAPTER   pAd,
48         OUT     PUCHAR                  pBuf);
49
50 INT     Show_Channel_Proc(
51         IN      PRTMP_ADAPTER   pAd,
52         OUT     PUCHAR                  pBuf);
53
54 INT     Show_BGProtection_Proc(
55         IN      PRTMP_ADAPTER   pAd,
56         OUT     PUCHAR                  pBuf);
57
58 INT     Show_RTSThreshold_Proc(
59         IN      PRTMP_ADAPTER   pAd,
60         OUT     PUCHAR                  pBuf);
61
62 INT     Show_FragThreshold_Proc(
63         IN      PRTMP_ADAPTER   pAd,
64         OUT     PUCHAR                  pBuf);
65
66 #ifdef DOT11_N_SUPPORT
67 INT     Show_HtBw_Proc(
68         IN      PRTMP_ADAPTER   pAd,
69         OUT     PUCHAR                  pBuf);
70
71 INT     Show_HtMcs_Proc(
72         IN      PRTMP_ADAPTER   pAd,
73         OUT     PUCHAR                  pBuf);
74
75 INT     Show_HtGi_Proc(
76         IN      PRTMP_ADAPTER   pAd,
77         OUT     PUCHAR                  pBuf);
78
79 INT     Show_HtOpMode_Proc(
80         IN      PRTMP_ADAPTER   pAd,
81         OUT     PUCHAR                  pBuf);
82
83 INT     Show_HtExtcha_Proc(
84         IN      PRTMP_ADAPTER   pAd,
85         OUT     PUCHAR                  pBuf);
86
87 INT     Show_HtMpduDensity_Proc(
88         IN      PRTMP_ADAPTER   pAd,
89         OUT     PUCHAR                  pBuf);
90
91 INT     Show_HtBaWinSize_Proc(
92         IN      PRTMP_ADAPTER   pAd,
93         OUT     PUCHAR                  pBuf);
94
95 INT     Show_HtRdg_Proc(
96         IN      PRTMP_ADAPTER   pAd,
97         OUT     PUCHAR                  pBuf);
98
99 INT     Show_HtAmsdu_Proc(
100         IN      PRTMP_ADAPTER   pAd,
101         OUT     PUCHAR                  pBuf);
102
103 INT     Show_HtAutoBa_Proc(
104         IN      PRTMP_ADAPTER   pAd,
105         OUT     PUCHAR                  pBuf);
106 #endif // DOT11_N_SUPPORT //
107
108 INT     Show_CountryRegion_Proc(
109         IN      PRTMP_ADAPTER   pAd,
110         OUT     PUCHAR                  pBuf);
111
112 INT     Show_CountryRegionABand_Proc(
113         IN      PRTMP_ADAPTER   pAd,
114         OUT     PUCHAR                  pBuf);
115
116 INT     Show_CountryCode_Proc(
117         IN      PRTMP_ADAPTER   pAd,
118         OUT     PUCHAR                  pBuf);
119
120 #ifdef AGGREGATION_SUPPORT
121 INT     Show_PktAggregate_Proc(
122         IN      PRTMP_ADAPTER   pAd,
123         OUT     PUCHAR                  pBuf);
124 #endif // AGGREGATION_SUPPORT //
125
126 #ifdef WMM_SUPPORT
127 INT     Show_WmmCapable_Proc(
128         IN      PRTMP_ADAPTER   pAd,
129         OUT     PUCHAR                  pBuf);
130 #endif // WMM_SUPPORT //
131
132 INT     Show_IEEE80211H_Proc(
133         IN      PRTMP_ADAPTER   pAd,
134         OUT     PUCHAR                  pBuf);
135
136 #ifdef CONFIG_STA_SUPPORT
137 INT     Show_NetworkType_Proc(
138         IN      PRTMP_ADAPTER   pAd,
139         OUT     PUCHAR                  pBuf);
140 #endif // CONFIG_STA_SUPPORT //
141
142 INT     Show_AuthMode_Proc(
143         IN      PRTMP_ADAPTER   pAd,
144         OUT     PUCHAR                  pBuf);
145
146 INT     Show_EncrypType_Proc(
147         IN      PRTMP_ADAPTER   pAd,
148         OUT     PUCHAR                  pBuf);
149
150 INT     Show_DefaultKeyID_Proc(
151         IN      PRTMP_ADAPTER   pAd,
152         OUT     PUCHAR                  pBuf);
153
154 INT     Show_Key1_Proc(
155         IN      PRTMP_ADAPTER   pAd,
156         OUT     PUCHAR                  pBuf);
157
158 INT     Show_Key2_Proc(
159         IN      PRTMP_ADAPTER   pAd,
160         OUT     PUCHAR                  pBuf);
161
162 INT     Show_Key3_Proc(
163         IN      PRTMP_ADAPTER   pAd,
164         OUT     PUCHAR                  pBuf);
165
166 INT     Show_Key4_Proc(
167         IN      PRTMP_ADAPTER   pAd,
168         OUT     PUCHAR                  pBuf);
169
170 INT     Show_WPAPSK_Proc(
171         IN      PRTMP_ADAPTER   pAd,
172         OUT     PUCHAR                  pBuf);
173
174 static struct {
175         CHAR *name;
176         INT (*show_proc)(PRTMP_ADAPTER pAdapter, PUCHAR arg);
177 } *PRTMP_PRIVATE_STA_SHOW_CFG_VALUE_PROC, RTMP_PRIVATE_STA_SHOW_CFG_VALUE_PROC[] = {
178         {"SSID",                                        Show_SSID_Proc},
179         {"WirelessMode",                        Show_WirelessMode_Proc},
180         {"TxBurst",                                     Show_TxBurst_Proc},
181         {"TxPreamble",                          Show_TxPreamble_Proc},
182         {"TxPower",                                     Show_TxPower_Proc},
183         {"Channel",                                     Show_Channel_Proc},
184         {"BGProtection",                        Show_BGProtection_Proc},
185         {"RTSThreshold",                        Show_RTSThreshold_Proc},
186         {"FragThreshold",                       Show_FragThreshold_Proc},
187 #ifdef DOT11_N_SUPPORT
188         {"HtBw",                                        Show_HtBw_Proc},
189         {"HtMcs",                                       Show_HtMcs_Proc},
190         {"HtGi",                                        Show_HtGi_Proc},
191         {"HtOpMode",                            Show_HtOpMode_Proc},
192         {"HtExtcha",                            Show_HtExtcha_Proc},
193         {"HtMpduDensity",                       Show_HtMpduDensity_Proc},
194         {"HtBaWinSize",                 Show_HtBaWinSize_Proc},
195         {"HtRdg",                               Show_HtRdg_Proc},
196         {"HtAmsdu",                             Show_HtAmsdu_Proc},
197         {"HtAutoBa",                    Show_HtAutoBa_Proc},
198 #endif // DOT11_N_SUPPORT //
199         {"CountryRegion",                       Show_CountryRegion_Proc},
200         {"CountryRegionABand",          Show_CountryRegionABand_Proc},
201         {"CountryCode",                         Show_CountryCode_Proc},
202 #ifdef AGGREGATION_SUPPORT
203         {"PktAggregate",                        Show_PktAggregate_Proc},
204 #endif
205
206 #ifdef WMM_SUPPORT
207         {"WmmCapable",                          Show_WmmCapable_Proc},
208 #endif
209         {"IEEE80211H",                          Show_IEEE80211H_Proc},
210 #ifdef CONFIG_STA_SUPPORT
211     {"NetworkType",                             Show_NetworkType_Proc},
212 #endif // CONFIG_STA_SUPPORT //
213         {"AuthMode",                            Show_AuthMode_Proc},
214         {"EncrypType",                          Show_EncrypType_Proc},
215         {"DefaultKeyID",                        Show_DefaultKeyID_Proc},
216         {"Key1",                                        Show_Key1_Proc},
217         {"Key2",                                        Show_Key2_Proc},
218         {"Key3",                                        Show_Key3_Proc},
219         {"Key4",                                        Show_Key4_Proc},
220         {"WPAPSK",                                      Show_WPAPSK_Proc},
221         {NULL, NULL}
222 };
223
224 /*
225     ==========================================================================
226     Description:
227         Get Driver version.
228
229     Return:
230     ==========================================================================
231 */
232 INT Set_DriverVersion_Proc(
233         IN      PRTMP_ADAPTER   pAd,
234         IN      PUCHAR                  arg)
235 {
236
237 #ifdef CONFIG_STA_SUPPORT
238         IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
239                 DBGPRINT(RT_DEBUG_TRACE, ("Driver version-%s\n", STA_DRIVER_VERSION));
240 #endif // CONFIG_STA_SUPPORT //
241
242     return TRUE;
243 }
244
245 /*
246     ==========================================================================
247     Description:
248         Set Country Region.
249         This command will not work, if the field of CountryRegion in eeprom is programmed.
250     Return:
251         TRUE if all parameters are OK, FALSE otherwise
252     ==========================================================================
253 */
254 INT Set_CountryRegion_Proc(
255         IN      PRTMP_ADAPTER   pAd,
256         IN      PUCHAR                  arg)
257 {
258         ULONG region;
259
260         region = simple_strtol(arg, 0, 10);
261
262 #ifdef EXT_BUILD_CHANNEL_LIST
263         return -EOPNOTSUPP;
264 #endif // EXT_BUILD_CHANNEL_LIST //
265
266         // Country can be set only when EEPROM not programmed
267         if (pAd->CommonCfg.CountryRegion & 0x80)
268         {
269                 DBGPRINT(RT_DEBUG_ERROR, ("Set_CountryRegion_Proc::parameter of CountryRegion in eeprom is programmed \n"));
270                 return FALSE;
271         }
272
273         if((region >= 0) && (region <= REGION_MAXIMUM_BG_BAND))
274         {
275                 pAd->CommonCfg.CountryRegion = (UCHAR) region;
276         }
277         else if (region == REGION_31_BG_BAND)
278         {
279                 pAd->CommonCfg.CountryRegion = (UCHAR) region;
280         }
281         else
282         {
283                 DBGPRINT(RT_DEBUG_ERROR, ("Set_CountryRegion_Proc::parameters out of range\n"));
284                 return FALSE;
285         }
286
287         // if set country region, driver needs to be reset
288         BuildChannelList(pAd);
289
290         DBGPRINT(RT_DEBUG_TRACE, ("Set_CountryRegion_Proc::(CountryRegion=%d)\n", pAd->CommonCfg.CountryRegion));
291
292         return TRUE;
293 }
294
295 /*
296     ==========================================================================
297     Description:
298         Set Country Region for A band.
299         This command will not work, if the field of CountryRegion in eeprom is programmed.
300     Return:
301         TRUE if all parameters are OK, FALSE otherwise
302     ==========================================================================
303 */
304 INT Set_CountryRegionABand_Proc(
305         IN      PRTMP_ADAPTER   pAd,
306         IN      PUCHAR                  arg)
307 {
308         ULONG region;
309
310         region = simple_strtol(arg, 0, 10);
311
312 #ifdef EXT_BUILD_CHANNEL_LIST
313         return -EOPNOTSUPP;
314 #endif // EXT_BUILD_CHANNEL_LIST //
315
316         // Country can be set only when EEPROM not programmed
317         if (pAd->CommonCfg.CountryRegionForABand & 0x80)
318         {
319                 DBGPRINT(RT_DEBUG_ERROR, ("Set_CountryRegionABand_Proc::parameter of CountryRegion in eeprom is programmed \n"));
320                 return FALSE;
321         }
322
323         if((region >= 0) && (region <= REGION_MAXIMUM_A_BAND))
324         {
325                 pAd->CommonCfg.CountryRegionForABand = (UCHAR) region;
326         }
327         else
328         {
329                 DBGPRINT(RT_DEBUG_ERROR, ("Set_CountryRegionABand_Proc::parameters out of range\n"));
330                 return FALSE;
331         }
332
333         // if set country region, driver needs to be reset
334         BuildChannelList(pAd);
335
336         DBGPRINT(RT_DEBUG_TRACE, ("Set_CountryRegionABand_Proc::(CountryRegion=%d)\n", pAd->CommonCfg.CountryRegionForABand));
337
338         return TRUE;
339 }
340
341 /*
342     ==========================================================================
343     Description:
344         Set Wireless Mode
345     Return:
346         TRUE if all parameters are OK, FALSE otherwise
347     ==========================================================================
348 */
349 INT     Set_WirelessMode_Proc(
350         IN      PRTMP_ADAPTER   pAd,
351         IN      PUCHAR                  arg)
352 {
353         ULONG   WirelessMode;
354         INT             success = TRUE;
355
356         WirelessMode = simple_strtol(arg, 0, 10);
357
358
359 #ifdef CONFIG_STA_SUPPORT
360         IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
361         {
362                 INT MaxPhyMode = PHY_11G;
363
364 #ifdef DOT11_N_SUPPORT
365                 MaxPhyMode = PHY_11N_5G;
366 #endif // DOT11_N_SUPPORT //
367
368                 if (WirelessMode <= MaxPhyMode)
369                 {
370                         RTMPSetPhyMode(pAd, WirelessMode);
371 #ifdef DOT11_N_SUPPORT
372                         if (WirelessMode >= PHY_11ABGN_MIXED)
373                         {
374                                 pAd->CommonCfg.BACapability.field.AutoBA = TRUE;
375                                 pAd->CommonCfg.REGBACapability.field.AutoBA = TRUE;
376                         }
377                         else
378                         {
379                                 pAd->CommonCfg.BACapability.field.AutoBA = FALSE;
380                                 pAd->CommonCfg.REGBACapability.field.AutoBA = FALSE;
381                         }
382 #endif // DOT11_N_SUPPORT //
383                         // Set AdhocMode rates
384                         if (pAd->StaCfg.BssType == BSS_ADHOC)
385                         {
386                                 MlmeUpdateTxRates(pAd, FALSE, 0);
387                                 MakeIbssBeacon(pAd);           // re-build BEACON frame
388                                 AsicEnableIbssSync(pAd);       // copy to on-chip memory
389                         }
390                 }
391                 else
392                 {
393                         success = FALSE;
394                 }
395         }
396 #endif // CONFIG_STA_SUPPORT //
397
398         // it is needed to set SSID to take effect
399         if (success == TRUE)
400         {
401 #ifdef DOT11_N_SUPPORT
402                 SetCommonHT(pAd);
403 #endif // DOT11_N_SUPPORT //
404                 DBGPRINT(RT_DEBUG_TRACE, ("Set_WirelessMode_Proc::(=%ld)\n", WirelessMode));
405         }
406         else
407         {
408                 DBGPRINT(RT_DEBUG_ERROR, ("Set_WirelessMode_Proc::parameters out of range\n"));
409         }
410
411         return success;
412 }
413
414 /*
415     ==========================================================================
416     Description:
417         Set Channel
418     Return:
419         TRUE if all parameters are OK, FALSE otherwise
420     ==========================================================================
421 */
422 INT     Set_Channel_Proc(
423         IN      PRTMP_ADAPTER   pAd,
424         IN      PUCHAR                  arg)
425 {
426         INT             success = TRUE;
427         UCHAR   Channel;
428
429         Channel = (UCHAR) simple_strtol(arg, 0, 10);
430
431         // check if this channel is valid
432         if (ChannelSanity(pAd, Channel) == TRUE)
433         {
434 #ifdef CONFIG_STA_SUPPORT
435                 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
436                 {
437                         pAd->CommonCfg.Channel = Channel;
438
439                         if (MONITOR_ON(pAd))
440                         {
441 #ifdef DOT11_N_SUPPORT
442                                 N_ChannelCheck(pAd);
443                                 if (pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED &&
444                                         pAd->CommonCfg.RegTransmitSetting.field.BW == BW_40)
445                                 {
446                                         N_SetCenCh(pAd);
447                                         AsicSwitchChannel(pAd, pAd->CommonCfg.CentralChannel, FALSE);
448                                         AsicLockChannel(pAd, pAd->CommonCfg.CentralChannel);
449                                         DBGPRINT(RT_DEBUG_TRACE, ("BW_40, control_channel(%d), CentralChannel(%d) \n",
450                                                                 pAd->CommonCfg.Channel, pAd->CommonCfg.CentralChannel));
451                                 }
452                                 else
453 #endif // DOT11_N_SUPPORT //
454                                 {
455                                         AsicSwitchChannel(pAd, pAd->CommonCfg.Channel, FALSE);
456                                         AsicLockChannel(pAd, pAd->CommonCfg.Channel);
457                                         DBGPRINT(RT_DEBUG_TRACE, ("BW_20, Channel(%d)\n", pAd->CommonCfg.Channel));
458                                 }
459                         }
460                 }
461 #endif // CONFIG_STA_SUPPORT //
462                 success = TRUE;
463         }
464         else
465         {
466
467 #ifdef CONFIG_STA_SUPPORT
468                 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
469                         success = FALSE;
470 #endif // CONFIG_STA_SUPPORT //
471         }
472
473
474         if (success == TRUE)
475                 DBGPRINT(RT_DEBUG_TRACE, ("Set_Channel_Proc::(Channel=%d)\n", pAd->CommonCfg.Channel));
476
477         return success;
478 }
479
480 /*
481     ==========================================================================
482     Description:
483         Set Short Slot Time Enable or Disable
484     Return:
485         TRUE if all parameters are OK, FALSE otherwise
486     ==========================================================================
487 */
488 INT     Set_ShortSlot_Proc(
489         IN      PRTMP_ADAPTER   pAd,
490         IN      PUCHAR                  arg)
491 {
492         ULONG ShortSlot;
493
494         ShortSlot = simple_strtol(arg, 0, 10);
495
496         if (ShortSlot == 1)
497                 pAd->CommonCfg.bUseShortSlotTime = TRUE;
498         else if (ShortSlot == 0)
499                 pAd->CommonCfg.bUseShortSlotTime = FALSE;
500         else
501                 return FALSE;  //Invalid argument
502
503         DBGPRINT(RT_DEBUG_TRACE, ("Set_ShortSlot_Proc::(ShortSlot=%d)\n", pAd->CommonCfg.bUseShortSlotTime));
504
505         return TRUE;
506 }
507
508 /*
509     ==========================================================================
510     Description:
511         Set Tx power
512     Return:
513         TRUE if all parameters are OK, FALSE otherwise
514     ==========================================================================
515 */
516 INT     Set_TxPower_Proc(
517         IN      PRTMP_ADAPTER   pAd,
518         IN      PUCHAR                  arg)
519 {
520         ULONG TxPower;
521         INT   success = FALSE;
522
523         TxPower = (ULONG) simple_strtol(arg, 0, 10);
524         if (TxPower <= 100)
525         {
526
527 #ifdef CONFIG_STA_SUPPORT
528                 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
529                 {
530                         pAd->CommonCfg.TxPowerDefault = TxPower;
531                         pAd->CommonCfg.TxPowerPercentage = pAd->CommonCfg.TxPowerDefault;
532                 }
533 #endif // CONFIG_STA_SUPPORT //
534                 success = TRUE;
535         }
536         else
537                 success = FALSE;
538
539         DBGPRINT(RT_DEBUG_TRACE, ("Set_TxPower_Proc::(TxPowerPercentage=%ld)\n", pAd->CommonCfg.TxPowerPercentage));
540
541         return success;
542 }
543
544 /*
545     ==========================================================================
546     Description:
547         Set 11B/11G Protection
548     Return:
549         TRUE if all parameters are OK, FALSE otherwise
550     ==========================================================================
551 */
552 INT     Set_BGProtection_Proc(
553         IN      PRTMP_ADAPTER   pAd,
554         IN      PUCHAR                  arg)
555 {
556         switch (simple_strtol(arg, 0, 10))
557         {
558                 case 0: //AUTO
559                         pAd->CommonCfg.UseBGProtection = 0;
560                         break;
561                 case 1: //Always On
562                         pAd->CommonCfg.UseBGProtection = 1;
563                         break;
564                 case 2: //Always OFF
565                         pAd->CommonCfg.UseBGProtection = 2;
566                         break;
567                 default:  //Invalid argument
568                         return FALSE;
569         }
570
571
572         DBGPRINT(RT_DEBUG_TRACE, ("Set_BGProtection_Proc::(BGProtection=%ld)\n", pAd->CommonCfg.UseBGProtection));
573
574         return TRUE;
575 }
576
577 /*
578     ==========================================================================
579     Description:
580         Set TxPreamble
581     Return:
582         TRUE if all parameters are OK, FALSE otherwise
583     ==========================================================================
584 */
585 INT     Set_TxPreamble_Proc(
586         IN      PRTMP_ADAPTER   pAd,
587         IN      PUCHAR                  arg)
588 {
589         RT_802_11_PREAMBLE      Preamble;
590
591         Preamble = simple_strtol(arg, 0, 10);
592
593
594         switch (Preamble)
595         {
596                 case Rt802_11PreambleShort:
597                         pAd->CommonCfg.TxPreamble = Preamble;
598 #ifdef CONFIG_STA_SUPPORT
599                         IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
600                                 MlmeSetTxPreamble(pAd, Rt802_11PreambleShort);
601 #endif // CONFIG_STA_SUPPORT //
602                         break;
603                 case Rt802_11PreambleLong:
604 #ifdef CONFIG_STA_SUPPORT
605                 case Rt802_11PreambleAuto:
606                         // if user wants AUTO, initialize to LONG here, then change according to AP's
607                         // capability upon association.
608 #endif // CONFIG_STA_SUPPORT //
609                         pAd->CommonCfg.TxPreamble = Preamble;
610 #ifdef CONFIG_STA_SUPPORT
611                         IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
612                                 MlmeSetTxPreamble(pAd, Rt802_11PreambleLong);
613 #endif // CONFIG_STA_SUPPORT //
614                         break;
615                 default: //Invalid argument
616                         return FALSE;
617         }
618
619         DBGPRINT(RT_DEBUG_TRACE, ("Set_TxPreamble_Proc::(TxPreamble=%ld)\n", pAd->CommonCfg.TxPreamble));
620
621         return TRUE;
622 }
623
624 /*
625     ==========================================================================
626     Description:
627         Set RTS Threshold
628     Return:
629         TRUE if all parameters are OK, FALSE otherwise
630     ==========================================================================
631 */
632 INT     Set_RTSThreshold_Proc(
633         IN      PRTMP_ADAPTER   pAd,
634         IN      PUCHAR                  arg)
635 {
636          NDIS_802_11_RTS_THRESHOLD           RtsThresh;
637
638         RtsThresh = simple_strtol(arg, 0, 10);
639
640         if((RtsThresh > 0) && (RtsThresh <= MAX_RTS_THRESHOLD))
641                 pAd->CommonCfg.RtsThreshold  = (USHORT)RtsThresh;
642 #ifdef CONFIG_STA_SUPPORT
643         else if (RtsThresh == 0)
644                 pAd->CommonCfg.RtsThreshold = MAX_RTS_THRESHOLD;
645 #endif // CONFIG_STA_SUPPORT //
646         else
647                 return FALSE; //Invalid argument
648
649         DBGPRINT(RT_DEBUG_TRACE, ("Set_RTSThreshold_Proc::(RTSThreshold=%d)\n", pAd->CommonCfg.RtsThreshold));
650
651         return TRUE;
652 }
653
654 /*
655     ==========================================================================
656     Description:
657         Set Fragment Threshold
658     Return:
659         TRUE if all parameters are OK, FALSE otherwise
660     ==========================================================================
661 */
662 INT     Set_FragThreshold_Proc(
663         IN      PRTMP_ADAPTER   pAd,
664         IN      PUCHAR                  arg)
665 {
666          NDIS_802_11_FRAGMENTATION_THRESHOLD     FragThresh;
667
668         FragThresh = simple_strtol(arg, 0, 10);
669
670         if (FragThresh > MAX_FRAG_THRESHOLD || FragThresh < MIN_FRAG_THRESHOLD)
671         {
672                 //Illegal FragThresh so we set it to default
673                 pAd->CommonCfg.FragmentThreshold = MAX_FRAG_THRESHOLD;
674         }
675         else if (FragThresh % 2 == 1)
676         {
677                 // The length of each fragment shall always be an even number of octets, except for the last fragment
678                 // of an MSDU or MMPDU, which may be either an even or an odd number of octets.
679                 pAd->CommonCfg.FragmentThreshold = (USHORT)(FragThresh - 1);
680         }
681         else
682         {
683                 pAd->CommonCfg.FragmentThreshold = (USHORT)FragThresh;
684         }
685
686 #ifdef CONFIG_STA_SUPPORT
687         IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
688         {
689                 if (pAd->CommonCfg.FragmentThreshold == MAX_FRAG_THRESHOLD)
690                         pAd->CommonCfg.bUseZeroToDisableFragment = TRUE;
691                 else
692                         pAd->CommonCfg.bUseZeroToDisableFragment = FALSE;
693         }
694 #endif // CONFIG_STA_SUPPORT //
695
696         DBGPRINT(RT_DEBUG_TRACE, ("Set_FragThreshold_Proc::(FragThreshold=%d)\n", pAd->CommonCfg.FragmentThreshold));
697
698         return TRUE;
699 }
700
701 /*
702     ==========================================================================
703     Description:
704         Set TxBurst
705     Return:
706         TRUE if all parameters are OK, FALSE otherwise
707     ==========================================================================
708 */
709 INT     Set_TxBurst_Proc(
710         IN      PRTMP_ADAPTER   pAd,
711         IN      PUCHAR                  arg)
712 {
713         ULONG TxBurst;
714
715         TxBurst = simple_strtol(arg, 0, 10);
716         if (TxBurst == 1)
717                 pAd->CommonCfg.bEnableTxBurst = TRUE;
718         else if (TxBurst == 0)
719                 pAd->CommonCfg.bEnableTxBurst = FALSE;
720         else
721                 return FALSE;  //Invalid argument
722
723         DBGPRINT(RT_DEBUG_TRACE, ("Set_TxBurst_Proc::(TxBurst=%d)\n", pAd->CommonCfg.bEnableTxBurst));
724
725         return TRUE;
726 }
727
728 #ifdef AGGREGATION_SUPPORT
729 /*
730     ==========================================================================
731     Description:
732         Set TxBurst
733     Return:
734         TRUE if all parameters are OK, FALSE otherwise
735     ==========================================================================
736 */
737 INT     Set_PktAggregate_Proc(
738         IN      PRTMP_ADAPTER   pAd,
739         IN      PUCHAR                  arg)
740 {
741         ULONG aggre;
742
743         aggre = simple_strtol(arg, 0, 10);
744
745         if (aggre == 1)
746                 pAd->CommonCfg.bAggregationCapable = TRUE;
747         else if (aggre == 0)
748                 pAd->CommonCfg.bAggregationCapable = FALSE;
749         else
750                 return FALSE;  //Invalid argument
751
752
753         DBGPRINT(RT_DEBUG_TRACE, ("Set_PktAggregate_Proc::(AGGRE=%d)\n", pAd->CommonCfg.bAggregationCapable));
754
755         return TRUE;
756 }
757 #endif
758
759 /*
760     ==========================================================================
761     Description:
762         Set IEEE80211H.
763         This parameter is 1 when needs radar detection, otherwise 0
764     Return:
765         TRUE if all parameters are OK, FALSE otherwise
766     ==========================================================================
767 */
768 INT     Set_IEEE80211H_Proc(
769         IN      PRTMP_ADAPTER   pAd,
770         IN      PUCHAR                  arg)
771 {
772     ULONG ieee80211h;
773
774         ieee80211h = simple_strtol(arg, 0, 10);
775
776         if (ieee80211h == 1)
777                 pAd->CommonCfg.bIEEE80211H = TRUE;
778         else if (ieee80211h == 0)
779                 pAd->CommonCfg.bIEEE80211H = FALSE;
780         else
781                 return FALSE;  //Invalid argument
782
783         DBGPRINT(RT_DEBUG_TRACE, ("Set_IEEE80211H_Proc::(IEEE80211H=%d)\n", pAd->CommonCfg.bIEEE80211H));
784
785         return TRUE;
786 }
787
788
789 #ifdef DBG
790 /*
791     ==========================================================================
792     Description:
793         For Debug information
794     Return:
795         TRUE if all parameters are OK, FALSE otherwise
796     ==========================================================================
797 */
798 INT     Set_Debug_Proc(
799         IN      PRTMP_ADAPTER   pAd,
800         IN      PUCHAR                  arg)
801 {
802         DBGPRINT(RT_DEBUG_TRACE, ("==> Set_Debug_Proc *******************\n"));
803
804     if(simple_strtol(arg, 0, 10) <= RT_DEBUG_LOUD)
805         RTDebugLevel = simple_strtol(arg, 0, 10);
806
807         DBGPRINT(RT_DEBUG_TRACE, ("<== Set_Debug_Proc(RTDebugLevel = %ld)\n", RTDebugLevel));
808
809         return TRUE;
810 }
811 #endif
812
813 INT     Show_DescInfo_Proc(
814         IN      PRTMP_ADAPTER   pAd,
815         IN      PUCHAR                  arg)
816 {
817 #ifdef RT2860
818         INT i, QueIdx=0;
819         PRT28XX_RXD_STRUC pRxD;
820     PTXD_STRUC pTxD;
821         PRTMP_TX_RING   pTxRing = &pAd->TxRing[QueIdx];
822         PRTMP_MGMT_RING pMgmtRing = &pAd->MgmtRing;
823         PRTMP_RX_RING   pRxRing = &pAd->RxRing;
824
825         for(i=0;i<TX_RING_SIZE;i++)
826         {
827             pTxD = (PTXD_STRUC) pTxRing->Cell[i].AllocVa;
828             printk("Desc #%d\n",i);
829             hex_dump("Tx Descriptor", (char *)pTxD, 16);
830             printk("pTxD->DMADONE = %x\n", pTxD->DMADONE);
831         }
832         printk("---------------------------------------------------\n");
833         for(i=0;i<MGMT_RING_SIZE;i++)
834         {
835             pTxD = (PTXD_STRUC) pMgmtRing->Cell[i].AllocVa;
836             printk("Desc #%d\n",i);
837             hex_dump("Mgmt Descriptor", (char *)pTxD, 16);
838             printk("pMgmt->DMADONE = %x\n", pTxD->DMADONE);
839         }
840         printk("---------------------------------------------------\n");
841         for(i=0;i<RX_RING_SIZE;i++)
842         {
843             pRxD = (PRT28XX_RXD_STRUC) pRxRing->Cell[i].AllocVa;
844             printk("Desc #%d\n",i);
845             hex_dump("Rx Descriptor", (char *)pRxD, 16);
846                 printk("pRxD->DDONE = %x\n", pRxD->DDONE);
847         }
848 #endif // RT2860 //
849
850         return TRUE;
851 }
852
853 /*
854     ==========================================================================
855     Description:
856         Reset statistics counter
857
858     Arguments:
859         pAdapter            Pointer to our adapter
860         arg
861
862     Return:
863         TRUE if all parameters are OK, FALSE otherwise
864     ==========================================================================
865 */
866 INT     Set_ResetStatCounter_Proc(
867         IN      PRTMP_ADAPTER   pAd,
868         IN      PUCHAR                  arg)
869 {
870         DBGPRINT(RT_DEBUG_TRACE, ("==>Set_ResetStatCounter_Proc\n"));
871
872         // add the most up-to-date h/w raw counters into software counters
873         NICUpdateRawCounters(pAd);
874
875         NdisZeroMemory(&pAd->WlanCounters, sizeof(COUNTER_802_11));
876         NdisZeroMemory(&pAd->Counters8023, sizeof(COUNTER_802_3));
877         NdisZeroMemory(&pAd->RalinkCounters, sizeof(COUNTER_RALINK));
878
879         return TRUE;
880 }
881
882 BOOLEAN RTMPCheckStrPrintAble(
883     IN  CHAR *pInPutStr,
884     IN  UCHAR strLen)
885 {
886     UCHAR i=0;
887
888     for (i=0; i<strLen; i++)
889     {
890         if ((pInPutStr[i] < 0x21) ||
891             (pInPutStr[i] > 0x7E))
892             return FALSE;
893     }
894
895     return TRUE;
896 }
897
898 /*
899         ========================================================================
900
901         Routine Description:
902                 Remove WPA Key process
903
904         Arguments:
905                 pAd                                     Pointer to our adapter
906                 pBuf                                                    Pointer to the where the key stored
907
908         Return Value:
909                 NDIS_SUCCESS                                    Add key successfully
910
911         IRQL = DISPATCH_LEVEL
912
913         Note:
914
915         ========================================================================
916 */
917 #ifdef CONFIG_STA_SUPPORT
918 VOID    RTMPSetDesiredRates(
919     IN  PRTMP_ADAPTER   pAdapter,
920     IN  LONG            Rates)
921 {
922     NDIS_802_11_RATES aryRates;
923
924     memset(&aryRates, 0x00, sizeof(NDIS_802_11_RATES));
925     switch (pAdapter->CommonCfg.PhyMode)
926     {
927         case PHY_11A: // A only
928             switch (Rates)
929             {
930                 case 6000000: //6M
931                     aryRates[0] = 0x0c; // 6M
932                     pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_0;
933                     break;
934                 case 9000000: //9M
935                     aryRates[0] = 0x12; // 9M
936                     pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_1;
937                     break;
938                 case 12000000: //12M
939                     aryRates[0] = 0x18; // 12M
940                     pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_2;
941                     break;
942                 case 18000000: //18M
943                     aryRates[0] = 0x24; // 18M
944                     pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_3;
945                     break;
946                 case 24000000: //24M
947                     aryRates[0] = 0x30; // 24M
948                     pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_4;
949                     break;
950                 case 36000000: //36M
951                     aryRates[0] = 0x48; // 36M
952                     pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_5;
953                     break;
954                 case 48000000: //48M
955                     aryRates[0] = 0x60; // 48M
956                     pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_6;
957                     break;
958                 case 54000000: //54M
959                     aryRates[0] = 0x6c; // 54M
960                     pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_7;
961                     break;
962                 case -1: //Auto
963                 default:
964                     aryRates[0] = 0x6c; // 54Mbps
965                     aryRates[1] = 0x60; // 48Mbps
966                     aryRates[2] = 0x48; // 36Mbps
967                     aryRates[3] = 0x30; // 24Mbps
968                     aryRates[4] = 0x24; // 18M
969                     aryRates[5] = 0x18; // 12M
970                     aryRates[6] = 0x12; // 9M
971                     aryRates[7] = 0x0c; // 6M
972                     pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_AUTO;
973                     break;
974             }
975             break;
976         case PHY_11BG_MIXED: // B/G Mixed
977         case PHY_11B: // B only
978         case PHY_11ABG_MIXED: // A/B/G Mixed
979         default:
980             switch (Rates)
981             {
982                 case 1000000: //1M
983                     aryRates[0] = 0x02;
984                     pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_0;
985                     break;
986                 case 2000000: //2M
987                     aryRates[0] = 0x04;
988                     pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_1;
989                     break;
990                 case 5000000: //5.5M
991                     aryRates[0] = 0x0b; // 5.5M
992                     pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_2;
993                     break;
994                 case 11000000: //11M
995                     aryRates[0] = 0x16; // 11M
996                     pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_3;
997                     break;
998                 case 6000000: //6M
999                     aryRates[0] = 0x0c; // 6M
1000                     pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_0;
1001                     break;
1002                 case 9000000: //9M
1003                     aryRates[0] = 0x12; // 9M
1004                     pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_1;
1005                     break;
1006                 case 12000000: //12M
1007                     aryRates[0] = 0x18; // 12M
1008                     pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_2;
1009                     break;
1010                 case 18000000: //18M
1011                     aryRates[0] = 0x24; // 18M
1012                     pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_3;
1013                     break;
1014                 case 24000000: //24M
1015                     aryRates[0] = 0x30; // 24M
1016                     pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_4;
1017                     break;
1018                 case 36000000: //36M
1019                     aryRates[0] = 0x48; // 36M
1020                     pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_5;
1021                     break;
1022                 case 48000000: //48M
1023                     aryRates[0] = 0x60; // 48M
1024                     pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_6;
1025                     break;
1026                 case 54000000: //54M
1027                     aryRates[0] = 0x6c; // 54M
1028                     pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_7;
1029                     break;
1030                 case -1: //Auto
1031                 default:
1032                     if (pAdapter->CommonCfg.PhyMode == PHY_11B)
1033                     { //B Only
1034                         aryRates[0] = 0x16; // 11Mbps
1035                         aryRates[1] = 0x0b; // 5.5Mbps
1036                         aryRates[2] = 0x04; // 2Mbps
1037                         aryRates[3] = 0x02; // 1Mbps
1038                     }
1039                     else
1040                     { //(B/G) Mixed or (A/B/G) Mixed
1041                         aryRates[0] = 0x6c; // 54Mbps
1042                         aryRates[1] = 0x60; // 48Mbps
1043                         aryRates[2] = 0x48; // 36Mbps
1044                         aryRates[3] = 0x30; // 24Mbps
1045                         aryRates[4] = 0x16; // 11Mbps
1046                         aryRates[5] = 0x0b; // 5.5Mbps
1047                         aryRates[6] = 0x04; // 2Mbps
1048                         aryRates[7] = 0x02; // 1Mbps
1049                     }
1050                     pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_AUTO;
1051                     break;
1052             }
1053             break;
1054     }
1055
1056     NdisZeroMemory(pAdapter->CommonCfg.DesireRate, MAX_LEN_OF_SUPPORTED_RATES);
1057     NdisMoveMemory(pAdapter->CommonCfg.DesireRate, &aryRates, sizeof(NDIS_802_11_RATES));
1058     DBGPRINT(RT_DEBUG_TRACE, (" RTMPSetDesiredRates (%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x)\n",
1059         pAdapter->CommonCfg.DesireRate[0],pAdapter->CommonCfg.DesireRate[1],
1060         pAdapter->CommonCfg.DesireRate[2],pAdapter->CommonCfg.DesireRate[3],
1061         pAdapter->CommonCfg.DesireRate[4],pAdapter->CommonCfg.DesireRate[5],
1062         pAdapter->CommonCfg.DesireRate[6],pAdapter->CommonCfg.DesireRate[7] ));
1063     // Changing DesiredRate may affect the MAX TX rate we used to TX frames out
1064     MlmeUpdateTxRates(pAdapter, FALSE, 0);
1065 }
1066
1067 NDIS_STATUS RTMPWPARemoveKeyProc(
1068         IN      PRTMP_ADAPTER   pAd,
1069         IN      PVOID                   pBuf)
1070 {
1071         PNDIS_802_11_REMOVE_KEY pKey;
1072         ULONG                                   KeyIdx;
1073         NDIS_STATUS                     Status = NDIS_STATUS_FAILURE;
1074         BOOLEAN         bTxKey;                 // Set the key as transmit key
1075         BOOLEAN         bPairwise;              // Indicate the key is pairwise key
1076         BOOLEAN         bKeyRSC;                // indicate the receive  SC set by KeyRSC value.
1077                                                                 // Otherwise, it will set by the NIC.
1078         BOOLEAN         bAuthenticator; // indicate key is set by authenticator.
1079         INT             i;
1080
1081         DBGPRINT(RT_DEBUG_TRACE,("---> RTMPWPARemoveKeyProc\n"));
1082
1083         pKey = (PNDIS_802_11_REMOVE_KEY) pBuf;
1084         KeyIdx = pKey->KeyIndex & 0xff;
1085         // Bit 31 of Add-key, Tx Key
1086         bTxKey             = (pKey->KeyIndex & 0x80000000) ? TRUE : FALSE;
1087         // Bit 30 of Add-key PairwiseKey
1088         bPairwise          = (pKey->KeyIndex & 0x40000000) ? TRUE : FALSE;
1089         // Bit 29 of Add-key KeyRSC
1090         bKeyRSC            = (pKey->KeyIndex & 0x20000000) ? TRUE : FALSE;
1091         // Bit 28 of Add-key Authenticator
1092         bAuthenticator = (pKey->KeyIndex & 0x10000000) ? TRUE : FALSE;
1093
1094         // 1. If bTx is TRUE, return failure information
1095         if (bTxKey == TRUE)
1096                 return(NDIS_STATUS_INVALID_DATA);
1097
1098         // 2. Check Pairwise Key
1099         if (bPairwise)
1100         {
1101                 // a. If BSSID is broadcast, remove all pairwise keys.
1102                 // b. If not broadcast, remove the pairwise specified by BSSID
1103                 for (i = 0; i < SHARE_KEY_NUM; i++)
1104                 {
1105                         if (MAC_ADDR_EQUAL(pAd->SharedKey[BSS0][i].BssId, pKey->BSSID))
1106                         {
1107                                 DBGPRINT(RT_DEBUG_TRACE,("RTMPWPARemoveKeyProc(KeyIdx=%d)\n", i));
1108                                 pAd->SharedKey[BSS0][i].KeyLen = 0;
1109                                 pAd->SharedKey[BSS0][i].CipherAlg = CIPHER_NONE;
1110                                 AsicRemoveSharedKeyEntry(pAd, BSS0, (UCHAR)i);
1111                                 Status = NDIS_STATUS_SUCCESS;
1112                                 break;
1113                         }
1114                 }
1115         }
1116         // 3. Group Key
1117         else
1118         {
1119                 // a. If BSSID is broadcast, remove all group keys indexed
1120                 // b. If BSSID matched, delete the group key indexed.
1121                 DBGPRINT(RT_DEBUG_TRACE,("RTMPWPARemoveKeyProc(KeyIdx=%ld)\n", KeyIdx));
1122                 pAd->SharedKey[BSS0][KeyIdx].KeyLen = 0;
1123                 pAd->SharedKey[BSS0][KeyIdx].CipherAlg = CIPHER_NONE;
1124                 AsicRemoveSharedKeyEntry(pAd, BSS0, (UCHAR)KeyIdx);
1125                 Status = NDIS_STATUS_SUCCESS;
1126         }
1127
1128         return (Status);
1129 }
1130 #endif // CONFIG_STA_SUPPORT //
1131
1132
1133 #ifdef CONFIG_STA_SUPPORT
1134 /*
1135         ========================================================================
1136
1137         Routine Description:
1138                 Remove All WPA Keys
1139
1140         Arguments:
1141                 pAd                                     Pointer to our adapter
1142
1143         Return Value:
1144                 None
1145
1146         IRQL = DISPATCH_LEVEL
1147
1148         Note:
1149
1150         ========================================================================
1151 */
1152 VOID    RTMPWPARemoveAllKeys(
1153         IN      PRTMP_ADAPTER   pAd)
1154 {
1155
1156         UCHAR   i;
1157
1158         DBGPRINT(RT_DEBUG_TRACE,("RTMPWPARemoveAllKeys(AuthMode=%d, WepStatus=%d)\n", pAd->StaCfg.AuthMode, pAd->StaCfg.WepStatus));
1159
1160         // For WEP/CKIP, there is no need to remove it, since WinXP won't set it again after
1161         // Link up. And it will be replaced if user changed it.
1162         if (pAd->StaCfg.AuthMode < Ndis802_11AuthModeWPA)
1163                 return;
1164
1165         // For WPA-None, there is no need to remove it, since WinXP won't set it again after
1166         // Link up. And it will be replaced if user changed it.
1167         if (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPANone)
1168                 return;
1169
1170         // set BSSID wcid entry of the Pair-wise Key table as no-security mode
1171         AsicRemovePairwiseKeyEntry(pAd, BSS0, BSSID_WCID);
1172
1173         // set all shared key mode as no-security.
1174         for (i = 0; i < SHARE_KEY_NUM; i++)
1175     {
1176                 DBGPRINT(RT_DEBUG_TRACE,("remove %s key #%d\n", CipherName[pAd->SharedKey[BSS0][i].CipherAlg], i));
1177                 NdisZeroMemory(&pAd->SharedKey[BSS0][i], sizeof(CIPHER_KEY));
1178
1179                 AsicRemoveSharedKeyEntry(pAd, BSS0, i);
1180         }
1181
1182 }
1183 #endif // CONFIG_STA_SUPPORT //
1184
1185 /*
1186         ========================================================================
1187         Routine Description:
1188                 Change NIC PHY mode. Re-association may be necessary. possible settings
1189                 include - PHY_11B, PHY_11BG_MIXED, PHY_11A, and PHY_11ABG_MIXED
1190
1191         Arguments:
1192                 pAd - Pointer to our adapter
1193                 phymode  -
1194
1195         IRQL = PASSIVE_LEVEL
1196         IRQL = DISPATCH_LEVEL
1197
1198         ========================================================================
1199 */
1200 VOID    RTMPSetPhyMode(
1201         IN      PRTMP_ADAPTER   pAd,
1202         IN      ULONG phymode)
1203 {
1204         INT i;
1205         // the selected phymode must be supported by the RF IC encoded in E2PROM
1206
1207         // if no change, do nothing
1208         /* bug fix
1209         if (pAd->CommonCfg.PhyMode == phymode)
1210                 return;
1211     */
1212         pAd->CommonCfg.PhyMode = (UCHAR)phymode;
1213
1214         DBGPRINT(RT_DEBUG_TRACE,("RTMPSetPhyMode : PhyMode=%d, channel=%d \n", pAd->CommonCfg.PhyMode, pAd->CommonCfg.Channel));
1215 #ifdef EXT_BUILD_CHANNEL_LIST
1216         BuildChannelListEx(pAd);
1217 #else
1218         BuildChannelList(pAd);
1219 #endif // EXT_BUILD_CHANNEL_LIST //
1220
1221         // sanity check user setting
1222         for (i = 0; i < pAd->ChannelListNum; i++)
1223         {
1224                 if (pAd->CommonCfg.Channel == pAd->ChannelList[i].Channel)
1225                         break;
1226         }
1227
1228         if (i == pAd->ChannelListNum)
1229         {
1230 #ifdef CONFIG_STA_SUPPORT
1231                 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1232                         pAd->CommonCfg.Channel = FirstChannel(pAd);
1233 #endif // CONFIG_STA_SUPPORT //
1234                 DBGPRINT(RT_DEBUG_ERROR, ("RTMPSetPhyMode: channel is out of range, use first channel=%d \n", pAd->CommonCfg.Channel));
1235         }
1236
1237         NdisZeroMemory(pAd->CommonCfg.SupRate, MAX_LEN_OF_SUPPORTED_RATES);
1238         NdisZeroMemory(pAd->CommonCfg.ExtRate, MAX_LEN_OF_SUPPORTED_RATES);
1239         NdisZeroMemory(pAd->CommonCfg.DesireRate, MAX_LEN_OF_SUPPORTED_RATES);
1240         switch (phymode) {
1241                 case PHY_11B:
1242                         pAd->CommonCfg.SupRate[0]  = 0x82;        // 1 mbps, in units of 0.5 Mbps, basic rate
1243                         pAd->CommonCfg.SupRate[1]  = 0x84;        // 2 mbps, in units of 0.5 Mbps, basic rate
1244                         pAd->CommonCfg.SupRate[2]  = 0x8B;        // 5.5 mbps, in units of 0.5 Mbps, basic rate
1245                         pAd->CommonCfg.SupRate[3]  = 0x96;        // 11 mbps, in units of 0.5 Mbps, basic rate
1246                         pAd->CommonCfg.SupRateLen  = 4;
1247                         pAd->CommonCfg.ExtRateLen  = 0;
1248                         pAd->CommonCfg.DesireRate[0]  = 2;         // 1 mbps, in units of 0.5 Mbps
1249                         pAd->CommonCfg.DesireRate[1]  = 4;         // 2 mbps, in units of 0.5 Mbps
1250                         pAd->CommonCfg.DesireRate[2]  = 11;    // 5.5 mbps, in units of 0.5 Mbps
1251                         pAd->CommonCfg.DesireRate[3]  = 22;    // 11 mbps, in units of 0.5 Mbps
1252                         //pAd->CommonCfg.HTPhyMode.field.MODE = MODE_CCK; // This MODE is only FYI. not use
1253                         break;
1254
1255                 case PHY_11G:
1256                 case PHY_11BG_MIXED:
1257                 case PHY_11ABG_MIXED:
1258 #ifdef DOT11_N_SUPPORT
1259                 case PHY_11N_2_4G:
1260                 case PHY_11ABGN_MIXED:
1261                 case PHY_11BGN_MIXED:
1262                 case PHY_11GN_MIXED:
1263 #endif // DOT11_N_SUPPORT //
1264                         pAd->CommonCfg.SupRate[0]  = 0x82;        // 1 mbps, in units of 0.5 Mbps, basic rate
1265                         pAd->CommonCfg.SupRate[1]  = 0x84;        // 2 mbps, in units of 0.5 Mbps, basic rate
1266                         pAd->CommonCfg.SupRate[2]  = 0x8B;        // 5.5 mbps, in units of 0.5 Mbps, basic rate
1267                         pAd->CommonCfg.SupRate[3]  = 0x96;        // 11 mbps, in units of 0.5 Mbps, basic rate
1268                         pAd->CommonCfg.SupRate[4]  = 0x12;        // 9 mbps, in units of 0.5 Mbps
1269                         pAd->CommonCfg.SupRate[5]  = 0x24;        // 18 mbps, in units of 0.5 Mbps
1270                         pAd->CommonCfg.SupRate[6]  = 0x48;        // 36 mbps, in units of 0.5 Mbps
1271                         pAd->CommonCfg.SupRate[7]  = 0x6c;        // 54 mbps, in units of 0.5 Mbps
1272                         pAd->CommonCfg.SupRateLen  = 8;
1273                         pAd->CommonCfg.ExtRate[0]  = 0x0C;        // 6 mbps, in units of 0.5 Mbps
1274                         pAd->CommonCfg.ExtRate[1]  = 0x18;        // 12 mbps, in units of 0.5 Mbps
1275                         pAd->CommonCfg.ExtRate[2]  = 0x30;        // 24 mbps, in units of 0.5 Mbps
1276                         pAd->CommonCfg.ExtRate[3]  = 0x60;        // 48 mbps, in units of 0.5 Mbps
1277                         pAd->CommonCfg.ExtRateLen  = 4;
1278                         pAd->CommonCfg.DesireRate[0]  = 2;         // 1 mbps, in units of 0.5 Mbps
1279                         pAd->CommonCfg.DesireRate[1]  = 4;         // 2 mbps, in units of 0.5 Mbps
1280                         pAd->CommonCfg.DesireRate[2]  = 11;    // 5.5 mbps, in units of 0.5 Mbps
1281                         pAd->CommonCfg.DesireRate[3]  = 22;    // 11 mbps, in units of 0.5 Mbps
1282                         pAd->CommonCfg.DesireRate[4]  = 12;    // 6 mbps, in units of 0.5 Mbps
1283                         pAd->CommonCfg.DesireRate[5]  = 18;    // 9 mbps, in units of 0.5 Mbps
1284                         pAd->CommonCfg.DesireRate[6]  = 24;    // 12 mbps, in units of 0.5 Mbps
1285                         pAd->CommonCfg.DesireRate[7]  = 36;    // 18 mbps, in units of 0.5 Mbps
1286                         pAd->CommonCfg.DesireRate[8]  = 48;    // 24 mbps, in units of 0.5 Mbps
1287                         pAd->CommonCfg.DesireRate[9]  = 72;    // 36 mbps, in units of 0.5 Mbps
1288                         pAd->CommonCfg.DesireRate[10] = 96;    // 48 mbps, in units of 0.5 Mbps
1289                         pAd->CommonCfg.DesireRate[11] = 108;   // 54 mbps, in units of 0.5 Mbps
1290                         break;
1291
1292                 case PHY_11A:
1293 #ifdef DOT11_N_SUPPORT
1294                 case PHY_11AN_MIXED:
1295                 case PHY_11AGN_MIXED:
1296                 case PHY_11N_5G:
1297 #endif // DOT11_N_SUPPORT //
1298                         pAd->CommonCfg.SupRate[0]  = 0x8C;        // 6 mbps, in units of 0.5 Mbps, basic rate
1299                         pAd->CommonCfg.SupRate[1]  = 0x12;        // 9 mbps, in units of 0.5 Mbps
1300                         pAd->CommonCfg.SupRate[2]  = 0x98;        // 12 mbps, in units of 0.5 Mbps, basic rate
1301                         pAd->CommonCfg.SupRate[3]  = 0x24;        // 18 mbps, in units of 0.5 Mbps
1302                         pAd->CommonCfg.SupRate[4]  = 0xb0;        // 24 mbps, in units of 0.5 Mbps, basic rate
1303                         pAd->CommonCfg.SupRate[5]  = 0x48;        // 36 mbps, in units of 0.5 Mbps
1304                         pAd->CommonCfg.SupRate[6]  = 0x60;        // 48 mbps, in units of 0.5 Mbps
1305                         pAd->CommonCfg.SupRate[7]  = 0x6c;        // 54 mbps, in units of 0.5 Mbps
1306                         pAd->CommonCfg.SupRateLen  = 8;
1307                         pAd->CommonCfg.ExtRateLen  = 0;
1308                         pAd->CommonCfg.DesireRate[0]  = 12;    // 6 mbps, in units of 0.5 Mbps
1309                         pAd->CommonCfg.DesireRate[1]  = 18;    // 9 mbps, in units of 0.5 Mbps
1310                         pAd->CommonCfg.DesireRate[2]  = 24;    // 12 mbps, in units of 0.5 Mbps
1311                         pAd->CommonCfg.DesireRate[3]  = 36;    // 18 mbps, in units of 0.5 Mbps
1312                         pAd->CommonCfg.DesireRate[4]  = 48;    // 24 mbps, in units of 0.5 Mbps
1313                         pAd->CommonCfg.DesireRate[5]  = 72;    // 36 mbps, in units of 0.5 Mbps
1314                         pAd->CommonCfg.DesireRate[6]  = 96;    // 48 mbps, in units of 0.5 Mbps
1315                         pAd->CommonCfg.DesireRate[7]  = 108;   // 54 mbps, in units of 0.5 Mbps
1316                         //pAd->CommonCfg.HTPhyMode.field.MODE = MODE_OFDM; // This MODE is only FYI. not use
1317                         break;
1318
1319                 default:
1320                         break;
1321         }
1322
1323
1324         pAd->CommonCfg.BandState = UNKNOWN_BAND;
1325 }
1326
1327
1328 #ifdef DOT11_N_SUPPORT
1329 /*
1330         ========================================================================
1331         Routine Description:
1332                 Caller ensures we has 802.11n support.
1333                 Calls at setting HT from AP/STASetinformation
1334
1335         Arguments:
1336                 pAd - Pointer to our adapter
1337                 phymode  -
1338
1339         ========================================================================
1340 */
1341 VOID    RTMPSetHT(
1342         IN      PRTMP_ADAPTER   pAd,
1343         IN      OID_SET_HT_PHYMODE *pHTPhyMode)
1344 {
1345         //ULONG *pmcs;
1346         UINT32  Value = 0;
1347         UCHAR   BBPValue = 0;
1348         UCHAR   BBP3Value = 0;
1349         UCHAR   RxStream = pAd->CommonCfg.RxStream;
1350
1351         DBGPRINT(RT_DEBUG_TRACE, ("RTMPSetHT : HT_mode(%d), ExtOffset(%d), MCS(%d), BW(%d), STBC(%d), SHORTGI(%d)\n",
1352                                                                                 pHTPhyMode->HtMode, pHTPhyMode->ExtOffset,
1353                                                                                 pHTPhyMode->MCS, pHTPhyMode->BW,
1354                                                                                 pHTPhyMode->STBC, pHTPhyMode->SHORTGI));
1355
1356         // Don't zero supportedHyPhy structure.
1357         RTMPZeroMemory(&pAd->CommonCfg.HtCapability, sizeof(pAd->CommonCfg.HtCapability));
1358         RTMPZeroMemory(&pAd->CommonCfg.AddHTInfo, sizeof(pAd->CommonCfg.AddHTInfo));
1359         RTMPZeroMemory(&pAd->CommonCfg.NewExtChanOffset, sizeof(pAd->CommonCfg.NewExtChanOffset));
1360         RTMPZeroMemory(&pAd->CommonCfg.DesiredHtPhy, sizeof(pAd->CommonCfg.DesiredHtPhy));
1361
1362         if (pAd->CommonCfg.bRdg)
1363         {
1364                 pAd->CommonCfg.HtCapability.ExtHtCapInfo.PlusHTC = 1;
1365                 pAd->CommonCfg.HtCapability.ExtHtCapInfo.RDGSupport = 1;
1366         }
1367         else
1368         {
1369                 pAd->CommonCfg.HtCapability.ExtHtCapInfo.PlusHTC = 0;
1370                 pAd->CommonCfg.HtCapability.ExtHtCapInfo.RDGSupport = 0;
1371         }
1372
1373         pAd->CommonCfg.HtCapability.HtCapParm.MaxRAmpduFactor = 3;
1374         pAd->CommonCfg.DesiredHtPhy.MaxRAmpduFactor = 3;
1375
1376         DBGPRINT(RT_DEBUG_TRACE, ("RTMPSetHT : RxBAWinLimit = %d\n", pAd->CommonCfg.BACapability.field.RxBAWinLimit));
1377
1378         // Mimo power save, A-MSDU size,
1379         pAd->CommonCfg.DesiredHtPhy.AmsduEnable = (USHORT)pAd->CommonCfg.BACapability.field.AmsduEnable;
1380         pAd->CommonCfg.DesiredHtPhy.AmsduSize = (UCHAR)pAd->CommonCfg.BACapability.field.AmsduSize;
1381         pAd->CommonCfg.DesiredHtPhy.MimoPs = (UCHAR)pAd->CommonCfg.BACapability.field.MMPSmode;
1382         pAd->CommonCfg.DesiredHtPhy.MpduDensity = (UCHAR)pAd->CommonCfg.BACapability.field.MpduDensity;
1383
1384         pAd->CommonCfg.HtCapability.HtCapInfo.AMsduSize = (USHORT)pAd->CommonCfg.BACapability.field.AmsduSize;
1385         pAd->CommonCfg.HtCapability.HtCapInfo.MimoPs = (USHORT)pAd->CommonCfg.BACapability.field.MMPSmode;
1386         pAd->CommonCfg.HtCapability.HtCapParm.MpduDensity = (UCHAR)pAd->CommonCfg.BACapability.field.MpduDensity;
1387
1388         DBGPRINT(RT_DEBUG_TRACE, ("RTMPSetHT : AMsduSize = %d, MimoPs = %d, MpduDensity = %d, MaxRAmpduFactor = %d\n",
1389                                                                                                         pAd->CommonCfg.DesiredHtPhy.AmsduSize,
1390                                                                                                         pAd->CommonCfg.DesiredHtPhy.MimoPs,
1391                                                                                                         pAd->CommonCfg.DesiredHtPhy.MpduDensity,
1392                                                                                                         pAd->CommonCfg.DesiredHtPhy.MaxRAmpduFactor));
1393
1394         if(pHTPhyMode->HtMode == HTMODE_GF)
1395         {
1396                 pAd->CommonCfg.HtCapability.HtCapInfo.GF = 1;
1397                 pAd->CommonCfg.DesiredHtPhy.GF = 1;
1398         }
1399         else
1400                 pAd->CommonCfg.DesiredHtPhy.GF = 0;
1401
1402         // Decide Rx MCSSet
1403         switch (RxStream)
1404         {
1405                 case 1:
1406                         pAd->CommonCfg.HtCapability.MCSSet[0] =  0xff;
1407                         pAd->CommonCfg.HtCapability.MCSSet[1] =  0x00;
1408                         break;
1409
1410                 case 2:
1411                         pAd->CommonCfg.HtCapability.MCSSet[0] =  0xff;
1412                         pAd->CommonCfg.HtCapability.MCSSet[1] =  0xff;
1413                         break;
1414
1415                 case 3: // 3*3
1416                         pAd->CommonCfg.HtCapability.MCSSet[0] =  0xff;
1417                         pAd->CommonCfg.HtCapability.MCSSet[1] =  0xff;
1418                         pAd->CommonCfg.HtCapability.MCSSet[2] =  0xff;
1419                         break;
1420         }
1421
1422         if (pAd->CommonCfg.bForty_Mhz_Intolerant && (pAd->CommonCfg.Channel <= 14) && (pHTPhyMode->BW == BW_40) )
1423         {
1424                 pHTPhyMode->BW = BW_20;
1425                 pAd->CommonCfg.HtCapability.HtCapInfo.Forty_Mhz_Intolerant = 1;
1426         }
1427
1428         if(pHTPhyMode->BW == BW_40)
1429         {
1430                 pAd->CommonCfg.HtCapability.MCSSet[4] = 0x1; // MCS 32
1431                 pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth = 1;
1432                 if (pAd->CommonCfg.Channel <= 14)
1433                         pAd->CommonCfg.HtCapability.HtCapInfo.CCKmodein40 = 1;
1434
1435                 pAd->CommonCfg.DesiredHtPhy.ChannelWidth = 1;
1436                 pAd->CommonCfg.AddHTInfo.AddHtInfo.RecomWidth = 1;
1437                 pAd->CommonCfg.AddHTInfo.AddHtInfo.ExtChanOffset = (pHTPhyMode->ExtOffset == EXTCHA_BELOW)? (EXTCHA_BELOW): EXTCHA_ABOVE;
1438                 // Set Regsiter for extension channel position.
1439                 RTMP_IO_READ32(pAd, TX_BAND_CFG, &Value);
1440                 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &BBP3Value);
1441                 if ((pHTPhyMode->ExtOffset == EXTCHA_BELOW))
1442                 {
1443                         Value |= 0x1;
1444                         BBP3Value |= (0x20);
1445                         RTMP_IO_WRITE32(pAd, TX_BAND_CFG, Value);
1446                 }
1447                 else if ((pHTPhyMode->ExtOffset == EXTCHA_ABOVE))
1448                 {
1449                         Value &= 0xfe;
1450                         BBP3Value &= (~0x20);
1451                         RTMP_IO_WRITE32(pAd, TX_BAND_CFG, Value);
1452                 }
1453
1454                 // Turn on BBP 40MHz mode now only as AP .
1455                 // Sta can turn on BBP 40MHz after connection with 40MHz AP. Sta only broadcast 40MHz capability before connection.
1456                 if ((pAd->OpMode == OPMODE_AP) || INFRA_ON(pAd) || ADHOC_ON(pAd)
1457                         )
1458                 {
1459                         RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &BBPValue);
1460                         BBPValue &= (~0x18);
1461                         BBPValue |= 0x10;
1462                         RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, BBPValue);
1463
1464                         RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, BBP3Value);
1465                         pAd->CommonCfg.BBPCurrentBW = BW_40;
1466                 }
1467         }
1468         else
1469         {
1470                 pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth = 0;
1471                 pAd->CommonCfg.DesiredHtPhy.ChannelWidth = 0;
1472                 pAd->CommonCfg.AddHTInfo.AddHtInfo.RecomWidth = 0;
1473                 pAd->CommonCfg.AddHTInfo.AddHtInfo.ExtChanOffset = EXTCHA_NONE;
1474                 pAd->CommonCfg.CentralChannel = pAd->CommonCfg.Channel;
1475                 // Turn on BBP 20MHz mode by request here.
1476                 {
1477                         RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &BBPValue);
1478                         BBPValue &= (~0x18);
1479                         RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, BBPValue);
1480                         pAd->CommonCfg.BBPCurrentBW = BW_20;
1481                 }
1482         }
1483
1484         if(pHTPhyMode->STBC == STBC_USE)
1485         {
1486                 pAd->CommonCfg.HtCapability.HtCapInfo.TxSTBC = 1;
1487                 pAd->CommonCfg.DesiredHtPhy.TxSTBC = 1;
1488                 pAd->CommonCfg.HtCapability.HtCapInfo.RxSTBC = 1;
1489                 pAd->CommonCfg.DesiredHtPhy.RxSTBC = 1;
1490         }
1491         else
1492         {
1493                 pAd->CommonCfg.DesiredHtPhy.TxSTBC = 0;
1494                 pAd->CommonCfg.DesiredHtPhy.RxSTBC = 0;
1495         }
1496
1497
1498         if(pHTPhyMode->SHORTGI == GI_400)
1499         {
1500                 pAd->CommonCfg.HtCapability.HtCapInfo.ShortGIfor20 = 1;
1501                 pAd->CommonCfg.HtCapability.HtCapInfo.ShortGIfor40 = 1;
1502                 pAd->CommonCfg.DesiredHtPhy.ShortGIfor20 = 1;
1503                 pAd->CommonCfg.DesiredHtPhy.ShortGIfor40 = 1;
1504         }
1505         else
1506         {
1507                 pAd->CommonCfg.HtCapability.HtCapInfo.ShortGIfor20 = 0;
1508                 pAd->CommonCfg.HtCapability.HtCapInfo.ShortGIfor40 = 0;
1509                 pAd->CommonCfg.DesiredHtPhy.ShortGIfor20 = 0;
1510                 pAd->CommonCfg.DesiredHtPhy.ShortGIfor40 = 0;
1511         }
1512
1513         // We support link adaptation for unsolicit MCS feedback, set to 2.
1514         pAd->CommonCfg.HtCapability.ExtHtCapInfo.MCSFeedback = MCSFBK_NONE; //MCSFBK_UNSOLICIT;
1515         pAd->CommonCfg.AddHTInfo.ControlChan = pAd->CommonCfg.Channel;
1516         // 1, the extension channel above the control channel.
1517
1518         // EDCA parameters used for AP's own transmission
1519         if (pAd->CommonCfg.APEdcaParm.bValid == FALSE)
1520         {
1521                 pAd->CommonCfg.APEdcaParm.bValid = TRUE;
1522                 pAd->CommonCfg.APEdcaParm.Aifsn[0] = 3;
1523                 pAd->CommonCfg.APEdcaParm.Aifsn[1] = 7;
1524                 pAd->CommonCfg.APEdcaParm.Aifsn[2] = 1;
1525                 pAd->CommonCfg.APEdcaParm.Aifsn[3] = 1;
1526
1527                 pAd->CommonCfg.APEdcaParm.Cwmin[0] = 4;
1528                 pAd->CommonCfg.APEdcaParm.Cwmin[1] = 4;
1529                 pAd->CommonCfg.APEdcaParm.Cwmin[2] = 3;
1530                 pAd->CommonCfg.APEdcaParm.Cwmin[3] = 2;
1531
1532                 pAd->CommonCfg.APEdcaParm.Cwmax[0] = 6;
1533                 pAd->CommonCfg.APEdcaParm.Cwmax[1] = 10;
1534                 pAd->CommonCfg.APEdcaParm.Cwmax[2] = 4;
1535                 pAd->CommonCfg.APEdcaParm.Cwmax[3] = 3;
1536
1537                 pAd->CommonCfg.APEdcaParm.Txop[0]  = 0;
1538                 pAd->CommonCfg.APEdcaParm.Txop[1]  = 0;
1539                 pAd->CommonCfg.APEdcaParm.Txop[2]  = 94;
1540                 pAd->CommonCfg.APEdcaParm.Txop[3]  = 47;
1541         }
1542         AsicSetEdcaParm(pAd, &pAd->CommonCfg.APEdcaParm);
1543
1544
1545 #ifdef CONFIG_STA_SUPPORT
1546         IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1547         {
1548                 RTMPSetIndividualHT(pAd, 0);
1549         }
1550 #endif // CONFIG_STA_SUPPORT //
1551
1552 }
1553
1554 /*
1555         ========================================================================
1556         Routine Description:
1557                 Caller ensures we has 802.11n support.
1558                 Calls at setting HT from AP/STASetinformation
1559
1560         Arguments:
1561                 pAd - Pointer to our adapter
1562                 phymode  -
1563
1564         ========================================================================
1565 */
1566 VOID    RTMPSetIndividualHT(
1567         IN      PRTMP_ADAPTER           pAd,
1568         IN      UCHAR                           apidx)
1569 {
1570         PRT_HT_PHY_INFO         pDesired_ht_phy = NULL;
1571         UCHAR   TxStream = pAd->CommonCfg.TxStream;
1572         UCHAR   DesiredMcs      = MCS_AUTO;
1573
1574         do
1575         {
1576
1577 #ifdef CONFIG_STA_SUPPORT
1578                 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1579                 {
1580                         pDesired_ht_phy = &pAd->StaCfg.DesiredHtPhyInfo;
1581                         DesiredMcs = pAd->StaCfg.DesiredTransmitSetting.field.MCS;
1582                         //pAd->StaCfg.bAutoTxRateSwitch = (DesiredMcs == MCS_AUTO) ? TRUE : FALSE;
1583                                 break;
1584                 }
1585 #endif // CONFIG_STA_SUPPORT //
1586         } while (FALSE);
1587
1588         if (pDesired_ht_phy == NULL)
1589         {
1590                 DBGPRINT(RT_DEBUG_ERROR, ("RTMPSetIndividualHT: invalid apidx(%d)\n", apidx));
1591                 return;
1592         }
1593         RTMPZeroMemory(pDesired_ht_phy, sizeof(RT_HT_PHY_INFO));
1594
1595         DBGPRINT(RT_DEBUG_TRACE, ("RTMPSetIndividualHT : Desired MCS = %d\n", DesiredMcs));
1596         // Check the validity of MCS
1597         if ((TxStream == 1) && ((DesiredMcs >= MCS_8) && (DesiredMcs <= MCS_15)))
1598         {
1599                 DBGPRINT(RT_DEBUG_WARN, ("RTMPSetIndividualHT: MCS(%d) is invalid in 1S, reset it as MCS_7\n", DesiredMcs));
1600                 DesiredMcs = MCS_7;
1601         }
1602
1603         if ((pAd->CommonCfg.DesiredHtPhy.ChannelWidth == BW_20) && (DesiredMcs == MCS_32))
1604         {
1605                 DBGPRINT(RT_DEBUG_WARN, ("RTMPSetIndividualHT: MCS_32 is only supported in 40-MHz, reset it as MCS_0\n"));
1606                 DesiredMcs = MCS_0;
1607         }
1608
1609         pDesired_ht_phy->bHtEnable = TRUE;
1610
1611         // Decide desired Tx MCS
1612         switch (TxStream)
1613         {
1614                 case 1:
1615                         if (DesiredMcs == MCS_AUTO)
1616                         {
1617                                 pDesired_ht_phy->MCSSet[0]= 0xff;
1618                                 pDesired_ht_phy->MCSSet[1]= 0x00;
1619                         }
1620                         else if (DesiredMcs <= MCS_7)
1621                         {
1622                                 pDesired_ht_phy->MCSSet[0]= 1<<DesiredMcs;
1623                                 pDesired_ht_phy->MCSSet[1]= 0x00;
1624                         }
1625                         break;
1626
1627                 case 2:
1628                         if (DesiredMcs == MCS_AUTO)
1629                         {
1630                                 pDesired_ht_phy->MCSSet[0]= 0xff;
1631                                 pDesired_ht_phy->MCSSet[1]= 0xff;
1632                         }
1633                         else if (DesiredMcs <= MCS_15)
1634                         {
1635                                 ULONG mode;
1636
1637                                 mode = DesiredMcs / 8;
1638                                 if (mode < 2)
1639                                         pDesired_ht_phy->MCSSet[mode] = (1 << (DesiredMcs - mode * 8));
1640                         }
1641                         break;
1642
1643                 case 3: // 3*3
1644                         if (DesiredMcs == MCS_AUTO)
1645                         {
1646                                 /* MCS0 ~ MCS23, 3 bytes */
1647                                 pDesired_ht_phy->MCSSet[0]= 0xff;
1648                                 pDesired_ht_phy->MCSSet[1]= 0xff;
1649                                 pDesired_ht_phy->MCSSet[2]= 0xff;
1650                         }
1651                         else if (DesiredMcs <= MCS_23)
1652                         {
1653                                 ULONG mode;
1654
1655                                 mode = DesiredMcs / 8;
1656                                 if (mode < 3)
1657                                         pDesired_ht_phy->MCSSet[mode] = (1 << (DesiredMcs - mode * 8));
1658                         }
1659                         break;
1660         }
1661
1662         if(pAd->CommonCfg.DesiredHtPhy.ChannelWidth == BW_40)
1663         {
1664                 if (DesiredMcs == MCS_AUTO || DesiredMcs == MCS_32)
1665                         pDesired_ht_phy->MCSSet[4] = 0x1;
1666         }
1667
1668         // update HT Rate setting
1669     if (pAd->OpMode == OPMODE_STA)
1670         MlmeUpdateHtTxRates(pAd, BSS0);
1671     else
1672             MlmeUpdateHtTxRates(pAd, apidx);
1673 }
1674
1675
1676 /*
1677         ========================================================================
1678         Routine Description:
1679                 Update HT IE from our capability.
1680
1681         Arguments:
1682                 Send all HT IE in beacon/probe rsp/assoc rsp/action frame.
1683
1684
1685         ========================================================================
1686 */
1687 VOID    RTMPUpdateHTIE(
1688         IN      RT_HT_CAPABILITY        *pRtHt,
1689         IN              UCHAR                           *pMcsSet,
1690         OUT             HT_CAPABILITY_IE *pHtCapability,
1691         OUT             ADD_HT_INFO_IE          *pAddHtInfo)
1692 {
1693         RTMPZeroMemory(pHtCapability, sizeof(HT_CAPABILITY_IE));
1694         RTMPZeroMemory(pAddHtInfo, sizeof(ADD_HT_INFO_IE));
1695
1696                 pHtCapability->HtCapInfo.ChannelWidth = pRtHt->ChannelWidth;
1697                 pHtCapability->HtCapInfo.MimoPs = pRtHt->MimoPs;
1698                 pHtCapability->HtCapInfo.GF = pRtHt->GF;
1699                 pHtCapability->HtCapInfo.ShortGIfor20 = pRtHt->ShortGIfor20;
1700                 pHtCapability->HtCapInfo.ShortGIfor40 = pRtHt->ShortGIfor40;
1701                 pHtCapability->HtCapInfo.TxSTBC = pRtHt->TxSTBC;
1702                 pHtCapability->HtCapInfo.RxSTBC = pRtHt->RxSTBC;
1703                 pHtCapability->HtCapInfo.AMsduSize = pRtHt->AmsduSize;
1704                 pHtCapability->HtCapParm.MaxRAmpduFactor = pRtHt->MaxRAmpduFactor;
1705                 pHtCapability->HtCapParm.MpduDensity = pRtHt->MpduDensity;
1706
1707                 pAddHtInfo->AddHtInfo.ExtChanOffset = pRtHt->ExtChanOffset ;
1708                 pAddHtInfo->AddHtInfo.RecomWidth = pRtHt->RecomWidth;
1709                 pAddHtInfo->AddHtInfo2.OperaionMode = pRtHt->OperaionMode;
1710                 pAddHtInfo->AddHtInfo2.NonGfPresent = pRtHt->NonGfPresent;
1711                 RTMPMoveMemory(pAddHtInfo->MCSSet, /*pRtHt->MCSSet*/pMcsSet, 4); // rt2860 only support MCS max=32, no need to copy all 16 uchar.
1712
1713         DBGPRINT(RT_DEBUG_TRACE,("RTMPUpdateHTIE <== \n"));
1714 }
1715 #endif // DOT11_N_SUPPORT //
1716
1717 /*
1718         ========================================================================
1719         Description:
1720                 Add Client security information into ASIC WCID table and IVEIV table.
1721     Return:
1722         ========================================================================
1723 */
1724 VOID    RTMPAddWcidAttributeEntry(
1725         IN      PRTMP_ADAPTER   pAd,
1726         IN      UCHAR                   BssIdx,
1727         IN      UCHAR                   KeyIdx,
1728         IN      UCHAR                   CipherAlg,
1729         IN      MAC_TABLE_ENTRY *pEntry)
1730 {
1731         UINT32          WCIDAttri = 0;
1732         USHORT          offset;
1733         UCHAR           IVEIV = 0;
1734         USHORT          Wcid = 0;
1735
1736         {
1737 #ifdef CONFIG_STA_SUPPORT
1738                 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1739                 {
1740                         if (BssIdx > BSS0)
1741                         {
1742                                 DBGPRINT(RT_DEBUG_ERROR, ("RTMPAddWcidAttributeEntry: The BSS-index(%d) is out of range for Infra link. \n", BssIdx));
1743                                 return;
1744                         }
1745
1746                         // 1.   In ADHOC mode, the AID is wcid number. And NO mesh link exists.
1747                         // 2.   In Infra mode, the AID:1 MUST be wcid of infra STA.
1748                         //                                         the AID:2~ assign to mesh link entry.
1749                         if (pEntry && ADHOC_ON(pAd))
1750                                 Wcid = pEntry->Aid;
1751                         else if (pEntry && INFRA_ON(pAd))
1752                         {
1753 #ifdef QOS_DLS_SUPPORT
1754                                 if (pEntry->ValidAsDls == TRUE)
1755                                         Wcid = pEntry->Aid;
1756                                 else
1757 #endif // QOS_DLS_SUPPORT //
1758                                 Wcid = BSSID_WCID;
1759                         }
1760                         else
1761                                 Wcid = MCAST_WCID;
1762                 }
1763 #endif // CONFIG_STA_SUPPORT //
1764         }
1765
1766         // Update WCID attribute table
1767         offset = MAC_WCID_ATTRIBUTE_BASE + (Wcid * HW_WCID_ATTRI_SIZE);
1768
1769 #ifdef CONFIG_STA_SUPPORT
1770         IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1771         {
1772                 if (pEntry && pEntry->ValidAsMesh)
1773                         WCIDAttri = (CipherAlg<<1) | PAIRWISEKEYTABLE;
1774 #ifdef QOS_DLS_SUPPORT
1775                 else if ((pEntry) && (pEntry->ValidAsDls) &&
1776                                         ((CipherAlg == CIPHER_TKIP) ||
1777                                         (CipherAlg == CIPHER_TKIP_NO_MIC) ||
1778                                         (CipherAlg == CIPHER_AES) ||
1779                                         (CipherAlg == CIPHER_NONE)))
1780                         WCIDAttri = (CipherAlg<<1) | PAIRWISEKEYTABLE;
1781 #endif // QOS_DLS_SUPPORT //
1782                 else
1783                         WCIDAttri = (CipherAlg<<1) | SHAREDKEYTABLE;
1784         }
1785 #endif // CONFIG_STA_SUPPORT //
1786
1787         RTMP_IO_WRITE32(pAd, offset, WCIDAttri);
1788
1789
1790         // Update IV/EIV table
1791         offset = MAC_IVEIV_TABLE_BASE + (Wcid * HW_IVEIV_ENTRY_SIZE);
1792
1793         // WPA mode
1794         if ((CipherAlg == CIPHER_TKIP) || (CipherAlg == CIPHER_TKIP_NO_MIC) || (CipherAlg == CIPHER_AES))
1795         {
1796                 // Eiv bit on. keyid always is 0 for pairwise key
1797                 IVEIV = (KeyIdx <<6) | 0x20;
1798         }
1799         else
1800         {
1801                 // WEP KeyIdx is default tx key.
1802                 IVEIV = (KeyIdx << 6);
1803         }
1804
1805         // For key index and ext IV bit, so only need to update the position(offset+3).
1806 #ifdef RT2860
1807         RTMP_IO_WRITE8(pAd, offset+3, IVEIV);
1808 #endif // RT2860 //
1809
1810         DBGPRINT(RT_DEBUG_TRACE,("RTMPAddWcidAttributeEntry: WCID #%d, KeyIndex #%d, Alg=%s\n",Wcid, KeyIdx, CipherName[CipherAlg]));
1811         DBGPRINT(RT_DEBUG_TRACE,("      WCIDAttri = 0x%x \n",  WCIDAttri));
1812
1813 }
1814
1815 /*
1816     ==========================================================================
1817     Description:
1818         Parse encryption type
1819 Arguments:
1820     pAdapter                    Pointer to our adapter
1821     wrq                         Pointer to the ioctl argument
1822
1823     Return Value:
1824         None
1825
1826     Note:
1827     ==========================================================================
1828 */
1829 CHAR *GetEncryptType(CHAR enc)
1830 {
1831     if(enc == Ndis802_11WEPDisabled)
1832         return "NONE";
1833     if(enc == Ndis802_11WEPEnabled)
1834         return "WEP";
1835     if(enc == Ndis802_11Encryption2Enabled)
1836         return "TKIP";
1837     if(enc == Ndis802_11Encryption3Enabled)
1838         return "AES";
1839         if(enc == Ndis802_11Encryption4Enabled)
1840         return "TKIPAES";
1841     else
1842         return "UNKNOW";
1843 }
1844
1845 CHAR *GetAuthMode(CHAR auth)
1846 {
1847     if(auth == Ndis802_11AuthModeOpen)
1848         return "OPEN";
1849     if(auth == Ndis802_11AuthModeShared)
1850         return "SHARED";
1851         if(auth == Ndis802_11AuthModeAutoSwitch)
1852         return "AUTOWEP";
1853     if(auth == Ndis802_11AuthModeWPA)
1854         return "WPA";
1855     if(auth == Ndis802_11AuthModeWPAPSK)
1856         return "WPAPSK";
1857     if(auth == Ndis802_11AuthModeWPANone)
1858         return "WPANONE";
1859     if(auth == Ndis802_11AuthModeWPA2)
1860         return "WPA2";
1861     if(auth == Ndis802_11AuthModeWPA2PSK)
1862         return "WPA2PSK";
1863         if(auth == Ndis802_11AuthModeWPA1WPA2)
1864         return "WPA1WPA2";
1865         if(auth == Ndis802_11AuthModeWPA1PSKWPA2PSK)
1866         return "WPA1PSKWPA2PSK";
1867
1868         return "UNKNOW";
1869 }
1870
1871 #if 1 //#ifndef UCOS
1872 /*
1873     ==========================================================================
1874     Description:
1875         Get site survey results
1876         Arguments:
1877             pAdapter                    Pointer to our adapter
1878             wrq                         Pointer to the ioctl argument
1879
1880     Return Value:
1881         None
1882
1883     Note:
1884         Usage:
1885                         1.) UI needs to wait 4 seconds after issue a site survey command
1886                         2.) iwpriv ra0 get_site_survey
1887                         3.) UI needs to prepare at least 4096bytes to get the results
1888     ==========================================================================
1889 */
1890 #define LINE_LEN        (4+33+20+8+10+9+7+3)    // Channel+SSID+Bssid+WepStatus+AuthMode+Signal+WiressMode+NetworkType
1891 VOID RTMPIoctlGetSiteSurvey(
1892         IN      PRTMP_ADAPTER   pAdapter,
1893         IN      struct iwreq    *wrq)
1894 {
1895         CHAR            *msg;
1896         INT             i=0;
1897         INT                     WaitCnt;
1898         INT             Status=0;
1899         CHAR            Ssid[MAX_LEN_OF_SSID +1];
1900     INT         Rssi = 0, max_len = LINE_LEN;
1901         UINT        Rssi_Quality = 0;
1902         NDIS_802_11_NETWORK_TYPE    wireless_mode;
1903
1904         os_alloc_mem(NULL, (PUCHAR *)&msg, sizeof(CHAR)*((MAX_LEN_OF_BSS_TABLE)*max_len));
1905
1906         if (msg == NULL)
1907         {
1908                 DBGPRINT(RT_DEBUG_TRACE, ("RTMPIoctlGetSiteSurvey - msg memory alloc fail.\n"));
1909                 return;
1910         }
1911
1912         memset(msg, 0 ,(MAX_LEN_OF_BSS_TABLE)*max_len );
1913         memset(Ssid, 0 ,(MAX_LEN_OF_SSID +1));
1914         sprintf(msg,"%s","\n");
1915         sprintf(msg+strlen(msg),"%-4s%-33s%-20s%-8s%-10s%-9s%-7s%-3s\n",
1916             "Ch", "SSID", "BSSID", "Enc", "Auth", "Siganl(%)", "W-Mode", " NT");
1917
1918         WaitCnt = 0;
1919 #ifdef CONFIG_STA_SUPPORT
1920         pAdapter->StaCfg.bScanReqIsFromWebUI = TRUE;
1921         while ((ScanRunning(pAdapter) == TRUE) && (WaitCnt++ < 200))
1922                 OS_WAIT(500);
1923 #endif // CONFIG_STA_SUPPORT //
1924
1925         for(i=0; i<pAdapter->ScanTab.BssNr ;i++)
1926         {
1927                 if( pAdapter->ScanTab.BssEntry[i].Channel==0)
1928                         break;
1929
1930                 if((strlen(msg)+max_len ) >= IW_SCAN_MAX_DATA)
1931                         break;
1932
1933                 //Channel
1934                 sprintf(msg+strlen(msg),"%-4d", pAdapter->ScanTab.BssEntry[i].Channel);
1935                 //SSID
1936                 memcpy(Ssid, pAdapter->ScanTab.BssEntry[i].Ssid, pAdapter->ScanTab.BssEntry[i].SsidLen);
1937                 Ssid[pAdapter->ScanTab.BssEntry[i].SsidLen] = '\0';
1938                 sprintf(msg+strlen(msg),"%-33s", Ssid);
1939                 //BSSID
1940                 sprintf(msg+strlen(msg),"%02x:%02x:%02x:%02x:%02x:%02x   ",
1941                         pAdapter->ScanTab.BssEntry[i].Bssid[0],
1942                         pAdapter->ScanTab.BssEntry[i].Bssid[1],
1943                         pAdapter->ScanTab.BssEntry[i].Bssid[2],
1944                         pAdapter->ScanTab.BssEntry[i].Bssid[3],
1945                         pAdapter->ScanTab.BssEntry[i].Bssid[4],
1946                         pAdapter->ScanTab.BssEntry[i].Bssid[5]);
1947                 //Encryption Type
1948                 sprintf(msg+strlen(msg),"%-8s",GetEncryptType(pAdapter->ScanTab.BssEntry[i].WepStatus));
1949                 //Authentication Mode
1950                 if (pAdapter->ScanTab.BssEntry[i].WepStatus == Ndis802_11WEPEnabled)
1951                         sprintf(msg+strlen(msg),"%-10s", "UNKNOW");
1952                 else
1953                         sprintf(msg+strlen(msg),"%-10s",GetAuthMode(pAdapter->ScanTab.BssEntry[i].AuthMode));
1954                 // Rssi
1955                 Rssi = (INT)pAdapter->ScanTab.BssEntry[i].Rssi;
1956                 if (Rssi >= -50)
1957                         Rssi_Quality = 100;
1958                 else if (Rssi >= -80)    // between -50 ~ -80dbm
1959                         Rssi_Quality = (UINT)(24 + ((Rssi + 80) * 26)/10);
1960                 else if (Rssi >= -90)   // between -80 ~ -90dbm
1961                         Rssi_Quality = (UINT)(((Rssi + 90) * 26)/10);
1962                 else    // < -84 dbm
1963                         Rssi_Quality = 0;
1964                 sprintf(msg+strlen(msg),"%-9d", Rssi_Quality);
1965                 // Wireless Mode
1966                 wireless_mode = NetworkTypeInUseSanity(&pAdapter->ScanTab.BssEntry[i]);
1967                 if (wireless_mode == Ndis802_11FH ||
1968                         wireless_mode == Ndis802_11DS)
1969                         sprintf(msg+strlen(msg),"%-7s", "11b");
1970                 else if (wireless_mode == Ndis802_11OFDM5)
1971                         sprintf(msg+strlen(msg),"%-7s", "11a");
1972                 else if (wireless_mode == Ndis802_11OFDM5_N)
1973                         sprintf(msg+strlen(msg),"%-7s", "11a/n");
1974                 else if (wireless_mode == Ndis802_11OFDM24)
1975                         sprintf(msg+strlen(msg),"%-7s", "11b/g");
1976                 else if (wireless_mode == Ndis802_11OFDM24_N)
1977                         sprintf(msg+strlen(msg),"%-7s", "11b/g/n");
1978                 else
1979                         sprintf(msg+strlen(msg),"%-7s", "unknow");
1980                 //Network Type
1981                 if (pAdapter->ScanTab.BssEntry[i].BssType == BSS_ADHOC)
1982                         sprintf(msg+strlen(msg),"%-3s", " Ad");
1983                 else
1984                         sprintf(msg+strlen(msg),"%-3s", " In");
1985
1986         sprintf(msg+strlen(msg),"\n");
1987         }
1988
1989 #ifdef CONFIG_STA_SUPPORT
1990         pAdapter->StaCfg.bScanReqIsFromWebUI = FALSE;
1991 #endif // CONFIG_STA_SUPPORT //
1992         wrq->u.data.length = strlen(msg);
1993         Status = copy_to_user(wrq->u.data.pointer, msg, wrq->u.data.length);
1994
1995         DBGPRINT(RT_DEBUG_TRACE, ("RTMPIoctlGetSiteSurvey - wrq->u.data.length = %d\n", wrq->u.data.length));
1996         os_free_mem(NULL, (PUCHAR)msg);
1997 }
1998
1999
2000 #define MAC_LINE_LEN    (14+4+4+10+10+10+6+6)   // Addr+aid+psm+datatime+rxbyte+txbyte+current tx rate+last tx rate
2001 VOID RTMPIoctlGetMacTable(
2002         IN PRTMP_ADAPTER pAd,
2003         IN struct iwreq *wrq)
2004 {
2005         INT i;
2006         RT_802_11_MAC_TABLE MacTab;
2007         char *msg;
2008
2009         MacTab.Num = 0;
2010         for (i=0; i<MAX_LEN_OF_MAC_TABLE; i++)
2011         {
2012                 if (pAd->MacTab.Content[i].ValidAsCLI && (pAd->MacTab.Content[i].Sst == SST_ASSOC))
2013                 {
2014                         COPY_MAC_ADDR(MacTab.Entry[MacTab.Num].Addr, &pAd->MacTab.Content[i].Addr);
2015                         MacTab.Entry[MacTab.Num].Aid = (UCHAR)pAd->MacTab.Content[i].Aid;
2016                         MacTab.Entry[MacTab.Num].Psm = pAd->MacTab.Content[i].PsMode;
2017 #ifdef DOT11_N_SUPPORT
2018                         MacTab.Entry[MacTab.Num].MimoPs = pAd->MacTab.Content[i].MmpsMode;
2019 #endif // DOT11_N_SUPPORT //
2020
2021                         // Fill in RSSI per entry
2022                         MacTab.Entry[MacTab.Num].AvgRssi0 = pAd->MacTab.Content[i].RssiSample.AvgRssi0;
2023                         MacTab.Entry[MacTab.Num].AvgRssi1 = pAd->MacTab.Content[i].RssiSample.AvgRssi1;
2024                         MacTab.Entry[MacTab.Num].AvgRssi2 = pAd->MacTab.Content[i].RssiSample.AvgRssi2;
2025
2026                         // the connected time per entry
2027                         MacTab.Entry[MacTab.Num].ConnectedTime = pAd->MacTab.Content[i].StaConnectTime;
2028                         MacTab.Entry[MacTab.Num].TxRate.field.MCS = pAd->MacTab.Content[i].HTPhyMode.field.MCS;
2029                         MacTab.Entry[MacTab.Num].TxRate.field.BW = pAd->MacTab.Content[i].HTPhyMode.field.BW;
2030                         MacTab.Entry[MacTab.Num].TxRate.field.ShortGI = pAd->MacTab.Content[i].HTPhyMode.field.ShortGI;
2031                         MacTab.Entry[MacTab.Num].TxRate.field.STBC = pAd->MacTab.Content[i].HTPhyMode.field.STBC;
2032                         MacTab.Entry[MacTab.Num].TxRate.field.rsv = pAd->MacTab.Content[i].HTPhyMode.field.rsv;
2033                         MacTab.Entry[MacTab.Num].TxRate.field.MODE = pAd->MacTab.Content[i].HTPhyMode.field.MODE;
2034                         MacTab.Entry[MacTab.Num].TxRate.word = pAd->MacTab.Content[i].HTPhyMode.word;
2035
2036                         MacTab.Num += 1;
2037                 }
2038         }
2039         wrq->u.data.length = sizeof(RT_802_11_MAC_TABLE);
2040         if (copy_to_user(wrq->u.data.pointer, &MacTab, wrq->u.data.length))
2041         {
2042                 DBGPRINT(RT_DEBUG_TRACE, ("%s: copy_to_user() fail\n", __func__));
2043         }
2044
2045         msg = (CHAR *) kmalloc(sizeof(CHAR)*(MAX_LEN_OF_MAC_TABLE*MAC_LINE_LEN), MEM_ALLOC_FLAG);
2046         memset(msg, 0 ,MAX_LEN_OF_MAC_TABLE*MAC_LINE_LEN );
2047         sprintf(msg,"%s","\n");
2048         sprintf(msg+strlen(msg),"%-14s%-4s%-4s%-10s%-10s%-10s%-6s%-6s\n",
2049                 "MAC", "AID", "PSM", "LDT", "RxB", "TxB","CTxR", "LTxR");
2050
2051         for (i=0; i<MAX_LEN_OF_MAC_TABLE; i++)
2052         {
2053                 PMAC_TABLE_ENTRY pEntry = &pAd->MacTab.Content[i];
2054                 if (pEntry->ValidAsCLI && (pEntry->Sst == SST_ASSOC))
2055                 {
2056                         if((strlen(msg)+MAC_LINE_LEN ) >= (MAX_LEN_OF_MAC_TABLE*MAC_LINE_LEN) )
2057                                 break;
2058                         sprintf(msg+strlen(msg),"%02x%02x%02x%02x%02x%02x  ",
2059                                 pEntry->Addr[0], pEntry->Addr[1], pEntry->Addr[2],
2060                                 pEntry->Addr[3], pEntry->Addr[4], pEntry->Addr[5]);
2061                         sprintf(msg+strlen(msg),"%-4d", (int)pEntry->Aid);
2062                         sprintf(msg+strlen(msg),"%-4d", (int)pEntry->PsMode);
2063                         sprintf(msg+strlen(msg),"%-10d",0/*pAd->MacTab.Content[i].HSCounter.LastDataPacketTime*/); // ToDo
2064                         sprintf(msg+strlen(msg),"%-10d",0/*pAd->MacTab.Content[i].HSCounter.TotalRxByteCount*/); // ToDo
2065                         sprintf(msg+strlen(msg),"%-10d",0/*pAd->MacTab.Content[i].HSCounter.TotalTxByteCount*/); // ToDo
2066                         sprintf(msg+strlen(msg),"%-6d",RateIdToMbps[pAd->MacTab.Content[i].CurrTxRate]);
2067                         sprintf(msg+strlen(msg),"%-6d\n",0/*RateIdToMbps[pAd->MacTab.Content[i].LastTxRate]*/); // ToDo
2068                 }
2069         }
2070         // for compatible with old API just do the printk to console
2071         //wrq->u.data.length = strlen(msg);
2072         //if (copy_to_user(wrq->u.data.pointer, msg, wrq->u.data.length))
2073         {
2074                 DBGPRINT(RT_DEBUG_TRACE, ("%s", msg));
2075         }
2076
2077         kfree(msg);
2078 }
2079 #endif // UCOS //
2080
2081 #ifdef DOT11_N_SUPPORT
2082 INT     Set_BASetup_Proc(
2083         IN      PRTMP_ADAPTER   pAd,
2084         IN      PUCHAR                  arg)
2085 {
2086     UCHAR mac[6], tid;
2087         char *token, sepValue[] = ":", DASH = '-';
2088         INT i;
2089     MAC_TABLE_ENTRY *pEntry;
2090
2091 /*
2092         The BASetup inupt string format should be xx:xx:xx:xx:xx:xx-d,
2093                 =>The six 2 digit hex-decimal number previous are the Mac address,
2094                 =>The seventh decimal number is the tid value.
2095 */
2096         //printk("\n%s\n", arg);
2097
2098         if(strlen(arg) < 19)  //Mac address acceptable format 01:02:03:04:05:06 length 17 plus the "-" and tid value in decimal format.
2099                 return FALSE;
2100
2101         token = strchr(arg, DASH);
2102         if ((token != NULL) && (strlen(token)>1))
2103         {
2104                 tid = simple_strtol((token+1), 0, 10);
2105                 if (tid > 15)
2106                         return FALSE;
2107
2108                 *token = '\0';
2109                 for (i = 0, token = rstrtok(arg, &sepValue[0]); token; token = rstrtok(NULL, &sepValue[0]), i++)
2110                 {
2111                         if((strlen(token) != 2) || (!isxdigit(*token)) || (!isxdigit(*(token+1))))
2112                                 return FALSE;
2113                         AtoH(token, (PUCHAR)(&mac[i]), 1);
2114                 }
2115                 if(i != 6)
2116                         return FALSE;
2117
2118                 printk("\n%02x:%02x:%02x:%02x:%02x:%02x-%02x\n", mac[0], mac[1],
2119                                 mac[2], mac[3], mac[4], mac[5], tid);
2120
2121             pEntry = MacTableLookup(pAd, mac);
2122
2123         if (pEntry) {
2124                 printk("\nSetup BA Session: Tid = %d\n", tid);
2125                 BAOriSessionSetUp(pAd, pEntry, tid, 0, 100, TRUE);
2126         }
2127
2128                 return TRUE;
2129         }
2130
2131         return FALSE;
2132
2133 }
2134
2135 INT     Set_BADecline_Proc(
2136         IN      PRTMP_ADAPTER   pAd,
2137         IN      PUCHAR                  arg)
2138 {
2139         ULONG bBADecline;
2140
2141         bBADecline = simple_strtol(arg, 0, 10);
2142
2143         if (bBADecline == 0)
2144         {
2145                 pAd->CommonCfg.bBADecline = FALSE;
2146         }
2147         else if (bBADecline == 1)
2148         {
2149                 pAd->CommonCfg.bBADecline = TRUE;
2150         }
2151         else
2152         {
2153                 return FALSE; //Invalid argument
2154         }
2155
2156         DBGPRINT(RT_DEBUG_TRACE, ("Set_BADecline_Proc::(BADecline=%d)\n", pAd->CommonCfg.bBADecline));
2157
2158         return TRUE;
2159 }
2160
2161 INT     Set_BAOriTearDown_Proc(
2162         IN      PRTMP_ADAPTER   pAd,
2163         IN      PUCHAR                  arg)
2164 {
2165     UCHAR mac[6], tid;
2166         char *token, sepValue[] = ":", DASH = '-';
2167         INT i;
2168     MAC_TABLE_ENTRY *pEntry;
2169
2170 /*
2171         The BAOriTearDown inupt string format should be xx:xx:xx:xx:xx:xx-d,
2172                 =>The six 2 digit hex-decimal number previous are the Mac address,
2173                 =>The seventh decimal number is the tid value.
2174 */
2175     if(strlen(arg) < 19)  //Mac address acceptable format 01:02:03:04:05:06 length 17 plus the "-" and tid value in decimal format.
2176                 return FALSE;
2177
2178         token = strchr(arg, DASH);
2179         if ((token != NULL) && (strlen(token)>1))
2180         {
2181                 tid = simple_strtol((token+1), 0, 10);
2182                 if (tid > NUM_OF_TID)
2183                         return FALSE;
2184
2185                 *token = '\0';
2186                 for (i = 0, token = rstrtok(arg, &sepValue[0]); token; token = rstrtok(NULL, &sepValue[0]), i++)
2187                 {
2188                         if((strlen(token) != 2) || (!isxdigit(*token)) || (!isxdigit(*(token+1))))
2189                                 return FALSE;
2190                         AtoH(token, (PUCHAR)(&mac[i]), 1);
2191                 }
2192                 if(i != 6)
2193                         return FALSE;
2194
2195             printk("\n%02x:%02x:%02x:%02x:%02x:%02x-%02x", mac[0], mac[1],
2196                    mac[2], mac[3], mac[4], mac[5], tid);
2197
2198             pEntry = MacTableLookup(pAd, mac);
2199
2200             if (pEntry) {
2201                 printk("\nTear down Ori BA Session: Tid = %d\n", tid);
2202         BAOriSessionTearDown(pAd, pEntry->Aid, tid, FALSE, TRUE);
2203             }
2204
2205                 return TRUE;
2206         }
2207
2208         return FALSE;
2209
2210 }
2211
2212 INT     Set_BARecTearDown_Proc(
2213         IN      PRTMP_ADAPTER   pAd,
2214         IN      PUCHAR                  arg)
2215 {
2216     UCHAR mac[6], tid;
2217         char *token, sepValue[] = ":", DASH = '-';
2218         INT i;
2219     MAC_TABLE_ENTRY *pEntry;
2220
2221     //printk("\n%s\n", arg);
2222 /*
2223         The BARecTearDown inupt string format should be xx:xx:xx:xx:xx:xx-d,
2224                 =>The six 2 digit hex-decimal number previous are the Mac address,
2225                 =>The seventh decimal number is the tid value.
2226 */
2227     if(strlen(arg) < 19)  //Mac address acceptable format 01:02:03:04:05:06 length 17 plus the "-" and tid value in decimal format.
2228                 return FALSE;
2229
2230         token = strchr(arg, DASH);
2231         if ((token != NULL) && (strlen(token)>1))
2232         {
2233                 tid = simple_strtol((token+1), 0, 10);
2234                 if (tid > NUM_OF_TID)
2235                         return FALSE;
2236
2237                 *token = '\0';
2238                 for (i = 0, token = rstrtok(arg, &sepValue[0]); token; token = rstrtok(NULL, &sepValue[0]), i++)
2239                 {
2240                         if((strlen(token) != 2) || (!isxdigit(*token)) || (!isxdigit(*(token+1))))
2241                                 return FALSE;
2242                         AtoH(token, (PUCHAR)(&mac[i]), 1);
2243                 }
2244                 if(i != 6)
2245                         return FALSE;
2246
2247                 printk("\n%02x:%02x:%02x:%02x:%02x:%02x-%02x", mac[0], mac[1],
2248                        mac[2], mac[3], mac[4], mac[5], tid);
2249
2250                 pEntry = MacTableLookup(pAd, mac);
2251
2252                 if (pEntry) {
2253                     printk("\nTear down Rec BA Session: Tid = %d\n", tid);
2254                     BARecSessionTearDown(pAd, pEntry->Aid, tid, FALSE);
2255                 }
2256
2257                 return TRUE;
2258         }
2259
2260         return FALSE;
2261
2262 }
2263
2264 INT     Set_HtBw_Proc(
2265         IN      PRTMP_ADAPTER   pAd,
2266         IN      PUCHAR                  arg)
2267 {
2268         ULONG HtBw;
2269
2270         HtBw = simple_strtol(arg, 0, 10);
2271         if (HtBw == BW_40)
2272                 pAd->CommonCfg.RegTransmitSetting.field.BW  = BW_40;
2273         else if (HtBw == BW_20)
2274                 pAd->CommonCfg.RegTransmitSetting.field.BW  = BW_20;
2275         else
2276                 return FALSE;  //Invalid argument
2277
2278         SetCommonHT(pAd);
2279
2280         DBGPRINT(RT_DEBUG_TRACE, ("Set_HtBw_Proc::(HtBw=%d)\n", pAd->CommonCfg.RegTransmitSetting.field.BW));
2281
2282         return TRUE;
2283 }
2284
2285 INT     Set_HtMcs_Proc(
2286         IN      PRTMP_ADAPTER   pAd,
2287         IN      PUCHAR                  arg)
2288 {
2289         ULONG HtMcs, Mcs_tmp;
2290 #ifdef CONFIG_STA_SUPPORT
2291     BOOLEAN bAutoRate = FALSE;
2292 #endif // CONFIG_STA_SUPPORT //
2293
2294         Mcs_tmp = simple_strtol(arg, 0, 10);
2295
2296         if (Mcs_tmp <= 15 || Mcs_tmp == 32)
2297                 HtMcs = Mcs_tmp;
2298         else
2299                 HtMcs = MCS_AUTO;
2300
2301 #ifdef CONFIG_STA_SUPPORT
2302         IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
2303         {
2304                 pAd->StaCfg.DesiredTransmitSetting.field.MCS = HtMcs;
2305                 pAd->StaCfg.bAutoTxRateSwitch = (HtMcs == MCS_AUTO) ? TRUE:FALSE;
2306                 DBGPRINT(RT_DEBUG_TRACE, ("Set_HtMcs_Proc::(HtMcs=%d, bAutoTxRateSwitch = %d)\n",
2307                                                 pAd->StaCfg.DesiredTransmitSetting.field.MCS, pAd->StaCfg.bAutoTxRateSwitch));
2308
2309                 if ((pAd->CommonCfg.PhyMode < PHY_11ABGN_MIXED) ||
2310                         (pAd->MacTab.Content[BSSID_WCID].HTPhyMode.field.MODE < MODE_HTMIX))
2311                 {
2312                 if ((pAd->StaCfg.DesiredTransmitSetting.field.MCS != MCS_AUTO) &&
2313                                 (HtMcs >= 0 && HtMcs <= 3) &&
2314                     (pAd->StaCfg.DesiredTransmitSetting.field.FixedTxMode == FIXED_TXMODE_CCK))
2315                         {
2316                                 RTMPSetDesiredRates(pAd, (LONG) (RateIdToMbps[HtMcs] * 1000000));
2317                         }
2318                 else if ((pAd->StaCfg.DesiredTransmitSetting.field.MCS != MCS_AUTO) &&
2319                                         (HtMcs >= 0 && HtMcs <= 7) &&
2320                         (pAd->StaCfg.DesiredTransmitSetting.field.FixedTxMode == FIXED_TXMODE_OFDM))
2321                         {
2322                                 RTMPSetDesiredRates(pAd, (LONG) (RateIdToMbps[HtMcs+4] * 1000000));
2323                         }
2324                         else
2325                                 bAutoRate = TRUE;
2326
2327                         if (bAutoRate)
2328                         {
2329                     pAd->StaCfg.DesiredTransmitSetting.field.MCS = MCS_AUTO;
2330                                 RTMPSetDesiredRates(pAd, -1);
2331                         }
2332                 DBGPRINT(RT_DEBUG_TRACE, ("Set_HtMcs_Proc::(FixedTxMode=%d)\n",pAd->StaCfg.DesiredTransmitSetting.field.FixedTxMode));
2333                 }
2334         if (ADHOC_ON(pAd))
2335             return TRUE;
2336         }
2337 #endif // CONFIG_STA_SUPPORT //
2338
2339         SetCommonHT(pAd);
2340
2341         return TRUE;
2342 }
2343
2344 INT     Set_HtGi_Proc(
2345         IN      PRTMP_ADAPTER   pAd,
2346         IN      PUCHAR                  arg)
2347 {
2348         ULONG HtGi;
2349
2350         HtGi = simple_strtol(arg, 0, 10);
2351
2352         if ( HtGi == GI_400)
2353                 pAd->CommonCfg.RegTransmitSetting.field.ShortGI = GI_400;
2354         else if ( HtGi == GI_800 )
2355                 pAd->CommonCfg.RegTransmitSetting.field.ShortGI = GI_800;
2356         else
2357                 return FALSE; //Invalid argument
2358
2359         SetCommonHT(pAd);
2360
2361         DBGPRINT(RT_DEBUG_TRACE, ("Set_HtGi_Proc::(ShortGI=%d)\n",pAd->CommonCfg.RegTransmitSetting.field.ShortGI));
2362
2363         return TRUE;
2364 }
2365
2366
2367 INT     Set_HtTxBASize_Proc(
2368         IN      PRTMP_ADAPTER   pAd,
2369         IN      PUCHAR                  arg)
2370 {
2371         UCHAR Size;
2372
2373         Size = simple_strtol(arg, 0, 10);
2374
2375         if (Size <=0 || Size >=64)
2376         {
2377                 Size = 8;
2378         }
2379         pAd->CommonCfg.TxBASize = Size-1;
2380         DBGPRINT(RT_DEBUG_ERROR, ("Set_HtTxBASize ::(TxBASize= %d)\n", Size));
2381
2382         return TRUE;
2383 }
2384
2385
2386 INT     Set_HtOpMode_Proc(
2387         IN      PRTMP_ADAPTER   pAd,
2388         IN      PUCHAR                  arg)
2389 {
2390
2391         ULONG Value;
2392
2393         Value = simple_strtol(arg, 0, 10);
2394
2395         if (Value == HTMODE_GF)
2396                 pAd->CommonCfg.RegTransmitSetting.field.HTMODE  = HTMODE_GF;
2397         else if ( Value == HTMODE_MM )
2398                 pAd->CommonCfg.RegTransmitSetting.field.HTMODE  = HTMODE_MM;
2399         else
2400                 return FALSE; //Invalid argument
2401
2402         SetCommonHT(pAd);
2403
2404         DBGPRINT(RT_DEBUG_TRACE, ("Set_HtOpMode_Proc::(HtOpMode=%d)\n",pAd->CommonCfg.RegTransmitSetting.field.HTMODE));
2405
2406         return TRUE;
2407
2408 }
2409
2410 INT     Set_HtStbc_Proc(
2411         IN      PRTMP_ADAPTER   pAd,
2412         IN      PUCHAR                  arg)
2413 {
2414
2415         ULONG Value;
2416
2417         Value = simple_strtol(arg, 0, 10);
2418
2419         if (Value == STBC_USE)
2420                 pAd->CommonCfg.RegTransmitSetting.field.STBC = STBC_USE;
2421         else if ( Value == STBC_NONE )
2422                 pAd->CommonCfg.RegTransmitSetting.field.STBC = STBC_NONE;
2423         else
2424                 return FALSE; //Invalid argument
2425
2426         SetCommonHT(pAd);
2427
2428         DBGPRINT(RT_DEBUG_TRACE, ("Set_Stbc_Proc::(HtStbc=%d)\n",pAd->CommonCfg.RegTransmitSetting.field.STBC));
2429
2430         return TRUE;
2431 }
2432
2433 INT     Set_HtHtc_Proc(
2434         IN      PRTMP_ADAPTER   pAd,
2435         IN      PUCHAR                  arg)
2436 {
2437
2438         ULONG Value;
2439
2440         Value = simple_strtol(arg, 0, 10);
2441         if (Value == 0)
2442                 pAd->HTCEnable = FALSE;
2443         else if ( Value ==1 )
2444                 pAd->HTCEnable = TRUE;
2445         else
2446                 return FALSE; //Invalid argument
2447
2448         DBGPRINT(RT_DEBUG_TRACE, ("Set_HtHtc_Proc::(HtHtc=%d)\n",pAd->HTCEnable));
2449
2450         return TRUE;
2451 }
2452
2453 INT     Set_HtExtcha_Proc(
2454         IN      PRTMP_ADAPTER   pAd,
2455         IN      PUCHAR                  arg)
2456 {
2457
2458         ULONG Value;
2459
2460         Value = simple_strtol(arg, 0, 10);
2461
2462         if (Value == 0)
2463                 pAd->CommonCfg.RegTransmitSetting.field.EXTCHA  = EXTCHA_BELOW;
2464         else if ( Value ==1 )
2465         pAd->CommonCfg.RegTransmitSetting.field.EXTCHA = EXTCHA_ABOVE;
2466         else
2467                 return FALSE; //Invalid argument
2468
2469         SetCommonHT(pAd);
2470
2471         DBGPRINT(RT_DEBUG_TRACE, ("Set_HtExtcha_Proc::(HtExtcha=%d)\n",pAd->CommonCfg.RegTransmitSetting.field.EXTCHA));
2472
2473         return TRUE;
2474 }
2475
2476 INT     Set_HtMpduDensity_Proc(
2477         IN      PRTMP_ADAPTER   pAd,
2478         IN      PUCHAR                  arg)
2479 {
2480         ULONG Value;
2481
2482         Value = simple_strtol(arg, 0, 10);
2483
2484         if (Value <=7 && Value >= 0)
2485                 pAd->CommonCfg.BACapability.field.MpduDensity = Value;
2486         else
2487                 pAd->CommonCfg.BACapability.field.MpduDensity = 4;
2488
2489         SetCommonHT(pAd);
2490
2491         DBGPRINT(RT_DEBUG_TRACE, ("Set_HtMpduDensity_Proc::(HtMpduDensity=%d)\n",pAd->CommonCfg.BACapability.field.MpduDensity));
2492
2493         return TRUE;
2494 }
2495
2496 INT     Set_HtBaWinSize_Proc(
2497         IN      PRTMP_ADAPTER   pAd,
2498         IN      PUCHAR                  arg)
2499 {
2500         ULONG Value;
2501
2502         Value = simple_strtol(arg, 0, 10);
2503
2504
2505         if (Value >=1 && Value <= 64)
2506         {
2507                 pAd->CommonCfg.REGBACapability.field.RxBAWinLimit = Value;
2508                 pAd->CommonCfg.BACapability.field.RxBAWinLimit = Value;
2509         }
2510         else
2511         {
2512         pAd->CommonCfg.REGBACapability.field.RxBAWinLimit = 64;
2513                 pAd->CommonCfg.BACapability.field.RxBAWinLimit = 64;
2514         }
2515
2516         SetCommonHT(pAd);
2517
2518         DBGPRINT(RT_DEBUG_TRACE, ("Set_HtBaWinSize_Proc::(HtBaWinSize=%d)\n",pAd->CommonCfg.BACapability.field.RxBAWinLimit));
2519
2520         return TRUE;
2521 }
2522
2523 INT     Set_HtRdg_Proc(
2524         IN      PRTMP_ADAPTER   pAd,
2525         IN      PUCHAR                  arg)
2526 {
2527         ULONG Value;
2528
2529         Value = simple_strtol(arg, 0, 10);
2530
2531         if (Value == 0)
2532                 pAd->CommonCfg.bRdg = FALSE;
2533         else if ( Value ==1 )
2534         {
2535                 pAd->HTCEnable = TRUE;
2536                 pAd->CommonCfg.bRdg = TRUE;
2537         }
2538         else
2539                 return FALSE; //Invalid argument
2540
2541         SetCommonHT(pAd);
2542
2543         DBGPRINT(RT_DEBUG_TRACE, ("Set_HtRdg_Proc::(HtRdg=%d)\n",pAd->CommonCfg.bRdg));
2544
2545         return TRUE;
2546 }
2547
2548 INT     Set_HtLinkAdapt_Proc(
2549         IN      PRTMP_ADAPTER   pAd,
2550         IN      PUCHAR                  arg)
2551 {
2552         ULONG Value;
2553
2554         Value = simple_strtol(arg, 0, 10);
2555         if (Value == 0)
2556                 pAd->bLinkAdapt = FALSE;
2557         else if ( Value ==1 )
2558         {
2559                         pAd->HTCEnable = TRUE;
2560                         pAd->bLinkAdapt = TRUE;
2561         }
2562         else
2563                 return FALSE; //Invalid argument
2564
2565         DBGPRINT(RT_DEBUG_TRACE, ("Set_HtLinkAdapt_Proc::(HtLinkAdapt=%d)\n",pAd->bLinkAdapt));
2566
2567         return TRUE;
2568 }
2569
2570 INT     Set_HtAmsdu_Proc(
2571         IN      PRTMP_ADAPTER   pAd,
2572         IN      PUCHAR                  arg)
2573 {
2574         ULONG Value;
2575
2576         Value = simple_strtol(arg, 0, 10);
2577         if (Value == 0)
2578                 pAd->CommonCfg.BACapability.field.AmsduEnable = FALSE;
2579         else if ( Value == 1 )
2580         pAd->CommonCfg.BACapability.field.AmsduEnable = TRUE;
2581         else
2582                 return FALSE; //Invalid argument
2583
2584         SetCommonHT(pAd);
2585
2586         DBGPRINT(RT_DEBUG_TRACE, ("Set_HtAmsdu_Proc::(HtAmsdu=%d)\n",pAd->CommonCfg.BACapability.field.AmsduEnable));
2587
2588         return TRUE;
2589 }
2590
2591 INT     Set_HtAutoBa_Proc(
2592         IN      PRTMP_ADAPTER   pAd,
2593         IN      PUCHAR                  arg)
2594 {
2595         ULONG Value;
2596
2597         Value = simple_strtol(arg, 0, 10);
2598         if (Value == 0)
2599                 pAd->CommonCfg.BACapability.field.AutoBA = FALSE;
2600     else if (Value == 1)
2601                 pAd->CommonCfg.BACapability.field.AutoBA = TRUE;
2602         else
2603                 return FALSE; //Invalid argument
2604
2605     pAd->CommonCfg.REGBACapability.field.AutoBA = pAd->CommonCfg.BACapability.field.AutoBA;
2606         SetCommonHT(pAd);
2607
2608         DBGPRINT(RT_DEBUG_TRACE, ("Set_HtAutoBa_Proc::(HtAutoBa=%d)\n",pAd->CommonCfg.BACapability.field.AutoBA));
2609
2610         return TRUE;
2611
2612 }
2613
2614 INT     Set_HtProtect_Proc(
2615         IN      PRTMP_ADAPTER   pAd,
2616         IN      PUCHAR                  arg)
2617 {
2618         ULONG Value;
2619
2620         Value = simple_strtol(arg, 0, 10);
2621         if (Value == 0)
2622                 pAd->CommonCfg.bHTProtect = FALSE;
2623     else if (Value == 1)
2624                 pAd->CommonCfg.bHTProtect = TRUE;
2625         else
2626                 return FALSE; //Invalid argument
2627
2628         DBGPRINT(RT_DEBUG_TRACE, ("Set_HtProtect_Proc::(HtProtect=%d)\n",pAd->CommonCfg.bHTProtect));
2629
2630         return TRUE;
2631 }
2632
2633 INT     Set_SendPSMPAction_Proc(
2634         IN      PRTMP_ADAPTER   pAd,
2635         IN      PUCHAR                  arg)
2636 {
2637     UCHAR mac[6], mode;
2638         char *token, sepValue[] = ":", DASH = '-';
2639         INT i;
2640     MAC_TABLE_ENTRY *pEntry;
2641
2642     //printk("\n%s\n", arg);
2643 /*
2644         The BARecTearDown inupt string format should be xx:xx:xx:xx:xx:xx-d,
2645                 =>The six 2 digit hex-decimal number previous are the Mac address,
2646                 =>The seventh decimal number is the mode value.
2647 */
2648     if(strlen(arg) < 19)  //Mac address acceptable format 01:02:03:04:05:06 length 17 plus the "-" and mode value in decimal format.
2649                 return FALSE;
2650
2651         token = strchr(arg, DASH);
2652         if ((token != NULL) && (strlen(token)>1))
2653         {
2654                 mode = simple_strtol((token+1), 0, 10);
2655                 if (mode > MMPS_ENABLE)
2656                         return FALSE;
2657
2658                 *token = '\0';
2659                 for (i = 0, token = rstrtok(arg, &sepValue[0]); token; token = rstrtok(NULL, &sepValue[0]), i++)
2660                 {
2661                         if((strlen(token) != 2) || (!isxdigit(*token)) || (!isxdigit(*(token+1))))
2662                                 return FALSE;
2663                         AtoH(token, (PUCHAR)(&mac[i]), 1);
2664                 }
2665                 if(i != 6)
2666                         return FALSE;
2667
2668                 printk("\n%02x:%02x:%02x:%02x:%02x:%02x-%02x", mac[0], mac[1],
2669                        mac[2], mac[3], mac[4], mac[5], mode);
2670
2671                 pEntry = MacTableLookup(pAd, mac);
2672
2673                 if (pEntry) {
2674                     printk("\nSendPSMPAction MIPS mode = %d\n", mode);
2675                     SendPSMPAction(pAd, pEntry->Aid, mode);
2676                 }
2677
2678                 return TRUE;
2679         }
2680
2681         return FALSE;
2682
2683
2684 }
2685
2686 INT     Set_HtMIMOPSmode_Proc(
2687         IN      PRTMP_ADAPTER   pAd,
2688         IN      PUCHAR                  arg)
2689 {
2690         ULONG Value;
2691
2692         Value = simple_strtol(arg, 0, 10);
2693
2694         if (Value <=3 && Value >= 0)
2695                 pAd->CommonCfg.BACapability.field.MMPSmode = Value;
2696         else
2697                 pAd->CommonCfg.BACapability.field.MMPSmode = 3;
2698
2699         SetCommonHT(pAd);
2700
2701         DBGPRINT(RT_DEBUG_TRACE, ("Set_HtMIMOPSmode_Proc::(MIMOPS mode=%d)\n",pAd->CommonCfg.BACapability.field.MMPSmode));
2702
2703         return TRUE;
2704 }
2705
2706
2707 INT     Set_ForceShortGI_Proc(
2708         IN      PRTMP_ADAPTER   pAd,
2709         IN      PUCHAR                  arg)
2710 {
2711         ULONG Value;
2712
2713         Value = simple_strtol(arg, 0, 10);
2714         if (Value == 0)
2715                 pAd->WIFItestbed.bShortGI = FALSE;
2716         else if (Value == 1)
2717                 pAd->WIFItestbed.bShortGI = TRUE;
2718         else
2719                 return FALSE; //Invalid argument
2720
2721         SetCommonHT(pAd);
2722
2723         DBGPRINT(RT_DEBUG_TRACE, ("Set_ForceShortGI_Proc::(ForceShortGI=%d)\n", pAd->WIFItestbed.bShortGI));
2724
2725         return TRUE;
2726 }
2727
2728
2729
2730 INT     Set_ForceGF_Proc(
2731         IN      PRTMP_ADAPTER   pAd,
2732         IN      PUCHAR                  arg)
2733 {
2734         ULONG Value;
2735
2736         Value = simple_strtol(arg, 0, 10);
2737         if (Value == 0)
2738                 pAd->WIFItestbed.bGreenField = FALSE;
2739         else if (Value == 1)
2740                 pAd->WIFItestbed.bGreenField = TRUE;
2741         else
2742                 return FALSE; //Invalid argument
2743
2744         SetCommonHT(pAd);
2745
2746         DBGPRINT(RT_DEBUG_TRACE, ("Set_ForceGF_Proc::(ForceGF=%d)\n", pAd->WIFItestbed.bGreenField));
2747
2748         return TRUE;
2749 }
2750
2751 INT     Set_HtMimoPs_Proc(
2752         IN      PRTMP_ADAPTER   pAd,
2753         IN      PUCHAR                  arg)
2754 {
2755         ULONG Value;
2756
2757         Value = simple_strtol(arg, 0, 10);
2758         if (Value == 0)
2759                 pAd->CommonCfg.bMIMOPSEnable = FALSE;
2760         else if (Value == 1)
2761                 pAd->CommonCfg.bMIMOPSEnable = TRUE;
2762         else
2763                 return FALSE; //Invalid argument
2764
2765         DBGPRINT(RT_DEBUG_TRACE, ("Set_HtMimoPs_Proc::(HtMimoPs=%d)\n",pAd->CommonCfg.bMIMOPSEnable));
2766
2767         return TRUE;
2768 }
2769 #endif // DOT11_N_SUPPORT //
2770
2771
2772 #ifdef DOT11_N_SUPPORT
2773 INT     SetCommonHT(
2774         IN      PRTMP_ADAPTER   pAd)
2775 {
2776         OID_SET_HT_PHYMODE              SetHT;
2777
2778         if (pAd->CommonCfg.PhyMode < PHY_11ABGN_MIXED)
2779                 return FALSE;
2780
2781         SetHT.PhyMode = pAd->CommonCfg.PhyMode;
2782         SetHT.TransmitNo = ((UCHAR)pAd->Antenna.field.TxPath);
2783         SetHT.HtMode = (UCHAR)pAd->CommonCfg.RegTransmitSetting.field.HTMODE;
2784         SetHT.ExtOffset = (UCHAR)pAd->CommonCfg.RegTransmitSetting.field.EXTCHA;
2785         SetHT.MCS = MCS_AUTO;
2786         SetHT.BW = (UCHAR)pAd->CommonCfg.RegTransmitSetting.field.BW;
2787         SetHT.STBC = (UCHAR)pAd->CommonCfg.RegTransmitSetting.field.STBC;
2788         SetHT.SHORTGI = (UCHAR)pAd->CommonCfg.RegTransmitSetting.field.ShortGI;
2789
2790         RTMPSetHT(pAd, &SetHT);
2791
2792         return TRUE;
2793 }
2794 #endif // DOT11_N_SUPPORT //
2795
2796 INT     Set_FixedTxMode_Proc(
2797         IN      PRTMP_ADAPTER   pAd,
2798         IN      PUCHAR                  arg)
2799 {
2800         UCHAR   fix_tx_mode = FIXED_TXMODE_HT;
2801
2802         if (strcmp(arg, "OFDM") == 0 || strcmp(arg, "ofdm") == 0)
2803         {
2804                 fix_tx_mode = FIXED_TXMODE_OFDM;
2805         }
2806         else if (strcmp(arg, "CCK") == 0 || strcmp(arg, "cck") == 0)
2807         {
2808         fix_tx_mode = FIXED_TXMODE_CCK;
2809         }
2810
2811 #ifdef CONFIG_STA_SUPPORT
2812         IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
2813                 pAd->StaCfg.DesiredTransmitSetting.field.FixedTxMode = fix_tx_mode;
2814 #endif // CONFIG_STA_SUPPORT //
2815
2816         DBGPRINT(RT_DEBUG_TRACE, ("Set_FixedTxMode_Proc::(FixedTxMode=%d)\n", fix_tx_mode));
2817
2818         return TRUE;
2819 }
2820
2821 #ifdef CONFIG_APSTA_MIXED_SUPPORT
2822 INT     Set_OpMode_Proc(
2823         IN      PRTMP_ADAPTER   pAd,
2824         IN      PUCHAR                  arg)
2825 {
2826         ULONG Value;
2827
2828         Value = simple_strtol(arg, 0, 10);
2829
2830 #ifdef RT2860
2831         if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE))
2832 #endif // RT2860 //
2833         {
2834                 DBGPRINT(RT_DEBUG_ERROR, ("Can not switch operate mode on interface up !! \n"));
2835                 return FALSE;
2836         }
2837
2838         if (Value == 0)
2839                 pAd->OpMode = OPMODE_STA;
2840         else if (Value == 1)
2841                 pAd->OpMode = OPMODE_AP;
2842         else
2843                 return FALSE; //Invalid argument
2844
2845         DBGPRINT(RT_DEBUG_TRACE, ("Set_OpMode_Proc::(OpMode=%s)\n", pAd->OpMode == 1 ? "AP Mode" : "STA Mode"));
2846
2847         return TRUE;
2848 }
2849 #endif // CONFIG_APSTA_MIXED_SUPPORT //
2850
2851
2852 /////////////////////////////////////////////////////////////////////////
2853 PCHAR   RTMPGetRalinkAuthModeStr(
2854     IN  NDIS_802_11_AUTHENTICATION_MODE authMode)
2855 {
2856         switch(authMode)
2857         {
2858                 case Ndis802_11AuthModeOpen:
2859                         return "OPEN";
2860         default:
2861                 case Ndis802_11AuthModeWPAPSK:
2862                         return "WPAPSK";
2863                 case Ndis802_11AuthModeShared:
2864                         return "SHARED";
2865                 case Ndis802_11AuthModeWPA:
2866                         return "WPA";
2867                 case Ndis802_11AuthModeWPA2:
2868                         return "WPA2";
2869                 case Ndis802_11AuthModeWPA2PSK:
2870                         return "WPA2PSK";
2871         case Ndis802_11AuthModeWPA1PSKWPA2PSK:
2872                         return "WPAPSKWPA2PSK";
2873         case Ndis802_11AuthModeWPA1WPA2:
2874                         return "WPA1WPA2";
2875                 case Ndis802_11AuthModeWPANone:
2876                         return "WPANONE";
2877         }
2878 }
2879
2880 PCHAR   RTMPGetRalinkEncryModeStr(
2881     IN  USHORT encryMode)
2882 {
2883         switch(encryMode)
2884         {
2885             default:
2886                 case Ndis802_11WEPDisabled:
2887                         return "NONE";
2888                 case Ndis802_11WEPEnabled:
2889                         return "WEP";
2890                 case Ndis802_11Encryption2Enabled:
2891                         return "TKIP";
2892                 case Ndis802_11Encryption3Enabled:
2893                         return "AES";
2894         case Ndis802_11Encryption4Enabled:
2895                         return "TKIPAES";
2896         }
2897 }
2898
2899 INT RTMPShowCfgValue(
2900         IN      PRTMP_ADAPTER   pAd,
2901         IN      PUCHAR                  pName,
2902         IN      PUCHAR                  pBuf)
2903 {
2904         INT     Status = 0;
2905
2906         for (PRTMP_PRIVATE_STA_SHOW_CFG_VALUE_PROC = RTMP_PRIVATE_STA_SHOW_CFG_VALUE_PROC; PRTMP_PRIVATE_STA_SHOW_CFG_VALUE_PROC->name; PRTMP_PRIVATE_STA_SHOW_CFG_VALUE_PROC++)
2907         {
2908                 if (!strcmp(pName, PRTMP_PRIVATE_STA_SHOW_CFG_VALUE_PROC->name))
2909                 {
2910                         if(PRTMP_PRIVATE_STA_SHOW_CFG_VALUE_PROC->show_proc(pAd, pBuf))
2911                                 Status = -EINVAL;
2912                         break;  //Exit for loop.
2913                 }
2914         }
2915
2916         if(PRTMP_PRIVATE_STA_SHOW_CFG_VALUE_PROC->name == NULL)
2917         {
2918                 sprintf(pBuf, "\n");
2919                 for (PRTMP_PRIVATE_STA_SHOW_CFG_VALUE_PROC = RTMP_PRIVATE_STA_SHOW_CFG_VALUE_PROC; PRTMP_PRIVATE_STA_SHOW_CFG_VALUE_PROC->name; PRTMP_PRIVATE_STA_SHOW_CFG_VALUE_PROC++)
2920                         sprintf(pBuf, "%s%s\n", pBuf, PRTMP_PRIVATE_STA_SHOW_CFG_VALUE_PROC->name);
2921         }
2922
2923         return Status;
2924 }
2925
2926 INT     Show_SSID_Proc(
2927         IN      PRTMP_ADAPTER   pAd,
2928         OUT     PUCHAR                  pBuf)
2929 {
2930
2931 #ifdef CONFIG_STA_SUPPORT
2932         IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
2933                 sprintf(pBuf, "\t%s", pAd->CommonCfg.Ssid);
2934 #endif // CONFIG_STA_SUPPORT //
2935         return 0;
2936 }
2937
2938 INT     Show_WirelessMode_Proc(
2939         IN      PRTMP_ADAPTER   pAd,
2940         OUT     PUCHAR                  pBuf)
2941 {
2942         switch(pAd->CommonCfg.PhyMode)
2943         {
2944                 case PHY_11BG_MIXED:
2945                         sprintf(pBuf, "\t11B/G");
2946                         break;
2947                 case PHY_11B:
2948                         sprintf(pBuf, "\t11B");
2949                         break;
2950                 case PHY_11A:
2951                         sprintf(pBuf, "\t11A");
2952                         break;
2953                 case PHY_11ABG_MIXED:
2954                         sprintf(pBuf, "\t11A/B/G");
2955                         break;
2956                 case PHY_11G:
2957                         sprintf(pBuf, "\t11G");
2958                         break;
2959 #ifdef DOT11_N_SUPPORT
2960                 case PHY_11ABGN_MIXED:
2961                         sprintf(pBuf, "\t11A/B/G/N");
2962                         break;
2963                 case PHY_11N_2_4G:
2964                         sprintf(pBuf, "\t11N only with 2.4G");
2965                         break;
2966                 case PHY_11GN_MIXED:
2967                         sprintf(pBuf, "\t11G/N");
2968                         break;
2969                 case PHY_11AN_MIXED:
2970                         sprintf(pBuf, "\t11A/N");
2971                         break;
2972                 case PHY_11BGN_MIXED:
2973                         sprintf(pBuf, "\t11B/G/N");
2974                         break;
2975                 case PHY_11AGN_MIXED:
2976                         sprintf(pBuf, "\t11A/G/N");
2977                         break;
2978                 case PHY_11N_5G:
2979                         sprintf(pBuf, "\t11N only with 5G");
2980                         break;
2981 #endif // DOT11_N_SUPPORT //
2982                 default:
2983                         sprintf(pBuf, "\tUnknow Value(%d)", pAd->CommonCfg.PhyMode);
2984                         break;
2985         }
2986         return 0;
2987 }
2988
2989
2990 INT     Show_TxBurst_Proc(
2991         IN      PRTMP_ADAPTER   pAd,
2992         OUT     PUCHAR                  pBuf)
2993 {
2994         sprintf(pBuf, "\t%s", pAd->CommonCfg.bEnableTxBurst ? "TRUE":"FALSE");
2995         return 0;
2996 }
2997
2998 INT     Show_TxPreamble_Proc(
2999         IN      PRTMP_ADAPTER   pAd,
3000         OUT     PUCHAR                  pBuf)
3001 {
3002         switch(pAd->CommonCfg.TxPreamble)
3003         {
3004                 case Rt802_11PreambleShort:
3005                         sprintf(pBuf, "\tShort");
3006                         break;
3007                 case Rt802_11PreambleLong:
3008                         sprintf(pBuf, "\tLong");
3009                         break;
3010                 case Rt802_11PreambleAuto:
3011                         sprintf(pBuf, "\tAuto");
3012                         break;
3013                 default:
3014                         sprintf(pBuf, "\tUnknow Value(%lu)", pAd->CommonCfg.TxPreamble);
3015                         break;
3016         }
3017
3018         return 0;
3019 }
3020
3021 INT     Show_TxPower_Proc(
3022         IN      PRTMP_ADAPTER   pAd,
3023         OUT     PUCHAR                  pBuf)
3024 {
3025         sprintf(pBuf, "\t%lu", pAd->CommonCfg.TxPowerPercentage);
3026         return 0;
3027 }
3028
3029 INT     Show_Channel_Proc(
3030         IN      PRTMP_ADAPTER   pAd,
3031         OUT     PUCHAR                  pBuf)
3032 {
3033         sprintf(pBuf, "\t%d", pAd->CommonCfg.Channel);
3034         return 0;
3035 }
3036
3037 INT     Show_BGProtection_Proc(
3038         IN      PRTMP_ADAPTER   pAd,
3039         OUT     PUCHAR                  pBuf)
3040 {
3041         switch(pAd->CommonCfg.UseBGProtection)
3042         {
3043                 case 1: //Always On
3044                         sprintf(pBuf, "\tON");
3045                         break;
3046                 case 2: //Always OFF
3047                         sprintf(pBuf, "\tOFF");
3048                         break;
3049                 case 0: //AUTO
3050                         sprintf(pBuf, "\tAuto");
3051                         break;
3052                 default:
3053                         sprintf(pBuf, "\tUnknow Value(%lu)", pAd->CommonCfg.UseBGProtection);
3054                         break;
3055         }
3056         return 0;
3057 }
3058
3059 INT     Show_RTSThreshold_Proc(
3060         IN      PRTMP_ADAPTER   pAd,
3061         OUT     PUCHAR                  pBuf)
3062 {
3063         sprintf(pBuf, "\t%u", pAd->CommonCfg.RtsThreshold);
3064         return 0;
3065 }
3066
3067 INT     Show_FragThreshold_Proc(
3068         IN      PRTMP_ADAPTER   pAd,
3069         OUT     PUCHAR                  pBuf)
3070 {
3071         sprintf(pBuf, "\t%u", pAd->CommonCfg.FragmentThreshold);
3072         return 0;
3073 }
3074
3075 #ifdef DOT11_N_SUPPORT
3076 INT     Show_HtBw_Proc(
3077         IN      PRTMP_ADAPTER   pAd,
3078         OUT     PUCHAR                  pBuf)
3079 {
3080         if (pAd->CommonCfg.RegTransmitSetting.field.BW == BW_40)
3081         {
3082                 sprintf(pBuf, "\t40 MHz");
3083         }
3084         else
3085         {
3086         sprintf(pBuf, "\t20 MHz");
3087         }
3088         return 0;
3089 }
3090
3091 INT     Show_HtMcs_Proc(
3092         IN      PRTMP_ADAPTER   pAd,
3093         OUT     PUCHAR                  pBuf)
3094 {
3095
3096 #ifdef CONFIG_STA_SUPPORT
3097         IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
3098                 sprintf(pBuf, "\t%u", pAd->StaCfg.DesiredTransmitSetting.field.MCS);
3099 #endif // CONFIG_STA_SUPPORT //
3100         return 0;
3101 }
3102
3103 INT     Show_HtGi_Proc(
3104         IN      PRTMP_ADAPTER   pAd,
3105         OUT     PUCHAR                  pBuf)
3106 {
3107         switch(pAd->CommonCfg.RegTransmitSetting.field.ShortGI)
3108         {
3109                 case GI_400:
3110                         sprintf(pBuf, "\tGI_400");
3111                         break;
3112                 case GI_800:
3113                         sprintf(pBuf, "\tGI_800");
3114                         break;
3115                 default:
3116                         sprintf(pBuf, "\tUnknow Value(%u)", pAd->CommonCfg.RegTransmitSetting.field.ShortGI);
3117                         break;
3118         }
3119         return 0;
3120 }
3121
3122 INT     Show_HtOpMode_Proc(
3123         IN      PRTMP_ADAPTER   pAd,
3124         OUT     PUCHAR                  pBuf)
3125 {
3126         switch(pAd->CommonCfg.RegTransmitSetting.field.HTMODE)
3127         {
3128                 case HTMODE_GF:
3129                         sprintf(pBuf, "\tGF");
3130                         break;
3131                 case HTMODE_MM:
3132                         sprintf(pBuf, "\tMM");
3133                         break;
3134                 default:
3135                         sprintf(pBuf, "\tUnknow Value(%u)", pAd->CommonCfg.RegTransmitSetting.field.HTMODE);
3136                         break;
3137         }
3138         return 0;
3139 }
3140
3141 INT     Show_HtExtcha_Proc(
3142         IN      PRTMP_ADAPTER   pAd,
3143         OUT     PUCHAR                  pBuf)
3144 {
3145         switch(pAd->CommonCfg.RegTransmitSetting.field.EXTCHA)
3146         {
3147                 case EXTCHA_BELOW:
3148                         sprintf(pBuf, "\tBelow");
3149                         break;
3150                 case EXTCHA_ABOVE:
3151                         sprintf(pBuf, "\tAbove");
3152                         break;
3153                 default:
3154                         sprintf(pBuf, "\tUnknow Value(%u)", pAd->CommonCfg.RegTransmitSetting.field.EXTCHA);
3155                         break;
3156         }
3157         return 0;
3158 }
3159
3160
3161 INT     Show_HtMpduDensity_Proc(
3162         IN      PRTMP_ADAPTER   pAd,
3163         OUT     PUCHAR                  pBuf)
3164 {
3165         sprintf(pBuf, "\t%u", pAd->CommonCfg.BACapability.field.MpduDensity);
3166         return 0;
3167 }
3168
3169 INT     Show_HtBaWinSize_Proc(
3170         IN      PRTMP_ADAPTER   pAd,
3171         OUT     PUCHAR                  pBuf)
3172 {
3173         sprintf(pBuf, "\t%u", pAd->CommonCfg.BACapability.field.RxBAWinLimit);
3174         return 0;
3175 }
3176
3177 INT     Show_HtRdg_Proc(
3178         IN      PRTMP_ADAPTER   pAd,
3179         OUT     PUCHAR                  pBuf)
3180 {
3181         sprintf(pBuf, "\t%s", pAd->CommonCfg.bRdg ? "TRUE":"FALSE");
3182         return 0;
3183 }
3184
3185 INT     Show_HtAmsdu_Proc(
3186         IN      PRTMP_ADAPTER   pAd,
3187         OUT     PUCHAR                  pBuf)
3188 {
3189         sprintf(pBuf, "\t%s", pAd->CommonCfg.BACapability.field.AmsduEnable ? "TRUE":"FALSE");
3190         return 0;
3191 }
3192
3193 INT     Show_HtAutoBa_Proc(
3194         IN      PRTMP_ADAPTER   pAd,
3195         OUT     PUCHAR                  pBuf)
3196 {
3197         sprintf(pBuf, "\t%s", pAd->CommonCfg.BACapability.field.AutoBA ? "TRUE":"FALSE");
3198         return 0;
3199 }
3200 #endif // DOT11_N_SUPPORT //
3201
3202 INT     Show_CountryRegion_Proc(
3203         IN      PRTMP_ADAPTER   pAd,
3204         OUT     PUCHAR                  pBuf)
3205 {
3206         sprintf(pBuf, "\t%d", pAd->CommonCfg.CountryRegion);
3207         return 0;
3208 }
3209
3210 INT     Show_CountryRegionABand_Proc(
3211         IN      PRTMP_ADAPTER   pAd,
3212         OUT     PUCHAR                  pBuf)
3213 {
3214         sprintf(pBuf, "\t%d", pAd->CommonCfg.CountryRegionForABand);
3215         return 0;
3216 }
3217
3218 INT     Show_CountryCode_Proc(
3219         IN      PRTMP_ADAPTER   pAd,
3220         OUT     PUCHAR                  pBuf)
3221 {
3222         sprintf(pBuf, "\t%s", pAd->CommonCfg.CountryCode);
3223         return 0;
3224 }
3225
3226 #ifdef AGGREGATION_SUPPORT
3227 INT     Show_PktAggregate_Proc(
3228         IN      PRTMP_ADAPTER   pAd,
3229         OUT     PUCHAR                  pBuf)
3230 {
3231         sprintf(pBuf, "\t%s", pAd->CommonCfg.bAggregationCapable ? "TRUE":"FALSE");
3232         return 0;
3233 }
3234 #endif // AGGREGATION_SUPPORT //
3235
3236 #ifdef WMM_SUPPORT
3237 INT     Show_WmmCapable_Proc(
3238         IN      PRTMP_ADAPTER   pAd,
3239         OUT     PUCHAR                  pBuf)
3240 {
3241
3242 #ifdef CONFIG_STA_SUPPORT
3243         IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
3244                 sprintf(pBuf, "\t%s", pAd->CommonCfg.bWmmCapable ? "TRUE":"FALSE");
3245 #endif // CONFIG_STA_SUPPORT //
3246
3247         return 0;
3248 }
3249 #endif // WMM_SUPPORT //
3250
3251 INT     Show_IEEE80211H_Proc(
3252         IN      PRTMP_ADAPTER   pAd,
3253         OUT     PUCHAR                  pBuf)
3254 {
3255         sprintf(pBuf, "\t%s", pAd->CommonCfg.bIEEE80211H ? "TRUE":"FALSE");
3256         return 0;
3257 }
3258
3259 #ifdef CONFIG_STA_SUPPORT
3260 INT     Show_NetworkType_Proc(
3261         IN      PRTMP_ADAPTER   pAd,
3262         OUT     PUCHAR                  pBuf)
3263 {
3264         switch(pAd->StaCfg.BssType)
3265         {
3266                 case BSS_ADHOC:
3267                         sprintf(pBuf, "\tAdhoc");
3268                         break;
3269                 case BSS_INFRA:
3270                         sprintf(pBuf, "\tInfra");
3271                         break;
3272                 case BSS_ANY:
3273                         sprintf(pBuf, "\tAny");
3274                         break;
3275                 case BSS_MONITOR:
3276                         sprintf(pBuf, "\tMonitor");
3277                         break;
3278                 default:
3279                         sprintf(pBuf, "\tUnknow Value(%d)", pAd->StaCfg.BssType);
3280                         break;
3281         }
3282         return 0;
3283 }
3284 #endif // CONFIG_STA_SUPPORT //
3285
3286 INT     Show_AuthMode_Proc(
3287         IN      PRTMP_ADAPTER   pAd,
3288         OUT     PUCHAR                  pBuf)
3289 {
3290         NDIS_802_11_AUTHENTICATION_MODE AuthMode = Ndis802_11AuthModeOpen;
3291
3292 #ifdef CONFIG_STA_SUPPORT
3293         IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
3294                 AuthMode = pAd->StaCfg.AuthMode;
3295 #endif // CONFIG_STA_SUPPORT //
3296
3297         if ((AuthMode >= Ndis802_11AuthModeOpen) &&
3298                 (AuthMode <= Ndis802_11AuthModeWPA1PSKWPA2PSK))
3299                 sprintf(pBuf, "\t%s", RTMPGetRalinkAuthModeStr(AuthMode));
3300         else
3301                 sprintf(pBuf, "\tUnknow Value(%d)", AuthMode);
3302
3303         return 0;
3304 }
3305
3306 INT     Show_EncrypType_Proc(
3307         IN      PRTMP_ADAPTER   pAd,
3308         OUT     PUCHAR                  pBuf)
3309 {
3310         NDIS_802_11_WEP_STATUS  WepStatus = Ndis802_11WEPDisabled;
3311
3312 #ifdef CONFIG_STA_SUPPORT
3313         IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
3314                 WepStatus = pAd->StaCfg.WepStatus;
3315 #endif // CONFIG_STA_SUPPORT //
3316
3317         if ((WepStatus >= Ndis802_11WEPEnabled) &&
3318                 (WepStatus <= Ndis802_11Encryption4KeyAbsent))
3319                 sprintf(pBuf, "\t%s", RTMPGetRalinkEncryModeStr(WepStatus));
3320         else
3321                 sprintf(pBuf, "\tUnknow Value(%d)", WepStatus);
3322
3323         return 0;
3324 }
3325
3326 INT     Show_DefaultKeyID_Proc(
3327         IN      PRTMP_ADAPTER   pAd,
3328         OUT     PUCHAR                  pBuf)
3329 {
3330         UCHAR DefaultKeyId = 0;
3331
3332 #ifdef CONFIG_STA_SUPPORT
3333         IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
3334                 DefaultKeyId = pAd->StaCfg.DefaultKeyId;
3335 #endif // CONFIG_STA_SUPPORT //
3336
3337         sprintf(pBuf, "\t%d", DefaultKeyId);
3338
3339         return 0;
3340 }
3341
3342 INT     Show_WepKey_Proc(
3343         IN      PRTMP_ADAPTER   pAd,
3344         IN  INT                         KeyIdx,
3345         OUT     PUCHAR                  pBuf)
3346 {
3347         UCHAR   Key[16] = {0}, KeyLength = 0;
3348         INT             index = BSS0;
3349
3350         KeyLength = pAd->SharedKey[index][KeyIdx].KeyLen;
3351         NdisMoveMemory(Key, pAd->SharedKey[index][KeyIdx].Key, KeyLength);
3352
3353         //check key string is ASCII or not
3354     if (RTMPCheckStrPrintAble(Key, KeyLength))
3355         sprintf(pBuf, "\t%s", Key);
3356     else
3357     {
3358         int idx;
3359         sprintf(pBuf, "\t");
3360         for (idx = 0; idx < KeyLength; idx++)
3361             sprintf(pBuf+strlen(pBuf), "%02X", Key[idx]);
3362     }
3363         return 0;
3364 }
3365
3366 INT     Show_Key1_Proc(
3367         IN      PRTMP_ADAPTER   pAd,
3368         OUT     PUCHAR                  pBuf)
3369 {
3370         Show_WepKey_Proc(pAd, 0, pBuf);
3371         return 0;
3372 }
3373
3374 INT     Show_Key2_Proc(
3375         IN      PRTMP_ADAPTER   pAd,
3376         OUT     PUCHAR                  pBuf)
3377 {
3378         Show_WepKey_Proc(pAd, 1, pBuf);
3379         return 0;
3380 }
3381
3382 INT     Show_Key3_Proc(
3383         IN      PRTMP_ADAPTER   pAd,
3384         OUT     PUCHAR                  pBuf)
3385 {
3386         Show_WepKey_Proc(pAd, 2, pBuf);
3387         return 0;
3388 }
3389
3390 INT     Show_Key4_Proc(
3391         IN      PRTMP_ADAPTER   pAd,
3392         OUT     PUCHAR                  pBuf)
3393 {
3394         Show_WepKey_Proc(pAd, 3, pBuf);
3395         return 0;
3396 }
3397
3398 INT     Show_WPAPSK_Proc(
3399         IN      PRTMP_ADAPTER   pAd,
3400         OUT     PUCHAR                  pBuf)
3401 {
3402         INT     idx;
3403         UCHAR   PMK[32] = {0};
3404
3405
3406 #ifdef CONFIG_STA_SUPPORT
3407         IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
3408                 NdisMoveMemory(PMK, pAd->StaCfg.PMK, 32);
3409 #endif // CONFIG_STA_SUPPORT //
3410
3411     sprintf(pBuf, "\tPMK = ");
3412     for (idx = 0; idx < 32; idx++)
3413         sprintf(pBuf+strlen(pBuf), "%02X", PMK[idx]);
3414
3415         return 0;
3416 }
3417