0809f2170a92052c3a2d208da2ac68ad76522698
[pandora-kernel.git] / drivers / staging / rt2860 / rt_profile.c
1 /*
2  *************************************************************************
3  * Ralink Tech Inc.
4  * 5F., No.36, Taiyuan St., Jhubei City,
5  * Hsinchu County 302,
6  * Taiwan, R.O.C.
7  *
8  * (c) Copyright 2002-2007, Ralink Technology, Inc.
9  *
10  * This program is free software; you can redistribute it and/or modify  *
11  * it under the terms of the GNU General Public License as published by  *
12  * the Free Software Foundation; either version 2 of the License, or     *
13  * (at your option) any later version.                                   *
14  *                                                                       *
15  * This program is distributed in the hope that it will be useful,       *
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of        *
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
18  * GNU General Public License for more details.                          *
19  *                                                                       *
20  * You should have received a copy of the GNU General Public License     *
21  * along with this program; if not, write to the                         *
22  * Free Software Foundation, Inc.,                                       *
23  * 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
24  *                                                                       *
25  *************************************************************************
26  */
27
28 #include "rt_config.h"
29
30 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 == '0')
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 - '0');
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(wlan%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(wlan%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(wlan%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;
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     orgfs = get_fs();
888     set_fs(KERNEL_DS);
889
890         if (src && *src)
891         {
892                 srcf = filp_open(src, O_RDONLY, 0);
893                 if (IS_ERR(srcf))
894                 {
895                         DBGPRINT(RT_DEBUG_ERROR, ("--> Error %ld opening %s\n", -PTR_ERR(srcf),src));
896                 }
897                 else
898                 {
899                         // The object must have a read method
900                         if (srcf->f_op && srcf->f_op->read)
901                         {
902                                 memset(buffer, 0x00, MAX_INI_BUFFER_SIZE);
903                                 retval=srcf->f_op->read(srcf, buffer, MAX_INI_BUFFER_SIZE, &srcf->f_pos);
904                                 if (retval < 0)
905                                 {
906                                         DBGPRINT(RT_DEBUG_TRACE, ("--> Read %s error %d\n", src, -retval));
907                                 }
908                                 else
909                                 {
910                                         // set file parameter to portcfg
911                                         //CountryRegion
912                                         if(RTMPGetKeyParameter("CountryRegion", tmpbuf, 25, buffer))
913                                         {
914                                                 pAd->CommonCfg.CountryRegion = (UCHAR) simple_strtol(tmpbuf, 0, 10);
915                                                 DBGPRINT(RT_DEBUG_TRACE, ("CountryRegion=%d\n", pAd->CommonCfg.CountryRegion));
916                                         }
917                                         //CountryRegionABand
918                                         if(RTMPGetKeyParameter("CountryRegionABand", tmpbuf, 25, buffer))
919                                         {
920                                                 pAd->CommonCfg.CountryRegionForABand= (UCHAR) simple_strtol(tmpbuf, 0, 10);
921                                                 DBGPRINT(RT_DEBUG_TRACE, ("CountryRegionABand=%d\n", pAd->CommonCfg.CountryRegionForABand));
922                                         }
923                                         //CountryCode
924                                         if(RTMPGetKeyParameter("CountryCode", tmpbuf, 25, buffer))
925                                         {
926                                                 NdisMoveMemory(pAd->CommonCfg.CountryCode, tmpbuf , 2);
927
928                                                 if (strlen(pAd->CommonCfg.CountryCode) != 0)
929                                                 {
930                                                         pAd->CommonCfg.bCountryFlag = TRUE;
931                                                 }
932                                                 DBGPRINT(RT_DEBUG_TRACE, ("CountryCode=%s\n", pAd->CommonCfg.CountryCode));
933                                         }
934                                         //ChannelGeography
935                                         if(RTMPGetKeyParameter("ChannelGeography", tmpbuf, 25, buffer))
936                                         {
937                                                 UCHAR Geography = (UCHAR) simple_strtol(tmpbuf, 0, 10);
938                                                 if (Geography <= BOTH)
939                                                 {
940                                                         pAd->CommonCfg.Geography = Geography;
941                                                         pAd->CommonCfg.CountryCode[2] =
942                                                                 (pAd->CommonCfg.Geography == BOTH) ? ' ' : ((pAd->CommonCfg.Geography == IDOR) ? 'I' : 'O');
943                                                         DBGPRINT(RT_DEBUG_TRACE, ("ChannelGeography=%d\n", pAd->CommonCfg.Geography));
944                                                 }
945                                         }
946                                         else
947                                         {
948                                                 pAd->CommonCfg.Geography = BOTH;
949                                                 pAd->CommonCfg.CountryCode[2] = ' ';
950                                         }
951
952                                         {
953                                                 //SSID
954                                                 if (RTMPGetCriticalParameter("SSID", tmpbuf, 256, buffer))
955                                                 {
956                                                         if (strlen(tmpbuf) <= 32)
957                                                         {
958                                                                 pAd->CommonCfg.SsidLen = (UCHAR) strlen(tmpbuf);
959                                                                 NdisZeroMemory(pAd->CommonCfg.Ssid, NDIS_802_11_LENGTH_SSID);
960                                                                 NdisMoveMemory(pAd->CommonCfg.Ssid, tmpbuf, pAd->CommonCfg.SsidLen);
961                                                                 pAd->MlmeAux.AutoReconnectSsidLen = pAd->CommonCfg.SsidLen;
962                                                                 NdisZeroMemory(pAd->MlmeAux.AutoReconnectSsid, NDIS_802_11_LENGTH_SSID);
963                                                                 NdisMoveMemory(pAd->MlmeAux.AutoReconnectSsid, tmpbuf, pAd->MlmeAux.AutoReconnectSsidLen);
964                                                                 pAd->MlmeAux.SsidLen = pAd->CommonCfg.SsidLen;
965                                                                 NdisZeroMemory(pAd->MlmeAux.Ssid, NDIS_802_11_LENGTH_SSID);
966                                                                 NdisMoveMemory(pAd->MlmeAux.Ssid, tmpbuf, pAd->MlmeAux.SsidLen);
967                                                                 DBGPRINT(RT_DEBUG_TRACE, ("%s::(SSID=%s)\n", __func__, tmpbuf));
968                                                         }
969                                                 }
970                                         }
971
972                                         {
973                                                 //NetworkType
974                                                 if (RTMPGetKeyParameter("NetworkType", tmpbuf, 25, buffer))
975                                                 {
976                                                         pAd->bConfigChanged = TRUE;
977                                                         if (strcmp(tmpbuf, "Adhoc") == 0)
978                                                                 pAd->StaCfg.BssType = BSS_ADHOC;
979                                                         else //Default Infrastructure mode
980                                                                 pAd->StaCfg.BssType = BSS_INFRA;
981                                                         // Reset Ralink supplicant to not use, it will be set to start when UI set PMK key
982                                                         pAd->StaCfg.WpaState = SS_NOTUSE;
983                                                         DBGPRINT(RT_DEBUG_TRACE, ("%s::(NetworkType=%d)\n", __func__, pAd->StaCfg.BssType));
984                                                 }
985                                         }
986
987                                         //Channel
988                                         if(RTMPGetKeyParameter("Channel", tmpbuf, 10, buffer))
989                                         {
990                                                 pAd->CommonCfg.Channel = (UCHAR) simple_strtol(tmpbuf, 0, 10);
991                                                 DBGPRINT(RT_DEBUG_TRACE, ("Channel=%d\n", pAd->CommonCfg.Channel));
992                                         }
993                                         //WirelessMode
994                                         if(RTMPGetKeyParameter("WirelessMode", tmpbuf, 10, buffer))
995                                         {
996                                                 int value  = 0, maxPhyMode = PHY_11G;
997
998                                                 maxPhyMode = PHY_11N_5G;
999
1000                                                 value = simple_strtol(tmpbuf, 0, 10);
1001
1002                                                 if (value <= maxPhyMode)
1003                                                 {
1004                                                         pAd->CommonCfg.PhyMode = value;
1005                                                 }
1006                                                 DBGPRINT(RT_DEBUG_TRACE, ("PhyMode=%d\n", pAd->CommonCfg.PhyMode));
1007                                         }
1008                     //BasicRate
1009                                         if(RTMPGetKeyParameter("BasicRate", tmpbuf, 10, buffer))
1010                                         {
1011                                                 pAd->CommonCfg.BasicRateBitmap = (ULONG) simple_strtol(tmpbuf, 0, 10);
1012                                                 DBGPRINT(RT_DEBUG_TRACE, ("BasicRate=%ld\n", pAd->CommonCfg.BasicRateBitmap));
1013                                         }
1014                                         //BeaconPeriod
1015                                         if(RTMPGetKeyParameter("BeaconPeriod", tmpbuf, 10, buffer))
1016                                         {
1017                                                 pAd->CommonCfg.BeaconPeriod = (USHORT) simple_strtol(tmpbuf, 0, 10);
1018                                                 DBGPRINT(RT_DEBUG_TRACE, ("BeaconPeriod=%d\n", pAd->CommonCfg.BeaconPeriod));
1019                                         }
1020                     //TxPower
1021                                         if(RTMPGetKeyParameter("TxPower", tmpbuf, 10, buffer))
1022                                         {
1023                                                 pAd->CommonCfg.TxPowerPercentage = (ULONG) simple_strtol(tmpbuf, 0, 10);
1024
1025                                                 pAd->CommonCfg.TxPowerDefault = pAd->CommonCfg.TxPowerPercentage;
1026
1027                                                 DBGPRINT(RT_DEBUG_TRACE, ("TxPower=%ld\n", pAd->CommonCfg.TxPowerPercentage));
1028                                         }
1029                                         //BGProtection
1030                                         if(RTMPGetKeyParameter("BGProtection", tmpbuf, 10, buffer))
1031                                         {
1032                                                 switch (simple_strtol(tmpbuf, 0, 10))
1033                                                 {
1034                                                         case 1: //Always On
1035                                                                 pAd->CommonCfg.UseBGProtection = 1;
1036                                                                 break;
1037                                                         case 2: //Always OFF
1038                                                                 pAd->CommonCfg.UseBGProtection = 2;
1039                                                                 break;
1040                                                         case 0: //AUTO
1041                                                         default:
1042                                                                 pAd->CommonCfg.UseBGProtection = 0;
1043                                                                 break;
1044                                                 }
1045                                                 DBGPRINT(RT_DEBUG_TRACE, ("BGProtection=%ld\n", pAd->CommonCfg.UseBGProtection));
1046                                         }
1047                                         //OLBCDetection
1048                                         if(RTMPGetKeyParameter("DisableOLBC", tmpbuf, 10, buffer))
1049                                         {
1050                                                 switch (simple_strtol(tmpbuf, 0, 10))
1051                                                 {
1052                                                         case 1: //disable OLBC Detection
1053                                                                 pAd->CommonCfg.DisableOLBCDetect = 1;
1054                                                                 break;
1055                                                         case 0: //enable OLBC Detection
1056                                                                 pAd->CommonCfg.DisableOLBCDetect = 0;
1057                                                                 break;
1058                                                         default:
1059                                                                 pAd->CommonCfg.DisableOLBCDetect= 0;
1060                                                                 break;
1061                                                 }
1062                                                 DBGPRINT(RT_DEBUG_TRACE, ("OLBCDetection=%ld\n", pAd->CommonCfg.DisableOLBCDetect));
1063                                         }
1064                                         //TxPreamble
1065                                         if(RTMPGetKeyParameter("TxPreamble", tmpbuf, 10, buffer))
1066                                         {
1067                                                 switch (simple_strtol(tmpbuf, 0, 10))
1068                                                 {
1069                                                         case Rt802_11PreambleShort:
1070                                                                 pAd->CommonCfg.TxPreamble = Rt802_11PreambleShort;
1071                                                                 break;
1072                                                         case Rt802_11PreambleLong:
1073                                                         default:
1074                                                                 pAd->CommonCfg.TxPreamble = Rt802_11PreambleLong;
1075                                                                 break;
1076                                                 }
1077                                                 DBGPRINT(RT_DEBUG_TRACE, ("TxPreamble=%ld\n", pAd->CommonCfg.TxPreamble));
1078                                         }
1079                                         //RTSThreshold
1080                                         if(RTMPGetKeyParameter("RTSThreshold", tmpbuf, 10, buffer))
1081                                         {
1082                                                 RtsThresh = simple_strtol(tmpbuf, 0, 10);
1083                                                 if( (RtsThresh >= 1) && (RtsThresh <= MAX_RTS_THRESHOLD) )
1084                                                         pAd->CommonCfg.RtsThreshold  = (USHORT)RtsThresh;
1085                                                 else
1086                                                         pAd->CommonCfg.RtsThreshold = MAX_RTS_THRESHOLD;
1087
1088                                                 DBGPRINT(RT_DEBUG_TRACE, ("RTSThreshold=%d\n", pAd->CommonCfg.RtsThreshold));
1089                                         }
1090                                         //FragThreshold
1091                                         if(RTMPGetKeyParameter("FragThreshold", tmpbuf, 10, buffer))
1092                                         {
1093                                                 FragThresh = simple_strtol(tmpbuf, 0, 10);
1094                                                 pAd->CommonCfg.bUseZeroToDisableFragment = FALSE;
1095
1096                                                 if (FragThresh > MAX_FRAG_THRESHOLD || FragThresh < MIN_FRAG_THRESHOLD)
1097                                                 { //illegal FragThresh so we set it to default
1098                                                         pAd->CommonCfg.FragmentThreshold = MAX_FRAG_THRESHOLD;
1099                                                         pAd->CommonCfg.bUseZeroToDisableFragment = TRUE;
1100                                                 }
1101                                                 else if (FragThresh % 2 == 1)
1102                                                 {
1103                                                         // The length of each fragment shall always be an even number of octets, except for the last fragment
1104                                                         // of an MSDU or MMPDU, which may be either an even or an odd number of octets.
1105                                                         pAd->CommonCfg.FragmentThreshold = (USHORT)(FragThresh - 1);
1106                                                 }
1107                                                 else
1108                                                 {
1109                                                         pAd->CommonCfg.FragmentThreshold = (USHORT)FragThresh;
1110                                                 }
1111                                                 //pAd->CommonCfg.AllowFragSize = (pAd->CommonCfg.FragmentThreshold) - LENGTH_802_11 - LENGTH_CRC;
1112                                                 DBGPRINT(RT_DEBUG_TRACE, ("FragThreshold=%d\n", pAd->CommonCfg.FragmentThreshold));
1113                                         }
1114                                         //TxBurst
1115                                         if(RTMPGetKeyParameter("TxBurst", tmpbuf, 10, buffer))
1116                                         {
1117                                                 if(simple_strtol(tmpbuf, 0, 10) != 0)  //Enable
1118                                                         pAd->CommonCfg.bEnableTxBurst = TRUE;
1119                                                 else //Disable
1120                                                         pAd->CommonCfg.bEnableTxBurst = FALSE;
1121                                                 DBGPRINT(RT_DEBUG_TRACE, ("TxBurst=%d\n", pAd->CommonCfg.bEnableTxBurst));
1122                                         }
1123
1124 #ifdef AGGREGATION_SUPPORT
1125                                         //PktAggregate
1126                                         if(RTMPGetKeyParameter("PktAggregate", tmpbuf, 10, buffer))
1127                                         {
1128                                                 if(simple_strtol(tmpbuf, 0, 10) != 0)  //Enable
1129                                                         pAd->CommonCfg.bAggregationCapable = TRUE;
1130                                                 else //Disable
1131                                                         pAd->CommonCfg.bAggregationCapable = FALSE;
1132 #ifdef PIGGYBACK_SUPPORT
1133                                                 pAd->CommonCfg.bPiggyBackCapable = pAd->CommonCfg.bAggregationCapable;
1134 #endif // PIGGYBACK_SUPPORT //
1135                                                 DBGPRINT(RT_DEBUG_TRACE, ("PktAggregate=%d\n", pAd->CommonCfg.bAggregationCapable));
1136                                         }
1137 #else
1138                                         pAd->CommonCfg.bAggregationCapable = FALSE;
1139                                         pAd->CommonCfg.bPiggyBackCapable = FALSE;
1140 #endif // AGGREGATION_SUPPORT //
1141
1142                                         // WmmCapable
1143                                         rtmp_read_sta_wmm_parms_from_file(pAd, tmpbuf, buffer);
1144
1145                                         //ShortSlot
1146                                         if(RTMPGetKeyParameter("ShortSlot", tmpbuf, 10, buffer))
1147                                         {
1148                                                 if(simple_strtol(tmpbuf, 0, 10) != 0)  //Enable
1149                                                         pAd->CommonCfg.bUseShortSlotTime = TRUE;
1150                                                 else //Disable
1151                                                         pAd->CommonCfg.bUseShortSlotTime = FALSE;
1152
1153                                                 DBGPRINT(RT_DEBUG_TRACE, ("ShortSlot=%d\n", pAd->CommonCfg.bUseShortSlotTime));
1154                                         }
1155                                         //IEEE80211H
1156                                         if(RTMPGetKeyParameter("IEEE80211H", tmpbuf, 10, buffer))
1157                                         {
1158                                             for (i = 0, macptr = rstrtok(tmpbuf,";"); macptr; macptr = rstrtok(NULL,";"), i++)
1159                                             {
1160                                                 if(simple_strtol(macptr, 0, 10) != 0)  //Enable
1161                                                         pAd->CommonCfg.bIEEE80211H = TRUE;
1162                                                 else //Disable
1163                                                         pAd->CommonCfg.bIEEE80211H = FALSE;
1164
1165                                                 DBGPRINT(RT_DEBUG_TRACE, ("IEEE80211H=%d\n", pAd->CommonCfg.bIEEE80211H));
1166                                             }
1167                                         }
1168                                         //CSPeriod
1169                                         if(RTMPGetKeyParameter("CSPeriod", tmpbuf, 10, buffer))
1170                                         {
1171                                             if(simple_strtol(tmpbuf, 0, 10) != 0)
1172                                                         pAd->CommonCfg.RadarDetect.CSPeriod = simple_strtol(tmpbuf, 0, 10);
1173                                                 else
1174                                                         pAd->CommonCfg.RadarDetect.CSPeriod = 0;
1175
1176                                                 DBGPRINT(RT_DEBUG_TRACE, ("CSPeriod=%d\n", pAd->CommonCfg.RadarDetect.CSPeriod));
1177                                         }
1178
1179                                         //RDRegion
1180                                         if(RTMPGetKeyParameter("RDRegion", tmpbuf, 128, buffer))
1181                                         {
1182                                                 if ((strncmp(tmpbuf, "JAP_W53", 7) == 0) || (strncmp(tmpbuf, "jap_w53", 7) == 0))
1183                                                 {
1184                                                         pAd->CommonCfg.RadarDetect.RDDurRegion = JAP_W53;
1185                                                         pAd->CommonCfg.RadarDetect.DfsSessionTime = 15;
1186                                                 }
1187                                                 else if ((strncmp(tmpbuf, "JAP_W56", 7) == 0) || (strncmp(tmpbuf, "jap_w56", 7) == 0))
1188                                                 {
1189                                                         pAd->CommonCfg.RadarDetect.RDDurRegion = JAP_W56;
1190                                                         pAd->CommonCfg.RadarDetect.DfsSessionTime = 13;
1191                                                 }
1192                                                 else if ((strncmp(tmpbuf, "JAP", 3) == 0) || (strncmp(tmpbuf, "jap", 3) == 0))
1193                                                 {
1194                                                         pAd->CommonCfg.RadarDetect.RDDurRegion = JAP;
1195                                                         pAd->CommonCfg.RadarDetect.DfsSessionTime = 5;
1196                                                 }
1197                                                 else  if ((strncmp(tmpbuf, "FCC", 3) == 0) || (strncmp(tmpbuf, "fcc", 3) == 0))
1198                                                 {
1199                                                         pAd->CommonCfg.RadarDetect.RDDurRegion = FCC;
1200                                                         pAd->CommonCfg.RadarDetect.DfsSessionTime = 5;
1201                                                 }
1202                                                 else if ((strncmp(tmpbuf, "CE", 2) == 0) || (strncmp(tmpbuf, "ce", 2) == 0))
1203                                                 {
1204                                                         pAd->CommonCfg.RadarDetect.RDDurRegion = CE;
1205                                                         pAd->CommonCfg.RadarDetect.DfsSessionTime = 13;
1206                                                 }
1207                                                 else
1208                                                 {
1209                                                         pAd->CommonCfg.RadarDetect.RDDurRegion = CE;
1210                                                         pAd->CommonCfg.RadarDetect.DfsSessionTime = 13;
1211                                                 }
1212
1213                                                 DBGPRINT(RT_DEBUG_TRACE, ("RDRegion=%d\n", pAd->CommonCfg.RadarDetect.RDDurRegion));
1214                                         }
1215                                         else
1216                                         {
1217                                                 pAd->CommonCfg.RadarDetect.RDDurRegion = CE;
1218                                                 pAd->CommonCfg.RadarDetect.DfsSessionTime = 13;
1219                                         }
1220
1221                                         //WirelessEvent
1222                                         if(RTMPGetKeyParameter("WirelessEvent", tmpbuf, 10, buffer))
1223                                         {
1224                                             if(simple_strtol(tmpbuf, 0, 10) != 0)
1225                                                         pAd->CommonCfg.bWirelessEvent = simple_strtol(tmpbuf, 0, 10);
1226                                                 else
1227                                                         pAd->CommonCfg.bWirelessEvent = 0;      // disable
1228                                                 DBGPRINT(RT_DEBUG_TRACE, ("WirelessEvent=%d\n", pAd->CommonCfg.bWirelessEvent));
1229                                         }
1230                                         if(RTMPGetKeyParameter("WiFiTest", tmpbuf, 10, buffer))
1231                                         {
1232                                             if(simple_strtol(tmpbuf, 0, 10) != 0)
1233                                                         pAd->CommonCfg.bWiFiTest= simple_strtol(tmpbuf, 0, 10);
1234                                                 else
1235                                                         pAd->CommonCfg.bWiFiTest = 0;   // disable
1236
1237                                                 DBGPRINT(RT_DEBUG_TRACE, ("WiFiTest=%d\n", pAd->CommonCfg.bWiFiTest));
1238                                         }
1239                                         //AuthMode
1240                                         if(RTMPGetKeyParameter("AuthMode", tmpbuf, 128, buffer))
1241                                         {
1242                                                 {
1243                                                         if ((strcmp(tmpbuf, "WEPAUTO") == 0) || (strcmp(tmpbuf, "wepauto") == 0))
1244                                                             pAd->StaCfg.AuthMode = Ndis802_11AuthModeAutoSwitch;
1245                                                         else if ((strcmp(tmpbuf, "SHARED") == 0) || (strcmp(tmpbuf, "shared") == 0))
1246                                                             pAd->StaCfg.AuthMode = Ndis802_11AuthModeShared;
1247                                                         else if ((strcmp(tmpbuf, "WPAPSK") == 0) || (strcmp(tmpbuf, "wpapsk") == 0))
1248                                                             pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPAPSK;
1249                                                         else if ((strcmp(tmpbuf, "WPANONE") == 0) || (strcmp(tmpbuf, "wpanone") == 0))
1250                                                             pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPANone;
1251                                                         else if ((strcmp(tmpbuf, "WPA2PSK") == 0) || (strcmp(tmpbuf, "wpa2psk") == 0))
1252                                                             pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPA2PSK;
1253                                                         else if ((strcmp(tmpbuf, "WPA") == 0) || (strcmp(tmpbuf, "wpa") == 0))
1254                                                             pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPA;
1255                                                         else if ((strcmp(tmpbuf, "WPA2") == 0) || (strcmp(tmpbuf, "wpa2") == 0))
1256                                                             pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPA2;
1257                                                         else
1258                                                             pAd->StaCfg.AuthMode = Ndis802_11AuthModeOpen;
1259
1260                                                         pAd->StaCfg.PortSecured = WPA_802_1X_PORT_NOT_SECURED;
1261
1262                                                         DBGPRINT(RT_DEBUG_TRACE, ("%s::(EncrypType=%d)\n", __func__, pAd->StaCfg.WepStatus));
1263                                                 }
1264                                         }
1265                                         //EncrypType
1266                                         if(RTMPGetKeyParameter("EncrypType", tmpbuf, 128, buffer))
1267                                         {
1268                                                 {
1269                                                         if ((strcmp(tmpbuf, "WEP") == 0) || (strcmp(tmpbuf, "wep") == 0))
1270                                                                 pAd->StaCfg.WepStatus   = Ndis802_11WEPEnabled;
1271                                                         else if ((strcmp(tmpbuf, "TKIP") == 0) || (strcmp(tmpbuf, "tkip") == 0))
1272                                                                 pAd->StaCfg.WepStatus   = Ndis802_11Encryption2Enabled;
1273                                                         else if ((strcmp(tmpbuf, "AES") == 0) || (strcmp(tmpbuf, "aes") == 0))
1274                                                                 pAd->StaCfg.WepStatus   = Ndis802_11Encryption3Enabled;
1275                                                         else
1276                                                                 pAd->StaCfg.WepStatus   = Ndis802_11WEPDisabled;
1277
1278                                                         // Update all wepstatus related
1279                                                         pAd->StaCfg.PairCipher          = pAd->StaCfg.WepStatus;
1280                                                         pAd->StaCfg.GroupCipher         = pAd->StaCfg.WepStatus;
1281                                                         pAd->StaCfg.OrigWepStatus       = pAd->StaCfg.WepStatus;
1282                                                         pAd->StaCfg.bMixCipher          = FALSE;
1283
1284                                                         DBGPRINT(RT_DEBUG_TRACE, ("%s::(EncrypType=%d)\n", __func__, pAd->StaCfg.WepStatus));
1285                                                 }
1286                                         }
1287
1288                                         {
1289                                                 if(RTMPGetCriticalParameter("WPAPSK", tmpbuf, 512, buffer))
1290                                                 {
1291                                                         int     err=0;
1292
1293                                                         tmpbuf[strlen(tmpbuf)] = '\0'; // make STA can process .$^& for WPAPSK input
1294
1295                                                         if ((pAd->StaCfg.AuthMode != Ndis802_11AuthModeWPAPSK) &&
1296                                                                 (pAd->StaCfg.AuthMode != Ndis802_11AuthModeWPA2PSK) &&
1297                                                                 (pAd->StaCfg.AuthMode != Ndis802_11AuthModeWPANone)
1298                                                                 )
1299                                                         {
1300                                                                 err = 1;
1301                                                         }
1302                                                         else if ((strlen(tmpbuf) >= 8) && (strlen(tmpbuf) < 64))
1303                                                         {
1304                                                                 PasswordHash((char *)tmpbuf, pAd->CommonCfg.Ssid, pAd->CommonCfg.SsidLen, keyMaterial);
1305                                                                 NdisMoveMemory(pAd->StaCfg.PMK, keyMaterial, 32);
1306
1307                                                         }
1308                                                         else if (strlen(tmpbuf) == 64)
1309                                                         {
1310                                                                 AtoH(tmpbuf, keyMaterial, 32);
1311                                                                 NdisMoveMemory(pAd->StaCfg.PMK, keyMaterial, 32);
1312                                                         }
1313                                                         else
1314                                                         {
1315                                                                 err = 1;
1316                                                                 DBGPRINT(RT_DEBUG_ERROR, ("%s::(WPAPSK key-string required 8 ~ 64 characters!)\n", __func__));
1317                                                         }
1318
1319                                                         if (err == 0)
1320                                                         {
1321                                                                 if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPAPSK) ||
1322                                                                         (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK))
1323                                                                 {
1324                                                                         // Start STA supplicant state machine
1325                                                                         pAd->StaCfg.WpaState = SS_START;
1326                                                                 }
1327                                                                 else if (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPANone)
1328                                                                 {
1329                                                                         pAd->StaCfg.WpaState = SS_NOTUSE;
1330                                                                 }
1331
1332                                                                 DBGPRINT(RT_DEBUG_TRACE, ("%s::(WPAPSK=%s)\n", __func__, tmpbuf));
1333                                                         }
1334                                                 }
1335                                         }
1336
1337                                         //DefaultKeyID, KeyType, KeyStr
1338                                         rtmp_read_key_parms_from_file(pAd, tmpbuf, buffer);
1339
1340                                         HTParametersHook(pAd, tmpbuf, buffer);
1341
1342                                         {
1343                                                 //PSMode
1344 #ifdef RT2860
1345                                                 if (RTMPGetKeyParameter("PSMode", tmpbuf, 32, buffer))
1346 #endif
1347 #ifdef RT2870
1348                                                 if (RTMPGetKeyParameter("PSMode", tmpbuf, 10, buffer))
1349 #endif
1350                                                 {
1351                                                         if (pAd->StaCfg.BssType == BSS_INFRA)
1352                                                         {
1353                                                                 if ((strcmp(tmpbuf, "MAX_PSP") == 0) || (strcmp(tmpbuf, "max_psp") == 0))
1354                                                                 {
1355                                                                         // do NOT turn on PSM bit here, wait until MlmeCheckForPsmChange()
1356                                                                         // to exclude certain situations.
1357                                                                         //         MlmeSetPsm(pAd, PWR_SAVE);
1358                                                                         OPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM);
1359                                                                         if (pAd->StaCfg.bWindowsACCAMEnable == FALSE)
1360                                                                                 pAd->StaCfg.WindowsPowerMode = Ndis802_11PowerModeMAX_PSP;
1361                                                                         pAd->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeMAX_PSP;
1362                                                                         pAd->StaCfg.DefaultListenCount = 5;
1363                                                                 }
1364                                                                 else if ((strcmp(tmpbuf, "Fast_PSP") == 0) || (strcmp(tmpbuf, "fast_psp") == 0)
1365                                                                         || (strcmp(tmpbuf, "FAST_PSP") == 0))
1366                                                                 {
1367                                                                         // do NOT turn on PSM bit here, wait until MlmeCheckForPsmChange()
1368                                                                         // to exclude certain situations.
1369                                                                         //         MlmeSetPsmBit(pAd, PWR_SAVE);
1370                                                                         OPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM);
1371                                                                         if (pAd->StaCfg.bWindowsACCAMEnable == FALSE)
1372                                                                                 pAd->StaCfg.WindowsPowerMode = Ndis802_11PowerModeFast_PSP;
1373                                                                         pAd->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeFast_PSP;
1374                                                                         pAd->StaCfg.DefaultListenCount = 3;
1375                                                                 }
1376                                                                 else if ((strcmp(tmpbuf, "Legacy_PSP") == 0) || (strcmp(tmpbuf, "legacy_psp") == 0)
1377                                                                         || (strcmp(tmpbuf, "LEGACY_PSP") == 0))
1378                                                                 {
1379                                                                         // do NOT turn on PSM bit here, wait until MlmeCheckForPsmChange()
1380                                                                         // to exclude certain situations.
1381                                                                         //         MlmeSetPsmBit(pAd, PWR_SAVE);
1382                                                                         OPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM);
1383                                                                         if (pAd->StaCfg.bWindowsACCAMEnable == FALSE)
1384                                                                                 pAd->StaCfg.WindowsPowerMode = Ndis802_11PowerModeLegacy_PSP;
1385                                                                         pAd->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeLegacy_PSP;
1386                                                                         pAd->StaCfg.DefaultListenCount = 3;
1387                                                                 }
1388                                                                 else
1389                                                                 { //Default Ndis802_11PowerModeCAM
1390                                                                         // clear PSM bit immediately
1391                                                                         MlmeSetPsmBit(pAd, PWR_ACTIVE);
1392                                                                         OPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM);
1393                                                                         if (pAd->StaCfg.bWindowsACCAMEnable == FALSE)
1394                                                                                 pAd->StaCfg.WindowsPowerMode = Ndis802_11PowerModeCAM;
1395                                                                         pAd->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeCAM;
1396                                                                 }
1397                                                                 DBGPRINT(RT_DEBUG_TRACE, ("PSMode=%ld\n", pAd->StaCfg.WindowsPowerMode));
1398                                                         }
1399                                                 }
1400                                                 // FastRoaming
1401                                                 if (RTMPGetKeyParameter("FastRoaming", tmpbuf, 32, buffer))
1402                                                 {
1403                                                         if (simple_strtol(tmpbuf, 0, 10) == 0)
1404                                                                 pAd->StaCfg.bFastRoaming = FALSE;
1405                                                         else
1406                                                                 pAd->StaCfg.bFastRoaming = TRUE;
1407
1408                                                         DBGPRINT(RT_DEBUG_TRACE, ("FastRoaming=%d\n", pAd->StaCfg.bFastRoaming));
1409                                                 }
1410                                                 // RoamThreshold
1411                                                 if (RTMPGetKeyParameter("RoamThreshold", tmpbuf, 32, buffer))
1412                                                 {
1413                                                         long lInfo = simple_strtol(tmpbuf, 0, 10);
1414
1415                                                         if (lInfo > 90 || lInfo < 60)
1416                                                                 pAd->StaCfg.dBmToRoam = -70;
1417                                                         else
1418                                                                 pAd->StaCfg.dBmToRoam = (CHAR)(-1)*lInfo;
1419
1420                                                         DBGPRINT(RT_DEBUG_TRACE, ("RoamThreshold=%d  dBm\n", pAd->StaCfg.dBmToRoam));
1421                                                 }
1422
1423                                                 if(RTMPGetKeyParameter("TGnWifiTest", tmpbuf, 10, buffer))
1424                                                 {
1425                                                         if(simple_strtol(tmpbuf, 0, 10) == 0)
1426                                                                 pAd->StaCfg.bTGnWifiTest = FALSE;
1427                                                         else
1428                                                                 pAd->StaCfg.bTGnWifiTest = TRUE;
1429                                                                 DBGPRINT(RT_DEBUG_TRACE, ("TGnWifiTest=%d\n", pAd->StaCfg.bTGnWifiTest));
1430                                                 }
1431                                         }
1432
1433 #ifdef RT30xx
1434                                                 {
1435                                                         if(RTMPGetKeyParameter("AntDiversity", tmpbuf, 10, buffer))
1436                                                         {
1437                                                                 for (i = 0, macptr = rstrtok(tmpbuf,";"); macptr; macptr = rstrtok(NULL,";"), i++)
1438                                                                 {
1439                                                                         if(simple_strtol(macptr, 0, 10) != 0)  //Enable
1440                                                                                 pAd->CommonCfg.bRxAntDiversity = TRUE;
1441                                                                         else //Disable
1442                                                                                 pAd->CommonCfg.bRxAntDiversity = FALSE;
1443
1444                                                                         DBGPRINT(RT_DEBUG_ERROR, ("AntDiversity=%d\n", pAd->CommonCfg.bRxAntDiversity));
1445                                                                 }
1446                                                         }
1447                                                 }
1448 #endif // RT30xx //
1449                                 }
1450                         }
1451                         else
1452                         {
1453                                 DBGPRINT(RT_DEBUG_TRACE, ("--> %s does not have a write method\n", src));
1454                         }
1455
1456                         retval=filp_close(srcf,NULL);
1457
1458                         if (retval)
1459                         {
1460                                 DBGPRINT(RT_DEBUG_TRACE, ("--> Error %d closing %s\n", -retval, src));
1461                         }
1462                 }
1463         }
1464
1465         set_fs(orgfs);
1466
1467         kfree(buffer);
1468         kfree(tmpbuf);
1469
1470         return (NDIS_STATUS_SUCCESS);
1471 }
1472
1473 static void     HTParametersHook(
1474         IN      PRTMP_ADAPTER pAd,
1475         IN      CHAR              *pValueStr,
1476         IN      CHAR              *pInput)
1477 {
1478
1479         INT Value;
1480
1481     if (RTMPGetKeyParameter("HT_PROTECT", pValueStr, 25, pInput))
1482     {
1483         Value = simple_strtol(pValueStr, 0, 10);
1484         if (Value == 0)
1485         {
1486             pAd->CommonCfg.bHTProtect = FALSE;
1487         }
1488         else
1489         {
1490             pAd->CommonCfg.bHTProtect = TRUE;
1491         }
1492         DBGPRINT(RT_DEBUG_TRACE, ("HT: Protection  = %s\n", (Value==0) ? "Disable" : "Enable"));
1493     }
1494
1495     if (RTMPGetKeyParameter("HT_MIMOPSEnable", pValueStr, 25, pInput))
1496     {
1497         Value = simple_strtol(pValueStr, 0, 10);
1498         if (Value == 0)
1499         {
1500             pAd->CommonCfg.bMIMOPSEnable = FALSE;
1501         }
1502         else
1503         {
1504             pAd->CommonCfg.bMIMOPSEnable = TRUE;
1505         }
1506         DBGPRINT(RT_DEBUG_TRACE, ("HT: MIMOPSEnable  = %s\n", (Value==0) ? "Disable" : "Enable"));
1507     }
1508
1509
1510     if (RTMPGetKeyParameter("HT_MIMOPSMode", pValueStr, 25, pInput))
1511     {
1512         Value = simple_strtol(pValueStr, 0, 10);
1513         if (Value > MMPS_ENABLE)
1514         {
1515                         pAd->CommonCfg.BACapability.field.MMPSmode = MMPS_ENABLE;
1516         }
1517         else
1518         {
1519             //TODO: add mimo power saving mechanism
1520             pAd->CommonCfg.BACapability.field.MMPSmode = MMPS_ENABLE;
1521                         //pAd->CommonCfg.BACapability.field.MMPSmode = Value;
1522         }
1523         DBGPRINT(RT_DEBUG_TRACE, ("HT: MIMOPS Mode  = %d\n", Value));
1524     }
1525
1526     if (RTMPGetKeyParameter("HT_BADecline", pValueStr, 25, pInput))
1527     {
1528         Value = simple_strtol(pValueStr, 0, 10);
1529         if (Value == 0)
1530         {
1531             pAd->CommonCfg.bBADecline = FALSE;
1532         }
1533         else
1534         {
1535             pAd->CommonCfg.bBADecline = TRUE;
1536         }
1537         DBGPRINT(RT_DEBUG_TRACE, ("HT: BA Decline  = %s\n", (Value==0) ? "Disable" : "Enable"));
1538     }
1539
1540
1541     if (RTMPGetKeyParameter("HT_DisableReordering", pValueStr, 25, pInput))
1542     {
1543         Value = simple_strtol(pValueStr, 0, 10);
1544         if (Value == 0)
1545         {
1546             pAd->CommonCfg.bDisableReordering = FALSE;
1547         }
1548         else
1549         {
1550             pAd->CommonCfg.bDisableReordering = TRUE;
1551         }
1552         DBGPRINT(RT_DEBUG_TRACE, ("HT: DisableReordering  = %s\n", (Value==0) ? "Disable" : "Enable"));
1553     }
1554
1555     if (RTMPGetKeyParameter("HT_AutoBA", pValueStr, 25, pInput))
1556     {
1557         Value = simple_strtol(pValueStr, 0, 10);
1558         if (Value == 0)
1559         {
1560             pAd->CommonCfg.BACapability.field.AutoBA = FALSE;
1561 #ifdef RT30xx
1562             pAd->CommonCfg.BACapability.field.Policy = BA_NOTUSE;
1563 #endif
1564         }
1565         else
1566         {
1567             pAd->CommonCfg.BACapability.field.AutoBA = TRUE;
1568 #ifdef RT30xx
1569             pAd->CommonCfg.BACapability.field.Policy = IMMED_BA;
1570 #endif
1571         }
1572         pAd->CommonCfg.REGBACapability.field.AutoBA = pAd->CommonCfg.BACapability.field.AutoBA;
1573 #ifdef RT30xx
1574         pAd->CommonCfg.REGBACapability.field.Policy = pAd->CommonCfg.BACapability.field.Policy;
1575 #endif
1576         DBGPRINT(RT_DEBUG_TRACE, ("HT: Auto BA  = %s\n", (Value==0) ? "Disable" : "Enable"));
1577     }
1578
1579         // Tx_+HTC frame
1580     if (RTMPGetKeyParameter("HT_HTC", pValueStr, 25, pInput))
1581         {
1582                 Value = simple_strtol(pValueStr, 0, 10);
1583                 if (Value == 0)
1584                 {
1585                         pAd->HTCEnable = FALSE;
1586                 }
1587                 else
1588                 {
1589                         pAd->HTCEnable = TRUE;
1590                 }
1591                 DBGPRINT(RT_DEBUG_TRACE, ("HT: Tx +HTC frame = %s\n", (Value==0) ? "Disable" : "Enable"));
1592         }
1593
1594         // Enable HT Link Adaptation Control
1595         if (RTMPGetKeyParameter("HT_LinkAdapt", pValueStr, 25, pInput))
1596         {
1597                 Value = simple_strtol(pValueStr, 0, 10);
1598                 if (Value == 0)
1599                 {
1600                         pAd->bLinkAdapt = FALSE;
1601                 }
1602                 else
1603                 {
1604                         pAd->HTCEnable = TRUE;
1605                         pAd->bLinkAdapt = TRUE;
1606                 }
1607                 DBGPRINT(RT_DEBUG_TRACE, ("HT: Link Adaptation Control = %s\n", (Value==0) ? "Disable" : "Enable(+HTC)"));
1608         }
1609
1610         // Reverse Direction Mechanism
1611     if (RTMPGetKeyParameter("HT_RDG", pValueStr, 25, pInput))
1612         {
1613                 Value = simple_strtol(pValueStr, 0, 10);
1614                 if (Value == 0)
1615                 {
1616                         pAd->CommonCfg.bRdg = FALSE;
1617                 }
1618                 else
1619                 {
1620                         pAd->HTCEnable = TRUE;
1621             pAd->CommonCfg.bRdg = TRUE;
1622                 }
1623                 DBGPRINT(RT_DEBUG_TRACE, ("HT: RDG = %s\n", (Value==0) ? "Disable" : "Enable(+HTC)"));
1624         }
1625
1626
1627
1628
1629         // Tx A-MSUD ?
1630     if (RTMPGetKeyParameter("HT_AMSDU", pValueStr, 25, pInput))
1631         {
1632                 Value = simple_strtol(pValueStr, 0, 10);
1633                 if (Value == 0)
1634                 {
1635                         pAd->CommonCfg.BACapability.field.AmsduEnable = FALSE;
1636                 }
1637                 else
1638                 {
1639             pAd->CommonCfg.BACapability.field.AmsduEnable = TRUE;
1640                 }
1641                 DBGPRINT(RT_DEBUG_TRACE, ("HT: Tx A-MSDU = %s\n", (Value==0) ? "Disable" : "Enable"));
1642         }
1643
1644         // MPDU Density
1645     if (RTMPGetKeyParameter("HT_MpduDensity", pValueStr, 25, pInput))
1646         {
1647                 Value = simple_strtol(pValueStr, 0, 10);
1648                 if (Value <=7 && Value >= 0)
1649                 {
1650                         pAd->CommonCfg.BACapability.field.MpduDensity = Value;
1651                         DBGPRINT(RT_DEBUG_TRACE, ("HT: MPDU Density = %d\n", Value));
1652                 }
1653                 else
1654                 {
1655                         pAd->CommonCfg.BACapability.field.MpduDensity = 4;
1656                         DBGPRINT(RT_DEBUG_TRACE, ("HT: MPDU Density = %d (Default)\n", 4));
1657                 }
1658         }
1659
1660         // Max Rx BA Window Size
1661     if (RTMPGetKeyParameter("HT_BAWinSize", pValueStr, 25, pInput))
1662         {
1663                 Value = simple_strtol(pValueStr, 0, 10);
1664
1665                 if (Value >=1 && Value <= 64)
1666                 {
1667                         pAd->CommonCfg.REGBACapability.field.RxBAWinLimit = Value;
1668                         pAd->CommonCfg.BACapability.field.RxBAWinLimit = Value;
1669                         DBGPRINT(RT_DEBUG_TRACE, ("HT: BA Windw Size = %d\n", Value));
1670                 }
1671                 else
1672                 {
1673             pAd->CommonCfg.REGBACapability.field.RxBAWinLimit = 64;
1674                         pAd->CommonCfg.BACapability.field.RxBAWinLimit = 64;
1675                         DBGPRINT(RT_DEBUG_TRACE, ("HT: BA Windw Size = 64 (Defualt)\n"));
1676                 }
1677
1678         }
1679
1680         // Guard Interval
1681         if (RTMPGetKeyParameter("HT_GI", pValueStr, 25, pInput))
1682         {
1683                 Value = simple_strtol(pValueStr, 0, 10);
1684
1685                 if (Value == GI_400)
1686                 {
1687                         pAd->CommonCfg.RegTransmitSetting.field.ShortGI = GI_400;
1688                 }
1689                 else
1690                 {
1691                         pAd->CommonCfg.RegTransmitSetting.field.ShortGI = GI_800;
1692                 }
1693
1694                 DBGPRINT(RT_DEBUG_TRACE, ("HT: Guard Interval = %s\n", (Value==GI_400) ? "400" : "800" ));
1695         }
1696
1697         // HT Operation Mode : Mixed Mode , Green Field
1698         if (RTMPGetKeyParameter("HT_OpMode", pValueStr, 25, pInput))
1699         {
1700                 Value = simple_strtol(pValueStr, 0, 10);
1701
1702                 if (Value == HTMODE_GF)
1703                 {
1704
1705                         pAd->CommonCfg.RegTransmitSetting.field.HTMODE  = HTMODE_GF;
1706                 }
1707                 else
1708                 {
1709                         pAd->CommonCfg.RegTransmitSetting.field.HTMODE  = HTMODE_MM;
1710                 }
1711
1712                 DBGPRINT(RT_DEBUG_TRACE, ("HT: Operate Mode = %s\n", (Value==HTMODE_GF) ? "Green Field" : "Mixed Mode" ));
1713         }
1714
1715         // Fixed Tx mode : CCK, OFDM
1716         if (RTMPGetKeyParameter("FixedTxMode", pValueStr, 25, pInput))
1717         {
1718                 UCHAR   fix_tx_mode;
1719
1720                 {
1721                         fix_tx_mode = FIXED_TXMODE_HT;
1722
1723                         if (strcmp(pValueStr, "OFDM") == 0 || strcmp(pValueStr, "ofdm") == 0)
1724                         {
1725                                 fix_tx_mode = FIXED_TXMODE_OFDM;
1726                         }
1727                         else if (strcmp(pValueStr, "CCK") == 0 || strcmp(pValueStr, "cck") == 0)
1728                         {
1729                         fix_tx_mode = FIXED_TXMODE_CCK;
1730                         }
1731                         else if (strcmp(pValueStr, "HT") == 0 || strcmp(pValueStr, "ht") == 0)
1732                         {
1733                         fix_tx_mode = FIXED_TXMODE_HT;
1734                 }
1735                 else
1736                 {
1737                                 Value = simple_strtol(pValueStr, 0, 10);
1738                                 // 1 : CCK
1739                                 // 2 : OFDM
1740                                 // otherwise : HT
1741                                 if (Value == FIXED_TXMODE_CCK || Value == FIXED_TXMODE_OFDM)
1742                                         fix_tx_mode = Value;
1743                                 else
1744                                         fix_tx_mode = FIXED_TXMODE_HT;
1745                 }
1746
1747                         pAd->StaCfg.DesiredTransmitSetting.field.FixedTxMode = fix_tx_mode;
1748                         DBGPRINT(RT_DEBUG_TRACE, ("Fixed Tx Mode = %d\n", fix_tx_mode));
1749
1750                 }
1751         }
1752
1753
1754         // Channel Width
1755         if (RTMPGetKeyParameter("HT_BW", pValueStr, 25, pInput))
1756         {
1757                 Value = simple_strtol(pValueStr, 0, 10);
1758
1759                 if (Value == BW_40)
1760                 {
1761                         pAd->CommonCfg.RegTransmitSetting.field.BW  = BW_40;
1762                 }
1763                 else
1764                 {
1765             pAd->CommonCfg.RegTransmitSetting.field.BW  = BW_20;
1766                 }
1767
1768 #ifdef MCAST_RATE_SPECIFIC
1769                 pAd->CommonCfg.MCastPhyMode.field.BW = pAd->CommonCfg.RegTransmitSetting.field.BW;
1770 #endif // MCAST_RATE_SPECIFIC //
1771
1772                 DBGPRINT(RT_DEBUG_TRACE, ("HT: Channel Width = %s\n", (Value==BW_40) ? "40 MHz" : "20 MHz" ));
1773         }
1774
1775         if (RTMPGetKeyParameter("HT_EXTCHA", pValueStr, 25, pInput))
1776         {
1777                 Value = simple_strtol(pValueStr, 0, 10);
1778
1779                 if (Value == 0)
1780                 {
1781
1782                         pAd->CommonCfg.RegTransmitSetting.field.EXTCHA  = EXTCHA_BELOW;
1783                 }
1784                 else
1785                 {
1786             pAd->CommonCfg.RegTransmitSetting.field.EXTCHA = EXTCHA_ABOVE;
1787                 }
1788
1789                 DBGPRINT(RT_DEBUG_TRACE, ("HT: Ext Channel = %s\n", (Value==0) ? "BELOW" : "ABOVE" ));
1790         }
1791
1792         // MSC
1793         if (RTMPGetKeyParameter("HT_MCS", pValueStr, 50, pInput))
1794         {
1795                 {
1796                         Value = simple_strtol(pValueStr, 0, 10);
1797
1798                         if ((Value >= 0 && Value <= 23) || (Value == 32)) // 3*3
1799                 {
1800                                 pAd->StaCfg.DesiredTransmitSetting.field.MCS  = Value;
1801                                 pAd->StaCfg.bAutoTxRateSwitch = FALSE;
1802                                 DBGPRINT(RT_DEBUG_TRACE, ("HT: MCS = %d\n", pAd->StaCfg.DesiredTransmitSetting.field.MCS));
1803                 }
1804                 else
1805                 {
1806                                 pAd->StaCfg.DesiredTransmitSetting.field.MCS  = MCS_AUTO;
1807                                 pAd->StaCfg.bAutoTxRateSwitch = TRUE;
1808                                 DBGPRINT(RT_DEBUG_TRACE, ("HT: MCS = AUTO\n"));
1809                 }
1810         }
1811         }
1812
1813         // STBC
1814     if (RTMPGetKeyParameter("HT_STBC", pValueStr, 25, pInput))
1815         {
1816                 Value = simple_strtol(pValueStr, 0, 10);
1817                 if (Value == STBC_USE)
1818                 {
1819                         pAd->CommonCfg.RegTransmitSetting.field.STBC = STBC_USE;
1820                 }
1821                 else
1822                 {
1823                         pAd->CommonCfg.RegTransmitSetting.field.STBC = STBC_NONE;
1824                 }
1825                 DBGPRINT(RT_DEBUG_TRACE, ("HT: STBC = %d\n", pAd->CommonCfg.RegTransmitSetting.field.STBC));
1826         }
1827
1828         // 40_Mhz_Intolerant
1829         if (RTMPGetKeyParameter("HT_40MHZ_INTOLERANT", pValueStr, 25, pInput))
1830         {
1831                 Value = simple_strtol(pValueStr, 0, 10);
1832                 if (Value == 0)
1833                 {
1834                         pAd->CommonCfg.bForty_Mhz_Intolerant = FALSE;
1835                 }
1836                 else
1837                 {
1838                         pAd->CommonCfg.bForty_Mhz_Intolerant = TRUE;
1839                 }
1840                 DBGPRINT(RT_DEBUG_TRACE, ("HT: 40MHZ INTOLERANT = %d\n", pAd->CommonCfg.bForty_Mhz_Intolerant));
1841         }
1842         //HT_TxStream
1843         if(RTMPGetKeyParameter("HT_TxStream", pValueStr, 10, pInput))
1844         {
1845                 switch (simple_strtol(pValueStr, 0, 10))
1846                 {
1847                         case 1:
1848                                 pAd->CommonCfg.TxStream = 1;
1849                                 break;
1850                         case 2:
1851                                 pAd->CommonCfg.TxStream = 2;
1852                                 break;
1853                         case 3: // 3*3
1854                         default:
1855                                 pAd->CommonCfg.TxStream = 3;
1856
1857                                 if (pAd->MACVersion < RALINK_2883_VERSION)
1858                                         pAd->CommonCfg.TxStream = 2; // only 2 tx streams for RT2860 series
1859                                 break;
1860                 }
1861                 DBGPRINT(RT_DEBUG_TRACE, ("HT: Tx Stream = %d\n", pAd->CommonCfg.TxStream));
1862         }
1863         //HT_RxStream
1864         if(RTMPGetKeyParameter("HT_RxStream", pValueStr, 10, pInput))
1865         {
1866                 switch (simple_strtol(pValueStr, 0, 10))
1867                 {
1868                         case 1:
1869                                 pAd->CommonCfg.RxStream = 1;
1870                                 break;
1871                         case 2:
1872                                 pAd->CommonCfg.RxStream = 2;
1873                                 break;
1874                         case 3:
1875                         default:
1876                                 pAd->CommonCfg.RxStream = 3;
1877
1878                                 if (pAd->MACVersion < RALINK_2883_VERSION)
1879                                         pAd->CommonCfg.RxStream = 2; // only 2 rx streams for RT2860 series
1880                                 break;
1881                 }
1882                 DBGPRINT(RT_DEBUG_TRACE, ("HT: Rx Stream = %d\n", pAd->CommonCfg.RxStream));
1883         }
1884
1885 }