Staging: rt2860: remove dead CONFIG_APSTA_MIXED_SUPPORT code
[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         INT i, QueIdx=0;
818         PRT28XX_RXD_STRUC pRxD;
819     PTXD_STRUC pTxD;
820         PRTMP_TX_RING   pTxRing = &pAd->TxRing[QueIdx];
821         PRTMP_MGMT_RING pMgmtRing = &pAd->MgmtRing;
822         PRTMP_RX_RING   pRxRing = &pAd->RxRing;
823
824         for(i=0;i<TX_RING_SIZE;i++)
825         {
826             pTxD = (PTXD_STRUC) pTxRing->Cell[i].AllocVa;
827             printk("Desc #%d\n",i);
828             hex_dump("Tx Descriptor", (char *)pTxD, 16);
829             printk("pTxD->DMADONE = %x\n", pTxD->DMADONE);
830         }
831         printk("---------------------------------------------------\n");
832         for(i=0;i<MGMT_RING_SIZE;i++)
833         {
834             pTxD = (PTXD_STRUC) pMgmtRing->Cell[i].AllocVa;
835             printk("Desc #%d\n",i);
836             hex_dump("Mgmt Descriptor", (char *)pTxD, 16);
837             printk("pMgmt->DMADONE = %x\n", pTxD->DMADONE);
838         }
839         printk("---------------------------------------------------\n");
840         for(i=0;i<RX_RING_SIZE;i++)
841         {
842             pRxD = (PRT28XX_RXD_STRUC) pRxRing->Cell[i].AllocVa;
843             printk("Desc #%d\n",i);
844             hex_dump("Rx Descriptor", (char *)pRxD, 16);
845                 printk("pRxD->DDONE = %x\n", pRxD->DDONE);
846         }
847
848         return TRUE;
849 }
850
851 /*
852     ==========================================================================
853     Description:
854         Reset statistics counter
855
856     Arguments:
857         pAdapter            Pointer to our adapter
858         arg
859
860     Return:
861         TRUE if all parameters are OK, FALSE otherwise
862     ==========================================================================
863 */
864 INT     Set_ResetStatCounter_Proc(
865         IN      PRTMP_ADAPTER   pAd,
866         IN      PUCHAR                  arg)
867 {
868         DBGPRINT(RT_DEBUG_TRACE, ("==>Set_ResetStatCounter_Proc\n"));
869
870         // add the most up-to-date h/w raw counters into software counters
871         NICUpdateRawCounters(pAd);
872
873         NdisZeroMemory(&pAd->WlanCounters, sizeof(COUNTER_802_11));
874         NdisZeroMemory(&pAd->Counters8023, sizeof(COUNTER_802_3));
875         NdisZeroMemory(&pAd->RalinkCounters, sizeof(COUNTER_RALINK));
876
877         return TRUE;
878 }
879
880 BOOLEAN RTMPCheckStrPrintAble(
881     IN  CHAR *pInPutStr,
882     IN  UCHAR strLen)
883 {
884     UCHAR i=0;
885
886     for (i=0; i<strLen; i++)
887     {
888         if ((pInPutStr[i] < 0x21) ||
889             (pInPutStr[i] > 0x7E))
890             return FALSE;
891     }
892
893     return TRUE;
894 }
895
896 /*
897         ========================================================================
898
899         Routine Description:
900                 Remove WPA Key process
901
902         Arguments:
903                 pAd                                     Pointer to our adapter
904                 pBuf                                                    Pointer to the where the key stored
905
906         Return Value:
907                 NDIS_SUCCESS                                    Add key successfully
908
909         IRQL = DISPATCH_LEVEL
910
911         Note:
912
913         ========================================================================
914 */
915 #ifdef CONFIG_STA_SUPPORT
916 VOID    RTMPSetDesiredRates(
917     IN  PRTMP_ADAPTER   pAdapter,
918     IN  LONG            Rates)
919 {
920     NDIS_802_11_RATES aryRates;
921
922     memset(&aryRates, 0x00, sizeof(NDIS_802_11_RATES));
923     switch (pAdapter->CommonCfg.PhyMode)
924     {
925         case PHY_11A: // A only
926             switch (Rates)
927             {
928                 case 6000000: //6M
929                     aryRates[0] = 0x0c; // 6M
930                     pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_0;
931                     break;
932                 case 9000000: //9M
933                     aryRates[0] = 0x12; // 9M
934                     pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_1;
935                     break;
936                 case 12000000: //12M
937                     aryRates[0] = 0x18; // 12M
938                     pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_2;
939                     break;
940                 case 18000000: //18M
941                     aryRates[0] = 0x24; // 18M
942                     pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_3;
943                     break;
944                 case 24000000: //24M
945                     aryRates[0] = 0x30; // 24M
946                     pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_4;
947                     break;
948                 case 36000000: //36M
949                     aryRates[0] = 0x48; // 36M
950                     pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_5;
951                     break;
952                 case 48000000: //48M
953                     aryRates[0] = 0x60; // 48M
954                     pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_6;
955                     break;
956                 case 54000000: //54M
957                     aryRates[0] = 0x6c; // 54M
958                     pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_7;
959                     break;
960                 case -1: //Auto
961                 default:
962                     aryRates[0] = 0x6c; // 54Mbps
963                     aryRates[1] = 0x60; // 48Mbps
964                     aryRates[2] = 0x48; // 36Mbps
965                     aryRates[3] = 0x30; // 24Mbps
966                     aryRates[4] = 0x24; // 18M
967                     aryRates[5] = 0x18; // 12M
968                     aryRates[6] = 0x12; // 9M
969                     aryRates[7] = 0x0c; // 6M
970                     pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_AUTO;
971                     break;
972             }
973             break;
974         case PHY_11BG_MIXED: // B/G Mixed
975         case PHY_11B: // B only
976         case PHY_11ABG_MIXED: // A/B/G Mixed
977         default:
978             switch (Rates)
979             {
980                 case 1000000: //1M
981                     aryRates[0] = 0x02;
982                     pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_0;
983                     break;
984                 case 2000000: //2M
985                     aryRates[0] = 0x04;
986                     pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_1;
987                     break;
988                 case 5000000: //5.5M
989                     aryRates[0] = 0x0b; // 5.5M
990                     pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_2;
991                     break;
992                 case 11000000: //11M
993                     aryRates[0] = 0x16; // 11M
994                     pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_3;
995                     break;
996                 case 6000000: //6M
997                     aryRates[0] = 0x0c; // 6M
998                     pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_0;
999                     break;
1000                 case 9000000: //9M
1001                     aryRates[0] = 0x12; // 9M
1002                     pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_1;
1003                     break;
1004                 case 12000000: //12M
1005                     aryRates[0] = 0x18; // 12M
1006                     pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_2;
1007                     break;
1008                 case 18000000: //18M
1009                     aryRates[0] = 0x24; // 18M
1010                     pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_3;
1011                     break;
1012                 case 24000000: //24M
1013                     aryRates[0] = 0x30; // 24M
1014                     pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_4;
1015                     break;
1016                 case 36000000: //36M
1017                     aryRates[0] = 0x48; // 36M
1018                     pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_5;
1019                     break;
1020                 case 48000000: //48M
1021                     aryRates[0] = 0x60; // 48M
1022                     pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_6;
1023                     break;
1024                 case 54000000: //54M
1025                     aryRates[0] = 0x6c; // 54M
1026                     pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_7;
1027                     break;
1028                 case -1: //Auto
1029                 default:
1030                     if (pAdapter->CommonCfg.PhyMode == PHY_11B)
1031                     { //B Only
1032                         aryRates[0] = 0x16; // 11Mbps
1033                         aryRates[1] = 0x0b; // 5.5Mbps
1034                         aryRates[2] = 0x04; // 2Mbps
1035                         aryRates[3] = 0x02; // 1Mbps
1036                     }
1037                     else
1038                     { //(B/G) Mixed or (A/B/G) Mixed
1039                         aryRates[0] = 0x6c; // 54Mbps
1040                         aryRates[1] = 0x60; // 48Mbps
1041                         aryRates[2] = 0x48; // 36Mbps
1042                         aryRates[3] = 0x30; // 24Mbps
1043                         aryRates[4] = 0x16; // 11Mbps
1044                         aryRates[5] = 0x0b; // 5.5Mbps
1045                         aryRates[6] = 0x04; // 2Mbps
1046                         aryRates[7] = 0x02; // 1Mbps
1047                     }
1048                     pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_AUTO;
1049                     break;
1050             }
1051             break;
1052     }
1053
1054     NdisZeroMemory(pAdapter->CommonCfg.DesireRate, MAX_LEN_OF_SUPPORTED_RATES);
1055     NdisMoveMemory(pAdapter->CommonCfg.DesireRate, &aryRates, sizeof(NDIS_802_11_RATES));
1056     DBGPRINT(RT_DEBUG_TRACE, (" RTMPSetDesiredRates (%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x)\n",
1057         pAdapter->CommonCfg.DesireRate[0],pAdapter->CommonCfg.DesireRate[1],
1058         pAdapter->CommonCfg.DesireRate[2],pAdapter->CommonCfg.DesireRate[3],
1059         pAdapter->CommonCfg.DesireRate[4],pAdapter->CommonCfg.DesireRate[5],
1060         pAdapter->CommonCfg.DesireRate[6],pAdapter->CommonCfg.DesireRate[7] ));
1061     // Changing DesiredRate may affect the MAX TX rate we used to TX frames out
1062     MlmeUpdateTxRates(pAdapter, FALSE, 0);
1063 }
1064
1065 NDIS_STATUS RTMPWPARemoveKeyProc(
1066         IN      PRTMP_ADAPTER   pAd,
1067         IN      PVOID                   pBuf)
1068 {
1069         PNDIS_802_11_REMOVE_KEY pKey;
1070         ULONG                                   KeyIdx;
1071         NDIS_STATUS                     Status = NDIS_STATUS_FAILURE;
1072         BOOLEAN         bTxKey;                 // Set the key as transmit key
1073         BOOLEAN         bPairwise;              // Indicate the key is pairwise key
1074         BOOLEAN         bKeyRSC;                // indicate the receive  SC set by KeyRSC value.
1075                                                                 // Otherwise, it will set by the NIC.
1076         BOOLEAN         bAuthenticator; // indicate key is set by authenticator.
1077         INT             i;
1078
1079         DBGPRINT(RT_DEBUG_TRACE,("---> RTMPWPARemoveKeyProc\n"));
1080
1081         pKey = (PNDIS_802_11_REMOVE_KEY) pBuf;
1082         KeyIdx = pKey->KeyIndex & 0xff;
1083         // Bit 31 of Add-key, Tx Key
1084         bTxKey             = (pKey->KeyIndex & 0x80000000) ? TRUE : FALSE;
1085         // Bit 30 of Add-key PairwiseKey
1086         bPairwise          = (pKey->KeyIndex & 0x40000000) ? TRUE : FALSE;
1087         // Bit 29 of Add-key KeyRSC
1088         bKeyRSC            = (pKey->KeyIndex & 0x20000000) ? TRUE : FALSE;
1089         // Bit 28 of Add-key Authenticator
1090         bAuthenticator = (pKey->KeyIndex & 0x10000000) ? TRUE : FALSE;
1091
1092         // 1. If bTx is TRUE, return failure information
1093         if (bTxKey == TRUE)
1094                 return(NDIS_STATUS_INVALID_DATA);
1095
1096         // 2. Check Pairwise Key
1097         if (bPairwise)
1098         {
1099                 // a. If BSSID is broadcast, remove all pairwise keys.
1100                 // b. If not broadcast, remove the pairwise specified by BSSID
1101                 for (i = 0; i < SHARE_KEY_NUM; i++)
1102                 {
1103                         if (MAC_ADDR_EQUAL(pAd->SharedKey[BSS0][i].BssId, pKey->BSSID))
1104                         {
1105                                 DBGPRINT(RT_DEBUG_TRACE,("RTMPWPARemoveKeyProc(KeyIdx=%d)\n", i));
1106                                 pAd->SharedKey[BSS0][i].KeyLen = 0;
1107                                 pAd->SharedKey[BSS0][i].CipherAlg = CIPHER_NONE;
1108                                 AsicRemoveSharedKeyEntry(pAd, BSS0, (UCHAR)i);
1109                                 Status = NDIS_STATUS_SUCCESS;
1110                                 break;
1111                         }
1112                 }
1113         }
1114         // 3. Group Key
1115         else
1116         {
1117                 // a. If BSSID is broadcast, remove all group keys indexed
1118                 // b. If BSSID matched, delete the group key indexed.
1119                 DBGPRINT(RT_DEBUG_TRACE,("RTMPWPARemoveKeyProc(KeyIdx=%ld)\n", KeyIdx));
1120                 pAd->SharedKey[BSS0][KeyIdx].KeyLen = 0;
1121                 pAd->SharedKey[BSS0][KeyIdx].CipherAlg = CIPHER_NONE;
1122                 AsicRemoveSharedKeyEntry(pAd, BSS0, (UCHAR)KeyIdx);
1123                 Status = NDIS_STATUS_SUCCESS;
1124         }
1125
1126         return (Status);
1127 }
1128 #endif // CONFIG_STA_SUPPORT //
1129
1130
1131 #ifdef CONFIG_STA_SUPPORT
1132 /*
1133         ========================================================================
1134
1135         Routine Description:
1136                 Remove All WPA Keys
1137
1138         Arguments:
1139                 pAd                                     Pointer to our adapter
1140
1141         Return Value:
1142                 None
1143
1144         IRQL = DISPATCH_LEVEL
1145
1146         Note:
1147
1148         ========================================================================
1149 */
1150 VOID    RTMPWPARemoveAllKeys(
1151         IN      PRTMP_ADAPTER   pAd)
1152 {
1153
1154         UCHAR   i;
1155
1156         DBGPRINT(RT_DEBUG_TRACE,("RTMPWPARemoveAllKeys(AuthMode=%d, WepStatus=%d)\n", pAd->StaCfg.AuthMode, pAd->StaCfg.WepStatus));
1157
1158         // For WEP/CKIP, there is no need to remove it, since WinXP won't set it again after
1159         // Link up. And it will be replaced if user changed it.
1160         if (pAd->StaCfg.AuthMode < Ndis802_11AuthModeWPA)
1161                 return;
1162
1163         // For WPA-None, there is no need to remove it, since WinXP won't set it again after
1164         // Link up. And it will be replaced if user changed it.
1165         if (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPANone)
1166                 return;
1167
1168         // set BSSID wcid entry of the Pair-wise Key table as no-security mode
1169         AsicRemovePairwiseKeyEntry(pAd, BSS0, BSSID_WCID);
1170
1171         // set all shared key mode as no-security.
1172         for (i = 0; i < SHARE_KEY_NUM; i++)
1173     {
1174                 DBGPRINT(RT_DEBUG_TRACE,("remove %s key #%d\n", CipherName[pAd->SharedKey[BSS0][i].CipherAlg], i));
1175                 NdisZeroMemory(&pAd->SharedKey[BSS0][i], sizeof(CIPHER_KEY));
1176
1177                 AsicRemoveSharedKeyEntry(pAd, BSS0, i);
1178         }
1179
1180 }
1181 #endif // CONFIG_STA_SUPPORT //
1182
1183 /*
1184         ========================================================================
1185         Routine Description:
1186                 Change NIC PHY mode. Re-association may be necessary. possible settings
1187                 include - PHY_11B, PHY_11BG_MIXED, PHY_11A, and PHY_11ABG_MIXED
1188
1189         Arguments:
1190                 pAd - Pointer to our adapter
1191                 phymode  -
1192
1193         IRQL = PASSIVE_LEVEL
1194         IRQL = DISPATCH_LEVEL
1195
1196         ========================================================================
1197 */
1198 VOID    RTMPSetPhyMode(
1199         IN      PRTMP_ADAPTER   pAd,
1200         IN      ULONG phymode)
1201 {
1202         INT i;
1203         // the selected phymode must be supported by the RF IC encoded in E2PROM
1204
1205         // if no change, do nothing
1206         /* bug fix
1207         if (pAd->CommonCfg.PhyMode == phymode)
1208                 return;
1209     */
1210         pAd->CommonCfg.PhyMode = (UCHAR)phymode;
1211
1212         DBGPRINT(RT_DEBUG_TRACE,("RTMPSetPhyMode : PhyMode=%d, channel=%d \n", pAd->CommonCfg.PhyMode, pAd->CommonCfg.Channel));
1213 #ifdef EXT_BUILD_CHANNEL_LIST
1214         BuildChannelListEx(pAd);
1215 #else
1216         BuildChannelList(pAd);
1217 #endif // EXT_BUILD_CHANNEL_LIST //
1218
1219         // sanity check user setting
1220         for (i = 0; i < pAd->ChannelListNum; i++)
1221         {
1222                 if (pAd->CommonCfg.Channel == pAd->ChannelList[i].Channel)
1223                         break;
1224         }
1225
1226         if (i == pAd->ChannelListNum)
1227         {
1228 #ifdef CONFIG_STA_SUPPORT
1229                 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1230                         pAd->CommonCfg.Channel = FirstChannel(pAd);
1231 #endif // CONFIG_STA_SUPPORT //
1232                 DBGPRINT(RT_DEBUG_ERROR, ("RTMPSetPhyMode: channel is out of range, use first channel=%d \n", pAd->CommonCfg.Channel));
1233         }
1234
1235         NdisZeroMemory(pAd->CommonCfg.SupRate, MAX_LEN_OF_SUPPORTED_RATES);
1236         NdisZeroMemory(pAd->CommonCfg.ExtRate, MAX_LEN_OF_SUPPORTED_RATES);
1237         NdisZeroMemory(pAd->CommonCfg.DesireRate, MAX_LEN_OF_SUPPORTED_RATES);
1238         switch (phymode) {
1239                 case PHY_11B:
1240                         pAd->CommonCfg.SupRate[0]  = 0x82;        // 1 mbps, in units of 0.5 Mbps, basic rate
1241                         pAd->CommonCfg.SupRate[1]  = 0x84;        // 2 mbps, in units of 0.5 Mbps, basic rate
1242                         pAd->CommonCfg.SupRate[2]  = 0x8B;        // 5.5 mbps, in units of 0.5 Mbps, basic rate
1243                         pAd->CommonCfg.SupRate[3]  = 0x96;        // 11 mbps, in units of 0.5 Mbps, basic rate
1244                         pAd->CommonCfg.SupRateLen  = 4;
1245                         pAd->CommonCfg.ExtRateLen  = 0;
1246                         pAd->CommonCfg.DesireRate[0]  = 2;         // 1 mbps, in units of 0.5 Mbps
1247                         pAd->CommonCfg.DesireRate[1]  = 4;         // 2 mbps, in units of 0.5 Mbps
1248                         pAd->CommonCfg.DesireRate[2]  = 11;    // 5.5 mbps, in units of 0.5 Mbps
1249                         pAd->CommonCfg.DesireRate[3]  = 22;    // 11 mbps, in units of 0.5 Mbps
1250                         //pAd->CommonCfg.HTPhyMode.field.MODE = MODE_CCK; // This MODE is only FYI. not use
1251                         break;
1252
1253                 case PHY_11G:
1254                 case PHY_11BG_MIXED:
1255                 case PHY_11ABG_MIXED:
1256 #ifdef DOT11_N_SUPPORT
1257                 case PHY_11N_2_4G:
1258                 case PHY_11ABGN_MIXED:
1259                 case PHY_11BGN_MIXED:
1260                 case PHY_11GN_MIXED:
1261 #endif // DOT11_N_SUPPORT //
1262                         pAd->CommonCfg.SupRate[0]  = 0x82;        // 1 mbps, in units of 0.5 Mbps, basic rate
1263                         pAd->CommonCfg.SupRate[1]  = 0x84;        // 2 mbps, in units of 0.5 Mbps, basic rate
1264                         pAd->CommonCfg.SupRate[2]  = 0x8B;        // 5.5 mbps, in units of 0.5 Mbps, basic rate
1265                         pAd->CommonCfg.SupRate[3]  = 0x96;        // 11 mbps, in units of 0.5 Mbps, basic rate
1266                         pAd->CommonCfg.SupRate[4]  = 0x12;        // 9 mbps, in units of 0.5 Mbps
1267                         pAd->CommonCfg.SupRate[5]  = 0x24;        // 18 mbps, in units of 0.5 Mbps
1268                         pAd->CommonCfg.SupRate[6]  = 0x48;        // 36 mbps, in units of 0.5 Mbps
1269                         pAd->CommonCfg.SupRate[7]  = 0x6c;        // 54 mbps, in units of 0.5 Mbps
1270                         pAd->CommonCfg.SupRateLen  = 8;
1271                         pAd->CommonCfg.ExtRate[0]  = 0x0C;        // 6 mbps, in units of 0.5 Mbps
1272                         pAd->CommonCfg.ExtRate[1]  = 0x18;        // 12 mbps, in units of 0.5 Mbps
1273                         pAd->CommonCfg.ExtRate[2]  = 0x30;        // 24 mbps, in units of 0.5 Mbps
1274                         pAd->CommonCfg.ExtRate[3]  = 0x60;        // 48 mbps, in units of 0.5 Mbps
1275                         pAd->CommonCfg.ExtRateLen  = 4;
1276                         pAd->CommonCfg.DesireRate[0]  = 2;         // 1 mbps, in units of 0.5 Mbps
1277                         pAd->CommonCfg.DesireRate[1]  = 4;         // 2 mbps, in units of 0.5 Mbps
1278                         pAd->CommonCfg.DesireRate[2]  = 11;    // 5.5 mbps, in units of 0.5 Mbps
1279                         pAd->CommonCfg.DesireRate[3]  = 22;    // 11 mbps, in units of 0.5 Mbps
1280                         pAd->CommonCfg.DesireRate[4]  = 12;    // 6 mbps, in units of 0.5 Mbps
1281                         pAd->CommonCfg.DesireRate[5]  = 18;    // 9 mbps, in units of 0.5 Mbps
1282                         pAd->CommonCfg.DesireRate[6]  = 24;    // 12 mbps, in units of 0.5 Mbps
1283                         pAd->CommonCfg.DesireRate[7]  = 36;    // 18 mbps, in units of 0.5 Mbps
1284                         pAd->CommonCfg.DesireRate[8]  = 48;    // 24 mbps, in units of 0.5 Mbps
1285                         pAd->CommonCfg.DesireRate[9]  = 72;    // 36 mbps, in units of 0.5 Mbps
1286                         pAd->CommonCfg.DesireRate[10] = 96;    // 48 mbps, in units of 0.5 Mbps
1287                         pAd->CommonCfg.DesireRate[11] = 108;   // 54 mbps, in units of 0.5 Mbps
1288                         break;
1289
1290                 case PHY_11A:
1291 #ifdef DOT11_N_SUPPORT
1292                 case PHY_11AN_MIXED:
1293                 case PHY_11AGN_MIXED:
1294                 case PHY_11N_5G:
1295 #endif // DOT11_N_SUPPORT //
1296                         pAd->CommonCfg.SupRate[0]  = 0x8C;        // 6 mbps, in units of 0.5 Mbps, basic rate
1297                         pAd->CommonCfg.SupRate[1]  = 0x12;        // 9 mbps, in units of 0.5 Mbps
1298                         pAd->CommonCfg.SupRate[2]  = 0x98;        // 12 mbps, in units of 0.5 Mbps, basic rate
1299                         pAd->CommonCfg.SupRate[3]  = 0x24;        // 18 mbps, in units of 0.5 Mbps
1300                         pAd->CommonCfg.SupRate[4]  = 0xb0;        // 24 mbps, in units of 0.5 Mbps, basic rate
1301                         pAd->CommonCfg.SupRate[5]  = 0x48;        // 36 mbps, in units of 0.5 Mbps
1302                         pAd->CommonCfg.SupRate[6]  = 0x60;        // 48 mbps, in units of 0.5 Mbps
1303                         pAd->CommonCfg.SupRate[7]  = 0x6c;        // 54 mbps, in units of 0.5 Mbps
1304                         pAd->CommonCfg.SupRateLen  = 8;
1305                         pAd->CommonCfg.ExtRateLen  = 0;
1306                         pAd->CommonCfg.DesireRate[0]  = 12;    // 6 mbps, in units of 0.5 Mbps
1307                         pAd->CommonCfg.DesireRate[1]  = 18;    // 9 mbps, in units of 0.5 Mbps
1308                         pAd->CommonCfg.DesireRate[2]  = 24;    // 12 mbps, in units of 0.5 Mbps
1309                         pAd->CommonCfg.DesireRate[3]  = 36;    // 18 mbps, in units of 0.5 Mbps
1310                         pAd->CommonCfg.DesireRate[4]  = 48;    // 24 mbps, in units of 0.5 Mbps
1311                         pAd->CommonCfg.DesireRate[5]  = 72;    // 36 mbps, in units of 0.5 Mbps
1312                         pAd->CommonCfg.DesireRate[6]  = 96;    // 48 mbps, in units of 0.5 Mbps
1313                         pAd->CommonCfg.DesireRate[7]  = 108;   // 54 mbps, in units of 0.5 Mbps
1314                         //pAd->CommonCfg.HTPhyMode.field.MODE = MODE_OFDM; // This MODE is only FYI. not use
1315                         break;
1316
1317                 default:
1318                         break;
1319         }
1320
1321
1322         pAd->CommonCfg.BandState = UNKNOWN_BAND;
1323 }
1324
1325
1326 #ifdef DOT11_N_SUPPORT
1327 /*
1328         ========================================================================
1329         Routine Description:
1330                 Caller ensures we has 802.11n support.
1331                 Calls at setting HT from AP/STASetinformation
1332
1333         Arguments:
1334                 pAd - Pointer to our adapter
1335                 phymode  -
1336
1337         ========================================================================
1338 */
1339 VOID    RTMPSetHT(
1340         IN      PRTMP_ADAPTER   pAd,
1341         IN      OID_SET_HT_PHYMODE *pHTPhyMode)
1342 {
1343         //ULONG *pmcs;
1344         UINT32  Value = 0;
1345         UCHAR   BBPValue = 0;
1346         UCHAR   BBP3Value = 0;
1347         UCHAR   RxStream = pAd->CommonCfg.RxStream;
1348
1349         DBGPRINT(RT_DEBUG_TRACE, ("RTMPSetHT : HT_mode(%d), ExtOffset(%d), MCS(%d), BW(%d), STBC(%d), SHORTGI(%d)\n",
1350                                                                                 pHTPhyMode->HtMode, pHTPhyMode->ExtOffset,
1351                                                                                 pHTPhyMode->MCS, pHTPhyMode->BW,
1352                                                                                 pHTPhyMode->STBC, pHTPhyMode->SHORTGI));
1353
1354         // Don't zero supportedHyPhy structure.
1355         RTMPZeroMemory(&pAd->CommonCfg.HtCapability, sizeof(pAd->CommonCfg.HtCapability));
1356         RTMPZeroMemory(&pAd->CommonCfg.AddHTInfo, sizeof(pAd->CommonCfg.AddHTInfo));
1357         RTMPZeroMemory(&pAd->CommonCfg.NewExtChanOffset, sizeof(pAd->CommonCfg.NewExtChanOffset));
1358         RTMPZeroMemory(&pAd->CommonCfg.DesiredHtPhy, sizeof(pAd->CommonCfg.DesiredHtPhy));
1359
1360         if (pAd->CommonCfg.bRdg)
1361         {
1362                 pAd->CommonCfg.HtCapability.ExtHtCapInfo.PlusHTC = 1;
1363                 pAd->CommonCfg.HtCapability.ExtHtCapInfo.RDGSupport = 1;
1364         }
1365         else
1366         {
1367                 pAd->CommonCfg.HtCapability.ExtHtCapInfo.PlusHTC = 0;
1368                 pAd->CommonCfg.HtCapability.ExtHtCapInfo.RDGSupport = 0;
1369         }
1370
1371         pAd->CommonCfg.HtCapability.HtCapParm.MaxRAmpduFactor = 3;
1372         pAd->CommonCfg.DesiredHtPhy.MaxRAmpduFactor = 3;
1373
1374         DBGPRINT(RT_DEBUG_TRACE, ("RTMPSetHT : RxBAWinLimit = %d\n", pAd->CommonCfg.BACapability.field.RxBAWinLimit));
1375
1376         // Mimo power save, A-MSDU size,
1377         pAd->CommonCfg.DesiredHtPhy.AmsduEnable = (USHORT)pAd->CommonCfg.BACapability.field.AmsduEnable;
1378         pAd->CommonCfg.DesiredHtPhy.AmsduSize = (UCHAR)pAd->CommonCfg.BACapability.field.AmsduSize;
1379         pAd->CommonCfg.DesiredHtPhy.MimoPs = (UCHAR)pAd->CommonCfg.BACapability.field.MMPSmode;
1380         pAd->CommonCfg.DesiredHtPhy.MpduDensity = (UCHAR)pAd->CommonCfg.BACapability.field.MpduDensity;
1381
1382         pAd->CommonCfg.HtCapability.HtCapInfo.AMsduSize = (USHORT)pAd->CommonCfg.BACapability.field.AmsduSize;
1383         pAd->CommonCfg.HtCapability.HtCapInfo.MimoPs = (USHORT)pAd->CommonCfg.BACapability.field.MMPSmode;
1384         pAd->CommonCfg.HtCapability.HtCapParm.MpduDensity = (UCHAR)pAd->CommonCfg.BACapability.field.MpduDensity;
1385
1386         DBGPRINT(RT_DEBUG_TRACE, ("RTMPSetHT : AMsduSize = %d, MimoPs = %d, MpduDensity = %d, MaxRAmpduFactor = %d\n",
1387                                                                                                         pAd->CommonCfg.DesiredHtPhy.AmsduSize,
1388                                                                                                         pAd->CommonCfg.DesiredHtPhy.MimoPs,
1389                                                                                                         pAd->CommonCfg.DesiredHtPhy.MpduDensity,
1390                                                                                                         pAd->CommonCfg.DesiredHtPhy.MaxRAmpduFactor));
1391
1392         if(pHTPhyMode->HtMode == HTMODE_GF)
1393         {
1394                 pAd->CommonCfg.HtCapability.HtCapInfo.GF = 1;
1395                 pAd->CommonCfg.DesiredHtPhy.GF = 1;
1396         }
1397         else
1398                 pAd->CommonCfg.DesiredHtPhy.GF = 0;
1399
1400         // Decide Rx MCSSet
1401         switch (RxStream)
1402         {
1403                 case 1:
1404                         pAd->CommonCfg.HtCapability.MCSSet[0] =  0xff;
1405                         pAd->CommonCfg.HtCapability.MCSSet[1] =  0x00;
1406                         break;
1407
1408                 case 2:
1409                         pAd->CommonCfg.HtCapability.MCSSet[0] =  0xff;
1410                         pAd->CommonCfg.HtCapability.MCSSet[1] =  0xff;
1411                         break;
1412
1413                 case 3: // 3*3
1414                         pAd->CommonCfg.HtCapability.MCSSet[0] =  0xff;
1415                         pAd->CommonCfg.HtCapability.MCSSet[1] =  0xff;
1416                         pAd->CommonCfg.HtCapability.MCSSet[2] =  0xff;
1417                         break;
1418         }
1419
1420         if (pAd->CommonCfg.bForty_Mhz_Intolerant && (pAd->CommonCfg.Channel <= 14) && (pHTPhyMode->BW == BW_40) )
1421         {
1422                 pHTPhyMode->BW = BW_20;
1423                 pAd->CommonCfg.HtCapability.HtCapInfo.Forty_Mhz_Intolerant = 1;
1424         }
1425
1426         if(pHTPhyMode->BW == BW_40)
1427         {
1428                 pAd->CommonCfg.HtCapability.MCSSet[4] = 0x1; // MCS 32
1429                 pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth = 1;
1430                 if (pAd->CommonCfg.Channel <= 14)
1431                         pAd->CommonCfg.HtCapability.HtCapInfo.CCKmodein40 = 1;
1432
1433                 pAd->CommonCfg.DesiredHtPhy.ChannelWidth = 1;
1434                 pAd->CommonCfg.AddHTInfo.AddHtInfo.RecomWidth = 1;
1435                 pAd->CommonCfg.AddHTInfo.AddHtInfo.ExtChanOffset = (pHTPhyMode->ExtOffset == EXTCHA_BELOW)? (EXTCHA_BELOW): EXTCHA_ABOVE;
1436                 // Set Regsiter for extension channel position.
1437                 RTMP_IO_READ32(pAd, TX_BAND_CFG, &Value);
1438                 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &BBP3Value);
1439                 if ((pHTPhyMode->ExtOffset == EXTCHA_BELOW))
1440                 {
1441                         Value |= 0x1;
1442                         BBP3Value |= (0x20);
1443                         RTMP_IO_WRITE32(pAd, TX_BAND_CFG, Value);
1444                 }
1445                 else if ((pHTPhyMode->ExtOffset == EXTCHA_ABOVE))
1446                 {
1447                         Value &= 0xfe;
1448                         BBP3Value &= (~0x20);
1449                         RTMP_IO_WRITE32(pAd, TX_BAND_CFG, Value);
1450                 }
1451
1452                 // Turn on BBP 40MHz mode now only as AP .
1453                 // Sta can turn on BBP 40MHz after connection with 40MHz AP. Sta only broadcast 40MHz capability before connection.
1454                 if ((pAd->OpMode == OPMODE_AP) || INFRA_ON(pAd) || ADHOC_ON(pAd)
1455                         )
1456                 {
1457                         RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &BBPValue);
1458                         BBPValue &= (~0x18);
1459                         BBPValue |= 0x10;
1460                         RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, BBPValue);
1461
1462                         RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, BBP3Value);
1463                         pAd->CommonCfg.BBPCurrentBW = BW_40;
1464                 }
1465         }
1466         else
1467         {
1468                 pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth = 0;
1469                 pAd->CommonCfg.DesiredHtPhy.ChannelWidth = 0;
1470                 pAd->CommonCfg.AddHTInfo.AddHtInfo.RecomWidth = 0;
1471                 pAd->CommonCfg.AddHTInfo.AddHtInfo.ExtChanOffset = EXTCHA_NONE;
1472                 pAd->CommonCfg.CentralChannel = pAd->CommonCfg.Channel;
1473                 // Turn on BBP 20MHz mode by request here.
1474                 {
1475                         RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &BBPValue);
1476                         BBPValue &= (~0x18);
1477                         RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, BBPValue);
1478                         pAd->CommonCfg.BBPCurrentBW = BW_20;
1479                 }
1480         }
1481
1482         if(pHTPhyMode->STBC == STBC_USE)
1483         {
1484                 pAd->CommonCfg.HtCapability.HtCapInfo.TxSTBC = 1;
1485                 pAd->CommonCfg.DesiredHtPhy.TxSTBC = 1;
1486                 pAd->CommonCfg.HtCapability.HtCapInfo.RxSTBC = 1;
1487                 pAd->CommonCfg.DesiredHtPhy.RxSTBC = 1;
1488         }
1489         else
1490         {
1491                 pAd->CommonCfg.DesiredHtPhy.TxSTBC = 0;
1492                 pAd->CommonCfg.DesiredHtPhy.RxSTBC = 0;
1493         }
1494
1495
1496         if(pHTPhyMode->SHORTGI == GI_400)
1497         {
1498                 pAd->CommonCfg.HtCapability.HtCapInfo.ShortGIfor20 = 1;
1499                 pAd->CommonCfg.HtCapability.HtCapInfo.ShortGIfor40 = 1;
1500                 pAd->CommonCfg.DesiredHtPhy.ShortGIfor20 = 1;
1501                 pAd->CommonCfg.DesiredHtPhy.ShortGIfor40 = 1;
1502         }
1503         else
1504         {
1505                 pAd->CommonCfg.HtCapability.HtCapInfo.ShortGIfor20 = 0;
1506                 pAd->CommonCfg.HtCapability.HtCapInfo.ShortGIfor40 = 0;
1507                 pAd->CommonCfg.DesiredHtPhy.ShortGIfor20 = 0;
1508                 pAd->CommonCfg.DesiredHtPhy.ShortGIfor40 = 0;
1509         }
1510
1511         // We support link adaptation for unsolicit MCS feedback, set to 2.
1512         pAd->CommonCfg.HtCapability.ExtHtCapInfo.MCSFeedback = MCSFBK_NONE; //MCSFBK_UNSOLICIT;
1513         pAd->CommonCfg.AddHTInfo.ControlChan = pAd->CommonCfg.Channel;
1514         // 1, the extension channel above the control channel.
1515
1516         // EDCA parameters used for AP's own transmission
1517         if (pAd->CommonCfg.APEdcaParm.bValid == FALSE)
1518         {
1519                 pAd->CommonCfg.APEdcaParm.bValid = TRUE;
1520                 pAd->CommonCfg.APEdcaParm.Aifsn[0] = 3;
1521                 pAd->CommonCfg.APEdcaParm.Aifsn[1] = 7;
1522                 pAd->CommonCfg.APEdcaParm.Aifsn[2] = 1;
1523                 pAd->CommonCfg.APEdcaParm.Aifsn[3] = 1;
1524
1525                 pAd->CommonCfg.APEdcaParm.Cwmin[0] = 4;
1526                 pAd->CommonCfg.APEdcaParm.Cwmin[1] = 4;
1527                 pAd->CommonCfg.APEdcaParm.Cwmin[2] = 3;
1528                 pAd->CommonCfg.APEdcaParm.Cwmin[3] = 2;
1529
1530                 pAd->CommonCfg.APEdcaParm.Cwmax[0] = 6;
1531                 pAd->CommonCfg.APEdcaParm.Cwmax[1] = 10;
1532                 pAd->CommonCfg.APEdcaParm.Cwmax[2] = 4;
1533                 pAd->CommonCfg.APEdcaParm.Cwmax[3] = 3;
1534
1535                 pAd->CommonCfg.APEdcaParm.Txop[0]  = 0;
1536                 pAd->CommonCfg.APEdcaParm.Txop[1]  = 0;
1537                 pAd->CommonCfg.APEdcaParm.Txop[2]  = 94;
1538                 pAd->CommonCfg.APEdcaParm.Txop[3]  = 47;
1539         }
1540         AsicSetEdcaParm(pAd, &pAd->CommonCfg.APEdcaParm);
1541
1542
1543 #ifdef CONFIG_STA_SUPPORT
1544         IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1545         {
1546                 RTMPSetIndividualHT(pAd, 0);
1547         }
1548 #endif // CONFIG_STA_SUPPORT //
1549
1550 }
1551
1552 /*
1553         ========================================================================
1554         Routine Description:
1555                 Caller ensures we has 802.11n support.
1556                 Calls at setting HT from AP/STASetinformation
1557
1558         Arguments:
1559                 pAd - Pointer to our adapter
1560                 phymode  -
1561
1562         ========================================================================
1563 */
1564 VOID    RTMPSetIndividualHT(
1565         IN      PRTMP_ADAPTER           pAd,
1566         IN      UCHAR                           apidx)
1567 {
1568         PRT_HT_PHY_INFO         pDesired_ht_phy = NULL;
1569         UCHAR   TxStream = pAd->CommonCfg.TxStream;
1570         UCHAR   DesiredMcs      = MCS_AUTO;
1571
1572         do
1573         {
1574
1575 #ifdef CONFIG_STA_SUPPORT
1576                 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1577                 {
1578                         pDesired_ht_phy = &pAd->StaCfg.DesiredHtPhyInfo;
1579                         DesiredMcs = pAd->StaCfg.DesiredTransmitSetting.field.MCS;
1580                         //pAd->StaCfg.bAutoTxRateSwitch = (DesiredMcs == MCS_AUTO) ? TRUE : FALSE;
1581                                 break;
1582                 }
1583 #endif // CONFIG_STA_SUPPORT //
1584         } while (FALSE);
1585
1586         if (pDesired_ht_phy == NULL)
1587         {
1588                 DBGPRINT(RT_DEBUG_ERROR, ("RTMPSetIndividualHT: invalid apidx(%d)\n", apidx));
1589                 return;
1590         }
1591         RTMPZeroMemory(pDesired_ht_phy, sizeof(RT_HT_PHY_INFO));
1592
1593         DBGPRINT(RT_DEBUG_TRACE, ("RTMPSetIndividualHT : Desired MCS = %d\n", DesiredMcs));
1594         // Check the validity of MCS
1595         if ((TxStream == 1) && ((DesiredMcs >= MCS_8) && (DesiredMcs <= MCS_15)))
1596         {
1597                 DBGPRINT(RT_DEBUG_WARN, ("RTMPSetIndividualHT: MCS(%d) is invalid in 1S, reset it as MCS_7\n", DesiredMcs));
1598                 DesiredMcs = MCS_7;
1599         }
1600
1601         if ((pAd->CommonCfg.DesiredHtPhy.ChannelWidth == BW_20) && (DesiredMcs == MCS_32))
1602         {
1603                 DBGPRINT(RT_DEBUG_WARN, ("RTMPSetIndividualHT: MCS_32 is only supported in 40-MHz, reset it as MCS_0\n"));
1604                 DesiredMcs = MCS_0;
1605         }
1606
1607         pDesired_ht_phy->bHtEnable = TRUE;
1608
1609         // Decide desired Tx MCS
1610         switch (TxStream)
1611         {
1612                 case 1:
1613                         if (DesiredMcs == MCS_AUTO)
1614                         {
1615                                 pDesired_ht_phy->MCSSet[0]= 0xff;
1616                                 pDesired_ht_phy->MCSSet[1]= 0x00;
1617                         }
1618                         else if (DesiredMcs <= MCS_7)
1619                         {
1620                                 pDesired_ht_phy->MCSSet[0]= 1<<DesiredMcs;
1621                                 pDesired_ht_phy->MCSSet[1]= 0x00;
1622                         }
1623                         break;
1624
1625                 case 2:
1626                         if (DesiredMcs == MCS_AUTO)
1627                         {
1628                                 pDesired_ht_phy->MCSSet[0]= 0xff;
1629                                 pDesired_ht_phy->MCSSet[1]= 0xff;
1630                         }
1631                         else if (DesiredMcs <= MCS_15)
1632                         {
1633                                 ULONG mode;
1634
1635                                 mode = DesiredMcs / 8;
1636                                 if (mode < 2)
1637                                         pDesired_ht_phy->MCSSet[mode] = (1 << (DesiredMcs - mode * 8));
1638                         }
1639                         break;
1640
1641                 case 3: // 3*3
1642                         if (DesiredMcs == MCS_AUTO)
1643                         {
1644                                 /* MCS0 ~ MCS23, 3 bytes */
1645                                 pDesired_ht_phy->MCSSet[0]= 0xff;
1646                                 pDesired_ht_phy->MCSSet[1]= 0xff;
1647                                 pDesired_ht_phy->MCSSet[2]= 0xff;
1648                         }
1649                         else if (DesiredMcs <= MCS_23)
1650                         {
1651                                 ULONG mode;
1652
1653                                 mode = DesiredMcs / 8;
1654                                 if (mode < 3)
1655                                         pDesired_ht_phy->MCSSet[mode] = (1 << (DesiredMcs - mode * 8));
1656                         }
1657                         break;
1658         }
1659
1660         if(pAd->CommonCfg.DesiredHtPhy.ChannelWidth == BW_40)
1661         {
1662                 if (DesiredMcs == MCS_AUTO || DesiredMcs == MCS_32)
1663                         pDesired_ht_phy->MCSSet[4] = 0x1;
1664         }
1665
1666         // update HT Rate setting
1667     if (pAd->OpMode == OPMODE_STA)
1668         MlmeUpdateHtTxRates(pAd, BSS0);
1669     else
1670             MlmeUpdateHtTxRates(pAd, apidx);
1671 }
1672
1673
1674 /*
1675         ========================================================================
1676         Routine Description:
1677                 Update HT IE from our capability.
1678
1679         Arguments:
1680                 Send all HT IE in beacon/probe rsp/assoc rsp/action frame.
1681
1682
1683         ========================================================================
1684 */
1685 VOID    RTMPUpdateHTIE(
1686         IN      RT_HT_CAPABILITY        *pRtHt,
1687         IN              UCHAR                           *pMcsSet,
1688         OUT             HT_CAPABILITY_IE *pHtCapability,
1689         OUT             ADD_HT_INFO_IE          *pAddHtInfo)
1690 {
1691         RTMPZeroMemory(pHtCapability, sizeof(HT_CAPABILITY_IE));
1692         RTMPZeroMemory(pAddHtInfo, sizeof(ADD_HT_INFO_IE));
1693
1694                 pHtCapability->HtCapInfo.ChannelWidth = pRtHt->ChannelWidth;
1695                 pHtCapability->HtCapInfo.MimoPs = pRtHt->MimoPs;
1696                 pHtCapability->HtCapInfo.GF = pRtHt->GF;
1697                 pHtCapability->HtCapInfo.ShortGIfor20 = pRtHt->ShortGIfor20;
1698                 pHtCapability->HtCapInfo.ShortGIfor40 = pRtHt->ShortGIfor40;
1699                 pHtCapability->HtCapInfo.TxSTBC = pRtHt->TxSTBC;
1700                 pHtCapability->HtCapInfo.RxSTBC = pRtHt->RxSTBC;
1701                 pHtCapability->HtCapInfo.AMsduSize = pRtHt->AmsduSize;
1702                 pHtCapability->HtCapParm.MaxRAmpduFactor = pRtHt->MaxRAmpduFactor;
1703                 pHtCapability->HtCapParm.MpduDensity = pRtHt->MpduDensity;
1704
1705                 pAddHtInfo->AddHtInfo.ExtChanOffset = pRtHt->ExtChanOffset ;
1706                 pAddHtInfo->AddHtInfo.RecomWidth = pRtHt->RecomWidth;
1707                 pAddHtInfo->AddHtInfo2.OperaionMode = pRtHt->OperaionMode;
1708                 pAddHtInfo->AddHtInfo2.NonGfPresent = pRtHt->NonGfPresent;
1709                 RTMPMoveMemory(pAddHtInfo->MCSSet, /*pRtHt->MCSSet*/pMcsSet, 4); // rt2860 only support MCS max=32, no need to copy all 16 uchar.
1710
1711         DBGPRINT(RT_DEBUG_TRACE,("RTMPUpdateHTIE <== \n"));
1712 }
1713 #endif // DOT11_N_SUPPORT //
1714
1715 /*
1716         ========================================================================
1717         Description:
1718                 Add Client security information into ASIC WCID table and IVEIV table.
1719     Return:
1720         ========================================================================
1721 */
1722 VOID    RTMPAddWcidAttributeEntry(
1723         IN      PRTMP_ADAPTER   pAd,
1724         IN      UCHAR                   BssIdx,
1725         IN      UCHAR                   KeyIdx,
1726         IN      UCHAR                   CipherAlg,
1727         IN      MAC_TABLE_ENTRY *pEntry)
1728 {
1729         UINT32          WCIDAttri = 0;
1730         USHORT          offset;
1731         UCHAR           IVEIV = 0;
1732         USHORT          Wcid = 0;
1733
1734         {
1735 #ifdef CONFIG_STA_SUPPORT
1736                 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1737                 {
1738                         if (BssIdx > BSS0)
1739                         {
1740                                 DBGPRINT(RT_DEBUG_ERROR, ("RTMPAddWcidAttributeEntry: The BSS-index(%d) is out of range for Infra link. \n", BssIdx));
1741                                 return;
1742                         }
1743
1744                         // 1.   In ADHOC mode, the AID is wcid number. And NO mesh link exists.
1745                         // 2.   In Infra mode, the AID:1 MUST be wcid of infra STA.
1746                         //                                         the AID:2~ assign to mesh link entry.
1747                         if (pEntry && ADHOC_ON(pAd))
1748                                 Wcid = pEntry->Aid;
1749                         else if (pEntry && INFRA_ON(pAd))
1750                         {
1751 #ifdef QOS_DLS_SUPPORT
1752                                 if (pEntry->ValidAsDls == TRUE)
1753                                         Wcid = pEntry->Aid;
1754                                 else
1755 #endif // QOS_DLS_SUPPORT //
1756                                 Wcid = BSSID_WCID;
1757                         }
1758                         else
1759                                 Wcid = MCAST_WCID;
1760                 }
1761 #endif // CONFIG_STA_SUPPORT //
1762         }
1763
1764         // Update WCID attribute table
1765         offset = MAC_WCID_ATTRIBUTE_BASE + (Wcid * HW_WCID_ATTRI_SIZE);
1766
1767 #ifdef CONFIG_STA_SUPPORT
1768         IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1769         {
1770                 if (pEntry && pEntry->ValidAsMesh)
1771                         WCIDAttri = (CipherAlg<<1) | PAIRWISEKEYTABLE;
1772 #ifdef QOS_DLS_SUPPORT
1773                 else if ((pEntry) && (pEntry->ValidAsDls) &&
1774                                         ((CipherAlg == CIPHER_TKIP) ||
1775                                         (CipherAlg == CIPHER_TKIP_NO_MIC) ||
1776                                         (CipherAlg == CIPHER_AES) ||
1777                                         (CipherAlg == CIPHER_NONE)))
1778                         WCIDAttri = (CipherAlg<<1) | PAIRWISEKEYTABLE;
1779 #endif // QOS_DLS_SUPPORT //
1780                 else
1781                         WCIDAttri = (CipherAlg<<1) | SHAREDKEYTABLE;
1782         }
1783 #endif // CONFIG_STA_SUPPORT //
1784
1785         RTMP_IO_WRITE32(pAd, offset, WCIDAttri);
1786
1787
1788         // Update IV/EIV table
1789         offset = MAC_IVEIV_TABLE_BASE + (Wcid * HW_IVEIV_ENTRY_SIZE);
1790
1791         // WPA mode
1792         if ((CipherAlg == CIPHER_TKIP) || (CipherAlg == CIPHER_TKIP_NO_MIC) || (CipherAlg == CIPHER_AES))
1793         {
1794                 // Eiv bit on. keyid always is 0 for pairwise key
1795                 IVEIV = (KeyIdx <<6) | 0x20;
1796         }
1797         else
1798         {
1799                 // WEP KeyIdx is default tx key.
1800                 IVEIV = (KeyIdx << 6);
1801         }
1802
1803         // For key index and ext IV bit, so only need to update the position(offset+3).
1804         RTMP_IO_WRITE8(pAd, offset+3, IVEIV);
1805
1806         DBGPRINT(RT_DEBUG_TRACE,("RTMPAddWcidAttributeEntry: WCID #%d, KeyIndex #%d, Alg=%s\n",Wcid, KeyIdx, CipherName[CipherAlg]));
1807         DBGPRINT(RT_DEBUG_TRACE,("      WCIDAttri = 0x%x \n",  WCIDAttri));
1808
1809 }
1810
1811 /*
1812     ==========================================================================
1813     Description:
1814         Parse encryption type
1815 Arguments:
1816     pAdapter                    Pointer to our adapter
1817     wrq                         Pointer to the ioctl argument
1818
1819     Return Value:
1820         None
1821
1822     Note:
1823     ==========================================================================
1824 */
1825 CHAR *GetEncryptType(CHAR enc)
1826 {
1827     if(enc == Ndis802_11WEPDisabled)
1828         return "NONE";
1829     if(enc == Ndis802_11WEPEnabled)
1830         return "WEP";
1831     if(enc == Ndis802_11Encryption2Enabled)
1832         return "TKIP";
1833     if(enc == Ndis802_11Encryption3Enabled)
1834         return "AES";
1835         if(enc == Ndis802_11Encryption4Enabled)
1836         return "TKIPAES";
1837     else
1838         return "UNKNOW";
1839 }
1840
1841 CHAR *GetAuthMode(CHAR auth)
1842 {
1843     if(auth == Ndis802_11AuthModeOpen)
1844         return "OPEN";
1845     if(auth == Ndis802_11AuthModeShared)
1846         return "SHARED";
1847         if(auth == Ndis802_11AuthModeAutoSwitch)
1848         return "AUTOWEP";
1849     if(auth == Ndis802_11AuthModeWPA)
1850         return "WPA";
1851     if(auth == Ndis802_11AuthModeWPAPSK)
1852         return "WPAPSK";
1853     if(auth == Ndis802_11AuthModeWPANone)
1854         return "WPANONE";
1855     if(auth == Ndis802_11AuthModeWPA2)
1856         return "WPA2";
1857     if(auth == Ndis802_11AuthModeWPA2PSK)
1858         return "WPA2PSK";
1859         if(auth == Ndis802_11AuthModeWPA1WPA2)
1860         return "WPA1WPA2";
1861         if(auth == Ndis802_11AuthModeWPA1PSKWPA2PSK)
1862         return "WPA1PSKWPA2PSK";
1863
1864         return "UNKNOW";
1865 }
1866
1867 #if 1 //#ifndef UCOS
1868 /*
1869     ==========================================================================
1870     Description:
1871         Get site survey results
1872         Arguments:
1873             pAdapter                    Pointer to our adapter
1874             wrq                         Pointer to the ioctl argument
1875
1876     Return Value:
1877         None
1878
1879     Note:
1880         Usage:
1881                         1.) UI needs to wait 4 seconds after issue a site survey command
1882                         2.) iwpriv ra0 get_site_survey
1883                         3.) UI needs to prepare at least 4096bytes to get the results
1884     ==========================================================================
1885 */
1886 #define LINE_LEN        (4+33+20+8+10+9+7+3)    // Channel+SSID+Bssid+WepStatus+AuthMode+Signal+WiressMode+NetworkType
1887 VOID RTMPIoctlGetSiteSurvey(
1888         IN      PRTMP_ADAPTER   pAdapter,
1889         IN      struct iwreq    *wrq)
1890 {
1891         CHAR            *msg;
1892         INT             i=0;
1893         INT                     WaitCnt;
1894         INT             Status=0;
1895         CHAR            Ssid[MAX_LEN_OF_SSID +1];
1896     INT         Rssi = 0, max_len = LINE_LEN;
1897         UINT        Rssi_Quality = 0;
1898         NDIS_802_11_NETWORK_TYPE    wireless_mode;
1899
1900         os_alloc_mem(NULL, (PUCHAR *)&msg, sizeof(CHAR)*((MAX_LEN_OF_BSS_TABLE)*max_len));
1901
1902         if (msg == NULL)
1903         {
1904                 DBGPRINT(RT_DEBUG_TRACE, ("RTMPIoctlGetSiteSurvey - msg memory alloc fail.\n"));
1905                 return;
1906         }
1907
1908         memset(msg, 0 ,(MAX_LEN_OF_BSS_TABLE)*max_len );
1909         memset(Ssid, 0 ,(MAX_LEN_OF_SSID +1));
1910         sprintf(msg,"%s","\n");
1911         sprintf(msg+strlen(msg),"%-4s%-33s%-20s%-8s%-10s%-9s%-7s%-3s\n",
1912             "Ch", "SSID", "BSSID", "Enc", "Auth", "Siganl(%)", "W-Mode", " NT");
1913
1914         WaitCnt = 0;
1915 #ifdef CONFIG_STA_SUPPORT
1916         pAdapter->StaCfg.bScanReqIsFromWebUI = TRUE;
1917         while ((ScanRunning(pAdapter) == TRUE) && (WaitCnt++ < 200))
1918                 OS_WAIT(500);
1919 #endif // CONFIG_STA_SUPPORT //
1920
1921         for(i=0; i<pAdapter->ScanTab.BssNr ;i++)
1922         {
1923                 if( pAdapter->ScanTab.BssEntry[i].Channel==0)
1924                         break;
1925
1926                 if((strlen(msg)+max_len ) >= IW_SCAN_MAX_DATA)
1927                         break;
1928
1929                 //Channel
1930                 sprintf(msg+strlen(msg),"%-4d", pAdapter->ScanTab.BssEntry[i].Channel);
1931                 //SSID
1932                 memcpy(Ssid, pAdapter->ScanTab.BssEntry[i].Ssid, pAdapter->ScanTab.BssEntry[i].SsidLen);
1933                 Ssid[pAdapter->ScanTab.BssEntry[i].SsidLen] = '\0';
1934                 sprintf(msg+strlen(msg),"%-33s", Ssid);
1935                 //BSSID
1936                 sprintf(msg+strlen(msg),"%02x:%02x:%02x:%02x:%02x:%02x   ",
1937                         pAdapter->ScanTab.BssEntry[i].Bssid[0],
1938                         pAdapter->ScanTab.BssEntry[i].Bssid[1],
1939                         pAdapter->ScanTab.BssEntry[i].Bssid[2],
1940                         pAdapter->ScanTab.BssEntry[i].Bssid[3],
1941                         pAdapter->ScanTab.BssEntry[i].Bssid[4],
1942                         pAdapter->ScanTab.BssEntry[i].Bssid[5]);
1943                 //Encryption Type
1944                 sprintf(msg+strlen(msg),"%-8s",GetEncryptType(pAdapter->ScanTab.BssEntry[i].WepStatus));
1945                 //Authentication Mode
1946                 if (pAdapter->ScanTab.BssEntry[i].WepStatus == Ndis802_11WEPEnabled)
1947                         sprintf(msg+strlen(msg),"%-10s", "UNKNOW");
1948                 else
1949                         sprintf(msg+strlen(msg),"%-10s",GetAuthMode(pAdapter->ScanTab.BssEntry[i].AuthMode));
1950                 // Rssi
1951                 Rssi = (INT)pAdapter->ScanTab.BssEntry[i].Rssi;
1952                 if (Rssi >= -50)
1953                         Rssi_Quality = 100;
1954                 else if (Rssi >= -80)    // between -50 ~ -80dbm
1955                         Rssi_Quality = (UINT)(24 + ((Rssi + 80) * 26)/10);
1956                 else if (Rssi >= -90)   // between -80 ~ -90dbm
1957                         Rssi_Quality = (UINT)(((Rssi + 90) * 26)/10);
1958                 else    // < -84 dbm
1959                         Rssi_Quality = 0;
1960                 sprintf(msg+strlen(msg),"%-9d", Rssi_Quality);
1961                 // Wireless Mode
1962                 wireless_mode = NetworkTypeInUseSanity(&pAdapter->ScanTab.BssEntry[i]);
1963                 if (wireless_mode == Ndis802_11FH ||
1964                         wireless_mode == Ndis802_11DS)
1965                         sprintf(msg+strlen(msg),"%-7s", "11b");
1966                 else if (wireless_mode == Ndis802_11OFDM5)
1967                         sprintf(msg+strlen(msg),"%-7s", "11a");
1968                 else if (wireless_mode == Ndis802_11OFDM5_N)
1969                         sprintf(msg+strlen(msg),"%-7s", "11a/n");
1970                 else if (wireless_mode == Ndis802_11OFDM24)
1971                         sprintf(msg+strlen(msg),"%-7s", "11b/g");
1972                 else if (wireless_mode == Ndis802_11OFDM24_N)
1973                         sprintf(msg+strlen(msg),"%-7s", "11b/g/n");
1974                 else
1975                         sprintf(msg+strlen(msg),"%-7s", "unknow");
1976                 //Network Type
1977                 if (pAdapter->ScanTab.BssEntry[i].BssType == BSS_ADHOC)
1978                         sprintf(msg+strlen(msg),"%-3s", " Ad");
1979                 else
1980                         sprintf(msg+strlen(msg),"%-3s", " In");
1981
1982         sprintf(msg+strlen(msg),"\n");
1983         }
1984
1985 #ifdef CONFIG_STA_SUPPORT
1986         pAdapter->StaCfg.bScanReqIsFromWebUI = FALSE;
1987 #endif // CONFIG_STA_SUPPORT //
1988         wrq->u.data.length = strlen(msg);
1989         Status = copy_to_user(wrq->u.data.pointer, msg, wrq->u.data.length);
1990
1991         DBGPRINT(RT_DEBUG_TRACE, ("RTMPIoctlGetSiteSurvey - wrq->u.data.length = %d\n", wrq->u.data.length));
1992         os_free_mem(NULL, (PUCHAR)msg);
1993 }
1994
1995
1996 #define MAC_LINE_LEN    (14+4+4+10+10+10+6+6)   // Addr+aid+psm+datatime+rxbyte+txbyte+current tx rate+last tx rate
1997 VOID RTMPIoctlGetMacTable(
1998         IN PRTMP_ADAPTER pAd,
1999         IN struct iwreq *wrq)
2000 {
2001         INT i;
2002         RT_802_11_MAC_TABLE MacTab;
2003         char *msg;
2004
2005         MacTab.Num = 0;
2006         for (i=0; i<MAX_LEN_OF_MAC_TABLE; i++)
2007         {
2008                 if (pAd->MacTab.Content[i].ValidAsCLI && (pAd->MacTab.Content[i].Sst == SST_ASSOC))
2009                 {
2010                         COPY_MAC_ADDR(MacTab.Entry[MacTab.Num].Addr, &pAd->MacTab.Content[i].Addr);
2011                         MacTab.Entry[MacTab.Num].Aid = (UCHAR)pAd->MacTab.Content[i].Aid;
2012                         MacTab.Entry[MacTab.Num].Psm = pAd->MacTab.Content[i].PsMode;
2013 #ifdef DOT11_N_SUPPORT
2014                         MacTab.Entry[MacTab.Num].MimoPs = pAd->MacTab.Content[i].MmpsMode;
2015 #endif // DOT11_N_SUPPORT //
2016
2017                         // Fill in RSSI per entry
2018                         MacTab.Entry[MacTab.Num].AvgRssi0 = pAd->MacTab.Content[i].RssiSample.AvgRssi0;
2019                         MacTab.Entry[MacTab.Num].AvgRssi1 = pAd->MacTab.Content[i].RssiSample.AvgRssi1;
2020                         MacTab.Entry[MacTab.Num].AvgRssi2 = pAd->MacTab.Content[i].RssiSample.AvgRssi2;
2021
2022                         // the connected time per entry
2023                         MacTab.Entry[MacTab.Num].ConnectedTime = pAd->MacTab.Content[i].StaConnectTime;
2024                         MacTab.Entry[MacTab.Num].TxRate.field.MCS = pAd->MacTab.Content[i].HTPhyMode.field.MCS;
2025                         MacTab.Entry[MacTab.Num].TxRate.field.BW = pAd->MacTab.Content[i].HTPhyMode.field.BW;
2026                         MacTab.Entry[MacTab.Num].TxRate.field.ShortGI = pAd->MacTab.Content[i].HTPhyMode.field.ShortGI;
2027                         MacTab.Entry[MacTab.Num].TxRate.field.STBC = pAd->MacTab.Content[i].HTPhyMode.field.STBC;
2028                         MacTab.Entry[MacTab.Num].TxRate.field.rsv = pAd->MacTab.Content[i].HTPhyMode.field.rsv;
2029                         MacTab.Entry[MacTab.Num].TxRate.field.MODE = pAd->MacTab.Content[i].HTPhyMode.field.MODE;
2030                         MacTab.Entry[MacTab.Num].TxRate.word = pAd->MacTab.Content[i].HTPhyMode.word;
2031
2032                         MacTab.Num += 1;
2033                 }
2034         }
2035         wrq->u.data.length = sizeof(RT_802_11_MAC_TABLE);
2036         if (copy_to_user(wrq->u.data.pointer, &MacTab, wrq->u.data.length))
2037         {
2038                 DBGPRINT(RT_DEBUG_TRACE, ("%s: copy_to_user() fail\n", __func__));
2039         }
2040
2041         msg = (CHAR *) kmalloc(sizeof(CHAR)*(MAX_LEN_OF_MAC_TABLE*MAC_LINE_LEN), MEM_ALLOC_FLAG);
2042         memset(msg, 0 ,MAX_LEN_OF_MAC_TABLE*MAC_LINE_LEN );
2043         sprintf(msg,"%s","\n");
2044         sprintf(msg+strlen(msg),"%-14s%-4s%-4s%-10s%-10s%-10s%-6s%-6s\n",
2045                 "MAC", "AID", "PSM", "LDT", "RxB", "TxB","CTxR", "LTxR");
2046
2047         for (i=0; i<MAX_LEN_OF_MAC_TABLE; i++)
2048         {
2049                 PMAC_TABLE_ENTRY pEntry = &pAd->MacTab.Content[i];
2050                 if (pEntry->ValidAsCLI && (pEntry->Sst == SST_ASSOC))
2051                 {
2052                         if((strlen(msg)+MAC_LINE_LEN ) >= (MAX_LEN_OF_MAC_TABLE*MAC_LINE_LEN) )
2053                                 break;
2054                         sprintf(msg+strlen(msg),"%02x%02x%02x%02x%02x%02x  ",
2055                                 pEntry->Addr[0], pEntry->Addr[1], pEntry->Addr[2],
2056                                 pEntry->Addr[3], pEntry->Addr[4], pEntry->Addr[5]);
2057                         sprintf(msg+strlen(msg),"%-4d", (int)pEntry->Aid);
2058                         sprintf(msg+strlen(msg),"%-4d", (int)pEntry->PsMode);
2059                         sprintf(msg+strlen(msg),"%-10d",0/*pAd->MacTab.Content[i].HSCounter.LastDataPacketTime*/); // ToDo
2060                         sprintf(msg+strlen(msg),"%-10d",0/*pAd->MacTab.Content[i].HSCounter.TotalRxByteCount*/); // ToDo
2061                         sprintf(msg+strlen(msg),"%-10d",0/*pAd->MacTab.Content[i].HSCounter.TotalTxByteCount*/); // ToDo
2062                         sprintf(msg+strlen(msg),"%-6d",RateIdToMbps[pAd->MacTab.Content[i].CurrTxRate]);
2063                         sprintf(msg+strlen(msg),"%-6d\n",0/*RateIdToMbps[pAd->MacTab.Content[i].LastTxRate]*/); // ToDo
2064                 }
2065         }
2066         // for compatible with old API just do the printk to console
2067         //wrq->u.data.length = strlen(msg);
2068         //if (copy_to_user(wrq->u.data.pointer, msg, wrq->u.data.length))
2069         {
2070                 DBGPRINT(RT_DEBUG_TRACE, ("%s", msg));
2071         }
2072
2073         kfree(msg);
2074 }
2075 #endif // UCOS //
2076
2077 #ifdef DOT11_N_SUPPORT
2078 INT     Set_BASetup_Proc(
2079         IN      PRTMP_ADAPTER   pAd,
2080         IN      PUCHAR                  arg)
2081 {
2082     UCHAR mac[6], tid;
2083         char *token, sepValue[] = ":", DASH = '-';
2084         INT i;
2085     MAC_TABLE_ENTRY *pEntry;
2086
2087 /*
2088         The BASetup inupt string format should be xx:xx:xx:xx:xx:xx-d,
2089                 =>The six 2 digit hex-decimal number previous are the Mac address,
2090                 =>The seventh decimal number is the tid value.
2091 */
2092         //printk("\n%s\n", arg);
2093
2094         if(strlen(arg) < 19)  //Mac address acceptable format 01:02:03:04:05:06 length 17 plus the "-" and tid value in decimal format.
2095                 return FALSE;
2096
2097         token = strchr(arg, DASH);
2098         if ((token != NULL) && (strlen(token)>1))
2099         {
2100                 tid = simple_strtol((token+1), 0, 10);
2101                 if (tid > 15)
2102                         return FALSE;
2103
2104                 *token = '\0';
2105                 for (i = 0, token = rstrtok(arg, &sepValue[0]); token; token = rstrtok(NULL, &sepValue[0]), i++)
2106                 {
2107                         if((strlen(token) != 2) || (!isxdigit(*token)) || (!isxdigit(*(token+1))))
2108                                 return FALSE;
2109                         AtoH(token, (PUCHAR)(&mac[i]), 1);
2110                 }
2111                 if(i != 6)
2112                         return FALSE;
2113
2114                 printk("\n%02x:%02x:%02x:%02x:%02x:%02x-%02x\n", mac[0], mac[1],
2115                                 mac[2], mac[3], mac[4], mac[5], tid);
2116
2117             pEntry = MacTableLookup(pAd, mac);
2118
2119         if (pEntry) {
2120                 printk("\nSetup BA Session: Tid = %d\n", tid);
2121                 BAOriSessionSetUp(pAd, pEntry, tid, 0, 100, TRUE);
2122         }
2123
2124                 return TRUE;
2125         }
2126
2127         return FALSE;
2128
2129 }
2130
2131 INT     Set_BADecline_Proc(
2132         IN      PRTMP_ADAPTER   pAd,
2133         IN      PUCHAR                  arg)
2134 {
2135         ULONG bBADecline;
2136
2137         bBADecline = simple_strtol(arg, 0, 10);
2138
2139         if (bBADecline == 0)
2140         {
2141                 pAd->CommonCfg.bBADecline = FALSE;
2142         }
2143         else if (bBADecline == 1)
2144         {
2145                 pAd->CommonCfg.bBADecline = TRUE;
2146         }
2147         else
2148         {
2149                 return FALSE; //Invalid argument
2150         }
2151
2152         DBGPRINT(RT_DEBUG_TRACE, ("Set_BADecline_Proc::(BADecline=%d)\n", pAd->CommonCfg.bBADecline));
2153
2154         return TRUE;
2155 }
2156
2157 INT     Set_BAOriTearDown_Proc(
2158         IN      PRTMP_ADAPTER   pAd,
2159         IN      PUCHAR                  arg)
2160 {
2161     UCHAR mac[6], tid;
2162         char *token, sepValue[] = ":", DASH = '-';
2163         INT i;
2164     MAC_TABLE_ENTRY *pEntry;
2165
2166 /*
2167         The BAOriTearDown inupt string format should be xx:xx:xx:xx:xx:xx-d,
2168                 =>The six 2 digit hex-decimal number previous are the Mac address,
2169                 =>The seventh decimal number is the tid value.
2170 */
2171     if(strlen(arg) < 19)  //Mac address acceptable format 01:02:03:04:05:06 length 17 plus the "-" and tid value in decimal format.
2172                 return FALSE;
2173
2174         token = strchr(arg, DASH);
2175         if ((token != NULL) && (strlen(token)>1))
2176         {
2177                 tid = simple_strtol((token+1), 0, 10);
2178                 if (tid > NUM_OF_TID)
2179                         return FALSE;
2180
2181                 *token = '\0';
2182                 for (i = 0, token = rstrtok(arg, &sepValue[0]); token; token = rstrtok(NULL, &sepValue[0]), i++)
2183                 {
2184                         if((strlen(token) != 2) || (!isxdigit(*token)) || (!isxdigit(*(token+1))))
2185                                 return FALSE;
2186                         AtoH(token, (PUCHAR)(&mac[i]), 1);
2187                 }
2188                 if(i != 6)
2189                         return FALSE;
2190
2191             printk("\n%02x:%02x:%02x:%02x:%02x:%02x-%02x", mac[0], mac[1],
2192                    mac[2], mac[3], mac[4], mac[5], tid);
2193
2194             pEntry = MacTableLookup(pAd, mac);
2195
2196             if (pEntry) {
2197                 printk("\nTear down Ori BA Session: Tid = %d\n", tid);
2198         BAOriSessionTearDown(pAd, pEntry->Aid, tid, FALSE, TRUE);
2199             }
2200
2201                 return TRUE;
2202         }
2203
2204         return FALSE;
2205
2206 }
2207
2208 INT     Set_BARecTearDown_Proc(
2209         IN      PRTMP_ADAPTER   pAd,
2210         IN      PUCHAR                  arg)
2211 {
2212     UCHAR mac[6], tid;
2213         char *token, sepValue[] = ":", DASH = '-';
2214         INT i;
2215     MAC_TABLE_ENTRY *pEntry;
2216
2217     //printk("\n%s\n", arg);
2218 /*
2219         The BARecTearDown inupt string format should be xx:xx:xx:xx:xx:xx-d,
2220                 =>The six 2 digit hex-decimal number previous are the Mac address,
2221                 =>The seventh decimal number is the tid value.
2222 */
2223     if(strlen(arg) < 19)  //Mac address acceptable format 01:02:03:04:05:06 length 17 plus the "-" and tid value in decimal format.
2224                 return FALSE;
2225
2226         token = strchr(arg, DASH);
2227         if ((token != NULL) && (strlen(token)>1))
2228         {
2229                 tid = simple_strtol((token+1), 0, 10);
2230                 if (tid > NUM_OF_TID)
2231                         return FALSE;
2232
2233                 *token = '\0';
2234                 for (i = 0, token = rstrtok(arg, &sepValue[0]); token; token = rstrtok(NULL, &sepValue[0]), i++)
2235                 {
2236                         if((strlen(token) != 2) || (!isxdigit(*token)) || (!isxdigit(*(token+1))))
2237                                 return FALSE;
2238                         AtoH(token, (PUCHAR)(&mac[i]), 1);
2239                 }
2240                 if(i != 6)
2241                         return FALSE;
2242
2243                 printk("\n%02x:%02x:%02x:%02x:%02x:%02x-%02x", mac[0], mac[1],
2244                        mac[2], mac[3], mac[4], mac[5], tid);
2245
2246                 pEntry = MacTableLookup(pAd, mac);
2247
2248                 if (pEntry) {
2249                     printk("\nTear down Rec BA Session: Tid = %d\n", tid);
2250                     BARecSessionTearDown(pAd, pEntry->Aid, tid, FALSE);
2251                 }
2252
2253                 return TRUE;
2254         }
2255
2256         return FALSE;
2257
2258 }
2259
2260 INT     Set_HtBw_Proc(
2261         IN      PRTMP_ADAPTER   pAd,
2262         IN      PUCHAR                  arg)
2263 {
2264         ULONG HtBw;
2265
2266         HtBw = simple_strtol(arg, 0, 10);
2267         if (HtBw == BW_40)
2268                 pAd->CommonCfg.RegTransmitSetting.field.BW  = BW_40;
2269         else if (HtBw == BW_20)
2270                 pAd->CommonCfg.RegTransmitSetting.field.BW  = BW_20;
2271         else
2272                 return FALSE;  //Invalid argument
2273
2274         SetCommonHT(pAd);
2275
2276         DBGPRINT(RT_DEBUG_TRACE, ("Set_HtBw_Proc::(HtBw=%d)\n", pAd->CommonCfg.RegTransmitSetting.field.BW));
2277
2278         return TRUE;
2279 }
2280
2281 INT     Set_HtMcs_Proc(
2282         IN      PRTMP_ADAPTER   pAd,
2283         IN      PUCHAR                  arg)
2284 {
2285         ULONG HtMcs, Mcs_tmp;
2286 #ifdef CONFIG_STA_SUPPORT
2287     BOOLEAN bAutoRate = FALSE;
2288 #endif // CONFIG_STA_SUPPORT //
2289
2290         Mcs_tmp = simple_strtol(arg, 0, 10);
2291
2292         if (Mcs_tmp <= 15 || Mcs_tmp == 32)
2293                 HtMcs = Mcs_tmp;
2294         else
2295                 HtMcs = MCS_AUTO;
2296
2297 #ifdef CONFIG_STA_SUPPORT
2298         IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
2299         {
2300                 pAd->StaCfg.DesiredTransmitSetting.field.MCS = HtMcs;
2301                 pAd->StaCfg.bAutoTxRateSwitch = (HtMcs == MCS_AUTO) ? TRUE:FALSE;
2302                 DBGPRINT(RT_DEBUG_TRACE, ("Set_HtMcs_Proc::(HtMcs=%d, bAutoTxRateSwitch = %d)\n",
2303                                                 pAd->StaCfg.DesiredTransmitSetting.field.MCS, pAd->StaCfg.bAutoTxRateSwitch));
2304
2305                 if ((pAd->CommonCfg.PhyMode < PHY_11ABGN_MIXED) ||
2306                         (pAd->MacTab.Content[BSSID_WCID].HTPhyMode.field.MODE < MODE_HTMIX))
2307                 {
2308                 if ((pAd->StaCfg.DesiredTransmitSetting.field.MCS != MCS_AUTO) &&
2309                                 (HtMcs >= 0 && HtMcs <= 3) &&
2310                     (pAd->StaCfg.DesiredTransmitSetting.field.FixedTxMode == FIXED_TXMODE_CCK))
2311                         {
2312                                 RTMPSetDesiredRates(pAd, (LONG) (RateIdToMbps[HtMcs] * 1000000));
2313                         }
2314                 else if ((pAd->StaCfg.DesiredTransmitSetting.field.MCS != MCS_AUTO) &&
2315                                         (HtMcs >= 0 && HtMcs <= 7) &&
2316                         (pAd->StaCfg.DesiredTransmitSetting.field.FixedTxMode == FIXED_TXMODE_OFDM))
2317                         {
2318                                 RTMPSetDesiredRates(pAd, (LONG) (RateIdToMbps[HtMcs+4] * 1000000));
2319                         }
2320                         else
2321                                 bAutoRate = TRUE;
2322
2323                         if (bAutoRate)
2324                         {
2325                     pAd->StaCfg.DesiredTransmitSetting.field.MCS = MCS_AUTO;
2326                                 RTMPSetDesiredRates(pAd, -1);
2327                         }
2328                 DBGPRINT(RT_DEBUG_TRACE, ("Set_HtMcs_Proc::(FixedTxMode=%d)\n",pAd->StaCfg.DesiredTransmitSetting.field.FixedTxMode));
2329                 }
2330         if (ADHOC_ON(pAd))
2331             return TRUE;
2332         }
2333 #endif // CONFIG_STA_SUPPORT //
2334
2335         SetCommonHT(pAd);
2336
2337         return TRUE;
2338 }
2339
2340 INT     Set_HtGi_Proc(
2341         IN      PRTMP_ADAPTER   pAd,
2342         IN      PUCHAR                  arg)
2343 {
2344         ULONG HtGi;
2345
2346         HtGi = simple_strtol(arg, 0, 10);
2347
2348         if ( HtGi == GI_400)
2349                 pAd->CommonCfg.RegTransmitSetting.field.ShortGI = GI_400;
2350         else if ( HtGi == GI_800 )
2351                 pAd->CommonCfg.RegTransmitSetting.field.ShortGI = GI_800;
2352         else
2353                 return FALSE; //Invalid argument
2354
2355         SetCommonHT(pAd);
2356
2357         DBGPRINT(RT_DEBUG_TRACE, ("Set_HtGi_Proc::(ShortGI=%d)\n",pAd->CommonCfg.RegTransmitSetting.field.ShortGI));
2358
2359         return TRUE;
2360 }
2361
2362
2363 INT     Set_HtTxBASize_Proc(
2364         IN      PRTMP_ADAPTER   pAd,
2365         IN      PUCHAR                  arg)
2366 {
2367         UCHAR Size;
2368
2369         Size = simple_strtol(arg, 0, 10);
2370
2371         if (Size <=0 || Size >=64)
2372         {
2373                 Size = 8;
2374         }
2375         pAd->CommonCfg.TxBASize = Size-1;
2376         DBGPRINT(RT_DEBUG_ERROR, ("Set_HtTxBASize ::(TxBASize= %d)\n", Size));
2377
2378         return TRUE;
2379 }
2380
2381
2382 INT     Set_HtOpMode_Proc(
2383         IN      PRTMP_ADAPTER   pAd,
2384         IN      PUCHAR                  arg)
2385 {
2386
2387         ULONG Value;
2388
2389         Value = simple_strtol(arg, 0, 10);
2390
2391         if (Value == HTMODE_GF)
2392                 pAd->CommonCfg.RegTransmitSetting.field.HTMODE  = HTMODE_GF;
2393         else if ( Value == HTMODE_MM )
2394                 pAd->CommonCfg.RegTransmitSetting.field.HTMODE  = HTMODE_MM;
2395         else
2396                 return FALSE; //Invalid argument
2397
2398         SetCommonHT(pAd);
2399
2400         DBGPRINT(RT_DEBUG_TRACE, ("Set_HtOpMode_Proc::(HtOpMode=%d)\n",pAd->CommonCfg.RegTransmitSetting.field.HTMODE));
2401
2402         return TRUE;
2403
2404 }
2405
2406 INT     Set_HtStbc_Proc(
2407         IN      PRTMP_ADAPTER   pAd,
2408         IN      PUCHAR                  arg)
2409 {
2410
2411         ULONG Value;
2412
2413         Value = simple_strtol(arg, 0, 10);
2414
2415         if (Value == STBC_USE)
2416                 pAd->CommonCfg.RegTransmitSetting.field.STBC = STBC_USE;
2417         else if ( Value == STBC_NONE )
2418                 pAd->CommonCfg.RegTransmitSetting.field.STBC = STBC_NONE;
2419         else
2420                 return FALSE; //Invalid argument
2421
2422         SetCommonHT(pAd);
2423
2424         DBGPRINT(RT_DEBUG_TRACE, ("Set_Stbc_Proc::(HtStbc=%d)\n",pAd->CommonCfg.RegTransmitSetting.field.STBC));
2425
2426         return TRUE;
2427 }
2428
2429 INT     Set_HtHtc_Proc(
2430         IN      PRTMP_ADAPTER   pAd,
2431         IN      PUCHAR                  arg)
2432 {
2433
2434         ULONG Value;
2435
2436         Value = simple_strtol(arg, 0, 10);
2437         if (Value == 0)
2438                 pAd->HTCEnable = FALSE;
2439         else if ( Value ==1 )
2440                 pAd->HTCEnable = TRUE;
2441         else
2442                 return FALSE; //Invalid argument
2443
2444         DBGPRINT(RT_DEBUG_TRACE, ("Set_HtHtc_Proc::(HtHtc=%d)\n",pAd->HTCEnable));
2445
2446         return TRUE;
2447 }
2448
2449 INT     Set_HtExtcha_Proc(
2450         IN      PRTMP_ADAPTER   pAd,
2451         IN      PUCHAR                  arg)
2452 {
2453
2454         ULONG Value;
2455
2456         Value = simple_strtol(arg, 0, 10);
2457
2458         if (Value == 0)
2459                 pAd->CommonCfg.RegTransmitSetting.field.EXTCHA  = EXTCHA_BELOW;
2460         else if ( Value ==1 )
2461         pAd->CommonCfg.RegTransmitSetting.field.EXTCHA = EXTCHA_ABOVE;
2462         else
2463                 return FALSE; //Invalid argument
2464
2465         SetCommonHT(pAd);
2466
2467         DBGPRINT(RT_DEBUG_TRACE, ("Set_HtExtcha_Proc::(HtExtcha=%d)\n",pAd->CommonCfg.RegTransmitSetting.field.EXTCHA));
2468
2469         return TRUE;
2470 }
2471
2472 INT     Set_HtMpduDensity_Proc(
2473         IN      PRTMP_ADAPTER   pAd,
2474         IN      PUCHAR                  arg)
2475 {
2476         ULONG Value;
2477
2478         Value = simple_strtol(arg, 0, 10);
2479
2480         if (Value <=7 && Value >= 0)
2481                 pAd->CommonCfg.BACapability.field.MpduDensity = Value;
2482         else
2483                 pAd->CommonCfg.BACapability.field.MpduDensity = 4;
2484
2485         SetCommonHT(pAd);
2486
2487         DBGPRINT(RT_DEBUG_TRACE, ("Set_HtMpduDensity_Proc::(HtMpduDensity=%d)\n",pAd->CommonCfg.BACapability.field.MpduDensity));
2488
2489         return TRUE;
2490 }
2491
2492 INT     Set_HtBaWinSize_Proc(
2493         IN      PRTMP_ADAPTER   pAd,
2494         IN      PUCHAR                  arg)
2495 {
2496         ULONG Value;
2497
2498         Value = simple_strtol(arg, 0, 10);
2499
2500
2501         if (Value >=1 && Value <= 64)
2502         {
2503                 pAd->CommonCfg.REGBACapability.field.RxBAWinLimit = Value;
2504                 pAd->CommonCfg.BACapability.field.RxBAWinLimit = Value;
2505         }
2506         else
2507         {
2508         pAd->CommonCfg.REGBACapability.field.RxBAWinLimit = 64;
2509                 pAd->CommonCfg.BACapability.field.RxBAWinLimit = 64;
2510         }
2511
2512         SetCommonHT(pAd);
2513
2514         DBGPRINT(RT_DEBUG_TRACE, ("Set_HtBaWinSize_Proc::(HtBaWinSize=%d)\n",pAd->CommonCfg.BACapability.field.RxBAWinLimit));
2515
2516         return TRUE;
2517 }
2518
2519 INT     Set_HtRdg_Proc(
2520         IN      PRTMP_ADAPTER   pAd,
2521         IN      PUCHAR                  arg)
2522 {
2523         ULONG Value;
2524
2525         Value = simple_strtol(arg, 0, 10);
2526
2527         if (Value == 0)
2528                 pAd->CommonCfg.bRdg = FALSE;
2529         else if ( Value ==1 )
2530         {
2531                 pAd->HTCEnable = TRUE;
2532                 pAd->CommonCfg.bRdg = TRUE;
2533         }
2534         else
2535                 return FALSE; //Invalid argument
2536
2537         SetCommonHT(pAd);
2538
2539         DBGPRINT(RT_DEBUG_TRACE, ("Set_HtRdg_Proc::(HtRdg=%d)\n",pAd->CommonCfg.bRdg));
2540
2541         return TRUE;
2542 }
2543
2544 INT     Set_HtLinkAdapt_Proc(
2545         IN      PRTMP_ADAPTER   pAd,
2546         IN      PUCHAR                  arg)
2547 {
2548         ULONG Value;
2549
2550         Value = simple_strtol(arg, 0, 10);
2551         if (Value == 0)
2552                 pAd->bLinkAdapt = FALSE;
2553         else if ( Value ==1 )
2554         {
2555                         pAd->HTCEnable = TRUE;
2556                         pAd->bLinkAdapt = TRUE;
2557         }
2558         else
2559                 return FALSE; //Invalid argument
2560
2561         DBGPRINT(RT_DEBUG_TRACE, ("Set_HtLinkAdapt_Proc::(HtLinkAdapt=%d)\n",pAd->bLinkAdapt));
2562
2563         return TRUE;
2564 }
2565
2566 INT     Set_HtAmsdu_Proc(
2567         IN      PRTMP_ADAPTER   pAd,
2568         IN      PUCHAR                  arg)
2569 {
2570         ULONG Value;
2571
2572         Value = simple_strtol(arg, 0, 10);
2573         if (Value == 0)
2574                 pAd->CommonCfg.BACapability.field.AmsduEnable = FALSE;
2575         else if ( Value == 1 )
2576         pAd->CommonCfg.BACapability.field.AmsduEnable = TRUE;
2577         else
2578                 return FALSE; //Invalid argument
2579
2580         SetCommonHT(pAd);
2581
2582         DBGPRINT(RT_DEBUG_TRACE, ("Set_HtAmsdu_Proc::(HtAmsdu=%d)\n",pAd->CommonCfg.BACapability.field.AmsduEnable));
2583
2584         return TRUE;
2585 }
2586
2587 INT     Set_HtAutoBa_Proc(
2588         IN      PRTMP_ADAPTER   pAd,
2589         IN      PUCHAR                  arg)
2590 {
2591         ULONG Value;
2592
2593         Value = simple_strtol(arg, 0, 10);
2594         if (Value == 0)
2595                 pAd->CommonCfg.BACapability.field.AutoBA = FALSE;
2596     else if (Value == 1)
2597                 pAd->CommonCfg.BACapability.field.AutoBA = TRUE;
2598         else
2599                 return FALSE; //Invalid argument
2600
2601     pAd->CommonCfg.REGBACapability.field.AutoBA = pAd->CommonCfg.BACapability.field.AutoBA;
2602         SetCommonHT(pAd);
2603
2604         DBGPRINT(RT_DEBUG_TRACE, ("Set_HtAutoBa_Proc::(HtAutoBa=%d)\n",pAd->CommonCfg.BACapability.field.AutoBA));
2605
2606         return TRUE;
2607
2608 }
2609
2610 INT     Set_HtProtect_Proc(
2611         IN      PRTMP_ADAPTER   pAd,
2612         IN      PUCHAR                  arg)
2613 {
2614         ULONG Value;
2615
2616         Value = simple_strtol(arg, 0, 10);
2617         if (Value == 0)
2618                 pAd->CommonCfg.bHTProtect = FALSE;
2619     else if (Value == 1)
2620                 pAd->CommonCfg.bHTProtect = TRUE;
2621         else
2622                 return FALSE; //Invalid argument
2623
2624         DBGPRINT(RT_DEBUG_TRACE, ("Set_HtProtect_Proc::(HtProtect=%d)\n",pAd->CommonCfg.bHTProtect));
2625
2626         return TRUE;
2627 }
2628
2629 INT     Set_SendPSMPAction_Proc(
2630         IN      PRTMP_ADAPTER   pAd,
2631         IN      PUCHAR                  arg)
2632 {
2633     UCHAR mac[6], mode;
2634         char *token, sepValue[] = ":", DASH = '-';
2635         INT i;
2636     MAC_TABLE_ENTRY *pEntry;
2637
2638     //printk("\n%s\n", arg);
2639 /*
2640         The BARecTearDown inupt string format should be xx:xx:xx:xx:xx:xx-d,
2641                 =>The six 2 digit hex-decimal number previous are the Mac address,
2642                 =>The seventh decimal number is the mode value.
2643 */
2644     if(strlen(arg) < 19)  //Mac address acceptable format 01:02:03:04:05:06 length 17 plus the "-" and mode value in decimal format.
2645                 return FALSE;
2646
2647         token = strchr(arg, DASH);
2648         if ((token != NULL) && (strlen(token)>1))
2649         {
2650                 mode = simple_strtol((token+1), 0, 10);
2651                 if (mode > MMPS_ENABLE)
2652                         return FALSE;
2653
2654                 *token = '\0';
2655                 for (i = 0, token = rstrtok(arg, &sepValue[0]); token; token = rstrtok(NULL, &sepValue[0]), i++)
2656                 {
2657                         if((strlen(token) != 2) || (!isxdigit(*token)) || (!isxdigit(*(token+1))))
2658                                 return FALSE;
2659                         AtoH(token, (PUCHAR)(&mac[i]), 1);
2660                 }
2661                 if(i != 6)
2662                         return FALSE;
2663
2664                 printk("\n%02x:%02x:%02x:%02x:%02x:%02x-%02x", mac[0], mac[1],
2665                        mac[2], mac[3], mac[4], mac[5], mode);
2666
2667                 pEntry = MacTableLookup(pAd, mac);
2668
2669                 if (pEntry) {
2670                     printk("\nSendPSMPAction MIPS mode = %d\n", mode);
2671                     SendPSMPAction(pAd, pEntry->Aid, mode);
2672                 }
2673
2674                 return TRUE;
2675         }
2676
2677         return FALSE;
2678
2679
2680 }
2681
2682 INT     Set_HtMIMOPSmode_Proc(
2683         IN      PRTMP_ADAPTER   pAd,
2684         IN      PUCHAR                  arg)
2685 {
2686         ULONG Value;
2687
2688         Value = simple_strtol(arg, 0, 10);
2689
2690         if (Value <=3 && Value >= 0)
2691                 pAd->CommonCfg.BACapability.field.MMPSmode = Value;
2692         else
2693                 pAd->CommonCfg.BACapability.field.MMPSmode = 3;
2694
2695         SetCommonHT(pAd);
2696
2697         DBGPRINT(RT_DEBUG_TRACE, ("Set_HtMIMOPSmode_Proc::(MIMOPS mode=%d)\n",pAd->CommonCfg.BACapability.field.MMPSmode));
2698
2699         return TRUE;
2700 }
2701
2702
2703 INT     Set_ForceShortGI_Proc(
2704         IN      PRTMP_ADAPTER   pAd,
2705         IN      PUCHAR                  arg)
2706 {
2707         ULONG Value;
2708
2709         Value = simple_strtol(arg, 0, 10);
2710         if (Value == 0)
2711                 pAd->WIFItestbed.bShortGI = FALSE;
2712         else if (Value == 1)
2713                 pAd->WIFItestbed.bShortGI = TRUE;
2714         else
2715                 return FALSE; //Invalid argument
2716
2717         SetCommonHT(pAd);
2718
2719         DBGPRINT(RT_DEBUG_TRACE, ("Set_ForceShortGI_Proc::(ForceShortGI=%d)\n", pAd->WIFItestbed.bShortGI));
2720
2721         return TRUE;
2722 }
2723
2724
2725
2726 INT     Set_ForceGF_Proc(
2727         IN      PRTMP_ADAPTER   pAd,
2728         IN      PUCHAR                  arg)
2729 {
2730         ULONG Value;
2731
2732         Value = simple_strtol(arg, 0, 10);
2733         if (Value == 0)
2734                 pAd->WIFItestbed.bGreenField = FALSE;
2735         else if (Value == 1)
2736                 pAd->WIFItestbed.bGreenField = TRUE;
2737         else
2738                 return FALSE; //Invalid argument
2739
2740         SetCommonHT(pAd);
2741
2742         DBGPRINT(RT_DEBUG_TRACE, ("Set_ForceGF_Proc::(ForceGF=%d)\n", pAd->WIFItestbed.bGreenField));
2743
2744         return TRUE;
2745 }
2746
2747 INT     Set_HtMimoPs_Proc(
2748         IN      PRTMP_ADAPTER   pAd,
2749         IN      PUCHAR                  arg)
2750 {
2751         ULONG Value;
2752
2753         Value = simple_strtol(arg, 0, 10);
2754         if (Value == 0)
2755                 pAd->CommonCfg.bMIMOPSEnable = FALSE;
2756         else if (Value == 1)
2757                 pAd->CommonCfg.bMIMOPSEnable = TRUE;
2758         else
2759                 return FALSE; //Invalid argument
2760
2761         DBGPRINT(RT_DEBUG_TRACE, ("Set_HtMimoPs_Proc::(HtMimoPs=%d)\n",pAd->CommonCfg.bMIMOPSEnable));
2762
2763         return TRUE;
2764 }
2765 #endif // DOT11_N_SUPPORT //
2766
2767
2768 #ifdef DOT11_N_SUPPORT
2769 INT     SetCommonHT(
2770         IN      PRTMP_ADAPTER   pAd)
2771 {
2772         OID_SET_HT_PHYMODE              SetHT;
2773
2774         if (pAd->CommonCfg.PhyMode < PHY_11ABGN_MIXED)
2775                 return FALSE;
2776
2777         SetHT.PhyMode = pAd->CommonCfg.PhyMode;
2778         SetHT.TransmitNo = ((UCHAR)pAd->Antenna.field.TxPath);
2779         SetHT.HtMode = (UCHAR)pAd->CommonCfg.RegTransmitSetting.field.HTMODE;
2780         SetHT.ExtOffset = (UCHAR)pAd->CommonCfg.RegTransmitSetting.field.EXTCHA;
2781         SetHT.MCS = MCS_AUTO;
2782         SetHT.BW = (UCHAR)pAd->CommonCfg.RegTransmitSetting.field.BW;
2783         SetHT.STBC = (UCHAR)pAd->CommonCfg.RegTransmitSetting.field.STBC;
2784         SetHT.SHORTGI = (UCHAR)pAd->CommonCfg.RegTransmitSetting.field.ShortGI;
2785
2786         RTMPSetHT(pAd, &SetHT);
2787
2788         return TRUE;
2789 }
2790 #endif // DOT11_N_SUPPORT //
2791
2792 INT     Set_FixedTxMode_Proc(
2793         IN      PRTMP_ADAPTER   pAd,
2794         IN      PUCHAR                  arg)
2795 {
2796         UCHAR   fix_tx_mode = FIXED_TXMODE_HT;
2797
2798         if (strcmp(arg, "OFDM") == 0 || strcmp(arg, "ofdm") == 0)
2799         {
2800                 fix_tx_mode = FIXED_TXMODE_OFDM;
2801         }
2802         else if (strcmp(arg, "CCK") == 0 || strcmp(arg, "cck") == 0)
2803         {
2804         fix_tx_mode = FIXED_TXMODE_CCK;
2805         }
2806
2807 #ifdef CONFIG_STA_SUPPORT
2808         IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
2809                 pAd->StaCfg.DesiredTransmitSetting.field.FixedTxMode = fix_tx_mode;
2810 #endif // CONFIG_STA_SUPPORT //
2811
2812         DBGPRINT(RT_DEBUG_TRACE, ("Set_FixedTxMode_Proc::(FixedTxMode=%d)\n", fix_tx_mode));
2813
2814         return TRUE;
2815 }
2816
2817 /////////////////////////////////////////////////////////////////////////
2818 PCHAR   RTMPGetRalinkAuthModeStr(
2819     IN  NDIS_802_11_AUTHENTICATION_MODE authMode)
2820 {
2821         switch(authMode)
2822         {
2823                 case Ndis802_11AuthModeOpen:
2824                         return "OPEN";
2825         default:
2826                 case Ndis802_11AuthModeWPAPSK:
2827                         return "WPAPSK";
2828                 case Ndis802_11AuthModeShared:
2829                         return "SHARED";
2830                 case Ndis802_11AuthModeWPA:
2831                         return "WPA";
2832                 case Ndis802_11AuthModeWPA2:
2833                         return "WPA2";
2834                 case Ndis802_11AuthModeWPA2PSK:
2835                         return "WPA2PSK";
2836         case Ndis802_11AuthModeWPA1PSKWPA2PSK:
2837                         return "WPAPSKWPA2PSK";
2838         case Ndis802_11AuthModeWPA1WPA2:
2839                         return "WPA1WPA2";
2840                 case Ndis802_11AuthModeWPANone:
2841                         return "WPANONE";
2842         }
2843 }
2844
2845 PCHAR   RTMPGetRalinkEncryModeStr(
2846     IN  USHORT encryMode)
2847 {
2848         switch(encryMode)
2849         {
2850             default:
2851                 case Ndis802_11WEPDisabled:
2852                         return "NONE";
2853                 case Ndis802_11WEPEnabled:
2854                         return "WEP";
2855                 case Ndis802_11Encryption2Enabled:
2856                         return "TKIP";
2857                 case Ndis802_11Encryption3Enabled:
2858                         return "AES";
2859         case Ndis802_11Encryption4Enabled:
2860                         return "TKIPAES";
2861         }
2862 }
2863
2864 INT RTMPShowCfgValue(
2865         IN      PRTMP_ADAPTER   pAd,
2866         IN      PUCHAR                  pName,
2867         IN      PUCHAR                  pBuf)
2868 {
2869         INT     Status = 0;
2870
2871         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++)
2872         {
2873                 if (!strcmp(pName, PRTMP_PRIVATE_STA_SHOW_CFG_VALUE_PROC->name))
2874                 {
2875                         if(PRTMP_PRIVATE_STA_SHOW_CFG_VALUE_PROC->show_proc(pAd, pBuf))
2876                                 Status = -EINVAL;
2877                         break;  //Exit for loop.
2878                 }
2879         }
2880
2881         if(PRTMP_PRIVATE_STA_SHOW_CFG_VALUE_PROC->name == NULL)
2882         {
2883                 sprintf(pBuf, "\n");
2884                 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++)
2885                         sprintf(pBuf + strlen(pBuf), "%s\n", PRTMP_PRIVATE_STA_SHOW_CFG_VALUE_PROC->name);
2886         }
2887
2888         return Status;
2889 }
2890
2891 INT     Show_SSID_Proc(
2892         IN      PRTMP_ADAPTER   pAd,
2893         OUT     PUCHAR                  pBuf)
2894 {
2895
2896 #ifdef CONFIG_STA_SUPPORT
2897         IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
2898                 sprintf(pBuf, "\t%s", pAd->CommonCfg.Ssid);
2899 #endif // CONFIG_STA_SUPPORT //
2900         return 0;
2901 }
2902
2903 INT     Show_WirelessMode_Proc(
2904         IN      PRTMP_ADAPTER   pAd,
2905         OUT     PUCHAR                  pBuf)
2906 {
2907         switch(pAd->CommonCfg.PhyMode)
2908         {
2909                 case PHY_11BG_MIXED:
2910                         sprintf(pBuf, "\t11B/G");
2911                         break;
2912                 case PHY_11B:
2913                         sprintf(pBuf, "\t11B");
2914                         break;
2915                 case PHY_11A:
2916                         sprintf(pBuf, "\t11A");
2917                         break;
2918                 case PHY_11ABG_MIXED:
2919                         sprintf(pBuf, "\t11A/B/G");
2920                         break;
2921                 case PHY_11G:
2922                         sprintf(pBuf, "\t11G");
2923                         break;
2924 #ifdef DOT11_N_SUPPORT
2925                 case PHY_11ABGN_MIXED:
2926                         sprintf(pBuf, "\t11A/B/G/N");
2927                         break;
2928                 case PHY_11N_2_4G:
2929                         sprintf(pBuf, "\t11N only with 2.4G");
2930                         break;
2931                 case PHY_11GN_MIXED:
2932                         sprintf(pBuf, "\t11G/N");
2933                         break;
2934                 case PHY_11AN_MIXED:
2935                         sprintf(pBuf, "\t11A/N");
2936                         break;
2937                 case PHY_11BGN_MIXED:
2938                         sprintf(pBuf, "\t11B/G/N");
2939                         break;
2940                 case PHY_11AGN_MIXED:
2941                         sprintf(pBuf, "\t11A/G/N");
2942                         break;
2943                 case PHY_11N_5G:
2944                         sprintf(pBuf, "\t11N only with 5G");
2945                         break;
2946 #endif // DOT11_N_SUPPORT //
2947                 default:
2948                         sprintf(pBuf, "\tUnknow Value(%d)", pAd->CommonCfg.PhyMode);
2949                         break;
2950         }
2951         return 0;
2952 }
2953
2954
2955 INT     Show_TxBurst_Proc(
2956         IN      PRTMP_ADAPTER   pAd,
2957         OUT     PUCHAR                  pBuf)
2958 {
2959         sprintf(pBuf, "\t%s", pAd->CommonCfg.bEnableTxBurst ? "TRUE":"FALSE");
2960         return 0;
2961 }
2962
2963 INT     Show_TxPreamble_Proc(
2964         IN      PRTMP_ADAPTER   pAd,
2965         OUT     PUCHAR                  pBuf)
2966 {
2967         switch(pAd->CommonCfg.TxPreamble)
2968         {
2969                 case Rt802_11PreambleShort:
2970                         sprintf(pBuf, "\tShort");
2971                         break;
2972                 case Rt802_11PreambleLong:
2973                         sprintf(pBuf, "\tLong");
2974                         break;
2975                 case Rt802_11PreambleAuto:
2976                         sprintf(pBuf, "\tAuto");
2977                         break;
2978                 default:
2979                         sprintf(pBuf, "\tUnknow Value(%lu)", pAd->CommonCfg.TxPreamble);
2980                         break;
2981         }
2982
2983         return 0;
2984 }
2985
2986 INT     Show_TxPower_Proc(
2987         IN      PRTMP_ADAPTER   pAd,
2988         OUT     PUCHAR                  pBuf)
2989 {
2990         sprintf(pBuf, "\t%lu", pAd->CommonCfg.TxPowerPercentage);
2991         return 0;
2992 }
2993
2994 INT     Show_Channel_Proc(
2995         IN      PRTMP_ADAPTER   pAd,
2996         OUT     PUCHAR                  pBuf)
2997 {
2998         sprintf(pBuf, "\t%d", pAd->CommonCfg.Channel);
2999         return 0;
3000 }
3001
3002 INT     Show_BGProtection_Proc(
3003         IN      PRTMP_ADAPTER   pAd,
3004         OUT     PUCHAR                  pBuf)
3005 {
3006         switch(pAd->CommonCfg.UseBGProtection)
3007         {
3008                 case 1: //Always On
3009                         sprintf(pBuf, "\tON");
3010                         break;
3011                 case 2: //Always OFF
3012                         sprintf(pBuf, "\tOFF");
3013                         break;
3014                 case 0: //AUTO
3015                         sprintf(pBuf, "\tAuto");
3016                         break;
3017                 default:
3018                         sprintf(pBuf, "\tUnknow Value(%lu)", pAd->CommonCfg.UseBGProtection);
3019                         break;
3020         }
3021         return 0;
3022 }
3023
3024 INT     Show_RTSThreshold_Proc(
3025         IN      PRTMP_ADAPTER   pAd,
3026         OUT     PUCHAR                  pBuf)
3027 {
3028         sprintf(pBuf, "\t%u", pAd->CommonCfg.RtsThreshold);
3029         return 0;
3030 }
3031
3032 INT     Show_FragThreshold_Proc(
3033         IN      PRTMP_ADAPTER   pAd,
3034         OUT     PUCHAR                  pBuf)
3035 {
3036         sprintf(pBuf, "\t%u", pAd->CommonCfg.FragmentThreshold);
3037         return 0;
3038 }
3039
3040 #ifdef DOT11_N_SUPPORT
3041 INT     Show_HtBw_Proc(
3042         IN      PRTMP_ADAPTER   pAd,
3043         OUT     PUCHAR                  pBuf)
3044 {
3045         if (pAd->CommonCfg.RegTransmitSetting.field.BW == BW_40)
3046         {
3047                 sprintf(pBuf, "\t40 MHz");
3048         }
3049         else
3050         {
3051         sprintf(pBuf, "\t20 MHz");
3052         }
3053         return 0;
3054 }
3055
3056 INT     Show_HtMcs_Proc(
3057         IN      PRTMP_ADAPTER   pAd,
3058         OUT     PUCHAR                  pBuf)
3059 {
3060
3061 #ifdef CONFIG_STA_SUPPORT
3062         IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
3063                 sprintf(pBuf, "\t%u", pAd->StaCfg.DesiredTransmitSetting.field.MCS);
3064 #endif // CONFIG_STA_SUPPORT //
3065         return 0;
3066 }
3067
3068 INT     Show_HtGi_Proc(
3069         IN      PRTMP_ADAPTER   pAd,
3070         OUT     PUCHAR                  pBuf)
3071 {
3072         switch(pAd->CommonCfg.RegTransmitSetting.field.ShortGI)
3073         {
3074                 case GI_400:
3075                         sprintf(pBuf, "\tGI_400");
3076                         break;
3077                 case GI_800:
3078                         sprintf(pBuf, "\tGI_800");
3079                         break;
3080                 default:
3081                         sprintf(pBuf, "\tUnknow Value(%u)", pAd->CommonCfg.RegTransmitSetting.field.ShortGI);
3082                         break;
3083         }
3084         return 0;
3085 }
3086
3087 INT     Show_HtOpMode_Proc(
3088         IN      PRTMP_ADAPTER   pAd,
3089         OUT     PUCHAR                  pBuf)
3090 {
3091         switch(pAd->CommonCfg.RegTransmitSetting.field.HTMODE)
3092         {
3093                 case HTMODE_GF:
3094                         sprintf(pBuf, "\tGF");
3095                         break;
3096                 case HTMODE_MM:
3097                         sprintf(pBuf, "\tMM");
3098                         break;
3099                 default:
3100                         sprintf(pBuf, "\tUnknow Value(%u)", pAd->CommonCfg.RegTransmitSetting.field.HTMODE);
3101                         break;
3102         }
3103         return 0;
3104 }
3105
3106 INT     Show_HtExtcha_Proc(
3107         IN      PRTMP_ADAPTER   pAd,
3108         OUT     PUCHAR                  pBuf)
3109 {
3110         switch(pAd->CommonCfg.RegTransmitSetting.field.EXTCHA)
3111         {
3112                 case EXTCHA_BELOW:
3113                         sprintf(pBuf, "\tBelow");
3114                         break;
3115                 case EXTCHA_ABOVE:
3116                         sprintf(pBuf, "\tAbove");
3117                         break;
3118                 default:
3119                         sprintf(pBuf, "\tUnknow Value(%u)", pAd->CommonCfg.RegTransmitSetting.field.EXTCHA);
3120                         break;
3121         }
3122         return 0;
3123 }
3124
3125
3126 INT     Show_HtMpduDensity_Proc(
3127         IN      PRTMP_ADAPTER   pAd,
3128         OUT     PUCHAR                  pBuf)
3129 {
3130         sprintf(pBuf, "\t%u", pAd->CommonCfg.BACapability.field.MpduDensity);
3131         return 0;
3132 }
3133
3134 INT     Show_HtBaWinSize_Proc(
3135         IN      PRTMP_ADAPTER   pAd,
3136         OUT     PUCHAR                  pBuf)
3137 {
3138         sprintf(pBuf, "\t%u", pAd->CommonCfg.BACapability.field.RxBAWinLimit);
3139         return 0;
3140 }
3141
3142 INT     Show_HtRdg_Proc(
3143         IN      PRTMP_ADAPTER   pAd,
3144         OUT     PUCHAR                  pBuf)
3145 {
3146         sprintf(pBuf, "\t%s", pAd->CommonCfg.bRdg ? "TRUE":"FALSE");
3147         return 0;
3148 }
3149
3150 INT     Show_HtAmsdu_Proc(
3151         IN      PRTMP_ADAPTER   pAd,
3152         OUT     PUCHAR                  pBuf)
3153 {
3154         sprintf(pBuf, "\t%s", pAd->CommonCfg.BACapability.field.AmsduEnable ? "TRUE":"FALSE");
3155         return 0;
3156 }
3157
3158 INT     Show_HtAutoBa_Proc(
3159         IN      PRTMP_ADAPTER   pAd,
3160         OUT     PUCHAR                  pBuf)
3161 {
3162         sprintf(pBuf, "\t%s", pAd->CommonCfg.BACapability.field.AutoBA ? "TRUE":"FALSE");
3163         return 0;
3164 }
3165 #endif // DOT11_N_SUPPORT //
3166
3167 INT     Show_CountryRegion_Proc(
3168         IN      PRTMP_ADAPTER   pAd,
3169         OUT     PUCHAR                  pBuf)
3170 {
3171         sprintf(pBuf, "\t%d", pAd->CommonCfg.CountryRegion);
3172         return 0;
3173 }
3174
3175 INT     Show_CountryRegionABand_Proc(
3176         IN      PRTMP_ADAPTER   pAd,
3177         OUT     PUCHAR                  pBuf)
3178 {
3179         sprintf(pBuf, "\t%d", pAd->CommonCfg.CountryRegionForABand);
3180         return 0;
3181 }
3182
3183 INT     Show_CountryCode_Proc(
3184         IN      PRTMP_ADAPTER   pAd,
3185         OUT     PUCHAR                  pBuf)
3186 {
3187         sprintf(pBuf, "\t%s", pAd->CommonCfg.CountryCode);
3188         return 0;
3189 }
3190
3191 #ifdef AGGREGATION_SUPPORT
3192 INT     Show_PktAggregate_Proc(
3193         IN      PRTMP_ADAPTER   pAd,
3194         OUT     PUCHAR                  pBuf)
3195 {
3196         sprintf(pBuf, "\t%s", pAd->CommonCfg.bAggregationCapable ? "TRUE":"FALSE");
3197         return 0;
3198 }
3199 #endif // AGGREGATION_SUPPORT //
3200
3201 #ifdef WMM_SUPPORT
3202 INT     Show_WmmCapable_Proc(
3203         IN      PRTMP_ADAPTER   pAd,
3204         OUT     PUCHAR                  pBuf)
3205 {
3206
3207 #ifdef CONFIG_STA_SUPPORT
3208         IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
3209                 sprintf(pBuf, "\t%s", pAd->CommonCfg.bWmmCapable ? "TRUE":"FALSE");
3210 #endif // CONFIG_STA_SUPPORT //
3211
3212         return 0;
3213 }
3214 #endif // WMM_SUPPORT //
3215
3216 INT     Show_IEEE80211H_Proc(
3217         IN      PRTMP_ADAPTER   pAd,
3218         OUT     PUCHAR                  pBuf)
3219 {
3220         sprintf(pBuf, "\t%s", pAd->CommonCfg.bIEEE80211H ? "TRUE":"FALSE");
3221         return 0;
3222 }
3223
3224 #ifdef CONFIG_STA_SUPPORT
3225 INT     Show_NetworkType_Proc(
3226         IN      PRTMP_ADAPTER   pAd,
3227         OUT     PUCHAR                  pBuf)
3228 {
3229         switch(pAd->StaCfg.BssType)
3230         {
3231                 case BSS_ADHOC:
3232                         sprintf(pBuf, "\tAdhoc");
3233                         break;
3234                 case BSS_INFRA:
3235                         sprintf(pBuf, "\tInfra");
3236                         break;
3237                 case BSS_ANY:
3238                         sprintf(pBuf, "\tAny");
3239                         break;
3240                 case BSS_MONITOR:
3241                         sprintf(pBuf, "\tMonitor");
3242                         break;
3243                 default:
3244                         sprintf(pBuf, "\tUnknow Value(%d)", pAd->StaCfg.BssType);
3245                         break;
3246         }
3247         return 0;
3248 }
3249 #endif // CONFIG_STA_SUPPORT //
3250
3251 INT     Show_AuthMode_Proc(
3252         IN      PRTMP_ADAPTER   pAd,
3253         OUT     PUCHAR                  pBuf)
3254 {
3255         NDIS_802_11_AUTHENTICATION_MODE AuthMode = Ndis802_11AuthModeOpen;
3256
3257 #ifdef CONFIG_STA_SUPPORT
3258         IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
3259                 AuthMode = pAd->StaCfg.AuthMode;
3260 #endif // CONFIG_STA_SUPPORT //
3261
3262         if ((AuthMode >= Ndis802_11AuthModeOpen) &&
3263                 (AuthMode <= Ndis802_11AuthModeWPA1PSKWPA2PSK))
3264                 sprintf(pBuf, "\t%s", RTMPGetRalinkAuthModeStr(AuthMode));
3265         else
3266                 sprintf(pBuf, "\tUnknow Value(%d)", AuthMode);
3267
3268         return 0;
3269 }
3270
3271 INT     Show_EncrypType_Proc(
3272         IN      PRTMP_ADAPTER   pAd,
3273         OUT     PUCHAR                  pBuf)
3274 {
3275         NDIS_802_11_WEP_STATUS  WepStatus = Ndis802_11WEPDisabled;
3276
3277 #ifdef CONFIG_STA_SUPPORT
3278         IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
3279                 WepStatus = pAd->StaCfg.WepStatus;
3280 #endif // CONFIG_STA_SUPPORT //
3281
3282         if ((WepStatus >= Ndis802_11WEPEnabled) &&
3283                 (WepStatus <= Ndis802_11Encryption4KeyAbsent))
3284                 sprintf(pBuf, "\t%s", RTMPGetRalinkEncryModeStr(WepStatus));
3285         else
3286                 sprintf(pBuf, "\tUnknow Value(%d)", WepStatus);
3287
3288         return 0;
3289 }
3290
3291 INT     Show_DefaultKeyID_Proc(
3292         IN      PRTMP_ADAPTER   pAd,
3293         OUT     PUCHAR                  pBuf)
3294 {
3295         UCHAR DefaultKeyId = 0;
3296
3297 #ifdef CONFIG_STA_SUPPORT
3298         IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
3299                 DefaultKeyId = pAd->StaCfg.DefaultKeyId;
3300 #endif // CONFIG_STA_SUPPORT //
3301
3302         sprintf(pBuf, "\t%d", DefaultKeyId);
3303
3304         return 0;
3305 }
3306
3307 INT     Show_WepKey_Proc(
3308         IN      PRTMP_ADAPTER   pAd,
3309         IN  INT                         KeyIdx,
3310         OUT     PUCHAR                  pBuf)
3311 {
3312         UCHAR   Key[16] = {0}, KeyLength = 0;
3313         INT             index = BSS0;
3314
3315         KeyLength = pAd->SharedKey[index][KeyIdx].KeyLen;
3316         NdisMoveMemory(Key, pAd->SharedKey[index][KeyIdx].Key, KeyLength);
3317
3318         //check key string is ASCII or not
3319     if (RTMPCheckStrPrintAble(Key, KeyLength))
3320         sprintf(pBuf, "\t%s", Key);
3321     else
3322     {
3323         int idx;
3324         sprintf(pBuf, "\t");
3325         for (idx = 0; idx < KeyLength; idx++)
3326             sprintf(pBuf+strlen(pBuf), "%02X", Key[idx]);
3327     }
3328         return 0;
3329 }
3330
3331 INT     Show_Key1_Proc(
3332         IN      PRTMP_ADAPTER   pAd,
3333         OUT     PUCHAR                  pBuf)
3334 {
3335         Show_WepKey_Proc(pAd, 0, pBuf);
3336         return 0;
3337 }
3338
3339 INT     Show_Key2_Proc(
3340         IN      PRTMP_ADAPTER   pAd,
3341         OUT     PUCHAR                  pBuf)
3342 {
3343         Show_WepKey_Proc(pAd, 1, pBuf);
3344         return 0;
3345 }
3346
3347 INT     Show_Key3_Proc(
3348         IN      PRTMP_ADAPTER   pAd,
3349         OUT     PUCHAR                  pBuf)
3350 {
3351         Show_WepKey_Proc(pAd, 2, pBuf);
3352         return 0;
3353 }
3354
3355 INT     Show_Key4_Proc(
3356         IN      PRTMP_ADAPTER   pAd,
3357         OUT     PUCHAR                  pBuf)
3358 {
3359         Show_WepKey_Proc(pAd, 3, pBuf);
3360         return 0;
3361 }
3362
3363 INT     Show_WPAPSK_Proc(
3364         IN      PRTMP_ADAPTER   pAd,
3365         OUT     PUCHAR                  pBuf)
3366 {
3367         INT     idx;
3368         UCHAR   PMK[32] = {0};
3369
3370
3371 #ifdef CONFIG_STA_SUPPORT
3372         IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
3373                 NdisMoveMemory(PMK, pAd->StaCfg.PMK, 32);
3374 #endif // CONFIG_STA_SUPPORT //
3375
3376     sprintf(pBuf, "\tPMK = ");
3377     for (idx = 0; idx < 32; idx++)
3378         sprintf(pBuf+strlen(pBuf), "%02X", PMK[idx]);
3379
3380         return 0;
3381 }
3382