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))
760 #ifdef CONFIG_STA_SUPPORT
761 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
763 KeyIdx = simple_strtol(tmpbuf, 0, 10);
764 if((KeyIdx >= 1 ) && (KeyIdx <= 4))
765 pAd->StaCfg.DefaultKeyId = (UCHAR) (KeyIdx - 1);
767 pAd->StaCfg.DefaultKeyId = 0;
769 DBGPRINT(RT_DEBUG_TRACE, ("DefaultKeyID(0~3)=%d\n", pAd->StaCfg.DefaultKeyId));
771 #endif // CONFIG_STA_SUPPORT //
775 for (idx = 0; idx < 4; idx++)
777 sprintf(tok_str, "Key%dType", idx + 1);
779 if (RTMPGetKeyParameter(tok_str, tmpbuf, 128, buffer))
781 for (i = 0, macptr = rstrtok(tmpbuf,";"); macptr; macptr = rstrtok(NULL,";"), i++)
783 KeyType[i] = simple_strtol(macptr, 0, 10);
786 #ifdef CONFIG_STA_SUPPORT
787 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
789 sprintf(tok_str, "Key%dStr", idx + 1);
790 if (RTMPGetCriticalParameter(tok_str, tmpbuf, 128, buffer))
792 rtmp_parse_key_buffer_from_file(pAd, tmpbuf, KeyType[BSS0], BSS0, idx);
795 #endif // CONFIG_STA_SUPPORT //
801 #ifdef CONFIG_STA_SUPPORT
802 static void rtmp_read_sta_wmm_parms_from_file(IN PRTMP_ADAPTER pAd, char *tmpbuf, char *buffer)
806 BOOLEAN bWmmEnable = FALSE;
809 if(RTMPGetKeyParameter("WmmCapable", tmpbuf, 32, buffer))
811 if(simple_strtol(tmpbuf, 0, 10) != 0) //Enable
813 pAd->CommonCfg.bWmmCapable = TRUE;
818 pAd->CommonCfg.bWmmCapable = FALSE;
821 DBGPRINT(RT_DEBUG_TRACE, ("WmmCapable=%d\n", pAd->CommonCfg.bWmmCapable));
824 //AckPolicy for AC_BK, AC_BE, AC_VI, AC_VO
825 if(RTMPGetKeyParameter("AckPolicy", tmpbuf, 32, buffer))
827 for (i = 0, macptr = rstrtok(tmpbuf,";"); macptr; macptr = rstrtok(NULL,";"), i++)
829 pAd->CommonCfg.AckPolicy[i] = (UCHAR)simple_strtol(macptr, 0, 10);
831 DBGPRINT(RT_DEBUG_TRACE, ("AckPolicy[%d]=%d\n", i, pAd->CommonCfg.AckPolicy[i]));
838 if(RTMPGetKeyParameter("APSDCapable", tmpbuf, 10, buffer))
840 if(simple_strtol(tmpbuf, 0, 10) != 0) //Enable
841 pAd->CommonCfg.bAPSDCapable = TRUE;
843 pAd->CommonCfg.bAPSDCapable = FALSE;
845 DBGPRINT(RT_DEBUG_TRACE, ("APSDCapable=%d\n", pAd->CommonCfg.bAPSDCapable));
848 //APSDAC for AC_BE, AC_BK, AC_VI, AC_VO
849 if(RTMPGetKeyParameter("APSDAC", tmpbuf, 32, buffer))
853 for (i = 0, macptr = rstrtok(tmpbuf,";"); macptr; macptr = rstrtok(NULL,";"), i++)
855 apsd_ac[i] = (BOOLEAN)simple_strtol(macptr, 0, 10);
857 DBGPRINT(RT_DEBUG_TRACE, ("APSDAC%d %d\n", i, apsd_ac[i]));
860 pAd->CommonCfg.bAPSDAC_BE = apsd_ac[0];
861 pAd->CommonCfg.bAPSDAC_BK = apsd_ac[1];
862 pAd->CommonCfg.bAPSDAC_VI = apsd_ac[2];
863 pAd->CommonCfg.bAPSDAC_VO = apsd_ac[3];
868 #endif // CONFIG_STA_SUPPORT //
871 NDIS_STATUS RTMPReadParametersHook(
872 IN PRTMP_ADAPTER pAd)
876 INT retval, orgfsuid, orgfsgid;
882 #ifdef CONFIG_STA_SUPPORT
883 UCHAR keyMaterial[40];
884 #endif // CONFIG_STA_SUPPORT //
890 buffer = kmalloc(MAX_INI_BUFFER_SIZE, MEM_ALLOC_FLAG);
892 return NDIS_STATUS_FAILURE;
894 tmpbuf = kmalloc(MAX_PARAM_BUFFER_SIZE, MEM_ALLOC_FLAG);
898 return NDIS_STATUS_FAILURE;
901 #ifdef CONFIG_STA_SUPPORT
902 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
903 src = STA_PROFILE_PATH;
904 #endif // CONFIG_STA_SUPPORT //
906 // Save uid and gid used for filesystem access.
907 // Set user and group to 0 (root)
908 orgfsuid = current_fsuid();
909 orgfsgid = current_fsgid();
910 /* Hm, can't really do this nicely anymore, so rely on these files
911 * being set to the proper permission to read them... */
912 /* current->cred->fsuid = current->cred->fsgid = 0; */
918 srcf = filp_open(src, O_RDONLY, 0);
921 DBGPRINT(RT_DEBUG_ERROR, ("--> Error %ld opening %s\n", -PTR_ERR(srcf),src));
925 // The object must have a read method
926 if (srcf->f_op && srcf->f_op->read)
928 memset(buffer, 0x00, MAX_INI_BUFFER_SIZE);
929 retval=srcf->f_op->read(srcf, buffer, MAX_INI_BUFFER_SIZE, &srcf->f_pos);
932 DBGPRINT(RT_DEBUG_TRACE, ("--> Read %s error %d\n", src, -retval));
936 // set file parameter to portcfg
938 if(RTMPGetKeyParameter("CountryRegion", tmpbuf, 25, buffer))
940 pAd->CommonCfg.CountryRegion = (UCHAR) simple_strtol(tmpbuf, 0, 10);
941 DBGPRINT(RT_DEBUG_TRACE, ("CountryRegion=%d\n", pAd->CommonCfg.CountryRegion));
944 if(RTMPGetKeyParameter("CountryRegionABand", tmpbuf, 25, buffer))
946 pAd->CommonCfg.CountryRegionForABand= (UCHAR) simple_strtol(tmpbuf, 0, 10);
947 DBGPRINT(RT_DEBUG_TRACE, ("CountryRegionABand=%d\n", pAd->CommonCfg.CountryRegionForABand));
950 if(RTMPGetKeyParameter("CountryCode", tmpbuf, 25, buffer))
952 NdisMoveMemory(pAd->CommonCfg.CountryCode, tmpbuf , 2);
954 if (strlen(pAd->CommonCfg.CountryCode) != 0)
956 pAd->CommonCfg.bCountryFlag = TRUE;
958 DBGPRINT(RT_DEBUG_TRACE, ("CountryCode=%s\n", pAd->CommonCfg.CountryCode));
961 if(RTMPGetKeyParameter("ChannelGeography", tmpbuf, 25, buffer))
963 UCHAR Geography = (UCHAR) simple_strtol(tmpbuf, 0, 10);
964 if (Geography <= BOTH)
966 pAd->CommonCfg.Geography = Geography;
967 pAd->CommonCfg.CountryCode[2] =
968 (pAd->CommonCfg.Geography == BOTH) ? ' ' : ((pAd->CommonCfg.Geography == IDOR) ? 'I' : 'O');
969 DBGPRINT(RT_DEBUG_TRACE, ("ChannelGeography=%d\n", pAd->CommonCfg.Geography));
974 pAd->CommonCfg.Geography = BOTH;
975 pAd->CommonCfg.CountryCode[2] = ' ';
979 #ifdef CONFIG_STA_SUPPORT
980 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
983 if (RTMPGetCriticalParameter("SSID", tmpbuf, 256, buffer))
985 if (strlen(tmpbuf) <= 32)
987 pAd->CommonCfg.SsidLen = (UCHAR) strlen(tmpbuf);
988 NdisZeroMemory(pAd->CommonCfg.Ssid, NDIS_802_11_LENGTH_SSID);
989 NdisMoveMemory(pAd->CommonCfg.Ssid, tmpbuf, pAd->CommonCfg.SsidLen);
990 pAd->MlmeAux.AutoReconnectSsidLen = pAd->CommonCfg.SsidLen;
991 NdisZeroMemory(pAd->MlmeAux.AutoReconnectSsid, NDIS_802_11_LENGTH_SSID);
992 NdisMoveMemory(pAd->MlmeAux.AutoReconnectSsid, tmpbuf, pAd->MlmeAux.AutoReconnectSsidLen);
993 pAd->MlmeAux.SsidLen = pAd->CommonCfg.SsidLen;
994 NdisZeroMemory(pAd->MlmeAux.Ssid, NDIS_802_11_LENGTH_SSID);
995 NdisMoveMemory(pAd->MlmeAux.Ssid, tmpbuf, pAd->MlmeAux.SsidLen);
996 DBGPRINT(RT_DEBUG_TRACE, ("%s::(SSID=%s)\n", __func__, tmpbuf));
1000 #endif // CONFIG_STA_SUPPORT //
1002 #ifdef CONFIG_STA_SUPPORT
1003 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1006 if (RTMPGetKeyParameter("NetworkType", tmpbuf, 25, buffer))
1008 pAd->bConfigChanged = TRUE;
1009 if (strcmp(tmpbuf, "Adhoc") == 0)
1010 pAd->StaCfg.BssType = BSS_ADHOC;
1011 else //Default Infrastructure mode
1012 pAd->StaCfg.BssType = BSS_INFRA;
1013 // Reset Ralink supplicant to not use, it will be set to start when UI set PMK key
1014 pAd->StaCfg.WpaState = SS_NOTUSE;
1015 DBGPRINT(RT_DEBUG_TRACE, ("%s::(NetworkType=%d)\n", __func__, pAd->StaCfg.BssType));
1018 #endif // CONFIG_STA_SUPPORT //
1020 if(RTMPGetKeyParameter("Channel", tmpbuf, 10, buffer))
1022 pAd->CommonCfg.Channel = (UCHAR) simple_strtol(tmpbuf, 0, 10);
1023 DBGPRINT(RT_DEBUG_TRACE, ("Channel=%d\n", pAd->CommonCfg.Channel));
1026 if(RTMPGetKeyParameter("WirelessMode", tmpbuf, 10, buffer))
1028 int value = 0, maxPhyMode = PHY_11G;
1030 #ifdef DOT11_N_SUPPORT
1031 maxPhyMode = PHY_11N_5G;
1032 #endif // DOT11_N_SUPPORT //
1034 value = simple_strtol(tmpbuf, 0, 10);
1036 if (value <= maxPhyMode)
1038 pAd->CommonCfg.PhyMode = value;
1040 DBGPRINT(RT_DEBUG_TRACE, ("PhyMode=%d\n", pAd->CommonCfg.PhyMode));
1043 if(RTMPGetKeyParameter("BasicRate", tmpbuf, 10, buffer))
1045 pAd->CommonCfg.BasicRateBitmap = (ULONG) simple_strtol(tmpbuf, 0, 10);
1046 DBGPRINT(RT_DEBUG_TRACE, ("BasicRate=%ld\n", pAd->CommonCfg.BasicRateBitmap));
1049 if(RTMPGetKeyParameter("BeaconPeriod", tmpbuf, 10, buffer))
1051 pAd->CommonCfg.BeaconPeriod = (USHORT) simple_strtol(tmpbuf, 0, 10);
1052 DBGPRINT(RT_DEBUG_TRACE, ("BeaconPeriod=%d\n", pAd->CommonCfg.BeaconPeriod));
1055 if(RTMPGetKeyParameter("TxPower", tmpbuf, 10, buffer))
1057 pAd->CommonCfg.TxPowerPercentage = (ULONG) simple_strtol(tmpbuf, 0, 10);
1058 #ifdef CONFIG_STA_SUPPORT
1059 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1060 pAd->CommonCfg.TxPowerDefault = pAd->CommonCfg.TxPowerPercentage;
1061 #endif // CONFIG_STA_SUPPORT //
1062 DBGPRINT(RT_DEBUG_TRACE, ("TxPower=%ld\n", pAd->CommonCfg.TxPowerPercentage));
1065 if(RTMPGetKeyParameter("BGProtection", tmpbuf, 10, buffer))
1067 switch (simple_strtol(tmpbuf, 0, 10))
1070 pAd->CommonCfg.UseBGProtection = 1;
1072 case 2: //Always OFF
1073 pAd->CommonCfg.UseBGProtection = 2;
1077 pAd->CommonCfg.UseBGProtection = 0;
1080 DBGPRINT(RT_DEBUG_TRACE, ("BGProtection=%ld\n", pAd->CommonCfg.UseBGProtection));
1083 if(RTMPGetKeyParameter("DisableOLBC", tmpbuf, 10, buffer))
1085 switch (simple_strtol(tmpbuf, 0, 10))
1087 case 1: //disable OLBC Detection
1088 pAd->CommonCfg.DisableOLBCDetect = 1;
1090 case 0: //enable OLBC Detection
1091 pAd->CommonCfg.DisableOLBCDetect = 0;
1094 pAd->CommonCfg.DisableOLBCDetect= 0;
1097 DBGPRINT(RT_DEBUG_TRACE, ("OLBCDetection=%ld\n", pAd->CommonCfg.DisableOLBCDetect));
1100 if(RTMPGetKeyParameter("TxPreamble", tmpbuf, 10, buffer))
1102 switch (simple_strtol(tmpbuf, 0, 10))
1104 case Rt802_11PreambleShort:
1105 pAd->CommonCfg.TxPreamble = Rt802_11PreambleShort;
1107 case Rt802_11PreambleLong:
1109 pAd->CommonCfg.TxPreamble = Rt802_11PreambleLong;
1112 DBGPRINT(RT_DEBUG_TRACE, ("TxPreamble=%ld\n", pAd->CommonCfg.TxPreamble));
1115 if(RTMPGetKeyParameter("RTSThreshold", tmpbuf, 10, buffer))
1117 RtsThresh = simple_strtol(tmpbuf, 0, 10);
1118 if( (RtsThresh >= 1) && (RtsThresh <= MAX_RTS_THRESHOLD) )
1119 pAd->CommonCfg.RtsThreshold = (USHORT)RtsThresh;
1121 pAd->CommonCfg.RtsThreshold = MAX_RTS_THRESHOLD;
1123 DBGPRINT(RT_DEBUG_TRACE, ("RTSThreshold=%d\n", pAd->CommonCfg.RtsThreshold));
1126 if(RTMPGetKeyParameter("FragThreshold", tmpbuf, 10, buffer))
1128 FragThresh = simple_strtol(tmpbuf, 0, 10);
1129 pAd->CommonCfg.bUseZeroToDisableFragment = FALSE;
1131 if (FragThresh > MAX_FRAG_THRESHOLD || FragThresh < MIN_FRAG_THRESHOLD)
1132 { //illegal FragThresh so we set it to default
1133 pAd->CommonCfg.FragmentThreshold = MAX_FRAG_THRESHOLD;
1134 pAd->CommonCfg.bUseZeroToDisableFragment = TRUE;
1136 else if (FragThresh % 2 == 1)
1138 // The length of each fragment shall always be an even number of octets, except for the last fragment
1139 // of an MSDU or MMPDU, which may be either an even or an odd number of octets.
1140 pAd->CommonCfg.FragmentThreshold = (USHORT)(FragThresh - 1);
1144 pAd->CommonCfg.FragmentThreshold = (USHORT)FragThresh;
1146 //pAd->CommonCfg.AllowFragSize = (pAd->CommonCfg.FragmentThreshold) - LENGTH_802_11 - LENGTH_CRC;
1147 DBGPRINT(RT_DEBUG_TRACE, ("FragThreshold=%d\n", pAd->CommonCfg.FragmentThreshold));
1150 if(RTMPGetKeyParameter("TxBurst", tmpbuf, 10, buffer))
1152 if(simple_strtol(tmpbuf, 0, 10) != 0) //Enable
1153 pAd->CommonCfg.bEnableTxBurst = TRUE;
1155 pAd->CommonCfg.bEnableTxBurst = FALSE;
1156 DBGPRINT(RT_DEBUG_TRACE, ("TxBurst=%d\n", pAd->CommonCfg.bEnableTxBurst));
1159 #ifdef AGGREGATION_SUPPORT
1161 if(RTMPGetKeyParameter("PktAggregate", tmpbuf, 10, buffer))
1163 if(simple_strtol(tmpbuf, 0, 10) != 0) //Enable
1164 pAd->CommonCfg.bAggregationCapable = TRUE;
1166 pAd->CommonCfg.bAggregationCapable = FALSE;
1167 #ifdef PIGGYBACK_SUPPORT
1168 pAd->CommonCfg.bPiggyBackCapable = pAd->CommonCfg.bAggregationCapable;
1169 #endif // PIGGYBACK_SUPPORT //
1170 DBGPRINT(RT_DEBUG_TRACE, ("PktAggregate=%d\n", pAd->CommonCfg.bAggregationCapable));
1173 pAd->CommonCfg.bAggregationCapable = FALSE;
1174 pAd->CommonCfg.bPiggyBackCapable = FALSE;
1175 #endif // AGGREGATION_SUPPORT //
1179 #ifdef CONFIG_STA_SUPPORT
1180 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1181 rtmp_read_sta_wmm_parms_from_file(pAd, tmpbuf, buffer);
1182 #endif // CONFIG_STA_SUPPORT //
1185 if(RTMPGetKeyParameter("ShortSlot", tmpbuf, 10, buffer))
1187 if(simple_strtol(tmpbuf, 0, 10) != 0) //Enable
1188 pAd->CommonCfg.bUseShortSlotTime = TRUE;
1190 pAd->CommonCfg.bUseShortSlotTime = FALSE;
1192 DBGPRINT(RT_DEBUG_TRACE, ("ShortSlot=%d\n", pAd->CommonCfg.bUseShortSlotTime));
1195 if(RTMPGetKeyParameter("IEEE80211H", tmpbuf, 10, buffer))
1197 for (i = 0, macptr = rstrtok(tmpbuf,";"); macptr; macptr = rstrtok(NULL,";"), i++)
1199 if(simple_strtol(macptr, 0, 10) != 0) //Enable
1200 pAd->CommonCfg.bIEEE80211H = TRUE;
1202 pAd->CommonCfg.bIEEE80211H = FALSE;
1204 DBGPRINT(RT_DEBUG_TRACE, ("IEEE80211H=%d\n", pAd->CommonCfg.bIEEE80211H));
1208 if(RTMPGetKeyParameter("CSPeriod", tmpbuf, 10, buffer))
1210 if(simple_strtol(tmpbuf, 0, 10) != 0)
1211 pAd->CommonCfg.RadarDetect.CSPeriod = simple_strtol(tmpbuf, 0, 10);
1213 pAd->CommonCfg.RadarDetect.CSPeriod = 0;
1215 DBGPRINT(RT_DEBUG_TRACE, ("CSPeriod=%d\n", pAd->CommonCfg.RadarDetect.CSPeriod));
1219 if(RTMPGetKeyParameter("RDRegion", tmpbuf, 128, buffer))
1221 if ((strncmp(tmpbuf, "JAP_W53", 7) == 0) || (strncmp(tmpbuf, "jap_w53", 7) == 0))
1223 pAd->CommonCfg.RadarDetect.RDDurRegion = JAP_W53;
1224 pAd->CommonCfg.RadarDetect.DfsSessionTime = 15;
1226 else if ((strncmp(tmpbuf, "JAP_W56", 7) == 0) || (strncmp(tmpbuf, "jap_w56", 7) == 0))
1228 pAd->CommonCfg.RadarDetect.RDDurRegion = JAP_W56;
1229 pAd->CommonCfg.RadarDetect.DfsSessionTime = 13;
1231 else if ((strncmp(tmpbuf, "JAP", 3) == 0) || (strncmp(tmpbuf, "jap", 3) == 0))
1233 pAd->CommonCfg.RadarDetect.RDDurRegion = JAP;
1234 pAd->CommonCfg.RadarDetect.DfsSessionTime = 5;
1236 else if ((strncmp(tmpbuf, "FCC", 3) == 0) || (strncmp(tmpbuf, "fcc", 3) == 0))
1238 pAd->CommonCfg.RadarDetect.RDDurRegion = FCC;
1239 pAd->CommonCfg.RadarDetect.DfsSessionTime = 5;
1241 else if ((strncmp(tmpbuf, "CE", 2) == 0) || (strncmp(tmpbuf, "ce", 2) == 0))
1243 pAd->CommonCfg.RadarDetect.RDDurRegion = CE;
1244 pAd->CommonCfg.RadarDetect.DfsSessionTime = 13;
1248 pAd->CommonCfg.RadarDetect.RDDurRegion = CE;
1249 pAd->CommonCfg.RadarDetect.DfsSessionTime = 13;
1252 DBGPRINT(RT_DEBUG_TRACE, ("RDRegion=%d\n", pAd->CommonCfg.RadarDetect.RDDurRegion));
1256 pAd->CommonCfg.RadarDetect.RDDurRegion = CE;
1257 pAd->CommonCfg.RadarDetect.DfsSessionTime = 13;
1261 if(RTMPGetKeyParameter("WirelessEvent", tmpbuf, 10, buffer))
1263 #if WIRELESS_EXT >= 15
1264 if(simple_strtol(tmpbuf, 0, 10) != 0)
1265 pAd->CommonCfg.bWirelessEvent = simple_strtol(tmpbuf, 0, 10);
1267 pAd->CommonCfg.bWirelessEvent = 0; // disable
1269 pAd->CommonCfg.bWirelessEvent = 0; // disable
1271 DBGPRINT(RT_DEBUG_TRACE, ("WirelessEvent=%d\n", pAd->CommonCfg.bWirelessEvent));
1273 if(RTMPGetKeyParameter("WiFiTest", tmpbuf, 10, buffer))
1275 if(simple_strtol(tmpbuf, 0, 10) != 0)
1276 pAd->CommonCfg.bWiFiTest= simple_strtol(tmpbuf, 0, 10);
1278 pAd->CommonCfg.bWiFiTest = 0; // disable
1280 DBGPRINT(RT_DEBUG_TRACE, ("WiFiTest=%d\n", pAd->CommonCfg.bWiFiTest));
1283 if(RTMPGetKeyParameter("AuthMode", tmpbuf, 128, buffer))
1285 #ifdef CONFIG_STA_SUPPORT
1286 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1288 if ((strcmp(tmpbuf, "WEPAUTO") == 0) || (strcmp(tmpbuf, "wepauto") == 0))
1289 pAd->StaCfg.AuthMode = Ndis802_11AuthModeAutoSwitch;
1290 else if ((strcmp(tmpbuf, "SHARED") == 0) || (strcmp(tmpbuf, "shared") == 0))
1291 pAd->StaCfg.AuthMode = Ndis802_11AuthModeShared;
1292 else if ((strcmp(tmpbuf, "WPAPSK") == 0) || (strcmp(tmpbuf, "wpapsk") == 0))
1293 pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPAPSK;
1294 else if ((strcmp(tmpbuf, "WPANONE") == 0) || (strcmp(tmpbuf, "wpanone") == 0))
1295 pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPANone;
1296 else if ((strcmp(tmpbuf, "WPA2PSK") == 0) || (strcmp(tmpbuf, "wpa2psk") == 0))
1297 pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPA2PSK;
1298 #ifdef WPA_SUPPLICANT_SUPPORT
1299 else if ((strcmp(tmpbuf, "WPA") == 0) || (strcmp(tmpbuf, "wpa") == 0))
1300 pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPA;
1301 else if ((strcmp(tmpbuf, "WPA2") == 0) || (strcmp(tmpbuf, "wpa2") == 0))
1302 pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPA2;
1303 #endif // WPA_SUPPLICANT_SUPPORT //
1305 pAd->StaCfg.AuthMode = Ndis802_11AuthModeOpen;
1307 pAd->StaCfg.PortSecured = WPA_802_1X_PORT_NOT_SECURED;
1309 DBGPRINT(RT_DEBUG_TRACE, ("%s::(EncrypType=%d)\n", __func__, pAd->StaCfg.WepStatus));
1311 #endif // CONFIG_STA_SUPPORT //
1314 if(RTMPGetKeyParameter("EncrypType", tmpbuf, 128, buffer))
1317 #ifdef CONFIG_STA_SUPPORT
1318 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1320 if ((strcmp(tmpbuf, "WEP") == 0) || (strcmp(tmpbuf, "wep") == 0))
1321 pAd->StaCfg.WepStatus = Ndis802_11WEPEnabled;
1322 else if ((strcmp(tmpbuf, "TKIP") == 0) || (strcmp(tmpbuf, "tkip") == 0))
1323 pAd->StaCfg.WepStatus = Ndis802_11Encryption2Enabled;
1324 else if ((strcmp(tmpbuf, "AES") == 0) || (strcmp(tmpbuf, "aes") == 0))
1325 pAd->StaCfg.WepStatus = Ndis802_11Encryption3Enabled;
1327 pAd->StaCfg.WepStatus = Ndis802_11WEPDisabled;
1329 // Update all wepstatus related
1330 pAd->StaCfg.PairCipher = pAd->StaCfg.WepStatus;
1331 pAd->StaCfg.GroupCipher = pAd->StaCfg.WepStatus;
1332 pAd->StaCfg.OrigWepStatus = pAd->StaCfg.WepStatus;
1333 pAd->StaCfg.bMixCipher = FALSE;
1335 DBGPRINT(RT_DEBUG_TRACE, ("%s::(EncrypType=%d)\n", __func__, pAd->StaCfg.WepStatus));
1337 #endif // CONFIG_STA_SUPPORT //
1342 #ifdef CONFIG_STA_SUPPORT
1343 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1345 if(RTMPGetCriticalParameter("WPAPSK", tmpbuf, 512, buffer))
1349 tmpbuf[strlen(tmpbuf)] = '\0'; // make STA can process .$^& for WPAPSK input
1351 if ((pAd->StaCfg.AuthMode != Ndis802_11AuthModeWPAPSK) &&
1352 (pAd->StaCfg.AuthMode != Ndis802_11AuthModeWPA2PSK) &&
1353 (pAd->StaCfg.AuthMode != Ndis802_11AuthModeWPANone)
1358 else if ((strlen(tmpbuf) >= 8) && (strlen(tmpbuf) < 64))
1360 PasswordHash((char *)tmpbuf, pAd->CommonCfg.Ssid, pAd->CommonCfg.SsidLen, keyMaterial);
1361 NdisMoveMemory(pAd->StaCfg.PMK, keyMaterial, 32);
1364 else if (strlen(tmpbuf) == 64)
1366 AtoH(tmpbuf, keyMaterial, 32);
1367 NdisMoveMemory(pAd->StaCfg.PMK, keyMaterial, 32);
1372 DBGPRINT(RT_DEBUG_ERROR, ("%s::(WPAPSK key-string required 8 ~ 64 characters!)\n", __func__));
1377 if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPAPSK) ||
1378 (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK))
1380 // Start STA supplicant state machine
1381 pAd->StaCfg.WpaState = SS_START;
1383 else if (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPANone)
1385 pAd->StaCfg.WpaState = SS_NOTUSE;
1388 DBGPRINT(RT_DEBUG_TRACE, ("%s::(WPAPSK=%s)\n", __func__, tmpbuf));
1392 #endif // CONFIG_STA_SUPPORT //
1394 //DefaultKeyID, KeyType, KeyStr
1395 rtmp_read_key_parms_from_file(pAd, tmpbuf, buffer);
1397 #ifdef DOT11_N_SUPPORT
1398 HTParametersHook(pAd, tmpbuf, buffer);
1399 #endif // DOT11_N_SUPPORT //
1401 #ifdef CONFIG_STA_SUPPORT
1402 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1405 if (RTMPGetKeyParameter("PSMode", tmpbuf, 32, buffer))
1407 if (pAd->StaCfg.BssType == BSS_INFRA)
1409 if ((strcmp(tmpbuf, "MAX_PSP") == 0) || (strcmp(tmpbuf, "max_psp") == 0))
1411 // do NOT turn on PSM bit here, wait until MlmeCheckForPsmChange()
1412 // to exclude certain situations.
1413 // MlmeSetPsm(pAd, PWR_SAVE);
1414 OPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM);
1415 if (pAd->StaCfg.bWindowsACCAMEnable == FALSE)
1416 pAd->StaCfg.WindowsPowerMode = Ndis802_11PowerModeMAX_PSP;
1417 pAd->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeMAX_PSP;
1418 pAd->StaCfg.DefaultListenCount = 5;
1420 else if ((strcmp(tmpbuf, "Fast_PSP") == 0) || (strcmp(tmpbuf, "fast_psp") == 0)
1421 || (strcmp(tmpbuf, "FAST_PSP") == 0))
1423 // do NOT turn on PSM bit here, wait until MlmeCheckForPsmChange()
1424 // to exclude certain situations.
1425 // MlmeSetPsmBit(pAd, PWR_SAVE);
1426 OPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM);
1427 if (pAd->StaCfg.bWindowsACCAMEnable == FALSE)
1428 pAd->StaCfg.WindowsPowerMode = Ndis802_11PowerModeFast_PSP;
1429 pAd->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeFast_PSP;
1430 pAd->StaCfg.DefaultListenCount = 3;
1432 else if ((strcmp(tmpbuf, "Legacy_PSP") == 0) || (strcmp(tmpbuf, "legacy_psp") == 0)
1433 || (strcmp(tmpbuf, "LEGACY_PSP") == 0))
1435 // do NOT turn on PSM bit here, wait until MlmeCheckForPsmChange()
1436 // to exclude certain situations.
1437 // MlmeSetPsmBit(pAd, PWR_SAVE);
1438 OPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM);
1439 if (pAd->StaCfg.bWindowsACCAMEnable == FALSE)
1440 pAd->StaCfg.WindowsPowerMode = Ndis802_11PowerModeLegacy_PSP;
1441 pAd->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeLegacy_PSP;
1442 pAd->StaCfg.DefaultListenCount = 3;
1445 { //Default Ndis802_11PowerModeCAM
1446 // clear PSM bit immediately
1447 MlmeSetPsmBit(pAd, PWR_ACTIVE);
1448 OPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM);
1449 if (pAd->StaCfg.bWindowsACCAMEnable == FALSE)
1450 pAd->StaCfg.WindowsPowerMode = Ndis802_11PowerModeCAM;
1451 pAd->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeCAM;
1453 DBGPRINT(RT_DEBUG_TRACE, ("PSMode=%ld\n", pAd->StaCfg.WindowsPowerMode));
1457 if (RTMPGetKeyParameter("FastRoaming", tmpbuf, 32, buffer))
1459 if (simple_strtol(tmpbuf, 0, 10) == 0)
1460 pAd->StaCfg.bFastRoaming = FALSE;
1462 pAd->StaCfg.bFastRoaming = TRUE;
1464 DBGPRINT(RT_DEBUG_TRACE, ("FastRoaming=%d\n", pAd->StaCfg.bFastRoaming));
1467 if (RTMPGetKeyParameter("RoamThreshold", tmpbuf, 32, buffer))
1469 long lInfo = simple_strtol(tmpbuf, 0, 10);
1471 if (lInfo > 90 || lInfo < 60)
1472 pAd->StaCfg.dBmToRoam = -70;
1474 pAd->StaCfg.dBmToRoam = (CHAR)(-1)*lInfo;
1476 DBGPRINT(RT_DEBUG_TRACE, ("RoamThreshold=%d dBm\n", pAd->StaCfg.dBmToRoam));
1479 if(RTMPGetKeyParameter("TGnWifiTest", tmpbuf, 10, buffer))
1481 if(simple_strtol(tmpbuf, 0, 10) == 0)
1482 pAd->StaCfg.bTGnWifiTest = FALSE;
1484 pAd->StaCfg.bTGnWifiTest = TRUE;
1485 DBGPRINT(RT_DEBUG_TRACE, ("TGnWifiTest=%d\n", pAd->StaCfg.bTGnWifiTest));
1488 #endif // CONFIG_STA_SUPPORT //
1494 DBGPRINT(RT_DEBUG_TRACE, ("--> %s does not have a write method\n", src));
1497 retval=filp_close(srcf,NULL);
1501 DBGPRINT(RT_DEBUG_TRACE, ("--> Error %d closing %s\n", -retval, src));
1509 current->cred->fsuid = orgfsuid;
1510 current->cred->fsgid = orgfsgid;
1516 return (NDIS_STATUS_SUCCESS);
1519 #ifdef DOT11_N_SUPPORT
1520 static void HTParametersHook(
1521 IN PRTMP_ADAPTER pAd,
1528 if (RTMPGetKeyParameter("HT_PROTECT", pValueStr, 25, pInput))
1530 Value = simple_strtol(pValueStr, 0, 10);
1533 pAd->CommonCfg.bHTProtect = FALSE;
1537 pAd->CommonCfg.bHTProtect = TRUE;
1539 DBGPRINT(RT_DEBUG_TRACE, ("HT: Protection = %s\n", (Value==0) ? "Disable" : "Enable"));
1542 if (RTMPGetKeyParameter("HT_MIMOPSEnable", pValueStr, 25, pInput))
1544 Value = simple_strtol(pValueStr, 0, 10);
1547 pAd->CommonCfg.bMIMOPSEnable = FALSE;
1551 pAd->CommonCfg.bMIMOPSEnable = TRUE;
1553 DBGPRINT(RT_DEBUG_TRACE, ("HT: MIMOPSEnable = %s\n", (Value==0) ? "Disable" : "Enable"));
1557 if (RTMPGetKeyParameter("HT_MIMOPSMode", pValueStr, 25, pInput))
1559 Value = simple_strtol(pValueStr, 0, 10);
1560 if (Value > MMPS_ENABLE)
1562 pAd->CommonCfg.BACapability.field.MMPSmode = MMPS_ENABLE;
1566 //TODO: add mimo power saving mechanism
1567 pAd->CommonCfg.BACapability.field.MMPSmode = MMPS_ENABLE;
1568 //pAd->CommonCfg.BACapability.field.MMPSmode = Value;
1570 DBGPRINT(RT_DEBUG_TRACE, ("HT: MIMOPS Mode = %d\n", Value));
1573 if (RTMPGetKeyParameter("HT_BADecline", pValueStr, 25, pInput))
1575 Value = simple_strtol(pValueStr, 0, 10);
1578 pAd->CommonCfg.bBADecline = FALSE;
1582 pAd->CommonCfg.bBADecline = TRUE;
1584 DBGPRINT(RT_DEBUG_TRACE, ("HT: BA Decline = %s\n", (Value==0) ? "Disable" : "Enable"));
1588 if (RTMPGetKeyParameter("HT_DisableReordering", pValueStr, 25, pInput))
1590 Value = simple_strtol(pValueStr, 0, 10);
1593 pAd->CommonCfg.bDisableReordering = FALSE;
1597 pAd->CommonCfg.bDisableReordering = TRUE;
1599 DBGPRINT(RT_DEBUG_TRACE, ("HT: DisableReordering = %s\n", (Value==0) ? "Disable" : "Enable"));
1602 if (RTMPGetKeyParameter("HT_AutoBA", pValueStr, 25, pInput))
1604 Value = simple_strtol(pValueStr, 0, 10);
1607 pAd->CommonCfg.BACapability.field.AutoBA = FALSE;
1611 pAd->CommonCfg.BACapability.field.AutoBA = TRUE;
1613 pAd->CommonCfg.REGBACapability.field.AutoBA = pAd->CommonCfg.BACapability.field.AutoBA;
1614 DBGPRINT(RT_DEBUG_TRACE, ("HT: Auto BA = %s\n", (Value==0) ? "Disable" : "Enable"));
1618 if (RTMPGetKeyParameter("HT_HTC", pValueStr, 25, pInput))
1620 Value = simple_strtol(pValueStr, 0, 10);
1623 pAd->HTCEnable = FALSE;
1627 pAd->HTCEnable = TRUE;
1629 DBGPRINT(RT_DEBUG_TRACE, ("HT: Tx +HTC frame = %s\n", (Value==0) ? "Disable" : "Enable"));
1632 // Enable HT Link Adaptation Control
1633 if (RTMPGetKeyParameter("HT_LinkAdapt", pValueStr, 25, pInput))
1635 Value = simple_strtol(pValueStr, 0, 10);
1638 pAd->bLinkAdapt = FALSE;
1642 pAd->HTCEnable = TRUE;
1643 pAd->bLinkAdapt = TRUE;
1645 DBGPRINT(RT_DEBUG_TRACE, ("HT: Link Adaptation Control = %s\n", (Value==0) ? "Disable" : "Enable(+HTC)"));
1648 // Reverse Direction Mechanism
1649 if (RTMPGetKeyParameter("HT_RDG", pValueStr, 25, pInput))
1651 Value = simple_strtol(pValueStr, 0, 10);
1654 pAd->CommonCfg.bRdg = FALSE;
1658 pAd->HTCEnable = TRUE;
1659 pAd->CommonCfg.bRdg = TRUE;
1661 DBGPRINT(RT_DEBUG_TRACE, ("HT: RDG = %s\n", (Value==0) ? "Disable" : "Enable(+HTC)"));
1668 if (RTMPGetKeyParameter("HT_AMSDU", pValueStr, 25, pInput))
1670 Value = simple_strtol(pValueStr, 0, 10);
1673 pAd->CommonCfg.BACapability.field.AmsduEnable = FALSE;
1677 pAd->CommonCfg.BACapability.field.AmsduEnable = TRUE;
1679 DBGPRINT(RT_DEBUG_TRACE, ("HT: Tx A-MSDU = %s\n", (Value==0) ? "Disable" : "Enable"));
1683 if (RTMPGetKeyParameter("HT_MpduDensity", pValueStr, 25, pInput))
1685 Value = simple_strtol(pValueStr, 0, 10);
1686 if (Value <=7 && Value >= 0)
1688 pAd->CommonCfg.BACapability.field.MpduDensity = Value;
1689 DBGPRINT(RT_DEBUG_TRACE, ("HT: MPDU Density = %d\n", Value));
1693 pAd->CommonCfg.BACapability.field.MpduDensity = 4;
1694 DBGPRINT(RT_DEBUG_TRACE, ("HT: MPDU Density = %d (Default)\n", 4));
1698 // Max Rx BA Window Size
1699 if (RTMPGetKeyParameter("HT_BAWinSize", pValueStr, 25, pInput))
1701 Value = simple_strtol(pValueStr, 0, 10);
1703 if (Value >=1 && Value <= 64)
1705 pAd->CommonCfg.REGBACapability.field.RxBAWinLimit = Value;
1706 pAd->CommonCfg.BACapability.field.RxBAWinLimit = Value;
1707 DBGPRINT(RT_DEBUG_TRACE, ("HT: BA Windw Size = %d\n", Value));
1711 pAd->CommonCfg.REGBACapability.field.RxBAWinLimit = 64;
1712 pAd->CommonCfg.BACapability.field.RxBAWinLimit = 64;
1713 DBGPRINT(RT_DEBUG_TRACE, ("HT: BA Windw Size = 64 (Defualt)\n"));
1719 if (RTMPGetKeyParameter("HT_GI", pValueStr, 25, pInput))
1721 Value = simple_strtol(pValueStr, 0, 10);
1723 if (Value == GI_400)
1725 pAd->CommonCfg.RegTransmitSetting.field.ShortGI = GI_400;
1729 pAd->CommonCfg.RegTransmitSetting.field.ShortGI = GI_800;
1732 DBGPRINT(RT_DEBUG_TRACE, ("HT: Guard Interval = %s\n", (Value==GI_400) ? "400" : "800" ));
1735 // HT Operation Mode : Mixed Mode , Green Field
1736 if (RTMPGetKeyParameter("HT_OpMode", pValueStr, 25, pInput))
1738 Value = simple_strtol(pValueStr, 0, 10);
1740 if (Value == HTMODE_GF)
1743 pAd->CommonCfg.RegTransmitSetting.field.HTMODE = HTMODE_GF;
1747 pAd->CommonCfg.RegTransmitSetting.field.HTMODE = HTMODE_MM;
1750 DBGPRINT(RT_DEBUG_TRACE, ("HT: Operate Mode = %s\n", (Value==HTMODE_GF) ? "Green Field" : "Mixed Mode" ));
1753 // Fixed Tx mode : CCK, OFDM
1754 if (RTMPGetKeyParameter("FixedTxMode", pValueStr, 25, pInput))
1758 #ifdef CONFIG_STA_SUPPORT
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));
1791 #endif // CONFIG_STA_SUPPORT //
1796 if (RTMPGetKeyParameter("HT_BW", pValueStr, 25, pInput))
1798 Value = simple_strtol(pValueStr, 0, 10);
1802 pAd->CommonCfg.RegTransmitSetting.field.BW = BW_40;
1806 pAd->CommonCfg.RegTransmitSetting.field.BW = BW_20;
1809 #ifdef MCAST_RATE_SPECIFIC
1810 pAd->CommonCfg.MCastPhyMode.field.BW = pAd->CommonCfg.RegTransmitSetting.field.BW;
1811 #endif // MCAST_RATE_SPECIFIC //
1813 DBGPRINT(RT_DEBUG_TRACE, ("HT: Channel Width = %s\n", (Value==BW_40) ? "40 MHz" : "20 MHz" ));
1816 if (RTMPGetKeyParameter("HT_EXTCHA", pValueStr, 25, pInput))
1818 Value = simple_strtol(pValueStr, 0, 10);
1823 pAd->CommonCfg.RegTransmitSetting.field.EXTCHA = EXTCHA_BELOW;
1827 pAd->CommonCfg.RegTransmitSetting.field.EXTCHA = EXTCHA_ABOVE;
1830 DBGPRINT(RT_DEBUG_TRACE, ("HT: Ext Channel = %s\n", (Value==0) ? "BELOW" : "ABOVE" ));
1834 if (RTMPGetKeyParameter("HT_MCS", pValueStr, 50, pInput))
1837 #ifdef CONFIG_STA_SUPPORT
1838 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1840 Value = simple_strtol(pValueStr, 0, 10);
1842 if ((Value >= 0 && Value <= 23) || (Value == 32)) // 3*3
1844 pAd->StaCfg.DesiredTransmitSetting.field.MCS = Value;
1845 pAd->StaCfg.bAutoTxRateSwitch = FALSE;
1846 DBGPRINT(RT_DEBUG_TRACE, ("HT: MCS = %d\n", pAd->StaCfg.DesiredTransmitSetting.field.MCS));
1850 pAd->StaCfg.DesiredTransmitSetting.field.MCS = MCS_AUTO;
1851 pAd->StaCfg.bAutoTxRateSwitch = TRUE;
1852 DBGPRINT(RT_DEBUG_TRACE, ("HT: MCS = AUTO\n"));
1855 #endif // CONFIG_STA_SUPPORT //
1859 if (RTMPGetKeyParameter("HT_STBC", pValueStr, 25, pInput))
1861 Value = simple_strtol(pValueStr, 0, 10);
1862 if (Value == STBC_USE)
1864 pAd->CommonCfg.RegTransmitSetting.field.STBC = STBC_USE;
1868 pAd->CommonCfg.RegTransmitSetting.field.STBC = STBC_NONE;
1870 DBGPRINT(RT_DEBUG_TRACE, ("HT: STBC = %d\n", pAd->CommonCfg.RegTransmitSetting.field.STBC));
1873 // 40_Mhz_Intolerant
1874 if (RTMPGetKeyParameter("HT_40MHZ_INTOLERANT", pValueStr, 25, pInput))
1876 Value = simple_strtol(pValueStr, 0, 10);
1879 pAd->CommonCfg.bForty_Mhz_Intolerant = FALSE;
1883 pAd->CommonCfg.bForty_Mhz_Intolerant = TRUE;
1885 DBGPRINT(RT_DEBUG_TRACE, ("HT: 40MHZ INTOLERANT = %d\n", pAd->CommonCfg.bForty_Mhz_Intolerant));
1888 if(RTMPGetKeyParameter("HT_TxStream", pValueStr, 10, pInput))
1890 switch (simple_strtol(pValueStr, 0, 10))
1893 pAd->CommonCfg.TxStream = 1;
1896 pAd->CommonCfg.TxStream = 2;
1900 pAd->CommonCfg.TxStream = 3;
1902 if (pAd->MACVersion < RALINK_2883_VERSION)
1903 pAd->CommonCfg.TxStream = 2; // only 2 tx streams for RT2860 series
1906 DBGPRINT(RT_DEBUG_TRACE, ("HT: Tx Stream = %d\n", pAd->CommonCfg.TxStream));
1909 if(RTMPGetKeyParameter("HT_RxStream", pValueStr, 10, pInput))
1911 switch (simple_strtol(pValueStr, 0, 10))
1914 pAd->CommonCfg.RxStream = 1;
1917 pAd->CommonCfg.RxStream = 2;
1921 pAd->CommonCfg.RxStream = 3;
1923 if (pAd->MACVersion < RALINK_2883_VERSION)
1924 pAd->CommonCfg.RxStream = 2; // only 2 rx streams for RT2860 series
1927 DBGPRINT(RT_DEBUG_TRACE, ("HT: Rx Stream = %d\n", pAd->CommonCfg.RxStream));
1931 #endif // DOT11_N_SUPPORT //