1 /*
2 *************************************************************************
3 * Ralink Tech Inc.
4 * 5F., No.36, Taiyuan St., Jhubei City,
5 * Hsinchu County 302,
6 * Taiwan, R.O.C.
7 *
8 * (c) Copyright 2002-2007, Ralink Technology, Inc.
9 *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 * This program is distributed in the hope that it will be useful, *
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
18 * GNU General Public License for more details. *
19 * *
20 * You should have received a copy of the GNU General Public License *
21 * along with this program; if not, write to the *
22 * Free Software Foundation, Inc., *
23 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
24 * *
25 *************************************************************************
26 */
27
28 #include "rt_config.h"
29
30 static void HTParametersHook(
31 IN PRTMP_ADAPTER pAd,
32 IN CHAR *pValueStr,
33 IN CHAR *pInput);
34
35 #define ETH_MAC_ADDR_STR_LEN 17 // in format of xx:xx:xx:xx:xx:xx
36
37 // We assume the s1 is a sting, s2 is a memory space with 6 bytes. and content of s1 will be changed.
38 BOOLEAN rtstrmactohex(char *s1, char *s2)
39 {
40 int i = 0;
41 char *ptokS = s1, *ptokE = s1;
42
43 if (strlen(s1) != ETH_MAC_ADDR_STR_LEN)
44 return FALSE;
45
46 while((*ptokS) != '\0')
47 {
48 if((ptokE = strchr(ptokS, ':')) != NULL)
49 *ptokE++ = '\0';
50 if ((strlen(ptokS) != 2) || (!isxdigit(*ptokS)) || (!isxdigit(*(ptokS+1))))
51 break; // fail
52 AtoH(ptokS, &s2[i++], 1);
53 ptokS = ptokE;
54 if (i == 6)
55 break; // parsing finished
56 }
57
58 return ( i == 6 ? TRUE : FALSE);
59
60 }
61
62
63 // we assume the s1 and s2 both are strings.
64 BOOLEAN rtstrcasecmp(char *s1, char *s2)
65 {
66 char *p1 = s1, *p2 = s2;
67
68 if (strlen(s1) != strlen(s2))
69 return FALSE;
70
71 while(*p1 != '\0')
72 {
73 if((*p1 != *p2) && ((*p1 ^ *p2) != 0x20))
74 return FALSE;
75 p1++;
76 p2++;
77 }
78
79 return TRUE;
80 }
81
82 // we assume the s1 (buffer) and s2 (key) both are strings.
83 char * rtstrstruncasecmp(char * s1, char * s2)
84 {
85 INT l1, l2, i;
86 char temp1, temp2;
87
88 l2 = strlen(s2);
89 if (!l2)
90 return (char *) s1;
91
92 l1 = strlen(s1);
93
94 while (l1 >= l2)
95 {
96 l1--;
97
98 for(i=0; i<l2; i++)
99 {
100 temp1 = *(s1+i);
101 temp2 = *(s2+i);
102
103 if (('a' <= temp1) && (temp1 <= 'z'))
104 temp1 = 'A'+(temp1-'a');
105 if (('a' <= temp2) && (temp2 <= 'z'))
106 temp2 = 'A'+(temp2-'a');
107
108 if (temp1 != temp2)
109 break;
110 }
111
112 if (i == l2)
113 return (char *) s1;
114
115 s1++;
116 }
117
118 return NULL; // not found
119 }
120
121 //add by kathy
122
123 /**
124 * strstr - Find the first substring in a %NUL terminated string
125 * @s1: The string to be searched
126 * @s2: The string to search for
127 */
128 char * rtstrstr(const char * s1,const char * s2)
129 {
130 INT l1, l2;
131
132 l2 = strlen(s2);
133 if (!l2)
134 return (char *) s1;
135
136 l1 = strlen(s1);
137
138 while (l1 >= l2)
139 {
140 l1--;
141 if (!memcmp(s1,s2,l2))
142 return (char *) s1;
143 s1++;
144 }
145
146 return NULL;
147 }
148
149 /**
150 * rstrtok - Split a string into tokens
151 * @s: The string to be searched
152 * @ct: The characters to search for
153 * * WARNING: strtok is deprecated, use strsep instead. However strsep is not compatible with old architecture.
154 */
155 char * __rstrtok;
156 char * rstrtok(char * s,const char * ct)
157 {
158 char *sbegin, *send;
159
160 sbegin = s ? s : __rstrtok;
161 if (!sbegin)
162 {
163 return NULL;
164 }
165
166 sbegin += strspn(sbegin,ct);
167 if (*sbegin == '\0')
168 {
169 __rstrtok = NULL;
170 return( NULL );
171 }
172
173 send = strpbrk( sbegin, ct);
174 if (send && *send != '\0')
175 *send++ = '\0';
176
177 __rstrtok = send;
178
179 return (sbegin);
180 }
181
182 /**
183 * delimitcnt - return the count of a given delimiter in a given string.
184 * @s: The string to be searched.
185 * @ct: The delimiter to search for.
186 * Notice : We suppose the delimiter is a single-char string(for example : ";").
187 */
188 INT delimitcnt(char * s,const char * ct)
189 {
190 INT count = 0;
191 /* point to the beginning of the line */
192 const char *token = s;
193
194 for ( ;; )
195 {
196 token = strpbrk(token, ct); /* search for delimiters */
197
198 if ( token == NULL )
199 {
200 /* advanced to the terminating null character */
201 break;
202 }
203 /* skip the delimiter */
204 ++token;
205
206 /*
207 * Print the found text: use len with %.*s to specify field width.
208 */
209
210 /* accumulate delimiter count */
211 ++count;
212 }
213 return count;
214 }
215
216 /*
217 * converts the Internet host address from the standard numbers-and-dots notation
218 * into binary data.
219 * returns nonzero if the address is valid, zero if not.
220 */
221 int rtinet_aton(const char *cp, unsigned int *addr)
222 {
223 unsigned int val;
224 int base, n;
225 char c;
226 unsigned int parts[4];
227 unsigned int *pp = parts;
228
229 for (;;)
230 {
231 /*
232 * Collect number up to ``.''.
233 * Values are specified as for C:
234 * 0x=hex, 0=octal, other=decimal.
235 */
236 val = 0;
237 base = 10;
238 if (*cp == '')
239 {
240 if (*++cp == 'x' || *cp == 'X')
241 base = 16, cp++;
242 else
243 base = 8;
244 }
245 while ((c = *cp) != '\0')
246 {
247 if (isdigit((unsigned char) c))
248 {
249 val = (val * base) + (c - '');
250 cp++;
251 continue;
252 }
253 if (base == 16 && isxdigit((unsigned char) c))
254 {
255 val = (val << 4) +
256 (c + 10 - (islower((unsigned char) c) ? 'a' : 'A'));
257 cp++;
258 continue;
259 }
260 break;
261 }
262 if (*cp == '.')
263 {
264 /*
265 * Internet format: a.b.c.d a.b.c (with c treated as 16-bits)
266 * a.b (with b treated as 24 bits)
267 */
268 if (pp >= parts + 3 || val > 0xff)
269 return 0;
270 *pp++ = val, cp++;
271 }
272 else
273 break;
274 }
275
276 /*
277 * Check for trailing junk.
278 */
279 while (*cp)
280 if (!isspace((unsigned char) *cp++))
281 return 0;
282
283 /*
284 * Concoct the address according to the number of parts specified.
285 */
286 n = pp - parts + 1;
287 switch (n)
288 {
289
290 case 1: /* a -- 32 bits */
291 break;
292
293 case 2: /* a.b -- 8.24 bits */
294 if (val > 0xffffff)
295 return 0;
296 val |= parts[0] << 24;
297 break;
298
299 case 3: /* a.b.c -- 8.8.16 bits */
300 if (val > 0xffff)
301 return 0;
302 val |= (parts[0] << 24) | (parts[1] << 16);
303 break;
304
305 case 4: /* a.b.c.d -- 8.8.8.8 bits */
306 if (val > 0xff)
307 return 0;
308 val |= (parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8);
309 break;
310 }
311
312 *addr = htonl(val);
313 return 1;
314
315 }
316
317 /*
318 ========================================================================
319
320 Routine Description:
321 Find key section for Get key parameter.
322
323 Arguments:
324 buffer Pointer to the buffer to start find the key section
325 section the key of the secion to be find
326
327 Return Value:
328 NULL Fail
329 Others Success
330 ========================================================================
331 */
332 PUCHAR RTMPFindSection(
333 IN PCHAR buffer)
334 {
335 CHAR temp_buf[32];
336 PUCHAR ptr;
337
338 strcpy(temp_buf, "Default");
339
340 if((ptr = rtstrstr(buffer, temp_buf)) != NULL)
341 return (ptr+strlen("\n"));
342 else
343 return NULL;
344 }
345
346 /*
347 ========================================================================
348
349 Routine Description:
350 Get key parameter.
351
352 Arguments:
353 key Pointer to key string
354 dest Pointer to destination
355 destsize The datasize of the destination
356 buffer Pointer to the buffer to start find the key
357
358 Return Value:
359 TRUE Success
360 FALSE Fail
361
362 Note:
363 This routine get the value with the matched key (case case-sensitive)
364 ========================================================================
365 */
366 INT RTMPGetKeyParameter(
367 IN PCHAR key,
368 OUT PCHAR dest,
369 IN INT destsize,
370 IN PCHAR buffer)
371 {
372 UCHAR *temp_buf1 = NULL;
373 UCHAR *temp_buf2 = NULL;
374 CHAR *start_ptr;
375 CHAR *end_ptr;
376 CHAR *ptr;
377 CHAR *offset = 0;
378 INT len;
379
380 //temp_buf1 = kmalloc(MAX_PARAM_BUFFER_SIZE, MEM_ALLOC_FLAG);
381 os_alloc_mem(NULL, &temp_buf1, MAX_PARAM_BUFFER_SIZE);
382
383 if(temp_buf1 == NULL)
384 return (FALSE);
385
386 //temp_buf2 = kmalloc(MAX_PARAM_BUFFER_SIZE, MEM_ALLOC_FLAG);
387 os_alloc_mem(NULL, &temp_buf2, MAX_PARAM_BUFFER_SIZE);
388 if(temp_buf2 == NULL)
389 {
390 os_free_mem(NULL, temp_buf1);
391 return (FALSE);
392 }
393
394 //find section
395 if((offset = RTMPFindSection(buffer)) == NULL)
396 {
397 os_free_mem(NULL, temp_buf1);
398 os_free_mem(NULL, temp_buf2);
399 return (FALSE);
400 }
401
402 strcpy(temp_buf1, "\n");
403 strcat(temp_buf1, key);
404 strcat(temp_buf1, "=");
405
406 //search key
407 if((start_ptr=rtstrstr(offset, temp_buf1))==NULL)
408 {
409 os_free_mem(NULL, temp_buf1);
410 os_free_mem(NULL, temp_buf2);
411 return (FALSE);
412 }
413
414 start_ptr+=strlen("\n");
415 if((end_ptr=rtstrstr(start_ptr, "\n"))==NULL)
416 end_ptr=start_ptr+strlen(start_ptr);
417
418 if (end_ptr<start_ptr)
419 {
420 os_free_mem(NULL, temp_buf1);
421 os_free_mem(NULL, temp_buf2);
422 return (FALSE);
423 }
424
425 NdisMoveMemory(temp_buf2, start_ptr, end_ptr-start_ptr);
426 temp_buf2[end_ptr-start_ptr]='\0';
427 len = strlen(temp_buf2);
428 strcpy(temp_buf1, temp_buf2);
429 if((start_ptr=rtstrstr(temp_buf1, "=")) == NULL)
430 {
431 os_free_mem(NULL, temp_buf1);
432 os_free_mem(NULL, temp_buf2);
433 return (FALSE);
434 }
435
436 strcpy(temp_buf2, start_ptr+1);
437 ptr = temp_buf2;
438 //trim space or tab
439 while(*ptr != 0x00)
440 {
441 if( (*ptr == ' ') || (*ptr == '\t') )
442 ptr++;
443 else
444 break;
445 }
446
447 len = strlen(ptr);
448 memset(dest, 0x00, destsize);
449 strncpy(dest, ptr, len >= destsize ? destsize: len);
450
451 os_free_mem(NULL, temp_buf1);
452 os_free_mem(NULL, temp_buf2);
453 return TRUE;
454 }
455
456 /*
457 ========================================================================
458
459 Routine Description:
460 Get key parameter.
461
462 Arguments:
463 key Pointer to key string
464 dest Pointer to destination
465 destsize The datasize of the destination
466 buffer Pointer to the buffer to start find the key
467
468 Return Value:
469 TRUE Success
470 FALSE Fail
471
472 Note:
473 This routine get the value with the matched key (case case-sensitive).
474 It is called for parsing SSID and any key string.
475 ========================================================================
476 */
477 INT RTMPGetCriticalParameter(
478 IN PCHAR key,
479 OUT PCHAR dest,
480 IN INT destsize,
481 IN PCHAR buffer)
482 {
483 UCHAR *temp_buf1 = NULL;
484 UCHAR *temp_buf2 = NULL;
485 CHAR *start_ptr;
486 CHAR *end_ptr;
487 CHAR *ptr;
488 CHAR *offset = 0;
489 INT len;
490
491 //temp_buf1 = kmalloc(MAX_PARAM_BUFFER_SIZE, MEM_ALLOC_FLAG);
492 os_alloc_mem(NULL, &temp_buf1, MAX_PARAM_BUFFER_SIZE);
493
494 if(temp_buf1 == NULL)
495 return (FALSE);
496
497 //temp_buf2 = kmalloc(MAX_PARAM_BUFFER_SIZE, MEM_ALLOC_FLAG);
498 os_alloc_mem(NULL, &temp_buf2, MAX_PARAM_BUFFER_SIZE);
499 if(temp_buf2 == NULL)
500 {
501 os_free_mem(NULL, temp_buf1);
502 return (FALSE);
503 }
504
505 //find section
506 if((offset = RTMPFindSection(buffer)) == NULL)
507 {
508 os_free_mem(NULL, temp_buf1);
509 os_free_mem(NULL, temp_buf2);
510 return (FALSE);
511 }
512
513 strcpy(temp_buf1, "\n");
514 strcat(temp_buf1, key);
515 strcat(temp_buf1, "=");
516
517 //search key
518 if((start_ptr=rtstrstr(offset, temp_buf1))==NULL)
519 {
520 os_free_mem(NULL, temp_buf1);
521 os_free_mem(NULL, temp_buf2);
522 return (FALSE);
523 }
524
525 start_ptr+=strlen("\n");
526 if((end_ptr=rtstrstr(start_ptr, "\n"))==NULL)
527 end_ptr=start_ptr+strlen(start_ptr);
528
529 if (end_ptr<start_ptr)
530 {
531 os_free_mem(NULL, temp_buf1);
532 os_free_mem(NULL, temp_buf2);
533 return (FALSE);
534 }
535
536 NdisMoveMemory(temp_buf2, start_ptr, end_ptr-start_ptr);
537 temp_buf2[end_ptr-start_ptr]='\0';
538 len = strlen(temp_buf2);
539 strcpy(temp_buf1, temp_buf2);
540 if((start_ptr=rtstrstr(temp_buf1, "=")) == NULL)
541 {
542 os_free_mem(NULL, temp_buf1);
543 os_free_mem(NULL, temp_buf2);
544 return (FALSE);
545 }
546
547 strcpy(temp_buf2, start_ptr+1);
548 ptr = temp_buf2;
549
550 //trim tab
551 /* We cannot trim space(' ') for SSID and key string. */
552 while(*ptr != 0x00)
553 {
554 //if( (*ptr == ' ') || (*ptr == '\t') )
555 if( (*ptr == '\t') )
556 ptr++;
557 else
558 break;
559 }
560
561 len = strlen(ptr);
562 memset(dest, 0x00, destsize);
563 strncpy(dest, ptr, len >= destsize ? destsize: len);
564
565 os_free_mem(NULL, temp_buf1);
566 os_free_mem(NULL, temp_buf2);
567 return TRUE;
568 }
569
570 /*
571 ========================================================================
572
573 Routine Description:
574 Get multiple key parameter.
575
576 Arguments:
577 key Pointer to key string
578 dest Pointer to destination
579 destsize The datasize of the destination
580 buffer Pointer to the buffer to start find the key
581
582 Return Value:
583 TRUE Success
584 FALSE Fail
585
586 Note:
587 This routine get the value with the matched key (case case-sensitive)
588 ========================================================================
589 */
590 INT RTMPGetKeyParameterWithOffset(
591 IN PCHAR key,
592 OUT PCHAR dest,
593 OUT USHORT *end_offset,
594 IN INT destsize,
595 IN PCHAR buffer,
596 IN BOOLEAN bTrimSpace)
597 {
598 UCHAR *temp_buf1 = NULL;
599 UCHAR *temp_buf2 = NULL;
600 CHAR *start_ptr;
601 CHAR *end_ptr;
602 CHAR *ptr;
603 CHAR *offset = 0;
604 INT len;
605
606 if (*end_offset >= MAX_INI_BUFFER_SIZE)
607 return (FALSE);
608
609 os_alloc_mem(NULL, &temp_buf1, MAX_PARAM_BUFFER_SIZE);
610
611 if(temp_buf1 == NULL)
612 return (FALSE);
613
614 os_alloc_mem(NULL, &temp_buf2, MAX_PARAM_BUFFER_SIZE);
615 if(temp_buf2 == NULL)
616 {
617 os_free_mem(NULL, temp_buf1);
618 return (FALSE);
619 }
620
621 //find section
622 if(*end_offset == 0)
623 {
624 if ((offset = RTMPFindSection(buffer)) == NULL)
625 {
626 os_free_mem(NULL, temp_buf1);
627 os_free_mem(NULL, temp_buf2);
628 return (FALSE);
629 }
630 }
631 else
632 offset = buffer + (*end_offset);
633
634 strcpy(temp_buf1, "\n");
635 strcat(temp_buf1, key);
636 strcat(temp_buf1, "=");
637
638 //search key
639 if((start_ptr=rtstrstr(offset, temp_buf1))==NULL)
640 {
641 os_free_mem(NULL, temp_buf1);
642 os_free_mem(NULL, temp_buf2);
643 return (FALSE);
644 }
645
646 start_ptr+=strlen("\n");
647 if((end_ptr=rtstrstr(start_ptr, "\n"))==NULL)
648 end_ptr=start_ptr+strlen(start_ptr);
649
650 if (end_ptr<start_ptr)
651 {
652 os_free_mem(NULL, temp_buf1);
653 os_free_mem(NULL, temp_buf2);
654 return (FALSE);
655 }
656
657 *end_offset = end_ptr - buffer;
658
659 NdisMoveMemory(temp_buf2, start_ptr, end_ptr-start_ptr);
660 temp_buf2[end_ptr-start_ptr]='\0';
661 len = strlen(temp_buf2);
662 strcpy(temp_buf1, temp_buf2);
663 if((start_ptr=rtstrstr(temp_buf1, "=")) == NULL)
664 {
665 os_free_mem(NULL, temp_buf1);
666 os_free_mem(NULL, temp_buf2);
667 return (FALSE);
668 }
669
670 strcpy(temp_buf2, start_ptr+1);
671 ptr = temp_buf2;
672 //trim space or tab
673 while(*ptr != 0x00)
674 {
675 if((bTrimSpace && (*ptr == ' ')) || (*ptr == '\t') )
676 ptr++;
677 else
678 break;
679 }
680
681 len = strlen(ptr);
682 memset(dest, 0x00, destsize);
683 strncpy(dest, ptr, len >= destsize ? destsize: len);
684
685 os_free_mem(NULL, temp_buf1);
686 os_free_mem(NULL, temp_buf2);
687 return TRUE;
688 }
689
690
691 static int rtmp_parse_key_buffer_from_file(IN PRTMP_ADAPTER pAd,IN char *buffer,IN ULONG KeyType,IN INT BSSIdx,IN INT KeyIdx)
692 {
693 PUCHAR keybuff;
694 INT i = BSSIdx, idx = KeyIdx;
695 ULONG KeyLen;
696 UCHAR CipherAlg = CIPHER_WEP64;
697
698 keybuff = buffer;
699 KeyLen = strlen(keybuff);
700
701 if (KeyType == 1)
702 {//Ascii
703 if( (KeyLen == 5) || (KeyLen == 13))
704 {
705 pAd->SharedKey[i][idx].KeyLen = KeyLen;
706 NdisMoveMemory(pAd->SharedKey[i][idx].Key, keybuff, KeyLen);
707 if (KeyLen == 5)
708 CipherAlg = CIPHER_WEP64;
709 else
710 CipherAlg = CIPHER_WEP128;
711 pAd->SharedKey[i][idx].CipherAlg = CipherAlg;
712
713 DBGPRINT(RT_DEBUG_TRACE, ("I/F(ra%d) Key%dStr=%s and type=%s\n", i, idx+1, keybuff, (KeyType == 0) ? "Hex":"Ascii"));
714 return 1;
715 }
716 else
717 {//Invalid key length
718 DBGPRINT(RT_DEBUG_ERROR, ("Key%dStr is Invalid key length! KeyLen = %ld!\n", idx+1, KeyLen));
719 return 0;
720 }
721 }
722 else
723 {//Hex type
724 if( (KeyLen == 10) || (KeyLen == 26))
725 {
726 pAd->SharedKey[i][idx].KeyLen = KeyLen / 2;
727 AtoH(keybuff, pAd->SharedKey[i][idx].Key, KeyLen / 2);
728 if (KeyLen == 10)
729 CipherAlg = CIPHER_WEP64;
730 else
731 CipherAlg = CIPHER_WEP128;
732 pAd->SharedKey[i][idx].CipherAlg = CipherAlg;
733
734 DBGPRINT(RT_DEBUG_TRACE, ("I/F(ra%d) Key%dStr=%s and type=%s\n", i, idx+1, keybuff, (KeyType == 0) ? "Hex":"Ascii"));
735 return 1;
736 }
737 else
738 {//Invalid key length
739 DBGPRINT(RT_DEBUG_ERROR, ("I/F(ra%d) Key%dStr is Invalid key length! KeyLen = %ld!\n", i, idx+1, KeyLen));
740 return 0;
741 }
742 }
743 }
744 static void rtmp_read_key_parms_from_file(IN PRTMP_ADAPTER pAd, char *tmpbuf, char *buffer)
745 {
746 char tok_str[16];
747 PUCHAR macptr;
748 INT i = 0, idx;
749 ULONG KeyType[MAX_MBSSID_NUM];
750 ULONG KeyIdx;
751
752 NdisZeroMemory(KeyType, MAX_MBSSID_NUM);
753
754 //DefaultKeyID
755 if(RTMPGetKeyParameter("DefaultKeyID", tmpbuf, 25, buffer))
756 {
757 {
758 KeyIdx = simple_strtol(tmpbuf, 0, 10);
759 if((KeyIdx >= 1 ) && (KeyIdx <= 4))
760 pAd->StaCfg.DefaultKeyId = (UCHAR) (KeyIdx - 1);
761 else
762 pAd->StaCfg.DefaultKeyId = 0;
763
764 DBGPRINT(RT_DEBUG_TRACE, ("DefaultKeyID(0~3)=%d\n", pAd->StaCfg.DefaultKeyId));
765 }
766 }
767
768
769 for (idx = 0; idx < 4; idx++)
770 {
771 sprintf(tok_str, "Key%dType", idx + 1);
772 //Key1Type
773 if (RTMPGetKeyParameter(tok_str, tmpbuf, 128, buffer))
774 {
775 for (i = 0, macptr = rstrtok(tmpbuf,";"); macptr; macptr = rstrtok(NULL,";"), i++)
776 {
777 KeyType[i] = simple_strtol(macptr, 0, 10);
778 }
779
780 {
781 sprintf(tok_str, "Key%dStr", idx + 1);
782 if (RTMPGetCriticalParameter(tok_str, tmpbuf, 128, buffer))
783 {
784 rtmp_parse_key_buffer_from_file(pAd, tmpbuf, KeyType[BSS0], BSS0, idx);
785 }
786 }
787 }
788 }
789 }
790
791 static void rtmp_read_sta_wmm_parms_from_file(IN PRTMP_ADAPTER pAd, char *tmpbuf, char *buffer)
792 {
793 PUCHAR macptr;
794 INT i=0;
795 BOOLEAN bWmmEnable = FALSE;
796
797 //WmmCapable
798 if(RTMPGetKeyParameter("WmmCapable", tmpbuf, 32, buffer))
799 {
800 if(simple_strtol(tmpbuf, 0, 10) != 0) //Enable
801 {
802 pAd->CommonCfg.bWmmCapable = TRUE;
803 bWmmEnable = TRUE;
804 }
805 else //Disable
806 {
807 pAd->CommonCfg.bWmmCapable = FALSE;
808 }
809
810 DBGPRINT(RT_DEBUG_TRACE, ("WmmCapable=%d\n", pAd->CommonCfg.bWmmCapable));
811 }
812
813 //AckPolicy for AC_BK, AC_BE, AC_VI, AC_VO
814 if(RTMPGetKeyParameter("AckPolicy", tmpbuf, 32, buffer))
815 {
816 for (i = 0, macptr = rstrtok(tmpbuf,";"); macptr; macptr = rstrtok(NULL,";"), i++)
817 {
818 pAd->CommonCfg.AckPolicy[i] = (UCHAR)simple_strtol(macptr, 0, 10);
819
820 DBGPRINT(RT_DEBUG_TRACE, ("AckPolicy[%d]=%d\n", i, pAd->CommonCfg.AckPolicy[i]));
821 }
822 }
823
824 if (bWmmEnable)
825 {
826 //APSDCapable
827 if(RTMPGetKeyParameter("APSDCapable", tmpbuf, 10, buffer))
828 {
829 if(simple_strtol(tmpbuf, 0, 10) != 0) //Enable
830 pAd->CommonCfg.bAPSDCapable = TRUE;
831 else
832 pAd->CommonCfg.bAPSDCapable = FALSE;
833
834 DBGPRINT(RT_DEBUG_TRACE, ("APSDCapable=%d\n", pAd->CommonCfg.bAPSDCapable));
835 }
836
837 //APSDAC for AC_BE, AC_BK, AC_VI, AC_VO
838 if(RTMPGetKeyParameter("APSDAC", tmpbuf, 32, buffer))
839 {
840 BOOLEAN apsd_ac[4];
841
842 for (i = 0, macptr = rstrtok(tmpbuf,";"); macptr; macptr = rstrtok(NULL,";"), i++)
843 {
844 apsd_ac[i] = (BOOLEAN)simple_strtol(macptr, 0, 10);
845
846 DBGPRINT(RT_DEBUG_TRACE, ("APSDAC%d %d\n", i, apsd_ac[i]));
847 }
848
849 pAd->CommonCfg.bAPSDAC_BE = apsd_ac[0];
850 pAd->CommonCfg.bAPSDAC_BK = apsd_ac[1];
851 pAd->CommonCfg.bAPSDAC_VI = apsd_ac[2];
852 pAd->CommonCfg.bAPSDAC_VO = apsd_ac[3];
853 }
854 }
855
856 }
857
858 NDIS_STATUS RTMPReadParametersHook(
859 IN PRTMP_ADAPTER pAd)
860 {
861 PUCHAR src = NULL;
862 struct file *srcf;
863 INT retval, orgfsuid, orgfsgid;
864 mm_segment_t orgfs;
865 CHAR *buffer;
866 CHAR *tmpbuf;
867 ULONG RtsThresh;
868 ULONG FragThresh;
869 UCHAR keyMaterial[40];
870
871 PUCHAR macptr;
872 INT i = 0;
873
874 buffer = kmalloc(MAX_INI_BUFFER_SIZE, MEM_ALLOC_FLAG);
875 if(buffer == NULL)
876 return NDIS_STATUS_FAILURE;
877
878 tmpbuf = kmalloc(MAX_PARAM_BUFFER_SIZE, MEM_ALLOC_FLAG);
879 if(tmpbuf == NULL)
880 {
881 kfree(buffer);
882 return NDIS_STATUS_FAILURE;
883 }
884
885 src = STA_PROFILE_PATH;
886
887 // Save uid and gid used for filesystem access.
888 // Set user and group to 0 (root)
889 #ifndef RT30xx
890 orgfsuid = current_fsuid();
891 orgfsgid = current_fsgid();
892 /* Hm, can't really do this nicely anymore, so rely on these files
893 * being set to the proper permission to read them... */
894 /* current->cred->fsuid = current->cred->fsgid = 0; */
895 #endif
896 orgfs = get_fs();
897 set_fs(KERNEL_DS);
898
899 if (src && *src)
900 {
901 srcf = filp_open(src, O_RDONLY, 0);
902 if (IS_ERR(srcf))
903 {
904 DBGPRINT(RT_DEBUG_ERROR, ("--> Error %ld opening %s\n", -PTR_ERR(srcf),src));
905 }
906 else
907 {
908 // The object must have a read method
909 if (srcf->f_op && srcf->f_op->read)
910 {
911 memset(buffer, 0x00, MAX_INI_BUFFER_SIZE);
912 retval=srcf->f_op->read(srcf, buffer, MAX_INI_BUFFER_SIZE, &srcf->f_pos);
913 if (retval < 0)
914 {
915 DBGPRINT(RT_DEBUG_TRACE, ("--> Read %s error %d\n", src, -retval));
916 }
917 else
918 {
919 // set file parameter to portcfg
920 //CountryRegion
921 if(RTMPGetKeyParameter("CountryRegion", tmpbuf, 25, buffer))
922 {
923 pAd->CommonCfg.CountryRegion = (UCHAR) simple_strtol(tmpbuf, 0, 10);
924 DBGPRINT(RT_DEBUG_TRACE, ("CountryRegion=%d\n", pAd->CommonCfg.CountryRegion));
925 }
926 //CountryRegionABand
927 if(RTMPGetKeyParameter("CountryRegionABand", tmpbuf, 25, buffer))
928 {
929 pAd->CommonCfg.CountryRegionForABand= (UCHAR) simple_strtol(tmpbuf, 0, 10);
930 DBGPRINT(RT_DEBUG_TRACE, ("CountryRegionABand=%d\n", pAd->CommonCfg.CountryRegionForABand));
931 }
932 //CountryCode
933 if(RTMPGetKeyParameter("CountryCode", tmpbuf, 25, buffer))
934 {
935 NdisMoveMemory(pAd->CommonCfg.CountryCode, tmpbuf , 2);
936
937 if (strlen(pAd->CommonCfg.CountryCode) != 0)
938 {
939 pAd->CommonCfg.bCountryFlag = TRUE;
940 }
941 DBGPRINT(RT_DEBUG_TRACE, ("CountryCode=%s\n", pAd->CommonCfg.CountryCode));
942 }
943 //ChannelGeography
944 if(RTMPGetKeyParameter("ChannelGeography", tmpbuf, 25, buffer))
945 {
946 UCHAR Geography = (UCHAR) simple_strtol(tmpbuf, 0, 10);
947 if (Geography <= BOTH)
948 {
949 pAd->CommonCfg.Geography = Geography;
950 pAd->CommonCfg.CountryCode[2] =
951 (pAd->CommonCfg.Geography == BOTH) ? ' ' : ((pAd->CommonCfg.Geography == IDOR) ? 'I' : 'O');
952 DBGPRINT(RT_DEBUG_TRACE, ("ChannelGeography=%d\n", pAd->CommonCfg.Geography));
953 }
954 }
955 else
956 {
957 pAd->CommonCfg.Geography = BOTH;
958 pAd->CommonCfg.CountryCode[2] = ' ';
959 }
960
961 {
962 //SSID
963 if (RTMPGetCriticalParameter("SSID", tmpbuf, 256, buffer))
964 {
965 if (strlen(tmpbuf) <= 32)
966 {
967 pAd->CommonCfg.SsidLen = (UCHAR) strlen(tmpbuf);
968 NdisZeroMemory(pAd->CommonCfg.Ssid, NDIS_802_11_LENGTH_SSID);
969 NdisMoveMemory(pAd->CommonCfg.Ssid, tmpbuf, pAd->CommonCfg.SsidLen);
970 pAd->MlmeAux.AutoReconnectSsidLen = pAd->CommonCfg.SsidLen;
971 NdisZeroMemory(pAd->MlmeAux.AutoReconnectSsid, NDIS_802_11_LENGTH_SSID);
972 NdisMoveMemory(pAd->MlmeAux.AutoReconnectSsid, tmpbuf, pAd->MlmeAux.AutoReconnectSsidLen);
973 pAd->MlmeAux.SsidLen = pAd->CommonCfg.SsidLen;
974 NdisZeroMemory(pAd->MlmeAux.Ssid, NDIS_802_11_LENGTH_SSID);
975 NdisMoveMemory(pAd->MlmeAux.Ssid, tmpbuf, pAd->MlmeAux.SsidLen);
976 DBGPRINT(RT_DEBUG_TRACE, ("%s::(SSID=%s)\n", __func__, tmpbuf));
977 }
978 }
979 }
980
981 {
982 //NetworkType
983 if (RTMPGetKeyParameter("NetworkType", tmpbuf, 25, buffer))
984 {
985 pAd->bConfigChanged = TRUE;
986 if (strcmp(tmpbuf, "Adhoc") == 0)
987 pAd->StaCfg.BssType = BSS_ADHOC;
988 else //Default Infrastructure mode
989 pAd->StaCfg.BssType = BSS_INFRA;
990 // Reset Ralink supplicant to not use, it will be set to start when UI set PMK key
991 pAd->StaCfg.WpaState = SS_NOTUSE;
992 DBGPRINT(RT_DEBUG_TRACE, ("%s::(NetworkType=%d)\n", __func__, pAd->StaCfg.BssType));
993 }
994 }
995
996 //Channel
997 if(RTMPGetKeyParameter("Channel", tmpbuf, 10, buffer))
998 {
999 pAd->CommonCfg.Channel = (UCHAR) simple_strtol(tmpbuf, 0, 10);
1000 DBGPRINT(RT_DEBUG_TRACE, ("Channel=%d\n", pAd->CommonCfg.Channel));
1001 }
1002 //WirelessMode
1003 if(RTMPGetKeyParameter("WirelessMode", tmpbuf, 10, buffer))
1004 {
1005 int value = 0, maxPhyMode = PHY_11G;
1006
1007 maxPhyMode = PHY_11N_5G;
1008
1009 value = simple_strtol(tmpbuf, 0, 10);
1010
1011 if (value <= maxPhyMode)
1012 {
1013 pAd->CommonCfg.PhyMode = value;
1014 }
1015 DBGPRINT(RT_DEBUG_TRACE, ("PhyMode=%d\n", pAd->CommonCfg.PhyMode));
1016 }
1017 //BasicRate
1018 if(RTMPGetKeyParameter("BasicRate", tmpbuf, 10, buffer))
1019 {
1020 pAd->CommonCfg.BasicRateBitmap = (ULONG) simple_strtol(tmpbuf, 0, 10);
1021 DBGPRINT(RT_DEBUG_TRACE, ("BasicRate=%ld\n", pAd->CommonCfg.BasicRateBitmap));
1022 }
1023 //BeaconPeriod
1024 if(RTMPGetKeyParameter("BeaconPeriod", tmpbuf, 10, buffer))
1025 {
1026 pAd->CommonCfg.BeaconPeriod = (USHORT) simple_strtol(tmpbuf, 0, 10);
1027 DBGPRINT(RT_DEBUG_TRACE, ("BeaconPeriod=%d\n", pAd->CommonCfg.BeaconPeriod));
1028 }
1029 //TxPower
1030 if(RTMPGetKeyParameter("TxPower", tmpbuf, 10, buffer))
1031 {
1032 pAd->CommonCfg.TxPowerPercentage = (ULONG) simple_strtol(tmpbuf, 0, 10);
1033
1034 pAd->CommonCfg.TxPowerDefault = pAd->CommonCfg.TxPowerPercentage;
1035
1036 DBGPRINT(RT_DEBUG_TRACE, ("TxPower=%ld\n", pAd->CommonCfg.TxPowerPercentage));
1037 }
1038 //BGProtection
1039 if(RTMPGetKeyParameter("BGProtection", tmpbuf, 10, buffer))
1040 {
1041 switch (simple_strtol(tmpbuf, 0, 10))
1042 {
1043 case 1: //Always On
1044 pAd->CommonCfg.UseBGProtection = 1;
1045 break;
1046 case 2: //Always OFF
1047 pAd->CommonCfg.UseBGProtection = 2;
1048 break;
1049 case 0: //AUTO
1050 default:
1051 pAd->CommonCfg.UseBGProtection = 0;
1052 break;
1053 }
1054 DBGPRINT(RT_DEBUG_TRACE, ("BGProtection=%ld\n", pAd->CommonCfg.UseBGProtection));
1055 }
1056 //OLBCDetection
1057 if(RTMPGetKeyParameter("DisableOLBC", tmpbuf, 10, buffer))
1058 {
1059 switch (simple_strtol(tmpbuf, 0, 10))
1060 {
1061 case 1: //disable OLBC Detection
1062 pAd->CommonCfg.DisableOLBCDetect = 1;
1063 break;
1064 case 0: //enable OLBC Detection
1065 pAd->CommonCfg.DisableOLBCDetect = 0;
1066 break;
1067 default:
1068 pAd->CommonCfg.DisableOLBCDetect= 0;
1069 break;
1070 }
1071 DBGPRINT(RT_DEBUG_TRACE, ("OLBCDetection=%ld\n", pAd->CommonCfg.DisableOLBCDetect));
1072 }
1073 //TxPreamble
1074 if(RTMPGetKeyParameter("TxPreamble", tmpbuf, 10, buffer))
1075 {
1076 switch (simple_strtol(tmpbuf, 0, 10))
1077 {
1078 case Rt802_11PreambleShort:
1079 pAd->CommonCfg.TxPreamble = Rt802_11PreambleShort;
1080 break;
1081 case Rt802_11PreambleLong:
1082 default:
1083 pAd->CommonCfg.TxPreamble = Rt802_11PreambleLong;
1084 break;
1085 }
1086 DBGPRINT(RT_DEBUG_TRACE, ("TxPreamble=%ld\n", pAd->CommonCfg.TxPreamble));
1087 }
1088 //RTSThreshold
1089 if(RTMPGetKeyParameter("RTSThreshold", tmpbuf, 10, buffer))
1090 {
1091 RtsThresh = simple_strtol(tmpbuf, 0, 10);
1092 if( (RtsThresh >= 1) && (RtsThresh <= MAX_RTS_THRESHOLD) )
1093 pAd->CommonCfg.RtsThreshold = (USHORT)RtsThresh;
1094 else
1095 pAd->CommonCfg.RtsThreshold = MAX_RTS_THRESHOLD;
1096
1097 DBGPRINT(RT_DEBUG_TRACE, ("RTSThreshold=%d\n", pAd->CommonCfg.RtsThreshold));
1098 }
1099 //FragThreshold
1100 if(RTMPGetKeyParameter("FragThreshold", tmpbuf, 10, buffer))
1101 {
1102 FragThresh = simple_strtol(tmpbuf, 0, 10);
1103 pAd->CommonCfg.bUseZeroToDisableFragment = FALSE;
1104
1105 if (FragThresh > MAX_FRAG_THRESHOLD || FragThresh < MIN_FRAG_THRESHOLD)
1106 { //illegal FragThresh so we set it to default
1107 pAd->CommonCfg.FragmentThreshold = MAX_FRAG_THRESHOLD;
1108 pAd->CommonCfg.bUseZeroToDisableFragment = TRUE;
1109 }
1110 else if (FragThresh % 2 == 1)
1111 {
1112 // The length of each fragment shall always be an even number of octets, except for the last fragment
1113 // of an MSDU or MMPDU, which may be either an even or an odd number of octets.
1114 pAd->CommonCfg.FragmentThreshold = (USHORT)(FragThresh - 1);
1115 }
1116 else
1117 {
1118 pAd->CommonCfg.FragmentThreshold = (USHORT)FragThresh;
1119 }
1120 //pAd->CommonCfg.AllowFragSize = (pAd->CommonCfg.FragmentThreshold) - LENGTH_802_11 - LENGTH_CRC;
1121 DBGPRINT(RT_DEBUG_TRACE, ("FragThreshold=%d\n", pAd->CommonCfg.FragmentThreshold));
1122 }
1123 //TxBurst
1124 if(RTMPGetKeyParameter("TxBurst", tmpbuf, 10, buffer))
1125 {
1126 if(simple_strtol(tmpbuf, 0, 10) != 0) //Enable
1127 pAd->CommonCfg.bEnableTxBurst = TRUE;
1128 else //Disable
1129 pAd->CommonCfg.bEnableTxBurst = FALSE;
1130 DBGPRINT(RT_DEBUG_TRACE, ("TxBurst=%d\n", pAd->CommonCfg.bEnableTxBurst));
1131 }
1132
1133 #ifdef AGGREGATION_SUPPORT
1134 //PktAggregate
1135 if(RTMPGetKeyParameter("PktAggregate", tmpbuf, 10, buffer))
1136 {
1137 if(simple_strtol(tmpbuf, 0, 10) != 0) //Enable
1138 pAd->CommonCfg.bAggregationCapable = TRUE;
1139 else //Disable
1140 pAd->CommonCfg.bAggregationCapable = FALSE;
1141 #ifdef PIGGYBACK_SUPPORT
1142 pAd->CommonCfg.bPiggyBackCapable = pAd->CommonCfg.bAggregationCapable;
1143 #endif // PIGGYBACK_SUPPORT //
1144 DBGPRINT(RT_DEBUG_TRACE, ("PktAggregate=%d\n", pAd->CommonCfg.bAggregationCapable));
1145 }
1146 #else
1147 pAd->CommonCfg.bAggregationCapable = FALSE;
1148 pAd->CommonCfg.bPiggyBackCapable = FALSE;
1149 #endif // AGGREGATION_SUPPORT //
1150
1151 // WmmCapable
1152 rtmp_read_sta_wmm_parms_from_file(pAd, tmpbuf, buffer);
1153
1154 //ShortSlot
1155 if(RTMPGetKeyParameter("ShortSlot", tmpbuf, 10, buffer))
1156 {
1157 if(simple_strtol(tmpbuf, 0, 10) != 0) //Enable
1158 pAd->CommonCfg.bUseShortSlotTime = TRUE;
1159 else //Disable
1160 pAd->CommonCfg.bUseShortSlotTime = FALSE;
1161
1162 DBGPRINT(RT_DEBUG_TRACE, ("ShortSlot=%d\n", pAd->CommonCfg.bUseShortSlotTime));
1163 }
1164 //IEEE80211H
1165 if(RTMPGetKeyParameter("IEEE80211H", tmpbuf, 10, buffer))
1166 {
1167 for (i = 0, macptr = rstrtok(tmpbuf,";"); macptr; macptr = rstrtok(NULL,";"), i++)
1168 {
1169 if(simple_strtol(macptr, 0, 10) != 0) //Enable
1170 pAd->CommonCfg.bIEEE80211H = TRUE;
1171 else //Disable
1172 pAd->CommonCfg.bIEEE80211H = FALSE;
1173
1174 DBGPRINT(RT_DEBUG_TRACE, ("IEEE80211H=%d\n", pAd->CommonCfg.bIEEE80211H));
1175 }
1176 }
1177 //CSPeriod
1178 if(RTMPGetKeyParameter("CSPeriod", tmpbuf, 10, buffer))
1179 {
1180 if(simple_strtol(tmpbuf, 0, 10) != 0)
1181 pAd->CommonCfg.RadarDetect.CSPeriod = simple_strtol(tmpbuf, 0, 10);
1182 else
1183 pAd->CommonCfg.RadarDetect.CSPeriod = 0;
1184
1185 DBGPRINT(RT_DEBUG_TRACE, ("CSPeriod=%d\n", pAd->CommonCfg.RadarDetect.CSPeriod));
1186 }
1187
1188 //RDRegion
1189 if(RTMPGetKeyParameter("RDRegion", tmpbuf, 128, buffer))
1190 {
1191 if ((strncmp(tmpbuf, "JAP_W53", 7) == 0) || (strncmp(tmpbuf, "jap_w53", 7) == 0))
1192 {
1193 pAd->CommonCfg.RadarDetect.RDDurRegion = JAP_W53;
1194 pAd->CommonCfg.RadarDetect.DfsSessionTime = 15;
1195 }
1196 else if ((strncmp(tmpbuf, "JAP_W56", 7) == 0) || (strncmp(tmpbuf, "jap_w56", 7) == 0))
1197 {
1198 pAd->CommonCfg.RadarDetect.RDDurRegion = JAP_W56;
1199 pAd->CommonCfg.RadarDetect.DfsSessionTime = 13;
1200 }
1201 else if ((strncmp(tmpbuf, "JAP", 3) == 0) || (strncmp(tmpbuf, "jap", 3) == 0))
1202 {
1203 pAd->CommonCfg.RadarDetect.RDDurRegion = JAP;
1204 pAd->CommonCfg.RadarDetect.DfsSessionTime = 5;
1205 }
1206 else if ((strncmp(tmpbuf, "FCC", 3) == 0) || (strncmp(tmpbuf, "fcc", 3) == 0))
1207 {
1208 pAd->CommonCfg.RadarDetect.RDDurRegion = FCC;
1209 pAd->CommonCfg.RadarDetect.DfsSessionTime = 5;
1210 }
1211 else if ((strncmp(tmpbuf, "CE", 2) == 0) || (strncmp(tmpbuf, "ce", 2) == 0))
1212 {
1213 pAd->CommonCfg.RadarDetect.RDDurRegion = CE;
1214 pAd->CommonCfg.RadarDetect.DfsSessionTime = 13;
1215 }
1216 else
1217 {
1218 pAd->CommonCfg.RadarDetect.RDDurRegion = CE;
1219 pAd->CommonCfg.RadarDetect.DfsSessionTime = 13;
1220 }
1221
1222 DBGPRINT(RT_DEBUG_TRACE, ("RDRegion=%d\n", pAd->CommonCfg.RadarDetect.RDDurRegion));
1223 }
1224 else
1225 {
1226 pAd->CommonCfg.RadarDetect.RDDurRegion = CE;
1227 pAd->CommonCfg.RadarDetect.DfsSessionTime = 13;
1228 }
1229
1230 //WirelessEvent
1231 if(RTMPGetKeyParameter("WirelessEvent", tmpbuf, 10, buffer))
1232 {
1233 #if WIRELESS_EXT >= 15
1234 if(simple_strtol(tmpbuf, 0, 10) != 0)
1235 pAd->CommonCfg.bWirelessEvent = simple_strtol(tmpbuf, 0, 10);
1236 else
1237 pAd->CommonCfg.bWirelessEvent = 0; // disable
1238 #else
1239 pAd->CommonCfg.bWirelessEvent = 0; // disable
1240 #endif
1241 DBGPRINT(RT_DEBUG_TRACE, ("WirelessEvent=%d\n", pAd->CommonCfg.bWirelessEvent));
1242 }
1243 if(RTMPGetKeyParameter("WiFiTest", tmpbuf, 10, buffer))
1244 {
1245 if(simple_strtol(tmpbuf, 0, 10) != 0)
1246 pAd->CommonCfg.bWiFiTest= simple_strtol(tmpbuf, 0, 10);
1247 else
1248 pAd->CommonCfg.bWiFiTest = 0; // disable
1249
1250 DBGPRINT(RT_DEBUG_TRACE, ("WiFiTest=%d\n", pAd->CommonCfg.bWiFiTest));
1251 }
1252 //AuthMode
1253 if(RTMPGetKeyParameter("AuthMode", tmpbuf, 128, buffer))
1254 {
1255 {
1256 if ((strcmp(tmpbuf, "WEPAUTO") == 0) || (strcmp(tmpbuf, "wepauto") == 0))
1257 pAd->StaCfg.AuthMode = Ndis802_11AuthModeAutoSwitch;
1258 else if ((strcmp(tmpbuf, "SHARED") == 0) || (strcmp(tmpbuf, "shared") == 0))
1259 pAd->StaCfg.AuthMode = Ndis802_11AuthModeShared;
1260 else if ((strcmp(tmpbuf, "WPAPSK") == 0) || (strcmp(tmpbuf, "wpapsk") == 0))
1261 pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPAPSK;
1262 else if ((strcmp(tmpbuf, "WPANONE") == 0) || (strcmp(tmpbuf, "wpanone") == 0))
1263 pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPANone;
1264 else if ((strcmp(tmpbuf, "WPA2PSK") == 0) || (strcmp(tmpbuf, "wpa2psk") == 0))
1265 pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPA2PSK;
1266 else if ((strcmp(tmpbuf, "WPA") == 0) || (strcmp(tmpbuf, "wpa") == 0))
1267 pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPA;
1268 else if ((strcmp(tmpbuf, "WPA2") == 0) || (strcmp(tmpbuf, "wpa2") == 0))
1269 pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPA2;
1270 else
1271 pAd->StaCfg.AuthMode = Ndis802_11AuthModeOpen;
1272
1273 pAd->StaCfg.PortSecured = WPA_802_1X_PORT_NOT_SECURED;
1274
1275 DBGPRINT(RT_DEBUG_TRACE, ("%s::(EncrypType=%d)\n", __func__, pAd->StaCfg.WepStatus));
1276 }
1277 }
1278 //EncrypType
1279 if(RTMPGetKeyParameter("EncrypType", tmpbuf, 128, buffer))
1280 {
1281 {
1282 if ((strcmp(tmpbuf, "WEP") == 0) || (strcmp(tmpbuf, "wep") == 0))
1283 pAd->StaCfg.WepStatus = Ndis802_11WEPEnabled;
1284 else if ((strcmp(tmpbuf, "TKIP") == 0) || (strcmp(tmpbuf, "tkip") == 0))
1285 pAd->StaCfg.WepStatus = Ndis802_11Encryption2Enabled;
1286 else if ((strcmp(tmpbuf, "AES") == 0) || (strcmp(tmpbuf, "aes") == 0))
1287 pAd->StaCfg.WepStatus = Ndis802_11Encryption3Enabled;
1288 else
1289 pAd->StaCfg.WepStatus = Ndis802_11WEPDisabled;
1290
1291 // Update all wepstatus related
1292 pAd->StaCfg.PairCipher = pAd->StaCfg.WepStatus;
1293 pAd->StaCfg.GroupCipher = pAd->StaCfg.WepStatus;
1294 pAd->StaCfg.OrigWepStatus = pAd->StaCfg.WepStatus;
1295 pAd->StaCfg.bMixCipher = FALSE;
1296
1297 DBGPRINT(RT_DEBUG_TRACE, ("%s::(EncrypType=%d)\n", __func__, pAd->StaCfg.WepStatus));
1298 }
1299 }
1300
1301 {
1302 if(RTMPGetCriticalParameter("WPAPSK", tmpbuf, 512, buffer))
1303 {
1304 int err=0;
1305
1306 tmpbuf[strlen(tmpbuf)] = '\0'; // make STA can process .$^& for WPAPSK input
1307
1308 if ((pAd->StaCfg.AuthMode != Ndis802_11AuthModeWPAPSK) &&
1309 (pAd->StaCfg.AuthMode != Ndis802_11AuthModeWPA2PSK) &&
1310 (pAd->StaCfg.AuthMode != Ndis802_11AuthModeWPANone)
1311 )
1312 {
1313 err = 1;
1314 }
1315 else if ((strlen(tmpbuf) >= 8) && (strlen(tmpbuf) < 64))
1316 {
1317 PasswordHash((char *)tmpbuf, pAd->CommonCfg.Ssid, pAd->CommonCfg.SsidLen, keyMaterial);
1318 NdisMoveMemory(pAd->StaCfg.PMK, keyMaterial, 32);
1319
1320 }
1321 else if (strlen(tmpbuf) == 64)
1322 {
1323 AtoH(tmpbuf, keyMaterial, 32);
1324 NdisMoveMemory(pAd->StaCfg.PMK, keyMaterial, 32);
1325 }
1326 else
1327 {
1328 err = 1;
1329 DBGPRINT(RT_DEBUG_ERROR, ("%s::(WPAPSK key-string required 8 ~ 64 characters!)\n", __func__));
1330 }
1331
1332 if (err == 0)
1333 {
1334 if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPAPSK) ||
1335 (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK))
1336 {
1337 // Start STA supplicant state machine
1338 pAd->StaCfg.WpaState = SS_START;
1339 }
1340 else if (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPANone)
1341 {
1342 pAd->StaCfg.WpaState = SS_NOTUSE;
1343 }
1344
1345 DBGPRINT(RT_DEBUG_TRACE, ("%s::(WPAPSK=%s)\n", __func__, tmpbuf));
1346 }
1347 }
1348 }
1349
1350 //DefaultKeyID, KeyType, KeyStr
1351 rtmp_read_key_parms_from_file(pAd, tmpbuf, buffer);
1352
1353 HTParametersHook(pAd, tmpbuf, buffer);
1354
1355 {
1356 //PSMode
1357 #ifdef RT2860
1358 if (RTMPGetKeyParameter("PSMode", tmpbuf, 32, buffer))
1359 #endif
1360 #ifdef RT2870
1361 if (RTMPGetKeyParameter("PSMode", tmpbuf, 10, buffer))
1362 #endif
1363 {
1364 if (pAd->StaCfg.BssType == BSS_INFRA)
1365 {
1366 if ((strcmp(tmpbuf, "MAX_PSP") == 0) || (strcmp(tmpbuf, "max_psp") == 0))
1367 {
1368 // do NOT turn on PSM bit here, wait until MlmeCheckForPsmChange()
1369 // to exclude certain situations.
1370 // MlmeSetPsm(pAd, PWR_SAVE);
1371 OPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM);
1372 if (pAd->StaCfg.bWindowsACCAMEnable == FALSE)
1373 pAd->StaCfg.WindowsPowerMode = Ndis802_11PowerModeMAX_PSP;
1374 pAd->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeMAX_PSP;
1375 pAd->StaCfg.DefaultListenCount = 5;
1376 }
1377 else if ((strcmp(tmpbuf, "Fast_PSP") == 0) || (strcmp(tmpbuf, "fast_psp") == 0)
1378 || (strcmp(tmpbuf, "FAST_PSP") == 0))
1379 {
1380 // do NOT turn on PSM bit here, wait until MlmeCheckForPsmChange()
1381 // to exclude certain situations.
1382 // MlmeSetPsmBit(pAd, PWR_SAVE);
1383 OPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM);
1384 if (pAd->StaCfg.bWindowsACCAMEnable == FALSE)
1385 pAd->StaCfg.WindowsPowerMode = Ndis802_11PowerModeFast_PSP;
1386 pAd->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeFast_PSP;
1387 pAd->StaCfg.DefaultListenCount = 3;
1388 }
1389 else if ((strcmp(tmpbuf, "Legacy_PSP") == 0) || (strcmp(tmpbuf, "legacy_psp") == 0)
1390 || (strcmp(tmpbuf, "LEGACY_PSP") == 0))
1391 {
1392 // do NOT turn on PSM bit here, wait until MlmeCheckForPsmChange()
1393 // to exclude certain situations.
1394 // MlmeSetPsmBit(pAd, PWR_SAVE);
1395 OPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM);
1396 if (pAd->StaCfg.bWindowsACCAMEnable == FALSE)
1397 pAd->StaCfg.WindowsPowerMode = Ndis802_11PowerModeLegacy_PSP;
1398 pAd->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeLegacy_PSP;
1399 pAd->StaCfg.DefaultListenCount = 3;
1400 }
1401 else
1402 { //Default Ndis802_11PowerModeCAM
1403 // clear PSM bit immediately
1404 MlmeSetPsmBit(pAd, PWR_ACTIVE);
1405 OPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM);
1406 if (pAd->StaCfg.bWindowsACCAMEnable == FALSE)
1407 pAd->StaCfg.WindowsPowerMode = Ndis802_11PowerModeCAM;
1408 pAd->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeCAM;
1409 }
1410 DBGPRINT(RT_DEBUG_TRACE, ("PSMode=%ld\n", pAd->StaCfg.WindowsPowerMode));
1411 }
1412 }
1413 // FastRoaming
1414 if (RTMPGetKeyParameter("FastRoaming", tmpbuf, 32, buffer))
1415 {
1416 if (simple_strtol(tmpbuf, 0, 10) == 0)
1417 pAd->StaCfg.bFastRoaming = FALSE;
1418 else
1419 pAd->StaCfg.bFastRoaming = TRUE;
1420
1421 DBGPRINT(RT_DEBUG_TRACE, ("FastRoaming=%d\n", pAd->StaCfg.bFastRoaming));
1422 }
1423 // RoamThreshold
1424 if (RTMPGetKeyParameter("RoamThreshold", tmpbuf, 32, buffer))
1425 {
1426 long lInfo = simple_strtol(tmpbuf, 0, 10);
1427
1428 if (lInfo > 90 || lInfo < 60)
1429 pAd->StaCfg.dBmToRoam = -70;
1430 else
1431 pAd->StaCfg.dBmToRoam = (CHAR)(-1)*lInfo;
1432
1433 DBGPRINT(RT_DEBUG_TRACE, ("RoamThreshold=%d dBm\n", pAd->StaCfg.dBmToRoam));
1434 }
1435
1436 if(RTMPGetKeyParameter("TGnWifiTest", tmpbuf, 10, buffer))
1437 {
1438 if(simple_strtol(tmpbuf, 0, 10) == 0)
1439 pAd->StaCfg.bTGnWifiTest = FALSE;
1440 else
1441 pAd->StaCfg.bTGnWifiTest = TRUE;
1442 DBGPRINT(RT_DEBUG_TRACE, ("TGnWifiTest=%d\n", pAd->StaCfg.bTGnWifiTest));
1443 }
1444 }
1445
1446 #ifdef RT30xx
1447 {
1448 if(RTMPGetKeyParameter("AntDiversity", tmpbuf, 10, buffer))
1449 {
1450 for (i = 0, macptr = rstrtok(tmpbuf,";"); macptr; macptr = rstrtok(NULL,";"), i++)
1451 {
1452 if(simple_strtol(macptr, 0, 10) != 0) //Enable
1453 pAd->CommonCfg.bRxAntDiversity = TRUE;
1454 else //Disable
1455 pAd->CommonCfg.bRxAntDiversity = FALSE;
1456
1457 DBGPRINT(RT_DEBUG_ERROR, ("AntDiversity=%d\n", pAd->CommonCfg.bRxAntDiversity));
1458 }
1459 }
1460 }
1461 #endif // RT30xx //
1462 }
1463 }
1464 else
1465 {
1466 DBGPRINT(RT_DEBUG_TRACE, ("--> %s does not have a write method\n", src));
1467 }
1468
1469 retval=filp_close(srcf,NULL);
1470
1471 if (retval)
1472 {
1473 DBGPRINT(RT_DEBUG_TRACE, ("--> Error %d closing %s\n", -retval, src));
1474 }
1475 }
1476 }
1477
1478 set_fs(orgfs);
1479
1480 kfree(buffer);
1481 kfree(tmpbuf);
1482
1483 return (NDIS_STATUS_SUCCESS);
1484 }
1485
1486 static void HTParametersHook(
1487 IN PRTMP_ADAPTER pAd,
1488 IN CHAR *pValueStr,
1489 IN CHAR *pInput)
1490 {
1491
1492 INT Value;
1493
1494 if (RTMPGetKeyParameter("HT_PROTECT", pValueStr, 25, pInput))
1495 {
1496 Value = simple_strtol(pValueStr, 0, 10);
1497 if (Value == 0)
1498 {
1499 pAd->CommonCfg.bHTProtect = FALSE;
1500 }
1501 else
1502 {
1503 pAd->CommonCfg.bHTProtect = TRUE;
1504 }
1505 DBGPRINT(RT_DEBUG_TRACE, ("HT: Protection = %s\n", (Value==0) ? "Disable" : "Enable"));
1506 }
1507
1508 if (RTMPGetKeyParameter("HT_MIMOPSEnable", pValueStr, 25, pInput))
1509 {
1510 Value = simple_strtol(pValueStr, 0, 10);
1511 if (Value == 0)
1512 {
1513 pAd->CommonCfg.bMIMOPSEnable = FALSE;
1514 }
1515 else
1516 {
1517 pAd->CommonCfg.bMIMOPSEnable = TRUE;
1518 }
1519 DBGPRINT(RT_DEBUG_TRACE, ("HT: MIMOPSEnable = %s\n", (Value==0) ? "Disable" : "Enable"));
1520 }
1521
1522
1523 if (RTMPGetKeyParameter("HT_MIMOPSMode", pValueStr, 25, pInput))
1524 {
1525 Value = simple_strtol(pValueStr, 0, 10);
1526 if (Value > MMPS_ENABLE)
1527 {
1528 pAd->CommonCfg.BACapability.field.MMPSmode = MMPS_ENABLE;
1529 }
1530 else
1531 {
1532 //TODO: add mimo power saving mechanism
1533 pAd->CommonCfg.BACapability.field.MMPSmode = MMPS_ENABLE;
1534 //pAd->CommonCfg.BACapability.field.MMPSmode = Value;
1535 }
1536 DBGPRINT(RT_DEBUG_TRACE, ("HT: MIMOPS Mode = %d\n", Value));
1537 }
1538
1539 if (RTMPGetKeyParameter("HT_BADecline", pValueStr, 25, pInput))
1540 {
1541 Value = simple_strtol(pValueStr, 0, 10);
1542 if (Value == 0)
1543 {
1544 pAd->CommonCfg.bBADecline = FALSE;
1545 }
1546 else
1547 {
1548 pAd->CommonCfg.bBADecline = TRUE;
1549 }
1550 DBGPRINT(RT_DEBUG_TRACE, ("HT: BA Decline = %s\n", (Value==0) ? "Disable" : "Enable"));
1551 }
1552
1553
1554 if (RTMPGetKeyParameter("HT_DisableReordering", pValueStr, 25, pInput))
1555 {
1556 Value = simple_strtol(pValueStr, 0, 10);
1557 if (Value == 0)
1558 {
1559 pAd->CommonCfg.bDisableReordering = FALSE;
1560 }
1561 else
1562 {
1563 pAd->CommonCfg.bDisableReordering = TRUE;
1564 }
1565 DBGPRINT(RT_DEBUG_TRACE, ("HT: DisableReordering = %s\n", (Value==0) ? "Disable" : "Enable"));
1566 }
1567
1568 if (RTMPGetKeyParameter("HT_AutoBA", pValueStr, 25, pInput))
1569 {
1570 Value = simple_strtol(pValueStr, 0, 10);
1571 if (Value == 0)
1572 {
1573 pAd->CommonCfg.BACapability.field.AutoBA = FALSE;
1574 #ifdef RT30xx
1575 pAd->CommonCfg.BACapability.field.Policy = BA_NOTUSE;
1576 #endif
1577 }
1578 else
1579 {
1580 pAd->CommonCfg.BACapability.field.AutoBA = TRUE;
1581 #ifdef RT30xx
1582 pAd->CommonCfg.BACapability.field.Policy = IMMED_BA;
1583 #endif
1584 }
1585 pAd->CommonCfg.REGBACapability.field.AutoBA = pAd->CommonCfg.BACapability.field.AutoBA;
1586 #ifdef RT30xx
1587 pAd->CommonCfg.REGBACapability.field.Policy = pAd->CommonCfg.BACapability.field.Policy;
1588 #endif
1589 DBGPRINT(RT_DEBUG_TRACE, ("HT: Auto BA = %s\n", (Value==0) ? "Disable" : "Enable"));
1590 }
1591
1592 // Tx_+HTC frame
1593 if (RTMPGetKeyParameter("HT_HTC", pValueStr, 25, pInput))
1594 {
1595 Value = simple_strtol(pValueStr, 0, 10);
1596 if (Value == 0)
1597 {
1598 pAd->HTCEnable = FALSE;
1599 }
1600 else
1601 {
1602 pAd->HTCEnable = TRUE;
1603 }
1604 DBGPRINT(RT_DEBUG_TRACE, ("HT: Tx +HTC frame = %s\n", (Value==0) ? "Disable" : "Enable"));
1605 }
1606
1607 // Enable HT Link Adaptation Control
1608 if (RTMPGetKeyParameter("HT_LinkAdapt", pValueStr, 25, pInput))
1609 {
1610 Value = simple_strtol(pValueStr, 0, 10);
1611 if (Value == 0)
1612 {
1613 pAd->bLinkAdapt = FALSE;
1614 }
1615 else
1616 {
1617 pAd->HTCEnable = TRUE;
1618 pAd->bLinkAdapt = TRUE;
1619 }
1620 DBGPRINT(RT_DEBUG_TRACE, ("HT: Link Adaptation Control = %s\n", (Value==0) ? "Disable" : "Enable(+HTC)"));
1621 }
1622
1623 // Reverse Direction Mechanism
1624 if (RTMPGetKeyParameter("HT_RDG", pValueStr, 25, pInput))
1625 {
1626 Value = simple_strtol(pValueStr, 0, 10);
1627 if (Value == 0)
1628 {
1629 pAd->CommonCfg.bRdg = FALSE;
1630 }
1631 else
1632 {
1633 pAd->HTCEnable = TRUE;
1634 pAd->CommonCfg.bRdg = TRUE;
1635 }
1636 DBGPRINT(RT_DEBUG_TRACE, ("HT: RDG = %s\n", (Value==0) ? "Disable" : "Enable(+HTC)"));
1637 }
1638
1639
1640
1641
1642 // Tx A-MSUD ?
1643 if (RTMPGetKeyParameter("HT_AMSDU", pValueStr, 25, pInput))
1644 {
1645 Value = simple_strtol(pValueStr, 0, 10);
1646 if (Value == 0)
1647 {
1648 pAd->CommonCfg.BACapability.field.AmsduEnable = FALSE;
1649 }
1650 else
1651 {
1652 pAd->CommonCfg.BACapability.field.AmsduEnable = TRUE;
1653 }
1654 DBGPRINT(RT_DEBUG_TRACE, ("HT: Tx A-MSDU = %s\n", (Value==0) ? "Disable" : "Enable"));
1655 }
1656
1657 // MPDU Density
1658 if (RTMPGetKeyParameter("HT_MpduDensity", pValueStr, 25, pInput))
1659 {
1660 Value = simple_strtol(pValueStr, 0, 10);
1661 if (Value <=7 && Value >= 0)
1662 {
1663 pAd->CommonCfg.BACapability.field.MpduDensity = Value;
1664 DBGPRINT(RT_DEBUG_TRACE, ("HT: MPDU Density = %d\n", Value));
1665 }
1666 else
1667 {
1668 pAd->CommonCfg.BACapability.field.MpduDensity = 4;
1669 DBGPRINT(RT_DEBUG_TRACE, ("HT: MPDU Density = %d (Default)\n", 4));
1670 }
1671 }
1672
1673 // Max Rx BA Window Size
1674 if (RTMPGetKeyParameter("HT_BAWinSize", pValueStr, 25, pInput))
1675 {
1676 Value = simple_strtol(pValueStr, 0, 10);
1677
1678 if (Value >=1 && Value <= 64)
1679 {
1680 pAd->CommonCfg.REGBACapability.field.RxBAWinLimit = Value;
1681 pAd->CommonCfg.BACapability.field.RxBAWinLimit = Value;
1682 DBGPRINT(RT_DEBUG_TRACE, ("HT: BA Windw Size = %d\n", Value));
1683 }
1684 else
1685 {
1686 pAd->CommonCfg.REGBACapability.field.RxBAWinLimit = 64;
1687 pAd->CommonCfg.BACapability.field.RxBAWinLimit = 64;
1688 DBGPRINT(RT_DEBUG_TRACE, ("HT: BA Windw Size = 64 (Defualt)\n"));
1689 }
1690
1691 }
1692
1693 // Guard Interval
1694 if (RTMPGetKeyParameter("HT_GI", pValueStr, 25, pInput))
1695 {
1696 Value = simple_strtol(pValueStr, 0, 10);
1697
1698 if (Value == GI_400)
1699 {
1700 pAd->CommonCfg.RegTransmitSetting.field.ShortGI = GI_400;
1701 }
1702 else
1703 {
1704 pAd->CommonCfg.RegTransmitSetting.field.ShortGI = GI_800;
1705 }
1706
1707 DBGPRINT(RT_DEBUG_TRACE, ("HT: Guard Interval = %s\n", (Value==GI_400) ? "400" : "800" ));
1708 }
1709
1710 // HT Operation Mode : Mixed Mode , Green Field
1711 if (RTMPGetKeyParameter("HT_OpMode", pValueStr, 25, pInput))
1712 {
1713 Value = simple_strtol(pValueStr, 0, 10);
1714
1715 if (Value == HTMODE_GF)
1716 {
1717
1718 pAd->CommonCfg.RegTransmitSetting.field.HTMODE = HTMODE_GF;
1719 }
1720 else
1721 {
1722 pAd->CommonCfg.RegTransmitSetting.field.HTMODE = HTMODE_MM;
1723 }
1724
1725 DBGPRINT(RT_DEBUG_TRACE, ("HT: Operate Mode = %s\n", (Value==HTMODE_GF) ? "Green Field" : "Mixed Mode" ));
1726 }
1727
1728 // Fixed Tx mode : CCK, OFDM
1729 if (RTMPGetKeyParameter("FixedTxMode", pValueStr, 25, pInput))
1730 {
1731 UCHAR fix_tx_mode;
1732
1733 {
1734 fix_tx_mode = FIXED_TXMODE_HT;
1735
1736 if (strcmp(pValueStr, "OFDM") == 0 || strcmp(pValueStr, "ofdm") == 0)
1737 {
1738 fix_tx_mode = FIXED_TXMODE_OFDM;
1739 }
1740 else if (strcmp(pValueStr, "CCK") == 0 || strcmp(pValueStr, "cck") == 0)
1741 {
1742 fix_tx_mode = FIXED_TXMODE_CCK;
1743 }
1744 else if (strcmp(pValueStr, "HT") == 0 || strcmp(pValueStr, "ht") == 0)
1745 {
1746 fix_tx_mode = FIXED_TXMODE_HT;
1747 }
1748 else
1749 {
1750 Value = simple_strtol(pValueStr, 0, 10);
1751 // 1 : CCK
1752 // 2 : OFDM
1753 // otherwise : HT
1754 if (Value == FIXED_TXMODE_CCK || Value == FIXED_TXMODE_OFDM)
1755 fix_tx_mode = Value;
1756 else
1757 fix_tx_mode = FIXED_TXMODE_HT;
1758 }
1759
1760 pAd->StaCfg.DesiredTransmitSetting.field.FixedTxMode = fix_tx_mode;
1761 DBGPRINT(RT_DEBUG_TRACE, ("Fixed Tx Mode = %d\n", fix_tx_mode));
1762
1763 }
1764 }
1765
1766
1767 // Channel Width
1768 if (RTMPGetKeyParameter("HT_BW", pValueStr, 25, pInput))
1769 {
1770 Value = simple_strtol(pValueStr, 0, 10);
1771
1772 if (Value == BW_40)
1773 {
1774 pAd->CommonCfg.RegTransmitSetting.field.BW = BW_40;
1775 }
1776 else
1777 {
1778 pAd->CommonCfg.RegTransmitSetting.field.BW = BW_20;
1779 }
1780
1781 #ifdef MCAST_RATE_SPECIFIC
1782 pAd->CommonCfg.MCastPhyMode.field.BW = pAd->CommonCfg.RegTransmitSetting.field.BW;
1783 #endif // MCAST_RATE_SPECIFIC //
1784
1785 DBGPRINT(RT_DEBUG_TRACE, ("HT: Channel Width = %s\n", (Value==BW_40) ? "40 MHz" : "20 MHz" ));
1786 }
1787
1788 if (RTMPGetKeyParameter("HT_EXTCHA", pValueStr, 25, pInput))
1789 {
1790 Value = simple_strtol(pValueStr, 0, 10);
1791
1792 if (Value == 0)
1793 {
1794
1795 pAd->CommonCfg.RegTransmitSetting.field.EXTCHA = EXTCHA_BELOW;
1796 }
1797 else
1798 {
1799 pAd->CommonCfg.RegTransmitSetting.field.EXTCHA = EXTCHA_ABOVE;
1800 }
1801
1802 DBGPRINT(RT_DEBUG_TRACE, ("HT: Ext Channel = %s\n", (Value==0) ? "BELOW" : "ABOVE" ));
1803 }
1804
1805 // MSC
1806 if (RTMPGetKeyParameter("HT_MCS", pValueStr, 50, pInput))
1807 {
1808 {
1809 Value = simple_strtol(pValueStr, 0, 10);
1810
1811 if ((Value >= 0 && Value <= 23) || (Value == 32)) // 3*3
1812 {
1813 pAd->StaCfg.DesiredTransmitSetting.field.MCS = Value;
1814 pAd->StaCfg.bAutoTxRateSwitch = FALSE;
1815 DBGPRINT(RT_DEBUG_TRACE, ("HT: MCS = %d\n", pAd->StaCfg.DesiredTransmitSetting.field.MCS));
1816 }
1817 else
1818 {
1819 pAd->StaCfg.DesiredTransmitSetting.field.MCS = MCS_AUTO;
1820 pAd->StaCfg.bAutoTxRateSwitch = TRUE;
1821 DBGPRINT(RT_DEBUG_TRACE, ("HT: MCS = AUTO\n"));
1822 }
1823 }
1824 }
1825
1826 // STBC
1827 if (RTMPGetKeyParameter("HT_STBC", pValueStr, 25, pInput))
1828 {
1829 Value = simple_strtol(pValueStr, 0, 10);
1830 if (Value == STBC_USE)
1831 {
1832 pAd->CommonCfg.RegTransmitSetting.field.STBC = STBC_USE;
1833 }
1834 else
1835 {
1836 pAd->CommonCfg.RegTransmitSetting.field.STBC = STBC_NONE;
1837 }
1838 DBGPRINT(RT_DEBUG_TRACE, ("HT: STBC = %d\n", pAd->CommonCfg.RegTransmitSetting.field.STBC));
1839 }
1840
1841 // 40_Mhz_Intolerant
1842 if (RTMPGetKeyParameter("HT_40MHZ_INTOLERANT", pValueStr, 25, pInput))
1843 {
1844 Value = simple_strtol(pValueStr, 0, 10);
1845 if (Value == 0)
1846 {
1847 pAd->CommonCfg.bForty_Mhz_Intolerant = FALSE;
1848 }
1849 else
1850 {
1851 pAd->CommonCfg.bForty_Mhz_Intolerant = TRUE;
1852 }
1853 DBGPRINT(RT_DEBUG_TRACE, ("HT: 40MHZ INTOLERANT = %d\n", pAd->CommonCfg.bForty_Mhz_Intolerant));
1854 }
1855 //HT_TxStream
1856 if(RTMPGetKeyParameter("HT_TxStream", pValueStr, 10, pInput))
1857 {
1858 switch (simple_strtol(pValueStr, 0, 10))
1859 {
1860 case 1:
1861 pAd->CommonCfg.TxStream = 1;
1862 break;
1863 case 2:
1864 pAd->CommonCfg.TxStream = 2;
1865 break;
1866 case 3: // 3*3
1867 default:
1868 pAd->CommonCfg.TxStream = 3;
1869
1870 if (pAd->MACVersion < RALINK_2883_VERSION)
1871 pAd->CommonCfg.TxStream = 2; // only 2 tx streams for RT2860 series
1872 break;
1873 }
1874 DBGPRINT(RT_DEBUG_TRACE, ("HT: Tx Stream = %d\n", pAd->CommonCfg.TxStream));
1875 }
1876 //HT_RxStream
1877 if(RTMPGetKeyParameter("HT_RxStream", pValueStr, 10, pInput))
1878 {
1879 switch (simple_strtol(pValueStr, 0, 10))
1880 {
1881 case 1:
1882 pAd->CommonCfg.RxStream = 1;
1883 break;
1884 case 2:
1885 pAd->CommonCfg.RxStream = 2;
1886 break;
1887 case 3:
1888 default:
1889 pAd->CommonCfg.RxStream = 3;
1890
1891 if (pAd->MACVersion < RALINK_2883_VERSION)
1892 pAd->CommonCfg.RxStream = 2; // only 2 rx streams for RT2860 series
1893 break;
1894 }
1895 DBGPRINT(RT_DEBUG_TRACE, ("HT: Rx Stream = %d\n", pAd->CommonCfg.RxStream));
1896 }
1897
1898 }
1899
|
This page was automatically generated by the
LXR engine.
|