2 *************************************************************************
4 * 5F., No.36, Taiyuan St., Jhubei City,
8 * (c) Copyright 2002-2007, Ralink Technology, Inc.
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. *
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. *
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. *
25 *************************************************************************
28 #include "rt_config.h"
30 #ifdef DOT11_N_SUPPORT
31 static void HTParametersHook(
35 #endif // DOT11_N_SUPPORT //
37 #define ETH_MAC_ADDR_STR_LEN 17 // in format of xx:xx:xx:xx:xx:xx
39 // We assume the s1 is a sting, s2 is a memory space with 6 bytes. and content of s1 will be changed.
40 BOOLEAN rtstrmactohex(char *s1, char *s2)
43 char *ptokS = s1, *ptokE = s1;
45 if (strlen(s1) != ETH_MAC_ADDR_STR_LEN)
48 while((*ptokS) != '\0')
50 if((ptokE = strchr(ptokS, ':')) != NULL)
52 if ((strlen(ptokS) != 2) || (!isxdigit(*ptokS)) || (!isxdigit(*(ptokS+1))))
54 AtoH(ptokS, &s2[i++], 1);
57 break; // parsing finished
60 return ( i == 6 ? TRUE : FALSE);
65 // we assume the s1 and s2 both are strings.
66 BOOLEAN rtstrcasecmp(char *s1, char *s2)
68 char *p1 = s1, *p2 = s2;
70 if (strlen(s1) != strlen(s2))
75 if((*p1 != *p2) && ((*p1 ^ *p2) != 0x20))
84 // we assume the s1 (buffer) and s2 (key) both are strings.
85 char * rtstrstruncasecmp(char * s1, char * s2)
105 if (('a' <= temp1) && (temp1 <= 'z'))
106 temp1 = 'A'+(temp1-'a');
107 if (('a' <= temp2) && (temp2 <= 'z'))
108 temp2 = 'A'+(temp2-'a');
120 return NULL; // not found
126 * strstr - Find the first substring in a %NUL terminated string
127 * @s1: The string to be searched
128 * @s2: The string to search for
130 char * rtstrstr(const char * s1,const char * s2)
143 if (!memcmp(s1,s2,l2))
152 * rstrtok - Split a string into tokens
153 * @s: The string to be searched
154 * @ct: The characters to search for
155 * * WARNING: strtok is deprecated, use strsep instead. However strsep is not compatible with old architecture.
158 char * rstrtok(char * s,const char * ct)
162 sbegin = s ? s : __rstrtok;
168 sbegin += strspn(sbegin,ct);
175 send = strpbrk( sbegin, ct);
176 if (send && *send != '\0')
185 * delimitcnt - return the count of a given delimiter in a given string.
186 * @s: The string to be searched.
187 * @ct: The delimiter to search for.
188 * Notice : We suppose the delimiter is a single-char string(for example : ";").
190 INT delimitcnt(char * s,const char * ct)
193 /* point to the beginning of the line */
194 const char *token = s;
198 token = strpbrk(token, ct); /* search for delimiters */
202 /* advanced to the terminating null character */
205 /* skip the delimiter */
209 * Print the found text: use len with %.*s to specify field width.
212 /* accumulate delimiter count */
219 * converts the Internet host address from the standard numbers-and-dots notation
221 * returns nonzero if the address is valid, zero if not.
223 int rtinet_aton(const char *cp, unsigned int *addr)
228 unsigned int parts[4];
229 unsigned int *pp = parts;
234 * Collect number up to ``.''.
235 * Values are specified as for C:
236 * 0x=hex, 0=octal, other=decimal.
242 if (*++cp == 'x' || *cp == 'X')
247 while ((c = *cp) != '\0')
249 if (isdigit((unsigned char) c))
251 val = (val * base) + (c - '0');
255 if (base == 16 && isxdigit((unsigned char) c))
258 (c + 10 - (islower((unsigned char) c) ? 'a' : 'A'));
267 * Internet format: a.b.c.d a.b.c (with c treated as 16-bits)
268 * a.b (with b treated as 24 bits)
270 if (pp >= parts + 3 || val > 0xff)
279 * Check for trailing junk.
282 if (!isspace((unsigned char) *cp++))
286 * Concoct the address according to the number of parts specified.
292 case 1: /* a -- 32 bits */
295 case 2: /* a.b -- 8.24 bits */
298 val |= parts[0] << 24;
301 case 3: /* a.b.c -- 8.8.16 bits */
304 val |= (parts[0] << 24) | (parts[1] << 16);
307 case 4: /* a.b.c.d -- 8.8.8.8 bits */
310 val |= (parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8);
320 ========================================================================
323 Find key section for Get key parameter.
326 buffer Pointer to the buffer to start find the key section
327 section the key of the secion to be find
332 ========================================================================
334 PUCHAR RTMPFindSection(
340 strcpy(temp_buf, "Default");
342 if((ptr = rtstrstr(buffer, temp_buf)) != NULL)
343 return (ptr+strlen("\n"));
349 ========================================================================
355 key Pointer to key string
356 dest Pointer to destination
357 destsize The datasize of the destination
358 buffer Pointer to the buffer to start find the key
365 This routine get the value with the matched key (case case-sensitive)
366 ========================================================================
368 INT RTMPGetKeyParameter(
374 UCHAR *temp_buf1 = NULL;
375 UCHAR *temp_buf2 = NULL;
382 //temp_buf1 = kmalloc(MAX_PARAM_BUFFER_SIZE, MEM_ALLOC_FLAG);
383 os_alloc_mem(NULL, &temp_buf1, MAX_PARAM_BUFFER_SIZE);
385 if(temp_buf1 == NULL)
388 //temp_buf2 = kmalloc(MAX_PARAM_BUFFER_SIZE, MEM_ALLOC_FLAG);
389 os_alloc_mem(NULL, &temp_buf2, MAX_PARAM_BUFFER_SIZE);
390 if(temp_buf2 == NULL)
392 os_free_mem(NULL, temp_buf1);
397 if((offset = RTMPFindSection(buffer)) == NULL)
399 os_free_mem(NULL, temp_buf1);
400 os_free_mem(NULL, temp_buf2);
404 strcpy(temp_buf1, "\n");
405 strcat(temp_buf1, key);
406 strcat(temp_buf1, "=");
409 if((start_ptr=rtstrstr(offset, temp_buf1))==NULL)
411 os_free_mem(NULL, temp_buf1);
412 os_free_mem(NULL, temp_buf2);
416 start_ptr+=strlen("\n");
417 if((end_ptr=rtstrstr(start_ptr, "\n"))==NULL)
418 end_ptr=start_ptr+strlen(start_ptr);
420 if (end_ptr<start_ptr)
422 os_free_mem(NULL, temp_buf1);
423 os_free_mem(NULL, temp_buf2);
427 NdisMoveMemory(temp_buf2, start_ptr, end_ptr-start_ptr);
428 temp_buf2[end_ptr-start_ptr]='\0';
429 len = strlen(temp_buf2);
430 strcpy(temp_buf1, temp_buf2);
431 if((start_ptr=rtstrstr(temp_buf1, "=")) == NULL)
433 os_free_mem(NULL, temp_buf1);
434 os_free_mem(NULL, temp_buf2);
438 strcpy(temp_buf2, start_ptr+1);
443 if( (*ptr == ' ') || (*ptr == '\t') )
450 memset(dest, 0x00, destsize);
451 strncpy(dest, ptr, len >= destsize ? destsize: len);
453 os_free_mem(NULL, temp_buf1);
454 os_free_mem(NULL, temp_buf2);
459 ========================================================================
465 key Pointer to key string
466 dest Pointer to destination
467 destsize The datasize of the destination
468 buffer Pointer to the buffer to start find the key
475 This routine get the value with the matched key (case case-sensitive).
476 It is called for parsing SSID and any key string.
477 ========================================================================
479 INT RTMPGetCriticalParameter(
485 UCHAR *temp_buf1 = NULL;
486 UCHAR *temp_buf2 = NULL;
493 //temp_buf1 = kmalloc(MAX_PARAM_BUFFER_SIZE, MEM_ALLOC_FLAG);
494 os_alloc_mem(NULL, &temp_buf1, MAX_PARAM_BUFFER_SIZE);
496 if(temp_buf1 == NULL)
499 //temp_buf2 = kmalloc(MAX_PARAM_BUFFER_SIZE, MEM_ALLOC_FLAG);
500 os_alloc_mem(NULL, &temp_buf2, MAX_PARAM_BUFFER_SIZE);
501 if(temp_buf2 == NULL)
503 os_free_mem(NULL, temp_buf1);
508 if((offset = RTMPFindSection(buffer)) == NULL)
510 os_free_mem(NULL, temp_buf1);
511 os_free_mem(NULL, temp_buf2);
515 strcpy(temp_buf1, "\n");
516 strcat(temp_buf1, key);
517 strcat(temp_buf1, "=");
520 if((start_ptr=rtstrstr(offset, temp_buf1))==NULL)
522 os_free_mem(NULL, temp_buf1);
523 os_free_mem(NULL, temp_buf2);
527 start_ptr+=strlen("\n");
528 if((end_ptr=rtstrstr(start_ptr, "\n"))==NULL)
529 end_ptr=start_ptr+strlen(start_ptr);
531 if (end_ptr<start_ptr)
533 os_free_mem(NULL, temp_buf1);
534 os_free_mem(NULL, temp_buf2);
538 NdisMoveMemory(temp_buf2, start_ptr, end_ptr-start_ptr);
539 temp_buf2[end_ptr-start_ptr]='\0';
540 len = strlen(temp_buf2);
541 strcpy(temp_buf1, temp_buf2);
542 if((start_ptr=rtstrstr(temp_buf1, "=")) == NULL)
544 os_free_mem(NULL, temp_buf1);
545 os_free_mem(NULL, temp_buf2);
549 strcpy(temp_buf2, start_ptr+1);
553 /* We cannot trim space(' ') for SSID and key string. */
556 //if( (*ptr == ' ') || (*ptr == '\t') )
564 memset(dest, 0x00, destsize);
565 strncpy(dest, ptr, len >= destsize ? destsize: len);
567 os_free_mem(NULL, temp_buf1);
568 os_free_mem(NULL, temp_buf2);
573 ========================================================================
576 Get multiple key parameter.
579 key Pointer to key string
580 dest Pointer to destination
581 destsize The datasize of the destination
582 buffer Pointer to the buffer to start find the key
589 This routine get the value with the matched key (case case-sensitive)
590 ========================================================================
592 INT RTMPGetKeyParameterWithOffset(
595 OUT USHORT *end_offset,
598 IN BOOLEAN bTrimSpace)
600 UCHAR *temp_buf1 = NULL;
601 UCHAR *temp_buf2 = NULL;
608 if (*end_offset >= MAX_INI_BUFFER_SIZE)
611 os_alloc_mem(NULL, &temp_buf1, MAX_PARAM_BUFFER_SIZE);
613 if(temp_buf1 == NULL)
616 os_alloc_mem(NULL, &temp_buf2, MAX_PARAM_BUFFER_SIZE);
617 if(temp_buf2 == NULL)
619 os_free_mem(NULL, temp_buf1);
626 if ((offset = RTMPFindSection(buffer)) == NULL)
628 os_free_mem(NULL, temp_buf1);
629 os_free_mem(NULL, temp_buf2);
634 offset = buffer + (*end_offset);
636 strcpy(temp_buf1, "\n");
637 strcat(temp_buf1, key);
638 strcat(temp_buf1, "=");
641 if((start_ptr=rtstrstr(offset, temp_buf1))==NULL)
643 os_free_mem(NULL, temp_buf1);
644 os_free_mem(NULL, temp_buf2);
648 start_ptr+=strlen("\n");
649 if((end_ptr=rtstrstr(start_ptr, "\n"))==NULL)
650 end_ptr=start_ptr+strlen(start_ptr);
652 if (end_ptr<start_ptr)
654 os_free_mem(NULL, temp_buf1);
655 os_free_mem(NULL, temp_buf2);
659 *end_offset = end_ptr - buffer;
661 NdisMoveMemory(temp_buf2, start_ptr, end_ptr-start_ptr);
662 temp_buf2[end_ptr-start_ptr]='\0';
663 len = strlen(temp_buf2);
664 strcpy(temp_buf1, temp_buf2);
665 if((start_ptr=rtstrstr(temp_buf1, "=")) == NULL)
667 os_free_mem(NULL, temp_buf1);
668 os_free_mem(NULL, temp_buf2);
672 strcpy(temp_buf2, start_ptr+1);
677 if((bTrimSpace && (*ptr == ' ')) || (*ptr == '\t') )
684 memset(dest, 0x00, destsize);
685 strncpy(dest, ptr, len >= destsize ? destsize: len);
687 os_free_mem(NULL, temp_buf1);
688 os_free_mem(NULL, temp_buf2);
693 static int rtmp_parse_key_buffer_from_file(IN PRTMP_ADAPTER pAd,IN char *buffer,IN ULONG KeyType,IN INT BSSIdx,IN INT KeyIdx)
696 INT i = BSSIdx, idx = KeyIdx;
698 UCHAR CipherAlg = CIPHER_WEP64;
701 KeyLen = strlen(keybuff);
705 if( (KeyLen == 5) || (KeyLen == 13))
707 pAd->SharedKey[i][idx].KeyLen = KeyLen;
708 NdisMoveMemory(pAd->SharedKey[i][idx].Key, keybuff, KeyLen);
710 CipherAlg = CIPHER_WEP64;
712 CipherAlg = CIPHER_WEP128;
713 pAd->SharedKey[i][idx].CipherAlg = CipherAlg;
715 DBGPRINT(RT_DEBUG_TRACE, ("I/F(ra%d) Key%dStr=%s and type=%s\n", i, idx+1, keybuff, (KeyType == 0) ? "Hex":"Ascii"));
719 {//Invalid key length
720 DBGPRINT(RT_DEBUG_ERROR, ("Key%dStr is Invalid key length! KeyLen = %ld!\n", idx+1, KeyLen));
726 if( (KeyLen == 10) || (KeyLen == 26))
728 pAd->SharedKey[i][idx].KeyLen = KeyLen / 2;
729 AtoH(keybuff, pAd->SharedKey[i][idx].Key, KeyLen / 2);
731 CipherAlg = CIPHER_WEP64;
733 CipherAlg = CIPHER_WEP128;
734 pAd->SharedKey[i][idx].CipherAlg = CipherAlg;
736 DBGPRINT(RT_DEBUG_TRACE, ("I/F(ra%d) Key%dStr=%s and type=%s\n", i, idx+1, keybuff, (KeyType == 0) ? "Hex":"Ascii"));
740 {//Invalid key length
741 DBGPRINT(RT_DEBUG_ERROR, ("I/F(ra%d) Key%dStr is Invalid key length! KeyLen = %ld!\n", i, idx+1, KeyLen));
746 static void rtmp_read_key_parms_from_file(IN PRTMP_ADAPTER pAd, char *tmpbuf, char *buffer)
751 ULONG KeyType[MAX_MBSSID_NUM];
754 NdisZeroMemory(KeyType, MAX_MBSSID_NUM);
757 if(RTMPGetKeyParameter("DefaultKeyID", tmpbuf, 25, buffer))
759 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
761 KeyIdx = simple_strtol(tmpbuf, 0, 10);
762 if((KeyIdx >= 1 ) && (KeyIdx <= 4))
763 pAd->StaCfg.DefaultKeyId = (UCHAR) (KeyIdx - 1);
765 pAd->StaCfg.DefaultKeyId = 0;
767 DBGPRINT(RT_DEBUG_TRACE, ("DefaultKeyID(0~3)=%d\n", pAd->StaCfg.DefaultKeyId));
772 for (idx = 0; idx < 4; idx++)
774 sprintf(tok_str, "Key%dType", idx + 1);
776 if (RTMPGetKeyParameter(tok_str, tmpbuf, 128, buffer))
778 for (i = 0, macptr = rstrtok(tmpbuf,";"); macptr; macptr = rstrtok(NULL,";"), i++)
780 KeyType[i] = simple_strtol(macptr, 0, 10);
783 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
785 sprintf(tok_str, "Key%dStr", idx + 1);
786 if (RTMPGetCriticalParameter(tok_str, tmpbuf, 128, buffer))
788 rtmp_parse_key_buffer_from_file(pAd, tmpbuf, KeyType[BSS0], BSS0, idx);
795 static void rtmp_read_sta_wmm_parms_from_file(IN PRTMP_ADAPTER pAd, char *tmpbuf, char *buffer)
799 BOOLEAN bWmmEnable = FALSE;
802 if(RTMPGetKeyParameter("WmmCapable", tmpbuf, 32, buffer))
804 if(simple_strtol(tmpbuf, 0, 10) != 0) //Enable
806 pAd->CommonCfg.bWmmCapable = TRUE;
811 pAd->CommonCfg.bWmmCapable = FALSE;
814 DBGPRINT(RT_DEBUG_TRACE, ("WmmCapable=%d\n", pAd->CommonCfg.bWmmCapable));
817 //AckPolicy for AC_BK, AC_BE, AC_VI, AC_VO
818 if(RTMPGetKeyParameter("AckPolicy", tmpbuf, 32, buffer))
820 for (i = 0, macptr = rstrtok(tmpbuf,";"); macptr; macptr = rstrtok(NULL,";"), i++)
822 pAd->CommonCfg.AckPolicy[i] = (UCHAR)simple_strtol(macptr, 0, 10);
824 DBGPRINT(RT_DEBUG_TRACE, ("AckPolicy[%d]=%d\n", i, pAd->CommonCfg.AckPolicy[i]));
831 if(RTMPGetKeyParameter("APSDCapable", tmpbuf, 10, buffer))
833 if(simple_strtol(tmpbuf, 0, 10) != 0) //Enable
834 pAd->CommonCfg.bAPSDCapable = TRUE;
836 pAd->CommonCfg.bAPSDCapable = FALSE;
838 DBGPRINT(RT_DEBUG_TRACE, ("APSDCapable=%d\n", pAd->CommonCfg.bAPSDCapable));
841 //APSDAC for AC_BE, AC_BK, AC_VI, AC_VO
842 if(RTMPGetKeyParameter("APSDAC", tmpbuf, 32, buffer))
846 for (i = 0, macptr = rstrtok(tmpbuf,";"); macptr; macptr = rstrtok(NULL,";"), i++)
848 apsd_ac[i] = (BOOLEAN)simple_strtol(macptr, 0, 10);
850 DBGPRINT(RT_DEBUG_TRACE, ("APSDAC%d %d\n", i, apsd_ac[i]));
853 pAd->CommonCfg.bAPSDAC_BE = apsd_ac[0];
854 pAd->CommonCfg.bAPSDAC_BK = apsd_ac[1];
855 pAd->CommonCfg.bAPSDAC_VI = apsd_ac[2];
856 pAd->CommonCfg.bAPSDAC_VO = apsd_ac[3];
862 NDIS_STATUS RTMPReadParametersHook(
863 IN PRTMP_ADAPTER pAd)
867 INT retval, orgfsuid, orgfsgid;
873 UCHAR keyMaterial[40];
878 buffer = kmalloc(MAX_INI_BUFFER_SIZE, MEM_ALLOC_FLAG);
880 return NDIS_STATUS_FAILURE;
882 tmpbuf = kmalloc(MAX_PARAM_BUFFER_SIZE, MEM_ALLOC_FLAG);
886 return NDIS_STATUS_FAILURE;
889 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
890 src = STA_PROFILE_PATH;
892 // Save uid and gid used for filesystem access.
893 // Set user and group to 0 (root)
894 orgfsuid = current_fsuid();
895 orgfsgid = current_fsgid();
896 /* Hm, can't really do this nicely anymore, so rely on these files
897 * being set to the proper permission to read them... */
898 /* current->cred->fsuid = current->cred->fsgid = 0; */
904 srcf = filp_open(src, O_RDONLY, 0);
907 DBGPRINT(RT_DEBUG_ERROR, ("--> Error %ld opening %s\n", -PTR_ERR(srcf),src));
911 // The object must have a read method
912 if (srcf->f_op && srcf->f_op->read)
914 memset(buffer, 0x00, MAX_INI_BUFFER_SIZE);
915 retval=srcf->f_op->read(srcf, buffer, MAX_INI_BUFFER_SIZE, &srcf->f_pos);
918 DBGPRINT(RT_DEBUG_TRACE, ("--> Read %s error %d\n", src, -retval));
922 // set file parameter to portcfg
924 if(RTMPGetKeyParameter("CountryRegion", tmpbuf, 25, buffer))
926 pAd->CommonCfg.CountryRegion = (UCHAR) simple_strtol(tmpbuf, 0, 10);
927 DBGPRINT(RT_DEBUG_TRACE, ("CountryRegion=%d\n", pAd->CommonCfg.CountryRegion));
930 if(RTMPGetKeyParameter("CountryRegionABand", tmpbuf, 25, buffer))
932 pAd->CommonCfg.CountryRegionForABand= (UCHAR) simple_strtol(tmpbuf, 0, 10);
933 DBGPRINT(RT_DEBUG_TRACE, ("CountryRegionABand=%d\n", pAd->CommonCfg.CountryRegionForABand));
936 if(RTMPGetKeyParameter("CountryCode", tmpbuf, 25, buffer))
938 NdisMoveMemory(pAd->CommonCfg.CountryCode, tmpbuf , 2);
940 if (strlen(pAd->CommonCfg.CountryCode) != 0)
942 pAd->CommonCfg.bCountryFlag = TRUE;
944 DBGPRINT(RT_DEBUG_TRACE, ("CountryCode=%s\n", pAd->CommonCfg.CountryCode));
947 if(RTMPGetKeyParameter("ChannelGeography", tmpbuf, 25, buffer))
949 UCHAR Geography = (UCHAR) simple_strtol(tmpbuf, 0, 10);
950 if (Geography <= BOTH)
952 pAd->CommonCfg.Geography = Geography;
953 pAd->CommonCfg.CountryCode[2] =
954 (pAd->CommonCfg.Geography == BOTH) ? ' ' : ((pAd->CommonCfg.Geography == IDOR) ? 'I' : 'O');
955 DBGPRINT(RT_DEBUG_TRACE, ("ChannelGeography=%d\n", pAd->CommonCfg.Geography));
960 pAd->CommonCfg.Geography = BOTH;
961 pAd->CommonCfg.CountryCode[2] = ' ';
964 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
967 if (RTMPGetCriticalParameter("SSID", tmpbuf, 256, buffer))
969 if (strlen(tmpbuf) <= 32)
971 pAd->CommonCfg.SsidLen = (UCHAR) strlen(tmpbuf);
972 NdisZeroMemory(pAd->CommonCfg.Ssid, NDIS_802_11_LENGTH_SSID);
973 NdisMoveMemory(pAd->CommonCfg.Ssid, tmpbuf, pAd->CommonCfg.SsidLen);
974 pAd->MlmeAux.AutoReconnectSsidLen = pAd->CommonCfg.SsidLen;
975 NdisZeroMemory(pAd->MlmeAux.AutoReconnectSsid, NDIS_802_11_LENGTH_SSID);
976 NdisMoveMemory(pAd->MlmeAux.AutoReconnectSsid, tmpbuf, pAd->MlmeAux.AutoReconnectSsidLen);
977 pAd->MlmeAux.SsidLen = pAd->CommonCfg.SsidLen;
978 NdisZeroMemory(pAd->MlmeAux.Ssid, NDIS_802_11_LENGTH_SSID);
979 NdisMoveMemory(pAd->MlmeAux.Ssid, tmpbuf, pAd->MlmeAux.SsidLen);
980 DBGPRINT(RT_DEBUG_TRACE, ("%s::(SSID=%s)\n", __func__, tmpbuf));
985 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
988 if (RTMPGetKeyParameter("NetworkType", tmpbuf, 25, buffer))
990 pAd->bConfigChanged = TRUE;
991 if (strcmp(tmpbuf, "Adhoc") == 0)
992 pAd->StaCfg.BssType = BSS_ADHOC;
993 else //Default Infrastructure mode
994 pAd->StaCfg.BssType = BSS_INFRA;
995 // Reset Ralink supplicant to not use, it will be set to start when UI set PMK key
996 pAd->StaCfg.WpaState = SS_NOTUSE;
997 DBGPRINT(RT_DEBUG_TRACE, ("%s::(NetworkType=%d)\n", __func__, pAd->StaCfg.BssType));
1002 if(RTMPGetKeyParameter("Channel", tmpbuf, 10, buffer))
1004 pAd->CommonCfg.Channel = (UCHAR) simple_strtol(tmpbuf, 0, 10);
1005 DBGPRINT(RT_DEBUG_TRACE, ("Channel=%d\n", pAd->CommonCfg.Channel));
1008 if(RTMPGetKeyParameter("WirelessMode", tmpbuf, 10, buffer))
1010 int value = 0, maxPhyMode = PHY_11G;
1012 #ifdef DOT11_N_SUPPORT
1013 maxPhyMode = PHY_11N_5G;
1014 #endif // DOT11_N_SUPPORT //
1016 value = simple_strtol(tmpbuf, 0, 10);
1018 if (value <= maxPhyMode)
1020 pAd->CommonCfg.PhyMode = value;
1022 DBGPRINT(RT_DEBUG_TRACE, ("PhyMode=%d\n", pAd->CommonCfg.PhyMode));
1025 if(RTMPGetKeyParameter("BasicRate", tmpbuf, 10, buffer))
1027 pAd->CommonCfg.BasicRateBitmap = (ULONG) simple_strtol(tmpbuf, 0, 10);
1028 DBGPRINT(RT_DEBUG_TRACE, ("BasicRate=%ld\n", pAd->CommonCfg.BasicRateBitmap));
1031 if(RTMPGetKeyParameter("BeaconPeriod", tmpbuf, 10, buffer))
1033 pAd->CommonCfg.BeaconPeriod = (USHORT) simple_strtol(tmpbuf, 0, 10);
1034 DBGPRINT(RT_DEBUG_TRACE, ("BeaconPeriod=%d\n", pAd->CommonCfg.BeaconPeriod));
1037 if(RTMPGetKeyParameter("TxPower", tmpbuf, 10, buffer))
1039 pAd->CommonCfg.TxPowerPercentage = (ULONG) simple_strtol(tmpbuf, 0, 10);
1041 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1042 pAd->CommonCfg.TxPowerDefault = pAd->CommonCfg.TxPowerPercentage;
1044 DBGPRINT(RT_DEBUG_TRACE, ("TxPower=%ld\n", pAd->CommonCfg.TxPowerPercentage));
1047 if(RTMPGetKeyParameter("BGProtection", tmpbuf, 10, buffer))
1049 switch (simple_strtol(tmpbuf, 0, 10))
1052 pAd->CommonCfg.UseBGProtection = 1;
1054 case 2: //Always OFF
1055 pAd->CommonCfg.UseBGProtection = 2;
1059 pAd->CommonCfg.UseBGProtection = 0;
1062 DBGPRINT(RT_DEBUG_TRACE, ("BGProtection=%ld\n", pAd->CommonCfg.UseBGProtection));
1065 if(RTMPGetKeyParameter("DisableOLBC", tmpbuf, 10, buffer))
1067 switch (simple_strtol(tmpbuf, 0, 10))
1069 case 1: //disable OLBC Detection
1070 pAd->CommonCfg.DisableOLBCDetect = 1;
1072 case 0: //enable OLBC Detection
1073 pAd->CommonCfg.DisableOLBCDetect = 0;
1076 pAd->CommonCfg.DisableOLBCDetect= 0;
1079 DBGPRINT(RT_DEBUG_TRACE, ("OLBCDetection=%ld\n", pAd->CommonCfg.DisableOLBCDetect));
1082 if(RTMPGetKeyParameter("TxPreamble", tmpbuf, 10, buffer))
1084 switch (simple_strtol(tmpbuf, 0, 10))
1086 case Rt802_11PreambleShort:
1087 pAd->CommonCfg.TxPreamble = Rt802_11PreambleShort;
1089 case Rt802_11PreambleLong:
1091 pAd->CommonCfg.TxPreamble = Rt802_11PreambleLong;
1094 DBGPRINT(RT_DEBUG_TRACE, ("TxPreamble=%ld\n", pAd->CommonCfg.TxPreamble));
1097 if(RTMPGetKeyParameter("RTSThreshold", tmpbuf, 10, buffer))
1099 RtsThresh = simple_strtol(tmpbuf, 0, 10);
1100 if( (RtsThresh >= 1) && (RtsThresh <= MAX_RTS_THRESHOLD) )
1101 pAd->CommonCfg.RtsThreshold = (USHORT)RtsThresh;
1103 pAd->CommonCfg.RtsThreshold = MAX_RTS_THRESHOLD;
1105 DBGPRINT(RT_DEBUG_TRACE, ("RTSThreshold=%d\n", pAd->CommonCfg.RtsThreshold));
1108 if(RTMPGetKeyParameter("FragThreshold", tmpbuf, 10, buffer))
1110 FragThresh = simple_strtol(tmpbuf, 0, 10);
1111 pAd->CommonCfg.bUseZeroToDisableFragment = FALSE;
1113 if (FragThresh > MAX_FRAG_THRESHOLD || FragThresh < MIN_FRAG_THRESHOLD)
1114 { //illegal FragThresh so we set it to default
1115 pAd->CommonCfg.FragmentThreshold = MAX_FRAG_THRESHOLD;
1116 pAd->CommonCfg.bUseZeroToDisableFragment = TRUE;
1118 else if (FragThresh % 2 == 1)
1120 // The length of each fragment shall always be an even number of octets, except for the last fragment
1121 // of an MSDU or MMPDU, which may be either an even or an odd number of octets.
1122 pAd->CommonCfg.FragmentThreshold = (USHORT)(FragThresh - 1);
1126 pAd->CommonCfg.FragmentThreshold = (USHORT)FragThresh;
1128 //pAd->CommonCfg.AllowFragSize = (pAd->CommonCfg.FragmentThreshold) - LENGTH_802_11 - LENGTH_CRC;
1129 DBGPRINT(RT_DEBUG_TRACE, ("FragThreshold=%d\n", pAd->CommonCfg.FragmentThreshold));
1132 if(RTMPGetKeyParameter("TxBurst", tmpbuf, 10, buffer))
1135 // pAd->CommonCfg.bEnableTxBurst = FALSE;
1137 if(simple_strtol(tmpbuf, 0, 10) != 0) //Enable
1138 pAd->CommonCfg.bEnableTxBurst = TRUE;
1140 pAd->CommonCfg.bEnableTxBurst = FALSE;
1142 DBGPRINT(RT_DEBUG_TRACE, ("TxBurst=%d\n", pAd->CommonCfg.bEnableTxBurst));
1145 #ifdef AGGREGATION_SUPPORT
1147 if(RTMPGetKeyParameter("PktAggregate", tmpbuf, 10, buffer))
1149 if(simple_strtol(tmpbuf, 0, 10) != 0) //Enable
1150 pAd->CommonCfg.bAggregationCapable = TRUE;
1152 pAd->CommonCfg.bAggregationCapable = FALSE;
1153 #ifdef PIGGYBACK_SUPPORT
1154 pAd->CommonCfg.bPiggyBackCapable = pAd->CommonCfg.bAggregationCapable;
1155 #endif // PIGGYBACK_SUPPORT //
1156 DBGPRINT(RT_DEBUG_TRACE, ("PktAggregate=%d\n", pAd->CommonCfg.bAggregationCapable));
1159 pAd->CommonCfg.bAggregationCapable = FALSE;
1160 pAd->CommonCfg.bPiggyBackCapable = FALSE;
1161 #endif // AGGREGATION_SUPPORT //
1164 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1165 rtmp_read_sta_wmm_parms_from_file(pAd, tmpbuf, buffer);
1168 if(RTMPGetKeyParameter("ShortSlot", tmpbuf, 10, buffer))
1170 if(simple_strtol(tmpbuf, 0, 10) != 0) //Enable
1171 pAd->CommonCfg.bUseShortSlotTime = TRUE;
1173 pAd->CommonCfg.bUseShortSlotTime = FALSE;
1175 DBGPRINT(RT_DEBUG_TRACE, ("ShortSlot=%d\n", pAd->CommonCfg.bUseShortSlotTime));
1178 if(RTMPGetKeyParameter("IEEE80211H", tmpbuf, 10, buffer))
1180 for (i = 0, macptr = rstrtok(tmpbuf,";"); macptr; macptr = rstrtok(NULL,";"), i++)
1182 if(simple_strtol(macptr, 0, 10) != 0) //Enable
1183 pAd->CommonCfg.bIEEE80211H = TRUE;
1185 pAd->CommonCfg.bIEEE80211H = FALSE;
1187 DBGPRINT(RT_DEBUG_TRACE, ("IEEE80211H=%d\n", pAd->CommonCfg.bIEEE80211H));
1191 if(RTMPGetKeyParameter("CSPeriod", tmpbuf, 10, buffer))
1193 if(simple_strtol(tmpbuf, 0, 10) != 0)
1194 pAd->CommonCfg.RadarDetect.CSPeriod = simple_strtol(tmpbuf, 0, 10);
1196 pAd->CommonCfg.RadarDetect.CSPeriod = 0;
1198 DBGPRINT(RT_DEBUG_TRACE, ("CSPeriod=%d\n", pAd->CommonCfg.RadarDetect.CSPeriod));
1202 if(RTMPGetKeyParameter("RDRegion", tmpbuf, 128, buffer))
1204 if ((strncmp(tmpbuf, "JAP_W53", 7) == 0) || (strncmp(tmpbuf, "jap_w53", 7) == 0))
1206 pAd->CommonCfg.RadarDetect.RDDurRegion = JAP_W53;
1207 pAd->CommonCfg.RadarDetect.DfsSessionTime = 15;
1209 else if ((strncmp(tmpbuf, "JAP_W56", 7) == 0) || (strncmp(tmpbuf, "jap_w56", 7) == 0))
1211 pAd->CommonCfg.RadarDetect.RDDurRegion = JAP_W56;
1212 pAd->CommonCfg.RadarDetect.DfsSessionTime = 13;
1214 else if ((strncmp(tmpbuf, "JAP", 3) == 0) || (strncmp(tmpbuf, "jap", 3) == 0))
1216 pAd->CommonCfg.RadarDetect.RDDurRegion = JAP;
1217 pAd->CommonCfg.RadarDetect.DfsSessionTime = 5;
1219 else if ((strncmp(tmpbuf, "FCC", 3) == 0) || (strncmp(tmpbuf, "fcc", 3) == 0))
1221 pAd->CommonCfg.RadarDetect.RDDurRegion = FCC;
1222 pAd->CommonCfg.RadarDetect.DfsSessionTime = 5;
1224 else if ((strncmp(tmpbuf, "CE", 2) == 0) || (strncmp(tmpbuf, "ce", 2) == 0))
1226 pAd->CommonCfg.RadarDetect.RDDurRegion = CE;
1227 pAd->CommonCfg.RadarDetect.DfsSessionTime = 13;
1231 pAd->CommonCfg.RadarDetect.RDDurRegion = CE;
1232 pAd->CommonCfg.RadarDetect.DfsSessionTime = 13;
1235 DBGPRINT(RT_DEBUG_TRACE, ("RDRegion=%d\n", pAd->CommonCfg.RadarDetect.RDDurRegion));
1239 pAd->CommonCfg.RadarDetect.RDDurRegion = CE;
1240 pAd->CommonCfg.RadarDetect.DfsSessionTime = 13;
1244 if(RTMPGetKeyParameter("WirelessEvent", tmpbuf, 10, buffer))
1246 #if WIRELESS_EXT >= 15
1247 if(simple_strtol(tmpbuf, 0, 10) != 0)
1248 pAd->CommonCfg.bWirelessEvent = simple_strtol(tmpbuf, 0, 10);
1250 pAd->CommonCfg.bWirelessEvent = 0; // disable
1252 pAd->CommonCfg.bWirelessEvent = 0; // disable
1254 DBGPRINT(RT_DEBUG_TRACE, ("WirelessEvent=%d\n", pAd->CommonCfg.bWirelessEvent));
1256 if(RTMPGetKeyParameter("WiFiTest", tmpbuf, 10, buffer))
1258 if(simple_strtol(tmpbuf, 0, 10) != 0)
1259 pAd->CommonCfg.bWiFiTest= simple_strtol(tmpbuf, 0, 10);
1261 pAd->CommonCfg.bWiFiTest = 0; // disable
1263 DBGPRINT(RT_DEBUG_TRACE, ("WiFiTest=%d\n", pAd->CommonCfg.bWiFiTest));
1266 if(RTMPGetKeyParameter("AuthMode", tmpbuf, 128, buffer))
1268 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1270 if ((strcmp(tmpbuf, "WEPAUTO") == 0) || (strcmp(tmpbuf, "wepauto") == 0))
1271 pAd->StaCfg.AuthMode = Ndis802_11AuthModeAutoSwitch;
1272 else if ((strcmp(tmpbuf, "SHARED") == 0) || (strcmp(tmpbuf, "shared") == 0))
1273 pAd->StaCfg.AuthMode = Ndis802_11AuthModeShared;
1274 else if ((strcmp(tmpbuf, "WPAPSK") == 0) || (strcmp(tmpbuf, "wpapsk") == 0))
1275 pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPAPSK;
1276 else if ((strcmp(tmpbuf, "WPANONE") == 0) || (strcmp(tmpbuf, "wpanone") == 0))
1277 pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPANone;
1278 else if ((strcmp(tmpbuf, "WPA2PSK") == 0) || (strcmp(tmpbuf, "wpa2psk") == 0))
1279 pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPA2PSK;
1280 else if ((strcmp(tmpbuf, "WPA") == 0) || (strcmp(tmpbuf, "wpa") == 0))
1281 pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPA;
1282 else if ((strcmp(tmpbuf, "WPA2") == 0) || (strcmp(tmpbuf, "wpa2") == 0))
1283 pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPA2;
1285 pAd->StaCfg.AuthMode = Ndis802_11AuthModeOpen;
1287 pAd->StaCfg.PortSecured = WPA_802_1X_PORT_NOT_SECURED;
1289 DBGPRINT(RT_DEBUG_TRACE, ("%s::(EncrypType=%d)\n", __func__, pAd->StaCfg.WepStatus));
1293 if(RTMPGetKeyParameter("EncrypType", tmpbuf, 128, buffer))
1295 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1297 if ((strcmp(tmpbuf, "WEP") == 0) || (strcmp(tmpbuf, "wep") == 0))
1298 pAd->StaCfg.WepStatus = Ndis802_11WEPEnabled;
1299 else if ((strcmp(tmpbuf, "TKIP") == 0) || (strcmp(tmpbuf, "tkip") == 0))
1300 pAd->StaCfg.WepStatus = Ndis802_11Encryption2Enabled;
1301 else if ((strcmp(tmpbuf, "AES") == 0) || (strcmp(tmpbuf, "aes") == 0))
1302 pAd->StaCfg.WepStatus = Ndis802_11Encryption3Enabled;
1304 pAd->StaCfg.WepStatus = Ndis802_11WEPDisabled;
1306 // Update all wepstatus related
1307 pAd->StaCfg.PairCipher = pAd->StaCfg.WepStatus;
1308 pAd->StaCfg.GroupCipher = pAd->StaCfg.WepStatus;
1309 pAd->StaCfg.OrigWepStatus = pAd->StaCfg.WepStatus;
1310 pAd->StaCfg.bMixCipher = FALSE;
1312 //RTMPMakeRSNIE(pAd, pAd->StaCfg.AuthMode, pAd->StaCfg.WepStatus, 0);
1313 DBGPRINT(RT_DEBUG_TRACE, ("%s::(EncrypType=%d)\n", __func__, pAd->StaCfg.WepStatus));
1317 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1319 if(RTMPGetCriticalParameter("WPAPSK", tmpbuf, 512, buffer))
1323 tmpbuf[strlen(tmpbuf)] = '\0'; // make STA can process .$^& for WPAPSK input
1325 if ((pAd->StaCfg.AuthMode != Ndis802_11AuthModeWPAPSK) &&
1326 (pAd->StaCfg.AuthMode != Ndis802_11AuthModeWPA2PSK) &&
1327 (pAd->StaCfg.AuthMode != Ndis802_11AuthModeWPANone)
1332 else if ((strlen(tmpbuf) >= 8) && (strlen(tmpbuf) < 64))
1334 PasswordHash((char *)tmpbuf, pAd->CommonCfg.Ssid, pAd->CommonCfg.SsidLen, keyMaterial);
1335 NdisMoveMemory(pAd->StaCfg.PMK, keyMaterial, 32);
1338 else if (strlen(tmpbuf) == 64)
1340 AtoH(tmpbuf, keyMaterial, 32);
1341 NdisMoveMemory(pAd->StaCfg.PMK, keyMaterial, 32);
1346 DBGPRINT(RT_DEBUG_ERROR, ("%s::(WPAPSK key-string required 8 ~ 64 characters!)\n", __func__));
1351 if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPAPSK) ||
1352 (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK))
1354 // Start STA supplicant state machine
1355 pAd->StaCfg.WpaState = SS_START;
1357 else if (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPANone)
1360 NdisZeroMemory(&pAd->SharedKey[BSS0][0], sizeof(CIPHER_KEY));
1361 pAd->SharedKey[BSS0][0].KeyLen = LEN_TKIP_EK;
1362 NdisMoveMemory(pAd->SharedKey[BSS0][0].Key, pAd->StaCfg.PMK, LEN_TKIP_EK);
1363 NdisMoveMemory(pAd->SharedKey[BSS0][0].RxMic, &pAd->StaCfg.PMK[16], LEN_TKIP_RXMICK);
1364 NdisMoveMemory(pAd->SharedKey[BSS0][0].TxMic, &pAd->StaCfg.PMK[16], LEN_TKIP_TXMICK);
1366 // Decide its ChiperAlg
1367 if (pAd->StaCfg.PairCipher == Ndis802_11Encryption2Enabled)
1368 pAd->SharedKey[BSS0][0].CipherAlg = CIPHER_TKIP;
1369 else if (pAd->StaCfg.PairCipher == Ndis802_11Encryption3Enabled)
1370 pAd->SharedKey[BSS0][0].CipherAlg = CIPHER_AES;
1372 pAd->SharedKey[BSS0][0].CipherAlg = CIPHER_NONE;
1374 pAd->StaCfg.WpaState = SS_NOTUSE;
1377 DBGPRINT(RT_DEBUG_TRACE, ("%s::(WPAPSK=%s)\n", __func__, tmpbuf));
1382 //DefaultKeyID, KeyType, KeyStr
1383 rtmp_read_key_parms_from_file(pAd, tmpbuf, buffer);
1387 /*if(RTMPGetKeyParameter("HSCounter", tmpbuf, 10, buffer))
1389 switch (simple_strtol(tmpbuf, 0, 10))
1392 pAd->CommonCfg.bEnableHSCounter = TRUE;
1396 pAd->CommonCfg.bEnableHSCounter = FALSE;
1399 DBGPRINT(RT_DEBUG_TRACE, "HSCounter=%d\n", pAd->CommonCfg.bEnableHSCounter);
1402 #ifdef DOT11_N_SUPPORT
1403 HTParametersHook(pAd, tmpbuf, buffer);
1404 #endif // DOT11_N_SUPPORT //
1406 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1409 if (RTMPGetKeyParameter("PSMode", tmpbuf, 10, buffer))
1411 if (pAd->StaCfg.BssType == BSS_INFRA)
1413 if ((strcmp(tmpbuf, "MAX_PSP") == 0) || (strcmp(tmpbuf, "max_psp") == 0))
1415 // do NOT turn on PSM bit here, wait until MlmeCheckForPsmChange()
1416 // to exclude certain situations.
1417 // MlmeSetPsm(pAd, PWR_SAVE);
1418 OPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM);
1419 if (pAd->StaCfg.bWindowsACCAMEnable == FALSE)
1420 pAd->StaCfg.WindowsPowerMode = Ndis802_11PowerModeMAX_PSP;
1421 pAd->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeMAX_PSP;
1422 pAd->StaCfg.DefaultListenCount = 5;
1424 else if ((strcmp(tmpbuf, "Fast_PSP") == 0) || (strcmp(tmpbuf, "fast_psp") == 0)
1425 || (strcmp(tmpbuf, "FAST_PSP") == 0))
1427 // do NOT turn on PSM bit here, wait until MlmeCheckForPsmChange()
1428 // to exclude certain situations.
1429 // MlmeSetPsmBit(pAd, PWR_SAVE);
1430 OPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM);
1431 if (pAd->StaCfg.bWindowsACCAMEnable == FALSE)
1432 pAd->StaCfg.WindowsPowerMode = Ndis802_11PowerModeFast_PSP;
1433 pAd->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeFast_PSP;
1434 pAd->StaCfg.DefaultListenCount = 3;
1436 else if ((strcmp(tmpbuf, "Legacy_PSP") == 0) || (strcmp(tmpbuf, "legacy_psp") == 0)
1437 || (strcmp(tmpbuf, "LEGACY_PSP") == 0))
1439 // do NOT turn on PSM bit here, wait until MlmeCheckForPsmChange()
1440 // to exclude certain situations.
1441 // MlmeSetPsmBit(pAd, PWR_SAVE);
1442 OPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM);
1443 if (pAd->StaCfg.bWindowsACCAMEnable == FALSE)
1444 pAd->StaCfg.WindowsPowerMode = Ndis802_11PowerModeLegacy_PSP;
1445 pAd->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeLegacy_PSP;
1446 pAd->StaCfg.DefaultListenCount = 3;
1449 { //Default Ndis802_11PowerModeCAM
1450 // clear PSM bit immediately
1451 MlmeSetPsmBit(pAd, PWR_ACTIVE);
1452 OPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM);
1453 if (pAd->StaCfg.bWindowsACCAMEnable == FALSE)
1454 pAd->StaCfg.WindowsPowerMode = Ndis802_11PowerModeCAM;
1455 pAd->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeCAM;
1457 DBGPRINT(RT_DEBUG_TRACE, ("PSMode=%ld\n", pAd->StaCfg.WindowsPowerMode));
1461 if (RTMPGetKeyParameter("FastRoaming", tmpbuf, 32, buffer))
1463 if (simple_strtol(tmpbuf, 0, 10) == 0)
1464 pAd->StaCfg.bFastRoaming = FALSE;
1466 pAd->StaCfg.bFastRoaming = TRUE;
1468 DBGPRINT(RT_DEBUG_TRACE, ("FastRoaming=%d\n", pAd->StaCfg.bFastRoaming));
1471 if (RTMPGetKeyParameter("RoamThreshold", tmpbuf, 32, buffer))
1473 long lInfo = simple_strtol(tmpbuf, 0, 10);
1475 if (lInfo > 90 || lInfo < 60)
1476 pAd->StaCfg.dBmToRoam = -70;
1478 pAd->StaCfg.dBmToRoam = (CHAR)(-1)*lInfo;
1480 DBGPRINT(RT_DEBUG_TRACE, ("RoamThreshold=%d dBm\n", pAd->StaCfg.dBmToRoam));
1483 if(RTMPGetKeyParameter("TGnWifiTest", tmpbuf, 10, buffer))
1485 if(simple_strtol(tmpbuf, 0, 10) == 0)
1486 pAd->StaCfg.bTGnWifiTest = FALSE;
1488 pAd->StaCfg.bTGnWifiTest = TRUE;
1489 DBGPRINT(RT_DEBUG_TRACE, ("TGnWifiTest=%d\n", pAd->StaCfg.bTGnWifiTest));
1496 DBGPRINT(RT_DEBUG_TRACE, ("--> %s does not have a write method\n", src));
1499 retval=filp_close(srcf,NULL);
1503 DBGPRINT(RT_DEBUG_TRACE, ("--> Error %d closing %s\n", -retval, src));
1510 current->fsuid = orgfsuid;
1511 current->fsgid = orgfsgid;
1517 return (NDIS_STATUS_SUCCESS);
1520 #ifdef DOT11_N_SUPPORT
1521 static void HTParametersHook(
1522 IN PRTMP_ADAPTER pAd,
1529 if (RTMPGetKeyParameter("HT_PROTECT", pValueStr, 25, pInput))
1531 Value = simple_strtol(pValueStr, 0, 10);
1534 pAd->CommonCfg.bHTProtect = FALSE;
1538 pAd->CommonCfg.bHTProtect = TRUE;
1540 DBGPRINT(RT_DEBUG_TRACE, ("HT: Protection = %s\n", (Value==0) ? "Disable" : "Enable"));
1543 if (RTMPGetKeyParameter("HT_MIMOPSEnable", pValueStr, 25, pInput))
1545 Value = simple_strtol(pValueStr, 0, 10);
1548 pAd->CommonCfg.bMIMOPSEnable = FALSE;
1552 pAd->CommonCfg.bMIMOPSEnable = TRUE;
1554 DBGPRINT(RT_DEBUG_TRACE, ("HT: MIMOPSEnable = %s\n", (Value==0) ? "Disable" : "Enable"));
1558 if (RTMPGetKeyParameter("HT_MIMOPSMode", pValueStr, 25, pInput))
1560 Value = simple_strtol(pValueStr, 0, 10);
1561 if (Value > MMPS_ENABLE)
1563 pAd->CommonCfg.BACapability.field.MMPSmode = MMPS_ENABLE;
1567 //TODO: add mimo power saving mechanism
1568 pAd->CommonCfg.BACapability.field.MMPSmode = MMPS_ENABLE;
1569 //pAd->CommonCfg.BACapability.field.MMPSmode = Value;
1571 DBGPRINT(RT_DEBUG_TRACE, ("HT: MIMOPS Mode = %d\n", Value));
1574 if (RTMPGetKeyParameter("HT_BADecline", pValueStr, 25, pInput))
1576 Value = simple_strtol(pValueStr, 0, 10);
1579 pAd->CommonCfg.bBADecline = FALSE;
1583 pAd->CommonCfg.bBADecline = TRUE;
1585 DBGPRINT(RT_DEBUG_TRACE, ("HT: BA Decline = %s\n", (Value==0) ? "Disable" : "Enable"));
1589 if (RTMPGetKeyParameter("HT_DisableReordering", pValueStr, 25, pInput))
1591 Value = simple_strtol(pValueStr, 0, 10);
1594 pAd->CommonCfg.bDisableReordering = FALSE;
1598 pAd->CommonCfg.bDisableReordering = TRUE;
1600 DBGPRINT(RT_DEBUG_TRACE, ("HT: DisableReordering = %s\n", (Value==0) ? "Disable" : "Enable"));
1603 if (RTMPGetKeyParameter("HT_AutoBA", pValueStr, 25, pInput))
1605 Value = simple_strtol(pValueStr, 0, 10);
1608 pAd->CommonCfg.BACapability.field.AutoBA = FALSE;
1612 pAd->CommonCfg.BACapability.field.AutoBA = TRUE;
1614 pAd->CommonCfg.REGBACapability.field.AutoBA = pAd->CommonCfg.BACapability.field.AutoBA;
1615 DBGPRINT(RT_DEBUG_TRACE, ("HT: Auto BA = %s\n", (Value==0) ? "Disable" : "Enable"));
1619 if (RTMPGetKeyParameter("HT_HTC", pValueStr, 25, pInput))
1621 Value = simple_strtol(pValueStr, 0, 10);
1624 pAd->HTCEnable = FALSE;
1628 pAd->HTCEnable = TRUE;
1630 DBGPRINT(RT_DEBUG_TRACE, ("HT: Tx +HTC frame = %s\n", (Value==0) ? "Disable" : "Enable"));
1633 // Enable HT Link Adaptation Control
1634 if (RTMPGetKeyParameter("HT_LinkAdapt", pValueStr, 25, pInput))
1636 Value = simple_strtol(pValueStr, 0, 10);
1639 pAd->bLinkAdapt = FALSE;
1643 pAd->HTCEnable = TRUE;
1644 pAd->bLinkAdapt = TRUE;
1646 DBGPRINT(RT_DEBUG_TRACE, ("HT: Link Adaptation Control = %s\n", (Value==0) ? "Disable" : "Enable(+HTC)"));
1649 // Reverse Direction Mechanism
1650 if (RTMPGetKeyParameter("HT_RDG", pValueStr, 25, pInput))
1652 Value = simple_strtol(pValueStr, 0, 10);
1655 pAd->CommonCfg.bRdg = FALSE;
1659 pAd->HTCEnable = TRUE;
1660 pAd->CommonCfg.bRdg = TRUE;
1662 DBGPRINT(RT_DEBUG_TRACE, ("HT: RDG = %s\n", (Value==0) ? "Disable" : "Enable(+HTC)"));
1669 if (RTMPGetKeyParameter("HT_AMSDU", pValueStr, 25, pInput))
1671 Value = simple_strtol(pValueStr, 0, 10);
1674 pAd->CommonCfg.BACapability.field.AmsduEnable = FALSE;
1678 pAd->CommonCfg.BACapability.field.AmsduEnable = TRUE;
1680 DBGPRINT(RT_DEBUG_TRACE, ("HT: Tx A-MSDU = %s\n", (Value==0) ? "Disable" : "Enable"));
1684 if (RTMPGetKeyParameter("HT_MpduDensity", pValueStr, 25, pInput))
1686 Value = simple_strtol(pValueStr, 0, 10);
1687 if (Value <=7 && Value >= 0)
1689 pAd->CommonCfg.BACapability.field.MpduDensity = Value;
1690 DBGPRINT(RT_DEBUG_TRACE, ("HT: MPDU Density = %d\n", Value));
1694 pAd->CommonCfg.BACapability.field.MpduDensity = 4;
1695 DBGPRINT(RT_DEBUG_TRACE, ("HT: MPDU Density = %d (Default)\n", 4));
1699 // Max Rx BA Window Size
1700 if (RTMPGetKeyParameter("HT_BAWinSize", pValueStr, 25, pInput))
1702 Value = simple_strtol(pValueStr, 0, 10);
1704 if (Value >=1 && Value <= 64)
1706 pAd->CommonCfg.REGBACapability.field.RxBAWinLimit = Value;
1707 pAd->CommonCfg.BACapability.field.RxBAWinLimit = Value;
1708 DBGPRINT(RT_DEBUG_TRACE, ("HT: BA Windw Size = %d\n", Value));
1712 pAd->CommonCfg.REGBACapability.field.RxBAWinLimit = 64;
1713 pAd->CommonCfg.BACapability.field.RxBAWinLimit = 64;
1714 DBGPRINT(RT_DEBUG_TRACE, ("HT: BA Windw Size = 64 (Defualt)\n"));
1720 if (RTMPGetKeyParameter("HT_GI", pValueStr, 25, pInput))
1722 Value = simple_strtol(pValueStr, 0, 10);
1724 if (Value == GI_400)
1726 pAd->CommonCfg.RegTransmitSetting.field.ShortGI = GI_400;
1730 pAd->CommonCfg.RegTransmitSetting.field.ShortGI = GI_800;
1733 DBGPRINT(RT_DEBUG_TRACE, ("HT: Guard Interval = %s\n", (Value==GI_400) ? "400" : "800" ));
1736 // HT Operation Mode : Mixed Mode , Green Field
1737 if (RTMPGetKeyParameter("HT_OpMode", pValueStr, 25, pInput))
1739 Value = simple_strtol(pValueStr, 0, 10);
1741 if (Value == HTMODE_GF)
1744 pAd->CommonCfg.RegTransmitSetting.field.HTMODE = HTMODE_GF;
1748 pAd->CommonCfg.RegTransmitSetting.field.HTMODE = HTMODE_MM;
1751 DBGPRINT(RT_DEBUG_TRACE, ("HT: Operate Mode = %s\n", (Value==HTMODE_GF) ? "Green Field" : "Mixed Mode" ));
1754 // Fixed Tx mode : CCK, OFDM
1755 if (RTMPGetKeyParameter("FixedTxMode", pValueStr, 25, pInput))
1759 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1761 fix_tx_mode = FIXED_TXMODE_HT;
1763 if (strcmp(pValueStr, "OFDM") == 0 || strcmp(pValueStr, "ofdm") == 0)
1765 fix_tx_mode = FIXED_TXMODE_OFDM;
1767 else if (strcmp(pValueStr, "CCK") == 0 || strcmp(pValueStr, "cck") == 0)
1769 fix_tx_mode = FIXED_TXMODE_CCK;
1771 else if (strcmp(pValueStr, "HT") == 0 || strcmp(pValueStr, "ht") == 0)
1773 fix_tx_mode = FIXED_TXMODE_HT;
1777 Value = simple_strtol(pValueStr, 0, 10);
1781 if (Value == FIXED_TXMODE_CCK || Value == FIXED_TXMODE_OFDM)
1782 fix_tx_mode = Value;
1784 fix_tx_mode = FIXED_TXMODE_HT;
1787 pAd->StaCfg.DesiredTransmitSetting.field.FixedTxMode = fix_tx_mode;
1788 DBGPRINT(RT_DEBUG_TRACE, ("Fixed Tx Mode = %d\n", fix_tx_mode));
1795 if (RTMPGetKeyParameter("HT_BW", pValueStr, 25, pInput))
1797 Value = simple_strtol(pValueStr, 0, 10);
1801 pAd->CommonCfg.RegTransmitSetting.field.BW = BW_40;
1805 pAd->CommonCfg.RegTransmitSetting.field.BW = BW_20;
1808 #ifdef MCAST_RATE_SPECIFIC
1809 pAd->CommonCfg.MCastPhyMode.field.BW = pAd->CommonCfg.RegTransmitSetting.field.BW;
1810 #endif // MCAST_RATE_SPECIFIC //
1812 DBGPRINT(RT_DEBUG_TRACE, ("HT: Channel Width = %s\n", (Value==BW_40) ? "40 MHz" : "20 MHz" ));
1815 if (RTMPGetKeyParameter("HT_EXTCHA", pValueStr, 25, pInput))
1817 Value = simple_strtol(pValueStr, 0, 10);
1822 pAd->CommonCfg.RegTransmitSetting.field.EXTCHA = EXTCHA_BELOW;
1826 pAd->CommonCfg.RegTransmitSetting.field.EXTCHA = EXTCHA_ABOVE;
1829 DBGPRINT(RT_DEBUG_TRACE, ("HT: Ext Channel = %s\n", (Value==0) ? "BELOW" : "ABOVE" ));
1833 if (RTMPGetKeyParameter("HT_MCS", pValueStr, 50, pInput))
1835 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1837 Value = simple_strtol(pValueStr, 0, 10);
1839 // if ((Value >= 0 && Value <= 15) || (Value == 32))
1840 if ((Value >= 0 && Value <= 23) || (Value == 32)) // 3*3
1842 pAd->StaCfg.DesiredTransmitSetting.field.MCS = Value;
1843 pAd->StaCfg.bAutoTxRateSwitch = FALSE;
1844 DBGPRINT(RT_DEBUG_TRACE, ("HT: MCS = %d\n", pAd->StaCfg.DesiredTransmitSetting.field.MCS));
1848 pAd->StaCfg.DesiredTransmitSetting.field.MCS = MCS_AUTO;
1849 pAd->StaCfg.bAutoTxRateSwitch = TRUE;
1850 DBGPRINT(RT_DEBUG_TRACE, ("HT: MCS = AUTO\n"));
1856 if (RTMPGetKeyParameter("HT_STBC", pValueStr, 25, pInput))
1858 Value = simple_strtol(pValueStr, 0, 10);
1859 if (Value == STBC_USE)
1861 pAd->CommonCfg.RegTransmitSetting.field.STBC = STBC_USE;
1865 pAd->CommonCfg.RegTransmitSetting.field.STBC = STBC_NONE;
1867 DBGPRINT(RT_DEBUG_TRACE, ("HT: STBC = %d\n", pAd->CommonCfg.RegTransmitSetting.field.STBC));
1870 // 40_Mhz_Intolerant
1871 if (RTMPGetKeyParameter("HT_40MHZ_INTOLERANT", pValueStr, 25, pInput))
1873 Value = simple_strtol(pValueStr, 0, 10);
1876 pAd->CommonCfg.bForty_Mhz_Intolerant = FALSE;
1880 pAd->CommonCfg.bForty_Mhz_Intolerant = TRUE;
1882 DBGPRINT(RT_DEBUG_TRACE, ("HT: 40MHZ INTOLERANT = %d\n", pAd->CommonCfg.bForty_Mhz_Intolerant));
1885 if(RTMPGetKeyParameter("HT_TxStream", pValueStr, 10, pInput))
1887 switch (simple_strtol(pValueStr, 0, 10))
1890 pAd->CommonCfg.TxStream = 1;
1893 pAd->CommonCfg.TxStream = 2;
1897 pAd->CommonCfg.TxStream = 3;
1899 if (pAd->MACVersion < RALINK_2883_VERSION)
1900 pAd->CommonCfg.TxStream = 2; // only 2 tx streams for RT2860 series
1903 DBGPRINT(RT_DEBUG_TRACE, ("HT: Tx Stream = %d\n", pAd->CommonCfg.TxStream));
1906 if(RTMPGetKeyParameter("HT_RxStream", pValueStr, 10, pInput))
1908 switch (simple_strtol(pValueStr, 0, 10))
1911 pAd->CommonCfg.RxStream = 1;
1914 pAd->CommonCfg.RxStream = 2;
1918 pAd->CommonCfg.RxStream = 3;
1920 if (pAd->MACVersion < RALINK_2883_VERSION)
1921 pAd->CommonCfg.RxStream = 2; // only 2 rx streams for RT2860 series
1924 DBGPRINT(RT_DEBUG_TRACE, ("HT: Rx Stream = %d\n", pAd->CommonCfg.RxStream));
1928 #endif // DOT11_N_SUPPORT //