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 #ifdef QOS_DLS_SUPPORT
826 if(RTMPGetKeyParameter("DLSCapable", tmpbuf, 32, buffer))
828 if(simple_strtol(tmpbuf, 0, 10) != 0) //Enable
830 pAd->CommonCfg.bDLSCapable = TRUE;
834 pAd->CommonCfg.bDLSCapable = FALSE;
837 DBGPRINT(RT_DEBUG_TRACE, ("bDLSCapable=%d\n", pAd->CommonCfg.bDLSCapable));
839 #endif // QOS_DLS_SUPPORT //
841 //AckPolicy for AC_BK, AC_BE, AC_VI, AC_VO
842 if(RTMPGetKeyParameter("AckPolicy", tmpbuf, 32, buffer))
844 for (i = 0, macptr = rstrtok(tmpbuf,";"); macptr; macptr = rstrtok(NULL,";"), i++)
846 pAd->CommonCfg.AckPolicy[i] = (UCHAR)simple_strtol(macptr, 0, 10);
848 DBGPRINT(RT_DEBUG_TRACE, ("AckPolicy[%d]=%d\n", i, pAd->CommonCfg.AckPolicy[i]));
855 if(RTMPGetKeyParameter("APSDCapable", tmpbuf, 10, buffer))
857 if(simple_strtol(tmpbuf, 0, 10) != 0) //Enable
858 pAd->CommonCfg.bAPSDCapable = TRUE;
860 pAd->CommonCfg.bAPSDCapable = FALSE;
862 DBGPRINT(RT_DEBUG_TRACE, ("APSDCapable=%d\n", pAd->CommonCfg.bAPSDCapable));
865 //APSDAC for AC_BE, AC_BK, AC_VI, AC_VO
866 if(RTMPGetKeyParameter("APSDAC", tmpbuf, 32, buffer))
870 for (i = 0, macptr = rstrtok(tmpbuf,";"); macptr; macptr = rstrtok(NULL,";"), i++)
872 apsd_ac[i] = (BOOLEAN)simple_strtol(macptr, 0, 10);
874 DBGPRINT(RT_DEBUG_TRACE, ("APSDAC%d %d\n", i, apsd_ac[i]));
877 pAd->CommonCfg.bAPSDAC_BE = apsd_ac[0];
878 pAd->CommonCfg.bAPSDAC_BK = apsd_ac[1];
879 pAd->CommonCfg.bAPSDAC_VI = apsd_ac[2];
880 pAd->CommonCfg.bAPSDAC_VO = apsd_ac[3];
885 #endif // CONFIG_STA_SUPPORT //
888 NDIS_STATUS RTMPReadParametersHook(
889 IN PRTMP_ADAPTER pAd)
893 INT retval, orgfsuid, orgfsgid;
899 #ifdef CONFIG_STA_SUPPORT
900 UCHAR keyMaterial[40];
901 #endif // CONFIG_STA_SUPPORT //
907 buffer = kmalloc(MAX_INI_BUFFER_SIZE, MEM_ALLOC_FLAG);
909 return NDIS_STATUS_FAILURE;
911 tmpbuf = kmalloc(MAX_PARAM_BUFFER_SIZE, MEM_ALLOC_FLAG);
915 return NDIS_STATUS_FAILURE;
918 #ifdef CONFIG_STA_SUPPORT
919 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
920 src = STA_PROFILE_PATH;
921 #endif // CONFIG_STA_SUPPORT //
922 #ifdef MULTIPLE_CARD_SUPPORT
923 src = pAd->MC_FileName;
924 #endif // MULTIPLE_CARD_SUPPORT //
926 // Save uid and gid used for filesystem access.
927 // Set user and group to 0 (root)
928 orgfsuid = current_fsuid();
929 orgfsgid = current_fsgid();
930 /* Hm, can't really do this nicely anymore, so rely on these files
931 * being set to the proper permission to read them... */
932 /* current->cred->fsuid = current->cred->fsgid = 0; */
938 srcf = filp_open(src, O_RDONLY, 0);
941 DBGPRINT(RT_DEBUG_ERROR, ("--> Error %ld opening %s\n", -PTR_ERR(srcf),src));
945 // The object must have a read method
946 if (srcf->f_op && srcf->f_op->read)
948 memset(buffer, 0x00, MAX_INI_BUFFER_SIZE);
949 retval=srcf->f_op->read(srcf, buffer, MAX_INI_BUFFER_SIZE, &srcf->f_pos);
952 DBGPRINT(RT_DEBUG_TRACE, ("--> Read %s error %d\n", src, -retval));
956 // set file parameter to portcfg
958 if(RTMPGetKeyParameter("CountryRegion", tmpbuf, 25, buffer))
960 pAd->CommonCfg.CountryRegion = (UCHAR) simple_strtol(tmpbuf, 0, 10);
961 DBGPRINT(RT_DEBUG_TRACE, ("CountryRegion=%d\n", pAd->CommonCfg.CountryRegion));
964 if(RTMPGetKeyParameter("CountryRegionABand", tmpbuf, 25, buffer))
966 pAd->CommonCfg.CountryRegionForABand= (UCHAR) simple_strtol(tmpbuf, 0, 10);
967 DBGPRINT(RT_DEBUG_TRACE, ("CountryRegionABand=%d\n", pAd->CommonCfg.CountryRegionForABand));
970 if(RTMPGetKeyParameter("CountryCode", tmpbuf, 25, buffer))
972 NdisMoveMemory(pAd->CommonCfg.CountryCode, tmpbuf , 2);
973 #ifdef CONFIG_STA_SUPPORT
974 #ifdef EXT_BUILD_CHANNEL_LIST
975 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
976 NdisMoveMemory(pAd->StaCfg.StaOriCountryCode, tmpbuf , 2);
977 #endif // EXT_BUILD_CHANNEL_LIST //
978 #endif // CONFIG_STA_SUPPORT //
979 if (strlen(pAd->CommonCfg.CountryCode) != 0)
981 pAd->CommonCfg.bCountryFlag = TRUE;
983 DBGPRINT(RT_DEBUG_TRACE, ("CountryCode=%s\n", pAd->CommonCfg.CountryCode));
986 if(RTMPGetKeyParameter("ChannelGeography", tmpbuf, 25, buffer))
988 UCHAR Geography = (UCHAR) simple_strtol(tmpbuf, 0, 10);
989 if (Geography <= BOTH)
991 pAd->CommonCfg.Geography = Geography;
992 pAd->CommonCfg.CountryCode[2] =
993 (pAd->CommonCfg.Geography == BOTH) ? ' ' : ((pAd->CommonCfg.Geography == IDOR) ? 'I' : 'O');
994 #ifdef CONFIG_STA_SUPPORT
995 #ifdef EXT_BUILD_CHANNEL_LIST
996 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
997 pAd->StaCfg.StaOriGeography = pAd->CommonCfg.Geography;
998 #endif // EXT_BUILD_CHANNEL_LIST //
999 #endif // CONFIG_STA_SUPPORT //
1000 DBGPRINT(RT_DEBUG_TRACE, ("ChannelGeography=%d\n", pAd->CommonCfg.Geography));
1005 pAd->CommonCfg.Geography = BOTH;
1006 pAd->CommonCfg.CountryCode[2] = ' ';
1010 #ifdef CONFIG_STA_SUPPORT
1011 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1014 if (RTMPGetCriticalParameter("SSID", tmpbuf, 256, buffer))
1016 if (strlen(tmpbuf) <= 32)
1018 pAd->CommonCfg.SsidLen = (UCHAR) strlen(tmpbuf);
1019 NdisZeroMemory(pAd->CommonCfg.Ssid, NDIS_802_11_LENGTH_SSID);
1020 NdisMoveMemory(pAd->CommonCfg.Ssid, tmpbuf, pAd->CommonCfg.SsidLen);
1021 pAd->MlmeAux.AutoReconnectSsidLen = pAd->CommonCfg.SsidLen;
1022 NdisZeroMemory(pAd->MlmeAux.AutoReconnectSsid, NDIS_802_11_LENGTH_SSID);
1023 NdisMoveMemory(pAd->MlmeAux.AutoReconnectSsid, tmpbuf, pAd->MlmeAux.AutoReconnectSsidLen);
1024 pAd->MlmeAux.SsidLen = pAd->CommonCfg.SsidLen;
1025 NdisZeroMemory(pAd->MlmeAux.Ssid, NDIS_802_11_LENGTH_SSID);
1026 NdisMoveMemory(pAd->MlmeAux.Ssid, tmpbuf, pAd->MlmeAux.SsidLen);
1027 DBGPRINT(RT_DEBUG_TRACE, ("%s::(SSID=%s)\n", __func__, tmpbuf));
1031 #endif // CONFIG_STA_SUPPORT //
1033 #ifdef CONFIG_STA_SUPPORT
1034 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1037 if (RTMPGetKeyParameter("NetworkType", tmpbuf, 25, buffer))
1039 pAd->bConfigChanged = TRUE;
1040 if (strcmp(tmpbuf, "Adhoc") == 0)
1041 pAd->StaCfg.BssType = BSS_ADHOC;
1042 else //Default Infrastructure mode
1043 pAd->StaCfg.BssType = BSS_INFRA;
1044 // Reset Ralink supplicant to not use, it will be set to start when UI set PMK key
1045 pAd->StaCfg.WpaState = SS_NOTUSE;
1046 DBGPRINT(RT_DEBUG_TRACE, ("%s::(NetworkType=%d)\n", __func__, pAd->StaCfg.BssType));
1049 #endif // CONFIG_STA_SUPPORT //
1051 if(RTMPGetKeyParameter("Channel", tmpbuf, 10, buffer))
1053 pAd->CommonCfg.Channel = (UCHAR) simple_strtol(tmpbuf, 0, 10);
1054 DBGPRINT(RT_DEBUG_TRACE, ("Channel=%d\n", pAd->CommonCfg.Channel));
1057 if(RTMPGetKeyParameter("WirelessMode", tmpbuf, 10, buffer))
1059 int value = 0, maxPhyMode = PHY_11G;
1061 #ifdef DOT11_N_SUPPORT
1062 maxPhyMode = PHY_11N_5G;
1063 #endif // DOT11_N_SUPPORT //
1065 value = simple_strtol(tmpbuf, 0, 10);
1067 if (value <= maxPhyMode)
1069 pAd->CommonCfg.PhyMode = value;
1071 DBGPRINT(RT_DEBUG_TRACE, ("PhyMode=%d\n", pAd->CommonCfg.PhyMode));
1074 if(RTMPGetKeyParameter("BasicRate", tmpbuf, 10, buffer))
1076 pAd->CommonCfg.BasicRateBitmap = (ULONG) simple_strtol(tmpbuf, 0, 10);
1077 DBGPRINT(RT_DEBUG_TRACE, ("BasicRate=%ld\n", pAd->CommonCfg.BasicRateBitmap));
1080 if(RTMPGetKeyParameter("BeaconPeriod", tmpbuf, 10, buffer))
1082 pAd->CommonCfg.BeaconPeriod = (USHORT) simple_strtol(tmpbuf, 0, 10);
1083 DBGPRINT(RT_DEBUG_TRACE, ("BeaconPeriod=%d\n", pAd->CommonCfg.BeaconPeriod));
1086 if(RTMPGetKeyParameter("TxPower", tmpbuf, 10, buffer))
1088 pAd->CommonCfg.TxPowerPercentage = (ULONG) simple_strtol(tmpbuf, 0, 10);
1089 #ifdef CONFIG_STA_SUPPORT
1090 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1091 pAd->CommonCfg.TxPowerDefault = pAd->CommonCfg.TxPowerPercentage;
1092 #endif // CONFIG_STA_SUPPORT //
1093 DBGPRINT(RT_DEBUG_TRACE, ("TxPower=%ld\n", pAd->CommonCfg.TxPowerPercentage));
1096 if(RTMPGetKeyParameter("BGProtection", tmpbuf, 10, buffer))
1098 switch (simple_strtol(tmpbuf, 0, 10))
1101 pAd->CommonCfg.UseBGProtection = 1;
1103 case 2: //Always OFF
1104 pAd->CommonCfg.UseBGProtection = 2;
1108 pAd->CommonCfg.UseBGProtection = 0;
1111 DBGPRINT(RT_DEBUG_TRACE, ("BGProtection=%ld\n", pAd->CommonCfg.UseBGProtection));
1114 if(RTMPGetKeyParameter("DisableOLBC", tmpbuf, 10, buffer))
1116 switch (simple_strtol(tmpbuf, 0, 10))
1118 case 1: //disable OLBC Detection
1119 pAd->CommonCfg.DisableOLBCDetect = 1;
1121 case 0: //enable OLBC Detection
1122 pAd->CommonCfg.DisableOLBCDetect = 0;
1125 pAd->CommonCfg.DisableOLBCDetect= 0;
1128 DBGPRINT(RT_DEBUG_TRACE, ("OLBCDetection=%ld\n", pAd->CommonCfg.DisableOLBCDetect));
1131 if(RTMPGetKeyParameter("TxPreamble", tmpbuf, 10, buffer))
1133 switch (simple_strtol(tmpbuf, 0, 10))
1135 case Rt802_11PreambleShort:
1136 pAd->CommonCfg.TxPreamble = Rt802_11PreambleShort;
1138 case Rt802_11PreambleLong:
1140 pAd->CommonCfg.TxPreamble = Rt802_11PreambleLong;
1143 DBGPRINT(RT_DEBUG_TRACE, ("TxPreamble=%ld\n", pAd->CommonCfg.TxPreamble));
1146 if(RTMPGetKeyParameter("RTSThreshold", tmpbuf, 10, buffer))
1148 RtsThresh = simple_strtol(tmpbuf, 0, 10);
1149 if( (RtsThresh >= 1) && (RtsThresh <= MAX_RTS_THRESHOLD) )
1150 pAd->CommonCfg.RtsThreshold = (USHORT)RtsThresh;
1152 pAd->CommonCfg.RtsThreshold = MAX_RTS_THRESHOLD;
1154 DBGPRINT(RT_DEBUG_TRACE, ("RTSThreshold=%d\n", pAd->CommonCfg.RtsThreshold));
1157 if(RTMPGetKeyParameter("FragThreshold", tmpbuf, 10, buffer))
1159 FragThresh = simple_strtol(tmpbuf, 0, 10);
1160 pAd->CommonCfg.bUseZeroToDisableFragment = FALSE;
1162 if (FragThresh > MAX_FRAG_THRESHOLD || FragThresh < MIN_FRAG_THRESHOLD)
1163 { //illegal FragThresh so we set it to default
1164 pAd->CommonCfg.FragmentThreshold = MAX_FRAG_THRESHOLD;
1165 pAd->CommonCfg.bUseZeroToDisableFragment = TRUE;
1167 else if (FragThresh % 2 == 1)
1169 // The length of each fragment shall always be an even number of octets, except for the last fragment
1170 // of an MSDU or MMPDU, which may be either an even or an odd number of octets.
1171 pAd->CommonCfg.FragmentThreshold = (USHORT)(FragThresh - 1);
1175 pAd->CommonCfg.FragmentThreshold = (USHORT)FragThresh;
1177 //pAd->CommonCfg.AllowFragSize = (pAd->CommonCfg.FragmentThreshold) - LENGTH_802_11 - LENGTH_CRC;
1178 DBGPRINT(RT_DEBUG_TRACE, ("FragThreshold=%d\n", pAd->CommonCfg.FragmentThreshold));
1181 if(RTMPGetKeyParameter("TxBurst", tmpbuf, 10, buffer))
1183 if(simple_strtol(tmpbuf, 0, 10) != 0) //Enable
1184 pAd->CommonCfg.bEnableTxBurst = TRUE;
1186 pAd->CommonCfg.bEnableTxBurst = FALSE;
1187 DBGPRINT(RT_DEBUG_TRACE, ("TxBurst=%d\n", pAd->CommonCfg.bEnableTxBurst));
1190 #ifdef AGGREGATION_SUPPORT
1192 if(RTMPGetKeyParameter("PktAggregate", tmpbuf, 10, buffer))
1194 if(simple_strtol(tmpbuf, 0, 10) != 0) //Enable
1195 pAd->CommonCfg.bAggregationCapable = TRUE;
1197 pAd->CommonCfg.bAggregationCapable = FALSE;
1198 #ifdef PIGGYBACK_SUPPORT
1199 pAd->CommonCfg.bPiggyBackCapable = pAd->CommonCfg.bAggregationCapable;
1200 #endif // PIGGYBACK_SUPPORT //
1201 DBGPRINT(RT_DEBUG_TRACE, ("PktAggregate=%d\n", pAd->CommonCfg.bAggregationCapable));
1204 pAd->CommonCfg.bAggregationCapable = FALSE;
1205 pAd->CommonCfg.bPiggyBackCapable = FALSE;
1206 #endif // AGGREGATION_SUPPORT //
1210 #ifdef CONFIG_STA_SUPPORT
1211 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1212 rtmp_read_sta_wmm_parms_from_file(pAd, tmpbuf, buffer);
1213 #endif // CONFIG_STA_SUPPORT //
1216 if(RTMPGetKeyParameter("ShortSlot", tmpbuf, 10, buffer))
1218 if(simple_strtol(tmpbuf, 0, 10) != 0) //Enable
1219 pAd->CommonCfg.bUseShortSlotTime = TRUE;
1221 pAd->CommonCfg.bUseShortSlotTime = FALSE;
1223 DBGPRINT(RT_DEBUG_TRACE, ("ShortSlot=%d\n", pAd->CommonCfg.bUseShortSlotTime));
1226 if(RTMPGetKeyParameter("IEEE80211H", tmpbuf, 10, buffer))
1228 for (i = 0, macptr = rstrtok(tmpbuf,";"); macptr; macptr = rstrtok(NULL,";"), i++)
1230 if(simple_strtol(macptr, 0, 10) != 0) //Enable
1231 pAd->CommonCfg.bIEEE80211H = TRUE;
1233 pAd->CommonCfg.bIEEE80211H = FALSE;
1235 DBGPRINT(RT_DEBUG_TRACE, ("IEEE80211H=%d\n", pAd->CommonCfg.bIEEE80211H));
1239 if(RTMPGetKeyParameter("CSPeriod", tmpbuf, 10, buffer))
1241 if(simple_strtol(tmpbuf, 0, 10) != 0)
1242 pAd->CommonCfg.RadarDetect.CSPeriod = simple_strtol(tmpbuf, 0, 10);
1244 pAd->CommonCfg.RadarDetect.CSPeriod = 0;
1246 DBGPRINT(RT_DEBUG_TRACE, ("CSPeriod=%d\n", pAd->CommonCfg.RadarDetect.CSPeriod));
1250 if(RTMPGetKeyParameter("RDRegion", tmpbuf, 128, buffer))
1252 if ((strncmp(tmpbuf, "JAP_W53", 7) == 0) || (strncmp(tmpbuf, "jap_w53", 7) == 0))
1254 pAd->CommonCfg.RadarDetect.RDDurRegion = JAP_W53;
1255 pAd->CommonCfg.RadarDetect.DfsSessionTime = 15;
1257 else if ((strncmp(tmpbuf, "JAP_W56", 7) == 0) || (strncmp(tmpbuf, "jap_w56", 7) == 0))
1259 pAd->CommonCfg.RadarDetect.RDDurRegion = JAP_W56;
1260 pAd->CommonCfg.RadarDetect.DfsSessionTime = 13;
1262 else if ((strncmp(tmpbuf, "JAP", 3) == 0) || (strncmp(tmpbuf, "jap", 3) == 0))
1264 pAd->CommonCfg.RadarDetect.RDDurRegion = JAP;
1265 pAd->CommonCfg.RadarDetect.DfsSessionTime = 5;
1267 else if ((strncmp(tmpbuf, "FCC", 3) == 0) || (strncmp(tmpbuf, "fcc", 3) == 0))
1269 pAd->CommonCfg.RadarDetect.RDDurRegion = FCC;
1270 pAd->CommonCfg.RadarDetect.DfsSessionTime = 5;
1272 else if ((strncmp(tmpbuf, "CE", 2) == 0) || (strncmp(tmpbuf, "ce", 2) == 0))
1274 pAd->CommonCfg.RadarDetect.RDDurRegion = CE;
1275 pAd->CommonCfg.RadarDetect.DfsSessionTime = 13;
1279 pAd->CommonCfg.RadarDetect.RDDurRegion = CE;
1280 pAd->CommonCfg.RadarDetect.DfsSessionTime = 13;
1283 DBGPRINT(RT_DEBUG_TRACE, ("RDRegion=%d\n", pAd->CommonCfg.RadarDetect.RDDurRegion));
1287 pAd->CommonCfg.RadarDetect.RDDurRegion = CE;
1288 pAd->CommonCfg.RadarDetect.DfsSessionTime = 13;
1292 if(RTMPGetKeyParameter("WirelessEvent", tmpbuf, 10, buffer))
1294 #if WIRELESS_EXT >= 15
1295 if(simple_strtol(tmpbuf, 0, 10) != 0)
1296 pAd->CommonCfg.bWirelessEvent = simple_strtol(tmpbuf, 0, 10);
1298 pAd->CommonCfg.bWirelessEvent = 0; // disable
1300 pAd->CommonCfg.bWirelessEvent = 0; // disable
1302 DBGPRINT(RT_DEBUG_TRACE, ("WirelessEvent=%d\n", pAd->CommonCfg.bWirelessEvent));
1304 if(RTMPGetKeyParameter("WiFiTest", tmpbuf, 10, buffer))
1306 if(simple_strtol(tmpbuf, 0, 10) != 0)
1307 pAd->CommonCfg.bWiFiTest= simple_strtol(tmpbuf, 0, 10);
1309 pAd->CommonCfg.bWiFiTest = 0; // disable
1311 DBGPRINT(RT_DEBUG_TRACE, ("WiFiTest=%d\n", pAd->CommonCfg.bWiFiTest));
1314 if(RTMPGetKeyParameter("AuthMode", tmpbuf, 128, buffer))
1316 #ifdef CONFIG_STA_SUPPORT
1317 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1319 if ((strcmp(tmpbuf, "WEPAUTO") == 0) || (strcmp(tmpbuf, "wepauto") == 0))
1320 pAd->StaCfg.AuthMode = Ndis802_11AuthModeAutoSwitch;
1321 else if ((strcmp(tmpbuf, "SHARED") == 0) || (strcmp(tmpbuf, "shared") == 0))
1322 pAd->StaCfg.AuthMode = Ndis802_11AuthModeShared;
1323 else if ((strcmp(tmpbuf, "WPAPSK") == 0) || (strcmp(tmpbuf, "wpapsk") == 0))
1324 pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPAPSK;
1325 else if ((strcmp(tmpbuf, "WPANONE") == 0) || (strcmp(tmpbuf, "wpanone") == 0))
1326 pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPANone;
1327 else if ((strcmp(tmpbuf, "WPA2PSK") == 0) || (strcmp(tmpbuf, "wpa2psk") == 0))
1328 pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPA2PSK;
1329 #ifdef WPA_SUPPLICANT_SUPPORT
1330 else if ((strcmp(tmpbuf, "WPA") == 0) || (strcmp(tmpbuf, "wpa") == 0))
1331 pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPA;
1332 else if ((strcmp(tmpbuf, "WPA2") == 0) || (strcmp(tmpbuf, "wpa2") == 0))
1333 pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPA2;
1334 #endif // WPA_SUPPLICANT_SUPPORT //
1336 pAd->StaCfg.AuthMode = Ndis802_11AuthModeOpen;
1338 pAd->StaCfg.PortSecured = WPA_802_1X_PORT_NOT_SECURED;
1340 DBGPRINT(RT_DEBUG_TRACE, ("%s::(EncrypType=%d)\n", __func__, pAd->StaCfg.WepStatus));
1342 #endif // CONFIG_STA_SUPPORT //
1345 if(RTMPGetKeyParameter("EncrypType", tmpbuf, 128, buffer))
1348 #ifdef CONFIG_STA_SUPPORT
1349 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1351 if ((strcmp(tmpbuf, "WEP") == 0) || (strcmp(tmpbuf, "wep") == 0))
1352 pAd->StaCfg.WepStatus = Ndis802_11WEPEnabled;
1353 else if ((strcmp(tmpbuf, "TKIP") == 0) || (strcmp(tmpbuf, "tkip") == 0))
1354 pAd->StaCfg.WepStatus = Ndis802_11Encryption2Enabled;
1355 else if ((strcmp(tmpbuf, "AES") == 0) || (strcmp(tmpbuf, "aes") == 0))
1356 pAd->StaCfg.WepStatus = Ndis802_11Encryption3Enabled;
1358 pAd->StaCfg.WepStatus = Ndis802_11WEPDisabled;
1360 // Update all wepstatus related
1361 pAd->StaCfg.PairCipher = pAd->StaCfg.WepStatus;
1362 pAd->StaCfg.GroupCipher = pAd->StaCfg.WepStatus;
1363 pAd->StaCfg.OrigWepStatus = pAd->StaCfg.WepStatus;
1364 pAd->StaCfg.bMixCipher = FALSE;
1366 DBGPRINT(RT_DEBUG_TRACE, ("%s::(EncrypType=%d)\n", __func__, pAd->StaCfg.WepStatus));
1368 #endif // CONFIG_STA_SUPPORT //
1373 #ifdef CONFIG_STA_SUPPORT
1374 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1376 if(RTMPGetCriticalParameter("WPAPSK", tmpbuf, 512, buffer))
1380 tmpbuf[strlen(tmpbuf)] = '\0'; // make STA can process .$^& for WPAPSK input
1382 if ((pAd->StaCfg.AuthMode != Ndis802_11AuthModeWPAPSK) &&
1383 (pAd->StaCfg.AuthMode != Ndis802_11AuthModeWPA2PSK) &&
1384 (pAd->StaCfg.AuthMode != Ndis802_11AuthModeWPANone)
1389 else if ((strlen(tmpbuf) >= 8) && (strlen(tmpbuf) < 64))
1391 PasswordHash((char *)tmpbuf, pAd->CommonCfg.Ssid, pAd->CommonCfg.SsidLen, keyMaterial);
1392 NdisMoveMemory(pAd->StaCfg.PMK, keyMaterial, 32);
1395 else if (strlen(tmpbuf) == 64)
1397 AtoH(tmpbuf, keyMaterial, 32);
1398 NdisMoveMemory(pAd->StaCfg.PMK, keyMaterial, 32);
1403 DBGPRINT(RT_DEBUG_ERROR, ("%s::(WPAPSK key-string required 8 ~ 64 characters!)\n", __func__));
1408 if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPAPSK) ||
1409 (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK))
1411 // Start STA supplicant state machine
1412 pAd->StaCfg.WpaState = SS_START;
1414 else if (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPANone)
1416 pAd->StaCfg.WpaState = SS_NOTUSE;
1419 DBGPRINT(RT_DEBUG_TRACE, ("%s::(WPAPSK=%s)\n", __func__, tmpbuf));
1423 #endif // CONFIG_STA_SUPPORT //
1425 //DefaultKeyID, KeyType, KeyStr
1426 rtmp_read_key_parms_from_file(pAd, tmpbuf, buffer);
1428 #ifdef DOT11_N_SUPPORT
1429 HTParametersHook(pAd, tmpbuf, buffer);
1430 #endif // DOT11_N_SUPPORT //
1433 #ifdef CARRIER_DETECTION_SUPPORT
1435 if(RTMPGetKeyParameter("CarrierDetect", tmpbuf, 128, buffer))
1437 if ((strncmp(tmpbuf, "0", 1) == 0))
1438 pAd->CommonCfg.CarrierDetect.Enable = FALSE;
1439 else if ((strncmp(tmpbuf, "1", 1) == 0))
1440 pAd->CommonCfg.CarrierDetect.Enable = TRUE;
1442 pAd->CommonCfg.CarrierDetect.Enable = FALSE;
1444 DBGPRINT(RT_DEBUG_TRACE, ("CarrierDetect.Enable=%d\n", pAd->CommonCfg.CarrierDetect.Enable));
1447 pAd->CommonCfg.CarrierDetect.Enable = FALSE;
1448 #endif // CARRIER_DETECTION_SUPPORT //
1450 #ifdef CONFIG_STA_SUPPORT
1451 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1454 if (RTMPGetKeyParameter("PSMode", tmpbuf, 32, buffer))
1456 if (pAd->StaCfg.BssType == BSS_INFRA)
1458 if ((strcmp(tmpbuf, "MAX_PSP") == 0) || (strcmp(tmpbuf, "max_psp") == 0))
1460 // do NOT turn on PSM bit here, wait until MlmeCheckForPsmChange()
1461 // to exclude certain situations.
1462 // MlmeSetPsm(pAd, PWR_SAVE);
1463 OPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM);
1464 if (pAd->StaCfg.bWindowsACCAMEnable == FALSE)
1465 pAd->StaCfg.WindowsPowerMode = Ndis802_11PowerModeMAX_PSP;
1466 pAd->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeMAX_PSP;
1467 pAd->StaCfg.DefaultListenCount = 5;
1469 else if ((strcmp(tmpbuf, "Fast_PSP") == 0) || (strcmp(tmpbuf, "fast_psp") == 0)
1470 || (strcmp(tmpbuf, "FAST_PSP") == 0))
1472 // do NOT turn on PSM bit here, wait until MlmeCheckForPsmChange()
1473 // to exclude certain situations.
1474 // MlmeSetPsmBit(pAd, PWR_SAVE);
1475 OPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM);
1476 if (pAd->StaCfg.bWindowsACCAMEnable == FALSE)
1477 pAd->StaCfg.WindowsPowerMode = Ndis802_11PowerModeFast_PSP;
1478 pAd->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeFast_PSP;
1479 pAd->StaCfg.DefaultListenCount = 3;
1481 else if ((strcmp(tmpbuf, "Legacy_PSP") == 0) || (strcmp(tmpbuf, "legacy_psp") == 0)
1482 || (strcmp(tmpbuf, "LEGACY_PSP") == 0))
1484 // do NOT turn on PSM bit here, wait until MlmeCheckForPsmChange()
1485 // to exclude certain situations.
1486 // MlmeSetPsmBit(pAd, PWR_SAVE);
1487 OPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM);
1488 if (pAd->StaCfg.bWindowsACCAMEnable == FALSE)
1489 pAd->StaCfg.WindowsPowerMode = Ndis802_11PowerModeLegacy_PSP;
1490 pAd->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeLegacy_PSP;
1491 pAd->StaCfg.DefaultListenCount = 3;
1494 { //Default Ndis802_11PowerModeCAM
1495 // clear PSM bit immediately
1496 MlmeSetPsmBit(pAd, PWR_ACTIVE);
1497 OPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM);
1498 if (pAd->StaCfg.bWindowsACCAMEnable == FALSE)
1499 pAd->StaCfg.WindowsPowerMode = Ndis802_11PowerModeCAM;
1500 pAd->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeCAM;
1502 DBGPRINT(RT_DEBUG_TRACE, ("PSMode=%ld\n", pAd->StaCfg.WindowsPowerMode));
1506 if (RTMPGetKeyParameter("FastRoaming", tmpbuf, 32, buffer))
1508 if (simple_strtol(tmpbuf, 0, 10) == 0)
1509 pAd->StaCfg.bFastRoaming = FALSE;
1511 pAd->StaCfg.bFastRoaming = TRUE;
1513 DBGPRINT(RT_DEBUG_TRACE, ("FastRoaming=%d\n", pAd->StaCfg.bFastRoaming));
1516 if (RTMPGetKeyParameter("RoamThreshold", tmpbuf, 32, buffer))
1518 long lInfo = simple_strtol(tmpbuf, 0, 10);
1520 if (lInfo > 90 || lInfo < 60)
1521 pAd->StaCfg.dBmToRoam = -70;
1523 pAd->StaCfg.dBmToRoam = (CHAR)(-1)*lInfo;
1525 DBGPRINT(RT_DEBUG_TRACE, ("RoamThreshold=%d dBm\n", pAd->StaCfg.dBmToRoam));
1528 if(RTMPGetKeyParameter("TGnWifiTest", tmpbuf, 10, buffer))
1530 if(simple_strtol(tmpbuf, 0, 10) == 0)
1531 pAd->StaCfg.bTGnWifiTest = FALSE;
1533 pAd->StaCfg.bTGnWifiTest = TRUE;
1534 DBGPRINT(RT_DEBUG_TRACE, ("TGnWifiTest=%d\n", pAd->StaCfg.bTGnWifiTest));
1537 #endif // CONFIG_STA_SUPPORT //
1543 DBGPRINT(RT_DEBUG_TRACE, ("--> %s does not have a write method\n", src));
1546 retval=filp_close(srcf,NULL);
1550 DBGPRINT(RT_DEBUG_TRACE, ("--> Error %d closing %s\n", -retval, src));
1558 current->cred->fsuid = orgfsuid;
1559 current->cred->fsgid = orgfsgid;
1565 return (NDIS_STATUS_SUCCESS);
1568 #ifdef DOT11_N_SUPPORT
1569 static void HTParametersHook(
1570 IN PRTMP_ADAPTER pAd,
1577 if (RTMPGetKeyParameter("HT_PROTECT", pValueStr, 25, pInput))
1579 Value = simple_strtol(pValueStr, 0, 10);
1582 pAd->CommonCfg.bHTProtect = FALSE;
1586 pAd->CommonCfg.bHTProtect = TRUE;
1588 DBGPRINT(RT_DEBUG_TRACE, ("HT: Protection = %s\n", (Value==0) ? "Disable" : "Enable"));
1591 if (RTMPGetKeyParameter("HT_MIMOPSEnable", pValueStr, 25, pInput))
1593 Value = simple_strtol(pValueStr, 0, 10);
1596 pAd->CommonCfg.bMIMOPSEnable = FALSE;
1600 pAd->CommonCfg.bMIMOPSEnable = TRUE;
1602 DBGPRINT(RT_DEBUG_TRACE, ("HT: MIMOPSEnable = %s\n", (Value==0) ? "Disable" : "Enable"));
1606 if (RTMPGetKeyParameter("HT_MIMOPSMode", pValueStr, 25, pInput))
1608 Value = simple_strtol(pValueStr, 0, 10);
1609 if (Value > MMPS_ENABLE)
1611 pAd->CommonCfg.BACapability.field.MMPSmode = MMPS_ENABLE;
1615 //TODO: add mimo power saving mechanism
1616 pAd->CommonCfg.BACapability.field.MMPSmode = MMPS_ENABLE;
1617 //pAd->CommonCfg.BACapability.field.MMPSmode = Value;
1619 DBGPRINT(RT_DEBUG_TRACE, ("HT: MIMOPS Mode = %d\n", Value));
1622 if (RTMPGetKeyParameter("HT_BADecline", pValueStr, 25, pInput))
1624 Value = simple_strtol(pValueStr, 0, 10);
1627 pAd->CommonCfg.bBADecline = FALSE;
1631 pAd->CommonCfg.bBADecline = TRUE;
1633 DBGPRINT(RT_DEBUG_TRACE, ("HT: BA Decline = %s\n", (Value==0) ? "Disable" : "Enable"));
1637 if (RTMPGetKeyParameter("HT_DisableReordering", pValueStr, 25, pInput))
1639 Value = simple_strtol(pValueStr, 0, 10);
1642 pAd->CommonCfg.bDisableReordering = FALSE;
1646 pAd->CommonCfg.bDisableReordering = TRUE;
1648 DBGPRINT(RT_DEBUG_TRACE, ("HT: DisableReordering = %s\n", (Value==0) ? "Disable" : "Enable"));
1651 if (RTMPGetKeyParameter("HT_AutoBA", pValueStr, 25, pInput))
1653 Value = simple_strtol(pValueStr, 0, 10);
1656 pAd->CommonCfg.BACapability.field.AutoBA = FALSE;
1660 pAd->CommonCfg.BACapability.field.AutoBA = TRUE;
1662 pAd->CommonCfg.REGBACapability.field.AutoBA = pAd->CommonCfg.BACapability.field.AutoBA;
1663 DBGPRINT(RT_DEBUG_TRACE, ("HT: Auto BA = %s\n", (Value==0) ? "Disable" : "Enable"));
1667 if (RTMPGetKeyParameter("HT_HTC", pValueStr, 25, pInput))
1669 Value = simple_strtol(pValueStr, 0, 10);
1672 pAd->HTCEnable = FALSE;
1676 pAd->HTCEnable = TRUE;
1678 DBGPRINT(RT_DEBUG_TRACE, ("HT: Tx +HTC frame = %s\n", (Value==0) ? "Disable" : "Enable"));
1681 // Enable HT Link Adaptation Control
1682 if (RTMPGetKeyParameter("HT_LinkAdapt", pValueStr, 25, pInput))
1684 Value = simple_strtol(pValueStr, 0, 10);
1687 pAd->bLinkAdapt = FALSE;
1691 pAd->HTCEnable = TRUE;
1692 pAd->bLinkAdapt = TRUE;
1694 DBGPRINT(RT_DEBUG_TRACE, ("HT: Link Adaptation Control = %s\n", (Value==0) ? "Disable" : "Enable(+HTC)"));
1697 // Reverse Direction Mechanism
1698 if (RTMPGetKeyParameter("HT_RDG", pValueStr, 25, pInput))
1700 Value = simple_strtol(pValueStr, 0, 10);
1703 pAd->CommonCfg.bRdg = FALSE;
1707 pAd->HTCEnable = TRUE;
1708 pAd->CommonCfg.bRdg = TRUE;
1710 DBGPRINT(RT_DEBUG_TRACE, ("HT: RDG = %s\n", (Value==0) ? "Disable" : "Enable(+HTC)"));
1717 if (RTMPGetKeyParameter("HT_AMSDU", pValueStr, 25, pInput))
1719 Value = simple_strtol(pValueStr, 0, 10);
1722 pAd->CommonCfg.BACapability.field.AmsduEnable = FALSE;
1726 pAd->CommonCfg.BACapability.field.AmsduEnable = TRUE;
1728 DBGPRINT(RT_DEBUG_TRACE, ("HT: Tx A-MSDU = %s\n", (Value==0) ? "Disable" : "Enable"));
1732 if (RTMPGetKeyParameter("HT_MpduDensity", pValueStr, 25, pInput))
1734 Value = simple_strtol(pValueStr, 0, 10);
1735 if (Value <=7 && Value >= 0)
1737 pAd->CommonCfg.BACapability.field.MpduDensity = Value;
1738 DBGPRINT(RT_DEBUG_TRACE, ("HT: MPDU Density = %d\n", Value));
1742 pAd->CommonCfg.BACapability.field.MpduDensity = 4;
1743 DBGPRINT(RT_DEBUG_TRACE, ("HT: MPDU Density = %d (Default)\n", 4));
1747 // Max Rx BA Window Size
1748 if (RTMPGetKeyParameter("HT_BAWinSize", pValueStr, 25, pInput))
1750 Value = simple_strtol(pValueStr, 0, 10);
1752 if (Value >=1 && Value <= 64)
1754 pAd->CommonCfg.REGBACapability.field.RxBAWinLimit = Value;
1755 pAd->CommonCfg.BACapability.field.RxBAWinLimit = Value;
1756 DBGPRINT(RT_DEBUG_TRACE, ("HT: BA Windw Size = %d\n", Value));
1760 pAd->CommonCfg.REGBACapability.field.RxBAWinLimit = 64;
1761 pAd->CommonCfg.BACapability.field.RxBAWinLimit = 64;
1762 DBGPRINT(RT_DEBUG_TRACE, ("HT: BA Windw Size = 64 (Defualt)\n"));
1768 if (RTMPGetKeyParameter("HT_GI", pValueStr, 25, pInput))
1770 Value = simple_strtol(pValueStr, 0, 10);
1772 if (Value == GI_400)
1774 pAd->CommonCfg.RegTransmitSetting.field.ShortGI = GI_400;
1778 pAd->CommonCfg.RegTransmitSetting.field.ShortGI = GI_800;
1781 DBGPRINT(RT_DEBUG_TRACE, ("HT: Guard Interval = %s\n", (Value==GI_400) ? "400" : "800" ));
1784 // HT Operation Mode : Mixed Mode , Green Field
1785 if (RTMPGetKeyParameter("HT_OpMode", pValueStr, 25, pInput))
1787 Value = simple_strtol(pValueStr, 0, 10);
1789 if (Value == HTMODE_GF)
1792 pAd->CommonCfg.RegTransmitSetting.field.HTMODE = HTMODE_GF;
1796 pAd->CommonCfg.RegTransmitSetting.field.HTMODE = HTMODE_MM;
1799 DBGPRINT(RT_DEBUG_TRACE, ("HT: Operate Mode = %s\n", (Value==HTMODE_GF) ? "Green Field" : "Mixed Mode" ));
1802 // Fixed Tx mode : CCK, OFDM
1803 if (RTMPGetKeyParameter("FixedTxMode", pValueStr, 25, pInput))
1807 #ifdef CONFIG_STA_SUPPORT
1808 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1810 fix_tx_mode = FIXED_TXMODE_HT;
1812 if (strcmp(pValueStr, "OFDM") == 0 || strcmp(pValueStr, "ofdm") == 0)
1814 fix_tx_mode = FIXED_TXMODE_OFDM;
1816 else if (strcmp(pValueStr, "CCK") == 0 || strcmp(pValueStr, "cck") == 0)
1818 fix_tx_mode = FIXED_TXMODE_CCK;
1820 else if (strcmp(pValueStr, "HT") == 0 || strcmp(pValueStr, "ht") == 0)
1822 fix_tx_mode = FIXED_TXMODE_HT;
1826 Value = simple_strtol(pValueStr, 0, 10);
1830 if (Value == FIXED_TXMODE_CCK || Value == FIXED_TXMODE_OFDM)
1831 fix_tx_mode = Value;
1833 fix_tx_mode = FIXED_TXMODE_HT;
1836 pAd->StaCfg.DesiredTransmitSetting.field.FixedTxMode = fix_tx_mode;
1837 DBGPRINT(RT_DEBUG_TRACE, ("Fixed Tx Mode = %d\n", fix_tx_mode));
1840 #endif // CONFIG_STA_SUPPORT //
1845 if (RTMPGetKeyParameter("HT_BW", pValueStr, 25, pInput))
1847 Value = simple_strtol(pValueStr, 0, 10);
1851 pAd->CommonCfg.RegTransmitSetting.field.BW = BW_40;
1855 pAd->CommonCfg.RegTransmitSetting.field.BW = BW_20;
1858 #ifdef MCAST_RATE_SPECIFIC
1859 pAd->CommonCfg.MCastPhyMode.field.BW = pAd->CommonCfg.RegTransmitSetting.field.BW;
1860 #endif // MCAST_RATE_SPECIFIC //
1862 DBGPRINT(RT_DEBUG_TRACE, ("HT: Channel Width = %s\n", (Value==BW_40) ? "40 MHz" : "20 MHz" ));
1865 if (RTMPGetKeyParameter("HT_EXTCHA", pValueStr, 25, pInput))
1867 Value = simple_strtol(pValueStr, 0, 10);
1872 pAd->CommonCfg.RegTransmitSetting.field.EXTCHA = EXTCHA_BELOW;
1876 pAd->CommonCfg.RegTransmitSetting.field.EXTCHA = EXTCHA_ABOVE;
1879 DBGPRINT(RT_DEBUG_TRACE, ("HT: Ext Channel = %s\n", (Value==0) ? "BELOW" : "ABOVE" ));
1883 if (RTMPGetKeyParameter("HT_MCS", pValueStr, 50, pInput))
1886 #ifdef CONFIG_STA_SUPPORT
1887 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1889 Value = simple_strtol(pValueStr, 0, 10);
1891 if ((Value >= 0 && Value <= 23) || (Value == 32)) // 3*3
1893 pAd->StaCfg.DesiredTransmitSetting.field.MCS = Value;
1894 pAd->StaCfg.bAutoTxRateSwitch = FALSE;
1895 DBGPRINT(RT_DEBUG_TRACE, ("HT: MCS = %d\n", pAd->StaCfg.DesiredTransmitSetting.field.MCS));
1899 pAd->StaCfg.DesiredTransmitSetting.field.MCS = MCS_AUTO;
1900 pAd->StaCfg.bAutoTxRateSwitch = TRUE;
1901 DBGPRINT(RT_DEBUG_TRACE, ("HT: MCS = AUTO\n"));
1904 #endif // CONFIG_STA_SUPPORT //
1908 if (RTMPGetKeyParameter("HT_STBC", pValueStr, 25, pInput))
1910 Value = simple_strtol(pValueStr, 0, 10);
1911 if (Value == STBC_USE)
1913 pAd->CommonCfg.RegTransmitSetting.field.STBC = STBC_USE;
1917 pAd->CommonCfg.RegTransmitSetting.field.STBC = STBC_NONE;
1919 DBGPRINT(RT_DEBUG_TRACE, ("HT: STBC = %d\n", pAd->CommonCfg.RegTransmitSetting.field.STBC));
1922 // 40_Mhz_Intolerant
1923 if (RTMPGetKeyParameter("HT_40MHZ_INTOLERANT", pValueStr, 25, pInput))
1925 Value = simple_strtol(pValueStr, 0, 10);
1928 pAd->CommonCfg.bForty_Mhz_Intolerant = FALSE;
1932 pAd->CommonCfg.bForty_Mhz_Intolerant = TRUE;
1934 DBGPRINT(RT_DEBUG_TRACE, ("HT: 40MHZ INTOLERANT = %d\n", pAd->CommonCfg.bForty_Mhz_Intolerant));
1937 if(RTMPGetKeyParameter("HT_TxStream", pValueStr, 10, pInput))
1939 switch (simple_strtol(pValueStr, 0, 10))
1942 pAd->CommonCfg.TxStream = 1;
1945 pAd->CommonCfg.TxStream = 2;
1949 pAd->CommonCfg.TxStream = 3;
1951 if (pAd->MACVersion < RALINK_2883_VERSION)
1952 pAd->CommonCfg.TxStream = 2; // only 2 tx streams for RT2860 series
1955 DBGPRINT(RT_DEBUG_TRACE, ("HT: Tx Stream = %d\n", pAd->CommonCfg.TxStream));
1958 if(RTMPGetKeyParameter("HT_RxStream", pValueStr, 10, pInput))
1960 switch (simple_strtol(pValueStr, 0, 10))
1963 pAd->CommonCfg.RxStream = 1;
1966 pAd->CommonCfg.RxStream = 2;
1970 pAd->CommonCfg.RxStream = 3;
1972 if (pAd->MACVersion < RALINK_2883_VERSION)
1973 pAd->CommonCfg.RxStream = 2; // only 2 rx streams for RT2860 series
1976 DBGPRINT(RT_DEBUG_TRACE, ("HT: Rx Stream = %d\n", pAd->CommonCfg.RxStream));
1980 #endif // DOT11_N_SUPPORT //