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