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 static void HTParametersHook(
35 #define ETH_MAC_ADDR_STR_LEN 17 // in format of xx:xx:xx:xx:xx:xx
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)
41 char *ptokS = s1, *ptokE = s1;
43 if (strlen(s1) != ETH_MAC_ADDR_STR_LEN)
46 while((*ptokS) != '\0')
48 if((ptokE = strchr(ptokS, ':')) != NULL)
50 if ((strlen(ptokS) != 2) || (!isxdigit(*ptokS)) || (!isxdigit(*(ptokS+1))))
52 AtoH(ptokS, &s2[i++], 1);
55 break; // parsing finished
58 return ( i == 6 ? TRUE : FALSE);
63 // we assume the s1 and s2 both are strings.
64 BOOLEAN rtstrcasecmp(char *s1, char *s2)
66 char *p1 = s1, *p2 = s2;
68 if (strlen(s1) != strlen(s2))
73 if((*p1 != *p2) && ((*p1 ^ *p2) != 0x20))
82 // we assume the s1 (buffer) and s2 (key) both are strings.
83 char * rtstrstruncasecmp(char * s1, char * s2)
103 if (('a' <= temp1) && (temp1 <= 'z'))
104 temp1 = 'A'+(temp1-'a');
105 if (('a' <= temp2) && (temp2 <= 'z'))
106 temp2 = 'A'+(temp2-'a');
118 return NULL; // not found
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
128 char * rtstrstr(const char * s1,const char * s2)
141 if (!memcmp(s1,s2,l2))
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.
156 char * rstrtok(char * s,const char * ct)
160 sbegin = s ? s : __rstrtok;
166 sbegin += strspn(sbegin,ct);
173 send = strpbrk( sbegin, ct);
174 if (send && *send != '\0')
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 : ";").
188 INT delimitcnt(char * s,const char * ct)
191 /* point to the beginning of the line */
192 const char *token = s;
196 token = strpbrk(token, ct); /* search for delimiters */
200 /* advanced to the terminating null character */
203 /* skip the delimiter */
207 * Print the found text: use len with %.*s to specify field width.
210 /* accumulate delimiter count */
217 * converts the Internet host address from the standard numbers-and-dots notation
219 * returns nonzero if the address is valid, zero if not.
221 int rtinet_aton(const char *cp, unsigned int *addr)
226 unsigned int parts[4];
227 unsigned int *pp = parts;
232 * Collect number up to ``.''.
233 * Values are specified as for C:
234 * 0x=hex, 0=octal, other=decimal.
240 if (*++cp == 'x' || *cp == 'X')
245 while ((c = *cp) != '\0')
247 if (isdigit((unsigned char) c))
249 val = (val * base) + (c - '0');
253 if (base == 16 && isxdigit((unsigned char) c))
256 (c + 10 - (islower((unsigned char) c) ? 'a' : 'A'));
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)
268 if (pp >= parts + 3 || val > 0xff)
277 * Check for trailing junk.
280 if (!isspace((unsigned char) *cp++))
284 * Concoct the address according to the number of parts specified.
290 case 1: /* a -- 32 bits */
293 case 2: /* a.b -- 8.24 bits */
296 val |= parts[0] << 24;
299 case 3: /* a.b.c -- 8.8.16 bits */
302 val |= (parts[0] << 24) | (parts[1] << 16);
305 case 4: /* a.b.c.d -- 8.8.8.8 bits */
308 val |= (parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8);
318 ========================================================================
321 Find key section for Get key parameter.
324 buffer Pointer to the buffer to start find the key section
325 section the key of the secion to be find
330 ========================================================================
332 PUCHAR RTMPFindSection(
338 strcpy(temp_buf, "Default");
340 if((ptr = rtstrstr(buffer, temp_buf)) != NULL)
341 return (ptr+strlen("\n"));
347 ========================================================================
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
363 This routine get the value with the matched key (case case-sensitive)
364 ========================================================================
366 INT RTMPGetKeyParameter(
372 UCHAR *temp_buf1 = NULL;
373 UCHAR *temp_buf2 = NULL;
380 //temp_buf1 = kmalloc(MAX_PARAM_BUFFER_SIZE, MEM_ALLOC_FLAG);
381 os_alloc_mem(NULL, &temp_buf1, MAX_PARAM_BUFFER_SIZE);
383 if(temp_buf1 == NULL)
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)
390 os_free_mem(NULL, temp_buf1);
395 if((offset = RTMPFindSection(buffer)) == NULL)
397 os_free_mem(NULL, temp_buf1);
398 os_free_mem(NULL, temp_buf2);
402 strcpy(temp_buf1, "\n");
403 strcat(temp_buf1, key);
404 strcat(temp_buf1, "=");
407 if((start_ptr=rtstrstr(offset, temp_buf1))==NULL)
409 os_free_mem(NULL, temp_buf1);
410 os_free_mem(NULL, temp_buf2);
414 start_ptr+=strlen("\n");
415 if((end_ptr=rtstrstr(start_ptr, "\n"))==NULL)
416 end_ptr=start_ptr+strlen(start_ptr);
418 if (end_ptr<start_ptr)
420 os_free_mem(NULL, temp_buf1);
421 os_free_mem(NULL, temp_buf2);
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)
431 os_free_mem(NULL, temp_buf1);
432 os_free_mem(NULL, temp_buf2);
436 strcpy(temp_buf2, start_ptr+1);
441 if( (*ptr == ' ') || (*ptr == '\t') )
448 memset(dest, 0x00, destsize);
449 strncpy(dest, ptr, len >= destsize ? destsize: len);
451 os_free_mem(NULL, temp_buf1);
452 os_free_mem(NULL, temp_buf2);
457 ========================================================================
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
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 ========================================================================
477 INT RTMPGetCriticalParameter(
483 UCHAR *temp_buf1 = NULL;
484 UCHAR *temp_buf2 = NULL;
491 //temp_buf1 = kmalloc(MAX_PARAM_BUFFER_SIZE, MEM_ALLOC_FLAG);
492 os_alloc_mem(NULL, &temp_buf1, MAX_PARAM_BUFFER_SIZE);
494 if(temp_buf1 == NULL)
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)
501 os_free_mem(NULL, temp_buf1);
506 if((offset = RTMPFindSection(buffer)) == NULL)
508 os_free_mem(NULL, temp_buf1);
509 os_free_mem(NULL, temp_buf2);
513 strcpy(temp_buf1, "\n");
514 strcat(temp_buf1, key);
515 strcat(temp_buf1, "=");
518 if((start_ptr=rtstrstr(offset, temp_buf1))==NULL)
520 os_free_mem(NULL, temp_buf1);
521 os_free_mem(NULL, temp_buf2);
525 start_ptr+=strlen("\n");
526 if((end_ptr=rtstrstr(start_ptr, "\n"))==NULL)
527 end_ptr=start_ptr+strlen(start_ptr);
529 if (end_ptr<start_ptr)
531 os_free_mem(NULL, temp_buf1);
532 os_free_mem(NULL, temp_buf2);
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)
542 os_free_mem(NULL, temp_buf1);
543 os_free_mem(NULL, temp_buf2);
547 strcpy(temp_buf2, start_ptr+1);
551 /* We cannot trim space(' ') for SSID and key string. */
554 //if( (*ptr == ' ') || (*ptr == '\t') )
562 memset(dest, 0x00, destsize);
563 strncpy(dest, ptr, len >= destsize ? destsize: len);
565 os_free_mem(NULL, temp_buf1);
566 os_free_mem(NULL, temp_buf2);
571 ========================================================================
574 Get multiple key parameter.
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
587 This routine get the value with the matched key (case case-sensitive)
588 ========================================================================
590 INT RTMPGetKeyParameterWithOffset(
593 OUT USHORT *end_offset,
596 IN BOOLEAN bTrimSpace)
598 UCHAR *temp_buf1 = NULL;
599 UCHAR *temp_buf2 = NULL;
606 if (*end_offset >= MAX_INI_BUFFER_SIZE)
609 os_alloc_mem(NULL, &temp_buf1, MAX_PARAM_BUFFER_SIZE);
611 if(temp_buf1 == NULL)
614 os_alloc_mem(NULL, &temp_buf2, MAX_PARAM_BUFFER_SIZE);
615 if(temp_buf2 == NULL)
617 os_free_mem(NULL, temp_buf1);
624 if ((offset = RTMPFindSection(buffer)) == NULL)
626 os_free_mem(NULL, temp_buf1);
627 os_free_mem(NULL, temp_buf2);
632 offset = buffer + (*end_offset);
634 strcpy(temp_buf1, "\n");
635 strcat(temp_buf1, key);
636 strcat(temp_buf1, "=");
639 if((start_ptr=rtstrstr(offset, temp_buf1))==NULL)
641 os_free_mem(NULL, temp_buf1);
642 os_free_mem(NULL, temp_buf2);
646 start_ptr+=strlen("\n");
647 if((end_ptr=rtstrstr(start_ptr, "\n"))==NULL)
648 end_ptr=start_ptr+strlen(start_ptr);
650 if (end_ptr<start_ptr)
652 os_free_mem(NULL, temp_buf1);
653 os_free_mem(NULL, temp_buf2);
657 *end_offset = end_ptr - buffer;
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)
665 os_free_mem(NULL, temp_buf1);
666 os_free_mem(NULL, temp_buf2);
670 strcpy(temp_buf2, start_ptr+1);
675 if((bTrimSpace && (*ptr == ' ')) || (*ptr == '\t') )
682 memset(dest, 0x00, destsize);
683 strncpy(dest, ptr, len >= destsize ? destsize: len);
685 os_free_mem(NULL, temp_buf1);
686 os_free_mem(NULL, temp_buf2);
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)
694 INT i = BSSIdx, idx = KeyIdx;
696 UCHAR CipherAlg = CIPHER_WEP64;
699 KeyLen = strlen(keybuff);
703 if( (KeyLen == 5) || (KeyLen == 13))
705 pAd->SharedKey[i][idx].KeyLen = KeyLen;
706 NdisMoveMemory(pAd->SharedKey[i][idx].Key, keybuff, KeyLen);
708 CipherAlg = CIPHER_WEP64;
710 CipherAlg = CIPHER_WEP128;
711 pAd->SharedKey[i][idx].CipherAlg = CipherAlg;
713 DBGPRINT(RT_DEBUG_TRACE, ("I/F(ra%d) Key%dStr=%s and type=%s\n", i, idx+1, keybuff, (KeyType == 0) ? "Hex":"Ascii"));
717 {//Invalid key length
718 DBGPRINT(RT_DEBUG_ERROR, ("Key%dStr is Invalid key length! KeyLen = %ld!\n", idx+1, KeyLen));
724 if( (KeyLen == 10) || (KeyLen == 26))
726 pAd->SharedKey[i][idx].KeyLen = KeyLen / 2;
727 AtoH(keybuff, pAd->SharedKey[i][idx].Key, KeyLen / 2);
729 CipherAlg = CIPHER_WEP64;
731 CipherAlg = CIPHER_WEP128;
732 pAd->SharedKey[i][idx].CipherAlg = CipherAlg;
734 DBGPRINT(RT_DEBUG_TRACE, ("I/F(ra%d) Key%dStr=%s and type=%s\n", i, idx+1, keybuff, (KeyType == 0) ? "Hex":"Ascii"));
738 {//Invalid key length
739 DBGPRINT(RT_DEBUG_ERROR, ("I/F(ra%d) Key%dStr is Invalid key length! KeyLen = %ld!\n", i, idx+1, KeyLen));
744 static void rtmp_read_key_parms_from_file(IN PRTMP_ADAPTER pAd, char *tmpbuf, char *buffer)
749 ULONG KeyType[MAX_MBSSID_NUM];
752 NdisZeroMemory(KeyType, MAX_MBSSID_NUM);
755 if(RTMPGetKeyParameter("DefaultKeyID", tmpbuf, 25, buffer))
757 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
759 KeyIdx = simple_strtol(tmpbuf, 0, 10);
760 if((KeyIdx >= 1 ) && (KeyIdx <= 4))
761 pAd->StaCfg.DefaultKeyId = (UCHAR) (KeyIdx - 1);
763 pAd->StaCfg.DefaultKeyId = 0;
765 DBGPRINT(RT_DEBUG_TRACE, ("DefaultKeyID(0~3)=%d\n", pAd->StaCfg.DefaultKeyId));
770 for (idx = 0; idx < 4; idx++)
772 sprintf(tok_str, "Key%dType", idx + 1);
774 if (RTMPGetKeyParameter(tok_str, tmpbuf, 128, buffer))
776 for (i = 0, macptr = rstrtok(tmpbuf,";"); macptr; macptr = rstrtok(NULL,";"), i++)
778 KeyType[i] = simple_strtol(macptr, 0, 10);
781 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
783 sprintf(tok_str, "Key%dStr", idx + 1);
784 if (RTMPGetCriticalParameter(tok_str, tmpbuf, 128, buffer))
786 rtmp_parse_key_buffer_from_file(pAd, tmpbuf, KeyType[BSS0], BSS0, idx);
793 static void rtmp_read_sta_wmm_parms_from_file(IN PRTMP_ADAPTER pAd, char *tmpbuf, char *buffer)
797 BOOLEAN bWmmEnable = FALSE;
800 if(RTMPGetKeyParameter("WmmCapable", tmpbuf, 32, buffer))
802 if(simple_strtol(tmpbuf, 0, 10) != 0) //Enable
804 pAd->CommonCfg.bWmmCapable = TRUE;
809 pAd->CommonCfg.bWmmCapable = FALSE;
812 DBGPRINT(RT_DEBUG_TRACE, ("WmmCapable=%d\n", pAd->CommonCfg.bWmmCapable));
815 //AckPolicy for AC_BK, AC_BE, AC_VI, AC_VO
816 if(RTMPGetKeyParameter("AckPolicy", tmpbuf, 32, buffer))
818 for (i = 0, macptr = rstrtok(tmpbuf,";"); macptr; macptr = rstrtok(NULL,";"), i++)
820 pAd->CommonCfg.AckPolicy[i] = (UCHAR)simple_strtol(macptr, 0, 10);
822 DBGPRINT(RT_DEBUG_TRACE, ("AckPolicy[%d]=%d\n", i, pAd->CommonCfg.AckPolicy[i]));
829 if(RTMPGetKeyParameter("APSDCapable", tmpbuf, 10, buffer))
831 if(simple_strtol(tmpbuf, 0, 10) != 0) //Enable
832 pAd->CommonCfg.bAPSDCapable = TRUE;
834 pAd->CommonCfg.bAPSDCapable = FALSE;
836 DBGPRINT(RT_DEBUG_TRACE, ("APSDCapable=%d\n", pAd->CommonCfg.bAPSDCapable));
839 //APSDAC for AC_BE, AC_BK, AC_VI, AC_VO
840 if(RTMPGetKeyParameter("APSDAC", tmpbuf, 32, buffer))
844 for (i = 0, macptr = rstrtok(tmpbuf,";"); macptr; macptr = rstrtok(NULL,";"), i++)
846 apsd_ac[i] = (BOOLEAN)simple_strtol(macptr, 0, 10);
848 DBGPRINT(RT_DEBUG_TRACE, ("APSDAC%d %d\n", i, apsd_ac[i]));
851 pAd->CommonCfg.bAPSDAC_BE = apsd_ac[0];
852 pAd->CommonCfg.bAPSDAC_BK = apsd_ac[1];
853 pAd->CommonCfg.bAPSDAC_VI = apsd_ac[2];
854 pAd->CommonCfg.bAPSDAC_VO = apsd_ac[3];
860 NDIS_STATUS RTMPReadParametersHook(
861 IN PRTMP_ADAPTER pAd)
865 INT retval, orgfsuid, orgfsgid;
871 UCHAR keyMaterial[40];
876 buffer = kmalloc(MAX_INI_BUFFER_SIZE, MEM_ALLOC_FLAG);
878 return NDIS_STATUS_FAILURE;
880 tmpbuf = kmalloc(MAX_PARAM_BUFFER_SIZE, MEM_ALLOC_FLAG);
884 return NDIS_STATUS_FAILURE;
887 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
888 src = STA_PROFILE_PATH;
890 // Save uid and gid used for filesystem access.
891 // Set user and group to 0 (root)
892 orgfsuid = current_fsuid();
893 orgfsgid = current_fsgid();
894 /* Hm, can't really do this nicely anymore, so rely on these files
895 * being set to the proper permission to read them... */
896 /* current->cred->fsuid = current->cred->fsgid = 0; */
902 srcf = filp_open(src, O_RDONLY, 0);
905 DBGPRINT(RT_DEBUG_ERROR, ("--> Error %ld opening %s\n", -PTR_ERR(srcf),src));
909 // The object must have a read method
910 if (srcf->f_op && srcf->f_op->read)
912 memset(buffer, 0x00, MAX_INI_BUFFER_SIZE);
913 retval=srcf->f_op->read(srcf, buffer, MAX_INI_BUFFER_SIZE, &srcf->f_pos);
916 DBGPRINT(RT_DEBUG_TRACE, ("--> Read %s error %d\n", src, -retval));
920 // set file parameter to portcfg
922 if(RTMPGetKeyParameter("CountryRegion", tmpbuf, 25, buffer))
924 pAd->CommonCfg.CountryRegion = (UCHAR) simple_strtol(tmpbuf, 0, 10);
925 DBGPRINT(RT_DEBUG_TRACE, ("CountryRegion=%d\n", pAd->CommonCfg.CountryRegion));
928 if(RTMPGetKeyParameter("CountryRegionABand", tmpbuf, 25, buffer))
930 pAd->CommonCfg.CountryRegionForABand= (UCHAR) simple_strtol(tmpbuf, 0, 10);
931 DBGPRINT(RT_DEBUG_TRACE, ("CountryRegionABand=%d\n", pAd->CommonCfg.CountryRegionForABand));
934 if(RTMPGetKeyParameter("CountryCode", tmpbuf, 25, buffer))
936 NdisMoveMemory(pAd->CommonCfg.CountryCode, tmpbuf , 2);
938 if (strlen(pAd->CommonCfg.CountryCode) != 0)
940 pAd->CommonCfg.bCountryFlag = TRUE;
942 DBGPRINT(RT_DEBUG_TRACE, ("CountryCode=%s\n", pAd->CommonCfg.CountryCode));
945 if(RTMPGetKeyParameter("ChannelGeography", tmpbuf, 25, buffer))
947 UCHAR Geography = (UCHAR) simple_strtol(tmpbuf, 0, 10);
948 if (Geography <= BOTH)
950 pAd->CommonCfg.Geography = Geography;
951 pAd->CommonCfg.CountryCode[2] =
952 (pAd->CommonCfg.Geography == BOTH) ? ' ' : ((pAd->CommonCfg.Geography == IDOR) ? 'I' : 'O');
953 DBGPRINT(RT_DEBUG_TRACE, ("ChannelGeography=%d\n", pAd->CommonCfg.Geography));
958 pAd->CommonCfg.Geography = BOTH;
959 pAd->CommonCfg.CountryCode[2] = ' ';
962 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
965 if (RTMPGetCriticalParameter("SSID", tmpbuf, 256, buffer))
967 if (strlen(tmpbuf) <= 32)
969 pAd->CommonCfg.SsidLen = (UCHAR) strlen(tmpbuf);
970 NdisZeroMemory(pAd->CommonCfg.Ssid, NDIS_802_11_LENGTH_SSID);
971 NdisMoveMemory(pAd->CommonCfg.Ssid, tmpbuf, pAd->CommonCfg.SsidLen);
972 pAd->MlmeAux.AutoReconnectSsidLen = pAd->CommonCfg.SsidLen;
973 NdisZeroMemory(pAd->MlmeAux.AutoReconnectSsid, NDIS_802_11_LENGTH_SSID);
974 NdisMoveMemory(pAd->MlmeAux.AutoReconnectSsid, tmpbuf, pAd->MlmeAux.AutoReconnectSsidLen);
975 pAd->MlmeAux.SsidLen = pAd->CommonCfg.SsidLen;
976 NdisZeroMemory(pAd->MlmeAux.Ssid, NDIS_802_11_LENGTH_SSID);
977 NdisMoveMemory(pAd->MlmeAux.Ssid, tmpbuf, pAd->MlmeAux.SsidLen);
978 DBGPRINT(RT_DEBUG_TRACE, ("%s::(SSID=%s)\n", __func__, tmpbuf));
983 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
986 if (RTMPGetKeyParameter("NetworkType", tmpbuf, 25, buffer))
988 pAd->bConfigChanged = TRUE;
989 if (strcmp(tmpbuf, "Adhoc") == 0)
990 pAd->StaCfg.BssType = BSS_ADHOC;
991 else //Default Infrastructure mode
992 pAd->StaCfg.BssType = BSS_INFRA;
993 // Reset Ralink supplicant to not use, it will be set to start when UI set PMK key
994 pAd->StaCfg.WpaState = SS_NOTUSE;
995 DBGPRINT(RT_DEBUG_TRACE, ("%s::(NetworkType=%d)\n", __func__, pAd->StaCfg.BssType));
1000 if(RTMPGetKeyParameter("Channel", tmpbuf, 10, buffer))
1002 pAd->CommonCfg.Channel = (UCHAR) simple_strtol(tmpbuf, 0, 10);
1003 DBGPRINT(RT_DEBUG_TRACE, ("Channel=%d\n", pAd->CommonCfg.Channel));
1006 if(RTMPGetKeyParameter("WirelessMode", tmpbuf, 10, buffer))
1008 int value = 0, maxPhyMode = PHY_11G;
1010 maxPhyMode = PHY_11N_5G;
1012 value = simple_strtol(tmpbuf, 0, 10);
1014 if (value <= maxPhyMode)
1016 pAd->CommonCfg.PhyMode = value;
1018 DBGPRINT(RT_DEBUG_TRACE, ("PhyMode=%d\n", pAd->CommonCfg.PhyMode));
1021 if(RTMPGetKeyParameter("BasicRate", tmpbuf, 10, buffer))
1023 pAd->CommonCfg.BasicRateBitmap = (ULONG) simple_strtol(tmpbuf, 0, 10);
1024 DBGPRINT(RT_DEBUG_TRACE, ("BasicRate=%ld\n", pAd->CommonCfg.BasicRateBitmap));
1027 if(RTMPGetKeyParameter("BeaconPeriod", tmpbuf, 10, buffer))
1029 pAd->CommonCfg.BeaconPeriod = (USHORT) simple_strtol(tmpbuf, 0, 10);
1030 DBGPRINT(RT_DEBUG_TRACE, ("BeaconPeriod=%d\n", pAd->CommonCfg.BeaconPeriod));
1033 if(RTMPGetKeyParameter("TxPower", tmpbuf, 10, buffer))
1035 pAd->CommonCfg.TxPowerPercentage = (ULONG) simple_strtol(tmpbuf, 0, 10);
1037 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1038 pAd->CommonCfg.TxPowerDefault = pAd->CommonCfg.TxPowerPercentage;
1040 DBGPRINT(RT_DEBUG_TRACE, ("TxPower=%ld\n", pAd->CommonCfg.TxPowerPercentage));
1043 if(RTMPGetKeyParameter("BGProtection", tmpbuf, 10, buffer))
1045 switch (simple_strtol(tmpbuf, 0, 10))
1048 pAd->CommonCfg.UseBGProtection = 1;
1050 case 2: //Always OFF
1051 pAd->CommonCfg.UseBGProtection = 2;
1055 pAd->CommonCfg.UseBGProtection = 0;
1058 DBGPRINT(RT_DEBUG_TRACE, ("BGProtection=%ld\n", pAd->CommonCfg.UseBGProtection));
1061 if(RTMPGetKeyParameter("DisableOLBC", tmpbuf, 10, buffer))
1063 switch (simple_strtol(tmpbuf, 0, 10))
1065 case 1: //disable OLBC Detection
1066 pAd->CommonCfg.DisableOLBCDetect = 1;
1068 case 0: //enable OLBC Detection
1069 pAd->CommonCfg.DisableOLBCDetect = 0;
1072 pAd->CommonCfg.DisableOLBCDetect= 0;
1075 DBGPRINT(RT_DEBUG_TRACE, ("OLBCDetection=%ld\n", pAd->CommonCfg.DisableOLBCDetect));
1078 if(RTMPGetKeyParameter("TxPreamble", tmpbuf, 10, buffer))
1080 switch (simple_strtol(tmpbuf, 0, 10))
1082 case Rt802_11PreambleShort:
1083 pAd->CommonCfg.TxPreamble = Rt802_11PreambleShort;
1085 case Rt802_11PreambleLong:
1087 pAd->CommonCfg.TxPreamble = Rt802_11PreambleLong;
1090 DBGPRINT(RT_DEBUG_TRACE, ("TxPreamble=%ld\n", pAd->CommonCfg.TxPreamble));
1093 if(RTMPGetKeyParameter("RTSThreshold", tmpbuf, 10, buffer))
1095 RtsThresh = simple_strtol(tmpbuf, 0, 10);
1096 if( (RtsThresh >= 1) && (RtsThresh <= MAX_RTS_THRESHOLD) )
1097 pAd->CommonCfg.RtsThreshold = (USHORT)RtsThresh;
1099 pAd->CommonCfg.RtsThreshold = MAX_RTS_THRESHOLD;
1101 DBGPRINT(RT_DEBUG_TRACE, ("RTSThreshold=%d\n", pAd->CommonCfg.RtsThreshold));
1104 if(RTMPGetKeyParameter("FragThreshold", tmpbuf, 10, buffer))
1106 FragThresh = simple_strtol(tmpbuf, 0, 10);
1107 pAd->CommonCfg.bUseZeroToDisableFragment = FALSE;
1109 if (FragThresh > MAX_FRAG_THRESHOLD || FragThresh < MIN_FRAG_THRESHOLD)
1110 { //illegal FragThresh so we set it to default
1111 pAd->CommonCfg.FragmentThreshold = MAX_FRAG_THRESHOLD;
1112 pAd->CommonCfg.bUseZeroToDisableFragment = TRUE;
1114 else if (FragThresh % 2 == 1)
1116 // The length of each fragment shall always be an even number of octets, except for the last fragment
1117 // of an MSDU or MMPDU, which may be either an even or an odd number of octets.
1118 pAd->CommonCfg.FragmentThreshold = (USHORT)(FragThresh - 1);
1122 pAd->CommonCfg.FragmentThreshold = (USHORT)FragThresh;
1124 //pAd->CommonCfg.AllowFragSize = (pAd->CommonCfg.FragmentThreshold) - LENGTH_802_11 - LENGTH_CRC;
1125 DBGPRINT(RT_DEBUG_TRACE, ("FragThreshold=%d\n", pAd->CommonCfg.FragmentThreshold));
1128 if(RTMPGetKeyParameter("TxBurst", tmpbuf, 10, buffer))
1131 // pAd->CommonCfg.bEnableTxBurst = FALSE;
1133 if(simple_strtol(tmpbuf, 0, 10) != 0) //Enable
1134 pAd->CommonCfg.bEnableTxBurst = TRUE;
1136 pAd->CommonCfg.bEnableTxBurst = FALSE;
1138 DBGPRINT(RT_DEBUG_TRACE, ("TxBurst=%d\n", pAd->CommonCfg.bEnableTxBurst));
1141 #ifdef AGGREGATION_SUPPORT
1143 if(RTMPGetKeyParameter("PktAggregate", tmpbuf, 10, buffer))
1145 if(simple_strtol(tmpbuf, 0, 10) != 0) //Enable
1146 pAd->CommonCfg.bAggregationCapable = TRUE;
1148 pAd->CommonCfg.bAggregationCapable = FALSE;
1149 #ifdef PIGGYBACK_SUPPORT
1150 pAd->CommonCfg.bPiggyBackCapable = pAd->CommonCfg.bAggregationCapable;
1151 #endif // PIGGYBACK_SUPPORT //
1152 DBGPRINT(RT_DEBUG_TRACE, ("PktAggregate=%d\n", pAd->CommonCfg.bAggregationCapable));
1155 pAd->CommonCfg.bAggregationCapable = FALSE;
1156 pAd->CommonCfg.bPiggyBackCapable = FALSE;
1157 #endif // AGGREGATION_SUPPORT //
1160 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1161 rtmp_read_sta_wmm_parms_from_file(pAd, tmpbuf, buffer);
1164 if(RTMPGetKeyParameter("ShortSlot", tmpbuf, 10, buffer))
1166 if(simple_strtol(tmpbuf, 0, 10) != 0) //Enable
1167 pAd->CommonCfg.bUseShortSlotTime = TRUE;
1169 pAd->CommonCfg.bUseShortSlotTime = FALSE;
1171 DBGPRINT(RT_DEBUG_TRACE, ("ShortSlot=%d\n", pAd->CommonCfg.bUseShortSlotTime));
1174 if(RTMPGetKeyParameter("IEEE80211H", tmpbuf, 10, buffer))
1176 for (i = 0, macptr = rstrtok(tmpbuf,";"); macptr; macptr = rstrtok(NULL,";"), i++)
1178 if(simple_strtol(macptr, 0, 10) != 0) //Enable
1179 pAd->CommonCfg.bIEEE80211H = TRUE;
1181 pAd->CommonCfg.bIEEE80211H = FALSE;
1183 DBGPRINT(RT_DEBUG_TRACE, ("IEEE80211H=%d\n", pAd->CommonCfg.bIEEE80211H));
1187 if(RTMPGetKeyParameter("CSPeriod", tmpbuf, 10, buffer))
1189 if(simple_strtol(tmpbuf, 0, 10) != 0)
1190 pAd->CommonCfg.RadarDetect.CSPeriod = simple_strtol(tmpbuf, 0, 10);
1192 pAd->CommonCfg.RadarDetect.CSPeriod = 0;
1194 DBGPRINT(RT_DEBUG_TRACE, ("CSPeriod=%d\n", pAd->CommonCfg.RadarDetect.CSPeriod));
1198 if(RTMPGetKeyParameter("RDRegion", tmpbuf, 128, buffer))
1200 if ((strncmp(tmpbuf, "JAP_W53", 7) == 0) || (strncmp(tmpbuf, "jap_w53", 7) == 0))
1202 pAd->CommonCfg.RadarDetect.RDDurRegion = JAP_W53;
1203 pAd->CommonCfg.RadarDetect.DfsSessionTime = 15;
1205 else if ((strncmp(tmpbuf, "JAP_W56", 7) == 0) || (strncmp(tmpbuf, "jap_w56", 7) == 0))
1207 pAd->CommonCfg.RadarDetect.RDDurRegion = JAP_W56;
1208 pAd->CommonCfg.RadarDetect.DfsSessionTime = 13;
1210 else if ((strncmp(tmpbuf, "JAP", 3) == 0) || (strncmp(tmpbuf, "jap", 3) == 0))
1212 pAd->CommonCfg.RadarDetect.RDDurRegion = JAP;
1213 pAd->CommonCfg.RadarDetect.DfsSessionTime = 5;
1215 else if ((strncmp(tmpbuf, "FCC", 3) == 0) || (strncmp(tmpbuf, "fcc", 3) == 0))
1217 pAd->CommonCfg.RadarDetect.RDDurRegion = FCC;
1218 pAd->CommonCfg.RadarDetect.DfsSessionTime = 5;
1220 else if ((strncmp(tmpbuf, "CE", 2) == 0) || (strncmp(tmpbuf, "ce", 2) == 0))
1222 pAd->CommonCfg.RadarDetect.RDDurRegion = CE;
1223 pAd->CommonCfg.RadarDetect.DfsSessionTime = 13;
1227 pAd->CommonCfg.RadarDetect.RDDurRegion = CE;
1228 pAd->CommonCfg.RadarDetect.DfsSessionTime = 13;
1231 DBGPRINT(RT_DEBUG_TRACE, ("RDRegion=%d\n", pAd->CommonCfg.RadarDetect.RDDurRegion));
1235 pAd->CommonCfg.RadarDetect.RDDurRegion = CE;
1236 pAd->CommonCfg.RadarDetect.DfsSessionTime = 13;
1240 if(RTMPGetKeyParameter("WirelessEvent", tmpbuf, 10, buffer))
1242 #if WIRELESS_EXT >= 15
1243 if(simple_strtol(tmpbuf, 0, 10) != 0)
1244 pAd->CommonCfg.bWirelessEvent = simple_strtol(tmpbuf, 0, 10);
1246 pAd->CommonCfg.bWirelessEvent = 0; // disable
1248 pAd->CommonCfg.bWirelessEvent = 0; // disable
1250 DBGPRINT(RT_DEBUG_TRACE, ("WirelessEvent=%d\n", pAd->CommonCfg.bWirelessEvent));
1252 if(RTMPGetKeyParameter("WiFiTest", tmpbuf, 10, buffer))
1254 if(simple_strtol(tmpbuf, 0, 10) != 0)
1255 pAd->CommonCfg.bWiFiTest= simple_strtol(tmpbuf, 0, 10);
1257 pAd->CommonCfg.bWiFiTest = 0; // disable
1259 DBGPRINT(RT_DEBUG_TRACE, ("WiFiTest=%d\n", pAd->CommonCfg.bWiFiTest));
1262 if(RTMPGetKeyParameter("AuthMode", tmpbuf, 128, buffer))
1264 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1266 if ((strcmp(tmpbuf, "WEPAUTO") == 0) || (strcmp(tmpbuf, "wepauto") == 0))
1267 pAd->StaCfg.AuthMode = Ndis802_11AuthModeAutoSwitch;
1268 else if ((strcmp(tmpbuf, "SHARED") == 0) || (strcmp(tmpbuf, "shared") == 0))
1269 pAd->StaCfg.AuthMode = Ndis802_11AuthModeShared;
1270 else if ((strcmp(tmpbuf, "WPAPSK") == 0) || (strcmp(tmpbuf, "wpapsk") == 0))
1271 pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPAPSK;
1272 else if ((strcmp(tmpbuf, "WPANONE") == 0) || (strcmp(tmpbuf, "wpanone") == 0))
1273 pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPANone;
1274 else if ((strcmp(tmpbuf, "WPA2PSK") == 0) || (strcmp(tmpbuf, "wpa2psk") == 0))
1275 pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPA2PSK;
1276 else if ((strcmp(tmpbuf, "WPA") == 0) || (strcmp(tmpbuf, "wpa") == 0))
1277 pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPA;
1278 else if ((strcmp(tmpbuf, "WPA2") == 0) || (strcmp(tmpbuf, "wpa2") == 0))
1279 pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPA2;
1281 pAd->StaCfg.AuthMode = Ndis802_11AuthModeOpen;
1283 pAd->StaCfg.PortSecured = WPA_802_1X_PORT_NOT_SECURED;
1285 DBGPRINT(RT_DEBUG_TRACE, ("%s::(EncrypType=%d)\n", __func__, pAd->StaCfg.WepStatus));
1289 if(RTMPGetKeyParameter("EncrypType", tmpbuf, 128, buffer))
1291 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1293 if ((strcmp(tmpbuf, "WEP") == 0) || (strcmp(tmpbuf, "wep") == 0))
1294 pAd->StaCfg.WepStatus = Ndis802_11WEPEnabled;
1295 else if ((strcmp(tmpbuf, "TKIP") == 0) || (strcmp(tmpbuf, "tkip") == 0))
1296 pAd->StaCfg.WepStatus = Ndis802_11Encryption2Enabled;
1297 else if ((strcmp(tmpbuf, "AES") == 0) || (strcmp(tmpbuf, "aes") == 0))
1298 pAd->StaCfg.WepStatus = Ndis802_11Encryption3Enabled;
1300 pAd->StaCfg.WepStatus = Ndis802_11WEPDisabled;
1302 // Update all wepstatus related
1303 pAd->StaCfg.PairCipher = pAd->StaCfg.WepStatus;
1304 pAd->StaCfg.GroupCipher = pAd->StaCfg.WepStatus;
1305 pAd->StaCfg.OrigWepStatus = pAd->StaCfg.WepStatus;
1306 pAd->StaCfg.bMixCipher = FALSE;
1308 //RTMPMakeRSNIE(pAd, pAd->StaCfg.AuthMode, pAd->StaCfg.WepStatus, 0);
1309 DBGPRINT(RT_DEBUG_TRACE, ("%s::(EncrypType=%d)\n", __func__, pAd->StaCfg.WepStatus));
1313 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1315 if(RTMPGetCriticalParameter("WPAPSK", tmpbuf, 512, buffer))
1319 tmpbuf[strlen(tmpbuf)] = '\0'; // make STA can process .$^& for WPAPSK input
1321 if ((pAd->StaCfg.AuthMode != Ndis802_11AuthModeWPAPSK) &&
1322 (pAd->StaCfg.AuthMode != Ndis802_11AuthModeWPA2PSK) &&
1323 (pAd->StaCfg.AuthMode != Ndis802_11AuthModeWPANone)
1328 else if ((strlen(tmpbuf) >= 8) && (strlen(tmpbuf) < 64))
1330 PasswordHash((char *)tmpbuf, pAd->CommonCfg.Ssid, pAd->CommonCfg.SsidLen, keyMaterial);
1331 NdisMoveMemory(pAd->StaCfg.PMK, keyMaterial, 32);
1334 else if (strlen(tmpbuf) == 64)
1336 AtoH(tmpbuf, keyMaterial, 32);
1337 NdisMoveMemory(pAd->StaCfg.PMK, keyMaterial, 32);
1342 DBGPRINT(RT_DEBUG_ERROR, ("%s::(WPAPSK key-string required 8 ~ 64 characters!)\n", __func__));
1347 if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPAPSK) ||
1348 (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK))
1350 // Start STA supplicant state machine
1351 pAd->StaCfg.WpaState = SS_START;
1353 else if (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPANone)
1356 NdisZeroMemory(&pAd->SharedKey[BSS0][0], sizeof(CIPHER_KEY));
1357 pAd->SharedKey[BSS0][0].KeyLen = LEN_TKIP_EK;
1358 NdisMoveMemory(pAd->SharedKey[BSS0][0].Key, pAd->StaCfg.PMK, LEN_TKIP_EK);
1359 NdisMoveMemory(pAd->SharedKey[BSS0][0].RxMic, &pAd->StaCfg.PMK[16], LEN_TKIP_RXMICK);
1360 NdisMoveMemory(pAd->SharedKey[BSS0][0].TxMic, &pAd->StaCfg.PMK[16], LEN_TKIP_TXMICK);
1362 // Decide its ChiperAlg
1363 if (pAd->StaCfg.PairCipher == Ndis802_11Encryption2Enabled)
1364 pAd->SharedKey[BSS0][0].CipherAlg = CIPHER_TKIP;
1365 else if (pAd->StaCfg.PairCipher == Ndis802_11Encryption3Enabled)
1366 pAd->SharedKey[BSS0][0].CipherAlg = CIPHER_AES;
1368 pAd->SharedKey[BSS0][0].CipherAlg = CIPHER_NONE;
1370 pAd->StaCfg.WpaState = SS_NOTUSE;
1373 DBGPRINT(RT_DEBUG_TRACE, ("%s::(WPAPSK=%s)\n", __func__, tmpbuf));
1378 //DefaultKeyID, KeyType, KeyStr
1379 rtmp_read_key_parms_from_file(pAd, tmpbuf, buffer);
1383 /*if(RTMPGetKeyParameter("HSCounter", tmpbuf, 10, buffer))
1385 switch (simple_strtol(tmpbuf, 0, 10))
1388 pAd->CommonCfg.bEnableHSCounter = TRUE;
1392 pAd->CommonCfg.bEnableHSCounter = FALSE;
1395 DBGPRINT(RT_DEBUG_TRACE, "HSCounter=%d\n", pAd->CommonCfg.bEnableHSCounter);
1398 HTParametersHook(pAd, tmpbuf, buffer);
1400 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1403 if (RTMPGetKeyParameter("PSMode", tmpbuf, 10, buffer))
1405 if (pAd->StaCfg.BssType == BSS_INFRA)
1407 if ((strcmp(tmpbuf, "MAX_PSP") == 0) || (strcmp(tmpbuf, "max_psp") == 0))
1409 // do NOT turn on PSM bit here, wait until MlmeCheckForPsmChange()
1410 // to exclude certain situations.
1411 // MlmeSetPsm(pAd, PWR_SAVE);
1412 OPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM);
1413 if (pAd->StaCfg.bWindowsACCAMEnable == FALSE)
1414 pAd->StaCfg.WindowsPowerMode = Ndis802_11PowerModeMAX_PSP;
1415 pAd->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeMAX_PSP;
1416 pAd->StaCfg.DefaultListenCount = 5;
1418 else if ((strcmp(tmpbuf, "Fast_PSP") == 0) || (strcmp(tmpbuf, "fast_psp") == 0)
1419 || (strcmp(tmpbuf, "FAST_PSP") == 0))
1421 // do NOT turn on PSM bit here, wait until MlmeCheckForPsmChange()
1422 // to exclude certain situations.
1423 // MlmeSetPsmBit(pAd, PWR_SAVE);
1424 OPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM);
1425 if (pAd->StaCfg.bWindowsACCAMEnable == FALSE)
1426 pAd->StaCfg.WindowsPowerMode = Ndis802_11PowerModeFast_PSP;
1427 pAd->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeFast_PSP;
1428 pAd->StaCfg.DefaultListenCount = 3;
1430 else if ((strcmp(tmpbuf, "Legacy_PSP") == 0) || (strcmp(tmpbuf, "legacy_psp") == 0)
1431 || (strcmp(tmpbuf, "LEGACY_PSP") == 0))
1433 // do NOT turn on PSM bit here, wait until MlmeCheckForPsmChange()
1434 // to exclude certain situations.
1435 // MlmeSetPsmBit(pAd, PWR_SAVE);
1436 OPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM);
1437 if (pAd->StaCfg.bWindowsACCAMEnable == FALSE)
1438 pAd->StaCfg.WindowsPowerMode = Ndis802_11PowerModeLegacy_PSP;
1439 pAd->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeLegacy_PSP;
1440 pAd->StaCfg.DefaultListenCount = 3;
1443 { //Default Ndis802_11PowerModeCAM
1444 // clear PSM bit immediately
1445 MlmeSetPsmBit(pAd, PWR_ACTIVE);
1446 OPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM);
1447 if (pAd->StaCfg.bWindowsACCAMEnable == FALSE)
1448 pAd->StaCfg.WindowsPowerMode = Ndis802_11PowerModeCAM;
1449 pAd->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeCAM;
1451 DBGPRINT(RT_DEBUG_TRACE, ("PSMode=%ld\n", pAd->StaCfg.WindowsPowerMode));
1455 if (RTMPGetKeyParameter("FastRoaming", tmpbuf, 32, buffer))
1457 if (simple_strtol(tmpbuf, 0, 10) == 0)
1458 pAd->StaCfg.bFastRoaming = FALSE;
1460 pAd->StaCfg.bFastRoaming = TRUE;
1462 DBGPRINT(RT_DEBUG_TRACE, ("FastRoaming=%d\n", pAd->StaCfg.bFastRoaming));
1465 if (RTMPGetKeyParameter("RoamThreshold", tmpbuf, 32, buffer))
1467 long lInfo = simple_strtol(tmpbuf, 0, 10);
1469 if (lInfo > 90 || lInfo < 60)
1470 pAd->StaCfg.dBmToRoam = -70;
1472 pAd->StaCfg.dBmToRoam = (CHAR)(-1)*lInfo;
1474 DBGPRINT(RT_DEBUG_TRACE, ("RoamThreshold=%d dBm\n", pAd->StaCfg.dBmToRoam));
1477 if(RTMPGetKeyParameter("TGnWifiTest", tmpbuf, 10, buffer))
1479 if(simple_strtol(tmpbuf, 0, 10) == 0)
1480 pAd->StaCfg.bTGnWifiTest = FALSE;
1482 pAd->StaCfg.bTGnWifiTest = TRUE;
1483 DBGPRINT(RT_DEBUG_TRACE, ("TGnWifiTest=%d\n", pAd->StaCfg.bTGnWifiTest));
1490 DBGPRINT(RT_DEBUG_TRACE, ("--> %s does not have a write method\n", src));
1493 retval=filp_close(srcf,NULL);
1497 DBGPRINT(RT_DEBUG_TRACE, ("--> Error %d closing %s\n", -retval, src));
1504 current->fsuid = orgfsuid;
1505 current->fsgid = orgfsgid;
1511 return (NDIS_STATUS_SUCCESS);
1514 static void HTParametersHook(
1515 IN PRTMP_ADAPTER pAd,
1522 if (RTMPGetKeyParameter("HT_PROTECT", pValueStr, 25, pInput))
1524 Value = simple_strtol(pValueStr, 0, 10);
1527 pAd->CommonCfg.bHTProtect = FALSE;
1531 pAd->CommonCfg.bHTProtect = TRUE;
1533 DBGPRINT(RT_DEBUG_TRACE, ("HT: Protection = %s\n", (Value==0) ? "Disable" : "Enable"));
1536 if (RTMPGetKeyParameter("HT_MIMOPSEnable", pValueStr, 25, pInput))
1538 Value = simple_strtol(pValueStr, 0, 10);
1541 pAd->CommonCfg.bMIMOPSEnable = FALSE;
1545 pAd->CommonCfg.bMIMOPSEnable = TRUE;
1547 DBGPRINT(RT_DEBUG_TRACE, ("HT: MIMOPSEnable = %s\n", (Value==0) ? "Disable" : "Enable"));
1551 if (RTMPGetKeyParameter("HT_MIMOPSMode", pValueStr, 25, pInput))
1553 Value = simple_strtol(pValueStr, 0, 10);
1554 if (Value > MMPS_ENABLE)
1556 pAd->CommonCfg.BACapability.field.MMPSmode = MMPS_ENABLE;
1560 //TODO: add mimo power saving mechanism
1561 pAd->CommonCfg.BACapability.field.MMPSmode = MMPS_ENABLE;
1562 //pAd->CommonCfg.BACapability.field.MMPSmode = Value;
1564 DBGPRINT(RT_DEBUG_TRACE, ("HT: MIMOPS Mode = %d\n", Value));
1567 if (RTMPGetKeyParameter("HT_BADecline", pValueStr, 25, pInput))
1569 Value = simple_strtol(pValueStr, 0, 10);
1572 pAd->CommonCfg.bBADecline = FALSE;
1576 pAd->CommonCfg.bBADecline = TRUE;
1578 DBGPRINT(RT_DEBUG_TRACE, ("HT: BA Decline = %s\n", (Value==0) ? "Disable" : "Enable"));
1582 if (RTMPGetKeyParameter("HT_DisableReordering", pValueStr, 25, pInput))
1584 Value = simple_strtol(pValueStr, 0, 10);
1587 pAd->CommonCfg.bDisableReordering = FALSE;
1591 pAd->CommonCfg.bDisableReordering = TRUE;
1593 DBGPRINT(RT_DEBUG_TRACE, ("HT: DisableReordering = %s\n", (Value==0) ? "Disable" : "Enable"));
1596 if (RTMPGetKeyParameter("HT_AutoBA", pValueStr, 25, pInput))
1598 Value = simple_strtol(pValueStr, 0, 10);
1601 pAd->CommonCfg.BACapability.field.AutoBA = FALSE;
1605 pAd->CommonCfg.BACapability.field.AutoBA = TRUE;
1607 pAd->CommonCfg.REGBACapability.field.AutoBA = pAd->CommonCfg.BACapability.field.AutoBA;
1608 DBGPRINT(RT_DEBUG_TRACE, ("HT: Auto BA = %s\n", (Value==0) ? "Disable" : "Enable"));
1612 if (RTMPGetKeyParameter("HT_HTC", pValueStr, 25, pInput))
1614 Value = simple_strtol(pValueStr, 0, 10);
1617 pAd->HTCEnable = FALSE;
1621 pAd->HTCEnable = TRUE;
1623 DBGPRINT(RT_DEBUG_TRACE, ("HT: Tx +HTC frame = %s\n", (Value==0) ? "Disable" : "Enable"));
1626 // Enable HT Link Adaptation Control
1627 if (RTMPGetKeyParameter("HT_LinkAdapt", pValueStr, 25, pInput))
1629 Value = simple_strtol(pValueStr, 0, 10);
1632 pAd->bLinkAdapt = FALSE;
1636 pAd->HTCEnable = TRUE;
1637 pAd->bLinkAdapt = TRUE;
1639 DBGPRINT(RT_DEBUG_TRACE, ("HT: Link Adaptation Control = %s\n", (Value==0) ? "Disable" : "Enable(+HTC)"));
1642 // Reverse Direction Mechanism
1643 if (RTMPGetKeyParameter("HT_RDG", pValueStr, 25, pInput))
1645 Value = simple_strtol(pValueStr, 0, 10);
1648 pAd->CommonCfg.bRdg = FALSE;
1652 pAd->HTCEnable = TRUE;
1653 pAd->CommonCfg.bRdg = TRUE;
1655 DBGPRINT(RT_DEBUG_TRACE, ("HT: RDG = %s\n", (Value==0) ? "Disable" : "Enable(+HTC)"));
1662 if (RTMPGetKeyParameter("HT_AMSDU", pValueStr, 25, pInput))
1664 Value = simple_strtol(pValueStr, 0, 10);
1667 pAd->CommonCfg.BACapability.field.AmsduEnable = FALSE;
1671 pAd->CommonCfg.BACapability.field.AmsduEnable = TRUE;
1673 DBGPRINT(RT_DEBUG_TRACE, ("HT: Tx A-MSDU = %s\n", (Value==0) ? "Disable" : "Enable"));
1677 if (RTMPGetKeyParameter("HT_MpduDensity", pValueStr, 25, pInput))
1679 Value = simple_strtol(pValueStr, 0, 10);
1680 if (Value <=7 && Value >= 0)
1682 pAd->CommonCfg.BACapability.field.MpduDensity = Value;
1683 DBGPRINT(RT_DEBUG_TRACE, ("HT: MPDU Density = %d\n", Value));
1687 pAd->CommonCfg.BACapability.field.MpduDensity = 4;
1688 DBGPRINT(RT_DEBUG_TRACE, ("HT: MPDU Density = %d (Default)\n", 4));
1692 // Max Rx BA Window Size
1693 if (RTMPGetKeyParameter("HT_BAWinSize", pValueStr, 25, pInput))
1695 Value = simple_strtol(pValueStr, 0, 10);
1697 if (Value >=1 && Value <= 64)
1699 pAd->CommonCfg.REGBACapability.field.RxBAWinLimit = Value;
1700 pAd->CommonCfg.BACapability.field.RxBAWinLimit = Value;
1701 DBGPRINT(RT_DEBUG_TRACE, ("HT: BA Windw Size = %d\n", Value));
1705 pAd->CommonCfg.REGBACapability.field.RxBAWinLimit = 64;
1706 pAd->CommonCfg.BACapability.field.RxBAWinLimit = 64;
1707 DBGPRINT(RT_DEBUG_TRACE, ("HT: BA Windw Size = 64 (Defualt)\n"));
1713 if (RTMPGetKeyParameter("HT_GI", pValueStr, 25, pInput))
1715 Value = simple_strtol(pValueStr, 0, 10);
1717 if (Value == GI_400)
1719 pAd->CommonCfg.RegTransmitSetting.field.ShortGI = GI_400;
1723 pAd->CommonCfg.RegTransmitSetting.field.ShortGI = GI_800;
1726 DBGPRINT(RT_DEBUG_TRACE, ("HT: Guard Interval = %s\n", (Value==GI_400) ? "400" : "800" ));
1729 // HT Operation Mode : Mixed Mode , Green Field
1730 if (RTMPGetKeyParameter("HT_OpMode", pValueStr, 25, pInput))
1732 Value = simple_strtol(pValueStr, 0, 10);
1734 if (Value == HTMODE_GF)
1737 pAd->CommonCfg.RegTransmitSetting.field.HTMODE = HTMODE_GF;
1741 pAd->CommonCfg.RegTransmitSetting.field.HTMODE = HTMODE_MM;
1744 DBGPRINT(RT_DEBUG_TRACE, ("HT: Operate Mode = %s\n", (Value==HTMODE_GF) ? "Green Field" : "Mixed Mode" ));
1747 // Fixed Tx mode : CCK, OFDM
1748 if (RTMPGetKeyParameter("FixedTxMode", pValueStr, 25, pInput))
1752 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1754 fix_tx_mode = FIXED_TXMODE_HT;
1756 if (strcmp(pValueStr, "OFDM") == 0 || strcmp(pValueStr, "ofdm") == 0)
1758 fix_tx_mode = FIXED_TXMODE_OFDM;
1760 else if (strcmp(pValueStr, "CCK") == 0 || strcmp(pValueStr, "cck") == 0)
1762 fix_tx_mode = FIXED_TXMODE_CCK;
1764 else if (strcmp(pValueStr, "HT") == 0 || strcmp(pValueStr, "ht") == 0)
1766 fix_tx_mode = FIXED_TXMODE_HT;
1770 Value = simple_strtol(pValueStr, 0, 10);
1774 if (Value == FIXED_TXMODE_CCK || Value == FIXED_TXMODE_OFDM)
1775 fix_tx_mode = Value;
1777 fix_tx_mode = FIXED_TXMODE_HT;
1780 pAd->StaCfg.DesiredTransmitSetting.field.FixedTxMode = fix_tx_mode;
1781 DBGPRINT(RT_DEBUG_TRACE, ("Fixed Tx Mode = %d\n", fix_tx_mode));
1788 if (RTMPGetKeyParameter("HT_BW", pValueStr, 25, pInput))
1790 Value = simple_strtol(pValueStr, 0, 10);
1794 pAd->CommonCfg.RegTransmitSetting.field.BW = BW_40;
1798 pAd->CommonCfg.RegTransmitSetting.field.BW = BW_20;
1801 #ifdef MCAST_RATE_SPECIFIC
1802 pAd->CommonCfg.MCastPhyMode.field.BW = pAd->CommonCfg.RegTransmitSetting.field.BW;
1803 #endif // MCAST_RATE_SPECIFIC //
1805 DBGPRINT(RT_DEBUG_TRACE, ("HT: Channel Width = %s\n", (Value==BW_40) ? "40 MHz" : "20 MHz" ));
1808 if (RTMPGetKeyParameter("HT_EXTCHA", pValueStr, 25, pInput))
1810 Value = simple_strtol(pValueStr, 0, 10);
1815 pAd->CommonCfg.RegTransmitSetting.field.EXTCHA = EXTCHA_BELOW;
1819 pAd->CommonCfg.RegTransmitSetting.field.EXTCHA = EXTCHA_ABOVE;
1822 DBGPRINT(RT_DEBUG_TRACE, ("HT: Ext Channel = %s\n", (Value==0) ? "BELOW" : "ABOVE" ));
1826 if (RTMPGetKeyParameter("HT_MCS", pValueStr, 50, pInput))
1828 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1830 Value = simple_strtol(pValueStr, 0, 10);
1832 // if ((Value >= 0 && Value <= 15) || (Value == 32))
1833 if ((Value >= 0 && Value <= 23) || (Value == 32)) // 3*3
1835 pAd->StaCfg.DesiredTransmitSetting.field.MCS = Value;
1836 pAd->StaCfg.bAutoTxRateSwitch = FALSE;
1837 DBGPRINT(RT_DEBUG_TRACE, ("HT: MCS = %d\n", pAd->StaCfg.DesiredTransmitSetting.field.MCS));
1841 pAd->StaCfg.DesiredTransmitSetting.field.MCS = MCS_AUTO;
1842 pAd->StaCfg.bAutoTxRateSwitch = TRUE;
1843 DBGPRINT(RT_DEBUG_TRACE, ("HT: MCS = AUTO\n"));
1849 if (RTMPGetKeyParameter("HT_STBC", pValueStr, 25, pInput))
1851 Value = simple_strtol(pValueStr, 0, 10);
1852 if (Value == STBC_USE)
1854 pAd->CommonCfg.RegTransmitSetting.field.STBC = STBC_USE;
1858 pAd->CommonCfg.RegTransmitSetting.field.STBC = STBC_NONE;
1860 DBGPRINT(RT_DEBUG_TRACE, ("HT: STBC = %d\n", pAd->CommonCfg.RegTransmitSetting.field.STBC));
1863 // 40_Mhz_Intolerant
1864 if (RTMPGetKeyParameter("HT_40MHZ_INTOLERANT", pValueStr, 25, pInput))
1866 Value = simple_strtol(pValueStr, 0, 10);
1869 pAd->CommonCfg.bForty_Mhz_Intolerant = FALSE;
1873 pAd->CommonCfg.bForty_Mhz_Intolerant = TRUE;
1875 DBGPRINT(RT_DEBUG_TRACE, ("HT: 40MHZ INTOLERANT = %d\n", pAd->CommonCfg.bForty_Mhz_Intolerant));
1878 if(RTMPGetKeyParameter("HT_TxStream", pValueStr, 10, pInput))
1880 switch (simple_strtol(pValueStr, 0, 10))
1883 pAd->CommonCfg.TxStream = 1;
1886 pAd->CommonCfg.TxStream = 2;
1890 pAd->CommonCfg.TxStream = 3;
1892 if (pAd->MACVersion < RALINK_2883_VERSION)
1893 pAd->CommonCfg.TxStream = 2; // only 2 tx streams for RT2860 series
1896 DBGPRINT(RT_DEBUG_TRACE, ("HT: Tx Stream = %d\n", pAd->CommonCfg.TxStream));
1899 if(RTMPGetKeyParameter("HT_RxStream", pValueStr, 10, pInput))
1901 switch (simple_strtol(pValueStr, 0, 10))
1904 pAd->CommonCfg.RxStream = 1;
1907 pAd->CommonCfg.RxStream = 2;
1911 pAd->CommonCfg.RxStream = 3;
1913 if (pAd->MACVersion < RALINK_2883_VERSION)
1914 pAd->CommonCfg.RxStream = 2; // only 2 rx streams for RT2860 series
1917 DBGPRINT(RT_DEBUG_TRACE, ("HT: Rx Stream = %d\n", pAd->CommonCfg.RxStream));