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