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