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))
1184 // pAd->CommonCfg.bEnableTxBurst = FALSE;
1186 if(simple_strtol(tmpbuf, 0, 10) != 0) //Enable
1187 pAd->CommonCfg.bEnableTxBurst = TRUE;
1189 pAd->CommonCfg.bEnableTxBurst = FALSE;
1191 DBGPRINT(RT_DEBUG_TRACE, ("TxBurst=%d\n", pAd->CommonCfg.bEnableTxBurst));
1194 #ifdef AGGREGATION_SUPPORT
1196 if(RTMPGetKeyParameter("PktAggregate", tmpbuf, 10, buffer))
1198 if(simple_strtol(tmpbuf, 0, 10) != 0) //Enable
1199 pAd->CommonCfg.bAggregationCapable = TRUE;
1201 pAd->CommonCfg.bAggregationCapable = FALSE;
1202 #ifdef PIGGYBACK_SUPPORT
1203 pAd->CommonCfg.bPiggyBackCapable = pAd->CommonCfg.bAggregationCapable;
1204 #endif // PIGGYBACK_SUPPORT //
1205 DBGPRINT(RT_DEBUG_TRACE, ("PktAggregate=%d\n", pAd->CommonCfg.bAggregationCapable));
1208 pAd->CommonCfg.bAggregationCapable = FALSE;
1209 pAd->CommonCfg.bPiggyBackCapable = FALSE;
1210 #endif // AGGREGATION_SUPPORT //
1214 #ifdef CONFIG_STA_SUPPORT
1215 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1216 rtmp_read_sta_wmm_parms_from_file(pAd, tmpbuf, buffer);
1217 #endif // CONFIG_STA_SUPPORT //
1220 if(RTMPGetKeyParameter("ShortSlot", tmpbuf, 10, buffer))
1222 if(simple_strtol(tmpbuf, 0, 10) != 0) //Enable
1223 pAd->CommonCfg.bUseShortSlotTime = TRUE;
1225 pAd->CommonCfg.bUseShortSlotTime = FALSE;
1227 DBGPRINT(RT_DEBUG_TRACE, ("ShortSlot=%d\n", pAd->CommonCfg.bUseShortSlotTime));
1230 if(RTMPGetKeyParameter("IEEE80211H", tmpbuf, 10, buffer))
1232 for (i = 0, macptr = rstrtok(tmpbuf,";"); macptr; macptr = rstrtok(NULL,";"), i++)
1234 if(simple_strtol(macptr, 0, 10) != 0) //Enable
1235 pAd->CommonCfg.bIEEE80211H = TRUE;
1237 pAd->CommonCfg.bIEEE80211H = FALSE;
1239 DBGPRINT(RT_DEBUG_TRACE, ("IEEE80211H=%d\n", pAd->CommonCfg.bIEEE80211H));
1243 if(RTMPGetKeyParameter("CSPeriod", tmpbuf, 10, buffer))
1245 if(simple_strtol(tmpbuf, 0, 10) != 0)
1246 pAd->CommonCfg.RadarDetect.CSPeriod = simple_strtol(tmpbuf, 0, 10);
1248 pAd->CommonCfg.RadarDetect.CSPeriod = 0;
1250 DBGPRINT(RT_DEBUG_TRACE, ("CSPeriod=%d\n", pAd->CommonCfg.RadarDetect.CSPeriod));
1254 if(RTMPGetKeyParameter("RDRegion", tmpbuf, 128, buffer))
1256 if ((strncmp(tmpbuf, "JAP_W53", 7) == 0) || (strncmp(tmpbuf, "jap_w53", 7) == 0))
1258 pAd->CommonCfg.RadarDetect.RDDurRegion = JAP_W53;
1259 pAd->CommonCfg.RadarDetect.DfsSessionTime = 15;
1261 else if ((strncmp(tmpbuf, "JAP_W56", 7) == 0) || (strncmp(tmpbuf, "jap_w56", 7) == 0))
1263 pAd->CommonCfg.RadarDetect.RDDurRegion = JAP_W56;
1264 pAd->CommonCfg.RadarDetect.DfsSessionTime = 13;
1266 else if ((strncmp(tmpbuf, "JAP", 3) == 0) || (strncmp(tmpbuf, "jap", 3) == 0))
1268 pAd->CommonCfg.RadarDetect.RDDurRegion = JAP;
1269 pAd->CommonCfg.RadarDetect.DfsSessionTime = 5;
1271 else if ((strncmp(tmpbuf, "FCC", 3) == 0) || (strncmp(tmpbuf, "fcc", 3) == 0))
1273 pAd->CommonCfg.RadarDetect.RDDurRegion = FCC;
1274 pAd->CommonCfg.RadarDetect.DfsSessionTime = 5;
1276 else if ((strncmp(tmpbuf, "CE", 2) == 0) || (strncmp(tmpbuf, "ce", 2) == 0))
1278 pAd->CommonCfg.RadarDetect.RDDurRegion = CE;
1279 pAd->CommonCfg.RadarDetect.DfsSessionTime = 13;
1283 pAd->CommonCfg.RadarDetect.RDDurRegion = CE;
1284 pAd->CommonCfg.RadarDetect.DfsSessionTime = 13;
1287 DBGPRINT(RT_DEBUG_TRACE, ("RDRegion=%d\n", pAd->CommonCfg.RadarDetect.RDDurRegion));
1291 pAd->CommonCfg.RadarDetect.RDDurRegion = CE;
1292 pAd->CommonCfg.RadarDetect.DfsSessionTime = 13;
1296 if(RTMPGetKeyParameter("WirelessEvent", tmpbuf, 10, buffer))
1298 #if WIRELESS_EXT >= 15
1299 if(simple_strtol(tmpbuf, 0, 10) != 0)
1300 pAd->CommonCfg.bWirelessEvent = simple_strtol(tmpbuf, 0, 10);
1302 pAd->CommonCfg.bWirelessEvent = 0; // disable
1304 pAd->CommonCfg.bWirelessEvent = 0; // disable
1306 DBGPRINT(RT_DEBUG_TRACE, ("WirelessEvent=%d\n", pAd->CommonCfg.bWirelessEvent));
1308 if(RTMPGetKeyParameter("WiFiTest", tmpbuf, 10, buffer))
1310 if(simple_strtol(tmpbuf, 0, 10) != 0)
1311 pAd->CommonCfg.bWiFiTest= simple_strtol(tmpbuf, 0, 10);
1313 pAd->CommonCfg.bWiFiTest = 0; // disable
1315 DBGPRINT(RT_DEBUG_TRACE, ("WiFiTest=%d\n", pAd->CommonCfg.bWiFiTest));
1318 if(RTMPGetKeyParameter("AuthMode", tmpbuf, 128, buffer))
1320 #ifdef CONFIG_STA_SUPPORT
1321 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1323 if ((strcmp(tmpbuf, "WEPAUTO") == 0) || (strcmp(tmpbuf, "wepauto") == 0))
1324 pAd->StaCfg.AuthMode = Ndis802_11AuthModeAutoSwitch;
1325 else if ((strcmp(tmpbuf, "SHARED") == 0) || (strcmp(tmpbuf, "shared") == 0))
1326 pAd->StaCfg.AuthMode = Ndis802_11AuthModeShared;
1327 else if ((strcmp(tmpbuf, "WPAPSK") == 0) || (strcmp(tmpbuf, "wpapsk") == 0))
1328 pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPAPSK;
1329 else if ((strcmp(tmpbuf, "WPANONE") == 0) || (strcmp(tmpbuf, "wpanone") == 0))
1330 pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPANone;
1331 else if ((strcmp(tmpbuf, "WPA2PSK") == 0) || (strcmp(tmpbuf, "wpa2psk") == 0))
1332 pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPA2PSK;
1333 #ifdef WPA_SUPPLICANT_SUPPORT
1334 else if ((strcmp(tmpbuf, "WPA") == 0) || (strcmp(tmpbuf, "wpa") == 0))
1335 pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPA;
1336 else if ((strcmp(tmpbuf, "WPA2") == 0) || (strcmp(tmpbuf, "wpa2") == 0))
1337 pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPA2;
1338 #endif // WPA_SUPPLICANT_SUPPORT //
1340 pAd->StaCfg.AuthMode = Ndis802_11AuthModeOpen;
1342 pAd->StaCfg.PortSecured = WPA_802_1X_PORT_NOT_SECURED;
1344 DBGPRINT(RT_DEBUG_TRACE, ("%s::(EncrypType=%d)\n", __func__, pAd->StaCfg.WepStatus));
1346 #endif // CONFIG_STA_SUPPORT //
1349 if(RTMPGetKeyParameter("EncrypType", tmpbuf, 128, buffer))
1352 #ifdef CONFIG_STA_SUPPORT
1353 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1355 if ((strcmp(tmpbuf, "WEP") == 0) || (strcmp(tmpbuf, "wep") == 0))
1356 pAd->StaCfg.WepStatus = Ndis802_11WEPEnabled;
1357 else if ((strcmp(tmpbuf, "TKIP") == 0) || (strcmp(tmpbuf, "tkip") == 0))
1358 pAd->StaCfg.WepStatus = Ndis802_11Encryption2Enabled;
1359 else if ((strcmp(tmpbuf, "AES") == 0) || (strcmp(tmpbuf, "aes") == 0))
1360 pAd->StaCfg.WepStatus = Ndis802_11Encryption3Enabled;
1362 pAd->StaCfg.WepStatus = Ndis802_11WEPDisabled;
1364 // Update all wepstatus related
1365 pAd->StaCfg.PairCipher = pAd->StaCfg.WepStatus;
1366 pAd->StaCfg.GroupCipher = pAd->StaCfg.WepStatus;
1367 pAd->StaCfg.OrigWepStatus = pAd->StaCfg.WepStatus;
1368 pAd->StaCfg.bMixCipher = FALSE;
1370 //RTMPMakeRSNIE(pAd, pAd->StaCfg.AuthMode, pAd->StaCfg.WepStatus, 0);
1371 DBGPRINT(RT_DEBUG_TRACE, ("%s::(EncrypType=%d)\n", __func__, pAd->StaCfg.WepStatus));
1373 #endif // CONFIG_STA_SUPPORT //
1378 #ifdef CONFIG_STA_SUPPORT
1379 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1381 if(RTMPGetCriticalParameter("WPAPSK", tmpbuf, 512, buffer))
1385 tmpbuf[strlen(tmpbuf)] = '\0'; // make STA can process .$^& for WPAPSK input
1387 if ((pAd->StaCfg.AuthMode != Ndis802_11AuthModeWPAPSK) &&
1388 (pAd->StaCfg.AuthMode != Ndis802_11AuthModeWPA2PSK) &&
1389 (pAd->StaCfg.AuthMode != Ndis802_11AuthModeWPANone)
1394 else if ((strlen(tmpbuf) >= 8) && (strlen(tmpbuf) < 64))
1396 PasswordHash((char *)tmpbuf, pAd->CommonCfg.Ssid, pAd->CommonCfg.SsidLen, keyMaterial);
1397 NdisMoveMemory(pAd->StaCfg.PMK, keyMaterial, 32);
1400 else if (strlen(tmpbuf) == 64)
1402 AtoH(tmpbuf, keyMaterial, 32);
1403 NdisMoveMemory(pAd->StaCfg.PMK, keyMaterial, 32);
1408 DBGPRINT(RT_DEBUG_ERROR, ("%s::(WPAPSK key-string required 8 ~ 64 characters!)\n", __func__));
1413 if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPAPSK) ||
1414 (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK))
1416 // Start STA supplicant state machine
1417 pAd->StaCfg.WpaState = SS_START;
1419 else if (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPANone)
1422 NdisZeroMemory(&pAd->SharedKey[BSS0][0], sizeof(CIPHER_KEY));
1423 pAd->SharedKey[BSS0][0].KeyLen = LEN_TKIP_EK;
1424 NdisMoveMemory(pAd->SharedKey[BSS0][0].Key, pAd->StaCfg.PMK, LEN_TKIP_EK);
1425 NdisMoveMemory(pAd->SharedKey[BSS0][0].RxMic, &pAd->StaCfg.PMK[16], LEN_TKIP_RXMICK);
1426 NdisMoveMemory(pAd->SharedKey[BSS0][0].TxMic, &pAd->StaCfg.PMK[16], LEN_TKIP_TXMICK);
1428 // Decide its ChiperAlg
1429 if (pAd->StaCfg.PairCipher == Ndis802_11Encryption2Enabled)
1430 pAd->SharedKey[BSS0][0].CipherAlg = CIPHER_TKIP;
1431 else if (pAd->StaCfg.PairCipher == Ndis802_11Encryption3Enabled)
1432 pAd->SharedKey[BSS0][0].CipherAlg = CIPHER_AES;
1434 pAd->SharedKey[BSS0][0].CipherAlg = CIPHER_NONE;
1436 pAd->StaCfg.WpaState = SS_NOTUSE;
1439 DBGPRINT(RT_DEBUG_TRACE, ("%s::(WPAPSK=%s)\n", __func__, tmpbuf));
1443 #endif // CONFIG_STA_SUPPORT //
1445 //DefaultKeyID, KeyType, KeyStr
1446 rtmp_read_key_parms_from_file(pAd, tmpbuf, buffer);
1450 /*if(RTMPGetKeyParameter("HSCounter", tmpbuf, 10, buffer))
1452 switch (simple_strtol(tmpbuf, 0, 10))
1455 pAd->CommonCfg.bEnableHSCounter = TRUE;
1459 pAd->CommonCfg.bEnableHSCounter = FALSE;
1462 DBGPRINT(RT_DEBUG_TRACE, "HSCounter=%d\n", pAd->CommonCfg.bEnableHSCounter);
1465 #ifdef DOT11_N_SUPPORT
1466 HTParametersHook(pAd, tmpbuf, buffer);
1467 #endif // DOT11_N_SUPPORT //
1469 #ifdef CONFIG_STA_SUPPORT
1470 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1473 if (RTMPGetKeyParameter("PSMode", tmpbuf, 10, buffer))
1475 if (pAd->StaCfg.BssType == BSS_INFRA)
1477 if ((strcmp(tmpbuf, "MAX_PSP") == 0) || (strcmp(tmpbuf, "max_psp") == 0))
1479 // do NOT turn on PSM bit here, wait until MlmeCheckForPsmChange()
1480 // to exclude certain situations.
1481 // MlmeSetPsm(pAd, PWR_SAVE);
1482 OPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM);
1483 if (pAd->StaCfg.bWindowsACCAMEnable == FALSE)
1484 pAd->StaCfg.WindowsPowerMode = Ndis802_11PowerModeMAX_PSP;
1485 pAd->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeMAX_PSP;
1486 pAd->StaCfg.DefaultListenCount = 5;
1488 else if ((strcmp(tmpbuf, "Fast_PSP") == 0) || (strcmp(tmpbuf, "fast_psp") == 0)
1489 || (strcmp(tmpbuf, "FAST_PSP") == 0))
1491 // do NOT turn on PSM bit here, wait until MlmeCheckForPsmChange()
1492 // to exclude certain situations.
1493 // MlmeSetPsmBit(pAd, PWR_SAVE);
1494 OPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM);
1495 if (pAd->StaCfg.bWindowsACCAMEnable == FALSE)
1496 pAd->StaCfg.WindowsPowerMode = Ndis802_11PowerModeFast_PSP;
1497 pAd->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeFast_PSP;
1498 pAd->StaCfg.DefaultListenCount = 3;
1500 else if ((strcmp(tmpbuf, "Legacy_PSP") == 0) || (strcmp(tmpbuf, "legacy_psp") == 0)
1501 || (strcmp(tmpbuf, "LEGACY_PSP") == 0))
1503 // do NOT turn on PSM bit here, wait until MlmeCheckForPsmChange()
1504 // to exclude certain situations.
1505 // MlmeSetPsmBit(pAd, PWR_SAVE);
1506 OPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM);
1507 if (pAd->StaCfg.bWindowsACCAMEnable == FALSE)
1508 pAd->StaCfg.WindowsPowerMode = Ndis802_11PowerModeLegacy_PSP;
1509 pAd->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeLegacy_PSP;
1510 pAd->StaCfg.DefaultListenCount = 3;
1513 { //Default Ndis802_11PowerModeCAM
1514 // clear PSM bit immediately
1515 MlmeSetPsmBit(pAd, PWR_ACTIVE);
1516 OPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM);
1517 if (pAd->StaCfg.bWindowsACCAMEnable == FALSE)
1518 pAd->StaCfg.WindowsPowerMode = Ndis802_11PowerModeCAM;
1519 pAd->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeCAM;
1521 DBGPRINT(RT_DEBUG_TRACE, ("PSMode=%ld\n", pAd->StaCfg.WindowsPowerMode));
1525 if (RTMPGetKeyParameter("FastRoaming", tmpbuf, 32, buffer))
1527 if (simple_strtol(tmpbuf, 0, 10) == 0)
1528 pAd->StaCfg.bFastRoaming = FALSE;
1530 pAd->StaCfg.bFastRoaming = TRUE;
1532 DBGPRINT(RT_DEBUG_TRACE, ("FastRoaming=%d\n", pAd->StaCfg.bFastRoaming));
1535 if (RTMPGetKeyParameter("RoamThreshold", tmpbuf, 32, buffer))
1537 long lInfo = simple_strtol(tmpbuf, 0, 10);
1539 if (lInfo > 90 || lInfo < 60)
1540 pAd->StaCfg.dBmToRoam = -70;
1542 pAd->StaCfg.dBmToRoam = (CHAR)(-1)*lInfo;
1544 DBGPRINT(RT_DEBUG_TRACE, ("RoamThreshold=%d dBm\n", pAd->StaCfg.dBmToRoam));
1547 if(RTMPGetKeyParameter("TGnWifiTest", tmpbuf, 10, buffer))
1549 if(simple_strtol(tmpbuf, 0, 10) == 0)
1550 pAd->StaCfg.bTGnWifiTest = FALSE;
1552 pAd->StaCfg.bTGnWifiTest = TRUE;
1553 DBGPRINT(RT_DEBUG_TRACE, ("TGnWifiTest=%d\n", pAd->StaCfg.bTGnWifiTest));
1556 #endif // CONFIG_STA_SUPPORT //
1564 DBGPRINT(RT_DEBUG_TRACE, ("--> %s does not have a write method\n", src));
1567 retval=filp_close(srcf,NULL);
1571 DBGPRINT(RT_DEBUG_TRACE, ("--> Error %d closing %s\n", -retval, src));
1578 current->fsuid = orgfsuid;
1579 current->fsgid = orgfsgid;
1585 return (NDIS_STATUS_SUCCESS);
1588 #ifdef DOT11_N_SUPPORT
1589 static void HTParametersHook(
1590 IN PRTMP_ADAPTER pAd,
1597 if (RTMPGetKeyParameter("HT_PROTECT", pValueStr, 25, pInput))
1599 Value = simple_strtol(pValueStr, 0, 10);
1602 pAd->CommonCfg.bHTProtect = FALSE;
1606 pAd->CommonCfg.bHTProtect = TRUE;
1608 DBGPRINT(RT_DEBUG_TRACE, ("HT: Protection = %s\n", (Value==0) ? "Disable" : "Enable"));
1611 if (RTMPGetKeyParameter("HT_MIMOPSEnable", pValueStr, 25, pInput))
1613 Value = simple_strtol(pValueStr, 0, 10);
1616 pAd->CommonCfg.bMIMOPSEnable = FALSE;
1620 pAd->CommonCfg.bMIMOPSEnable = TRUE;
1622 DBGPRINT(RT_DEBUG_TRACE, ("HT: MIMOPSEnable = %s\n", (Value==0) ? "Disable" : "Enable"));
1626 if (RTMPGetKeyParameter("HT_MIMOPSMode", pValueStr, 25, pInput))
1628 Value = simple_strtol(pValueStr, 0, 10);
1629 if (Value > MMPS_ENABLE)
1631 pAd->CommonCfg.BACapability.field.MMPSmode = MMPS_ENABLE;
1635 //TODO: add mimo power saving mechanism
1636 pAd->CommonCfg.BACapability.field.MMPSmode = MMPS_ENABLE;
1637 //pAd->CommonCfg.BACapability.field.MMPSmode = Value;
1639 DBGPRINT(RT_DEBUG_TRACE, ("HT: MIMOPS Mode = %d\n", Value));
1642 if (RTMPGetKeyParameter("HT_BADecline", pValueStr, 25, pInput))
1644 Value = simple_strtol(pValueStr, 0, 10);
1647 pAd->CommonCfg.bBADecline = FALSE;
1651 pAd->CommonCfg.bBADecline = TRUE;
1653 DBGPRINT(RT_DEBUG_TRACE, ("HT: BA Decline = %s\n", (Value==0) ? "Disable" : "Enable"));
1657 if (RTMPGetKeyParameter("HT_DisableReordering", pValueStr, 25, pInput))
1659 Value = simple_strtol(pValueStr, 0, 10);
1662 pAd->CommonCfg.bDisableReordering = FALSE;
1666 pAd->CommonCfg.bDisableReordering = TRUE;
1668 DBGPRINT(RT_DEBUG_TRACE, ("HT: DisableReordering = %s\n", (Value==0) ? "Disable" : "Enable"));
1671 if (RTMPGetKeyParameter("HT_AutoBA", pValueStr, 25, pInput))
1673 Value = simple_strtol(pValueStr, 0, 10);
1676 pAd->CommonCfg.BACapability.field.AutoBA = FALSE;
1680 pAd->CommonCfg.BACapability.field.AutoBA = TRUE;
1682 pAd->CommonCfg.REGBACapability.field.AutoBA = pAd->CommonCfg.BACapability.field.AutoBA;
1683 DBGPRINT(RT_DEBUG_TRACE, ("HT: Auto BA = %s\n", (Value==0) ? "Disable" : "Enable"));
1687 if (RTMPGetKeyParameter("HT_HTC", pValueStr, 25, pInput))
1689 Value = simple_strtol(pValueStr, 0, 10);
1692 pAd->HTCEnable = FALSE;
1696 pAd->HTCEnable = TRUE;
1698 DBGPRINT(RT_DEBUG_TRACE, ("HT: Tx +HTC frame = %s\n", (Value==0) ? "Disable" : "Enable"));
1701 // Enable HT Link Adaptation Control
1702 if (RTMPGetKeyParameter("HT_LinkAdapt", pValueStr, 25, pInput))
1704 Value = simple_strtol(pValueStr, 0, 10);
1707 pAd->bLinkAdapt = FALSE;
1711 pAd->HTCEnable = TRUE;
1712 pAd->bLinkAdapt = TRUE;
1714 DBGPRINT(RT_DEBUG_TRACE, ("HT: Link Adaptation Control = %s\n", (Value==0) ? "Disable" : "Enable(+HTC)"));
1717 // Reverse Direction Mechanism
1718 if (RTMPGetKeyParameter("HT_RDG", pValueStr, 25, pInput))
1720 Value = simple_strtol(pValueStr, 0, 10);
1723 pAd->CommonCfg.bRdg = FALSE;
1727 pAd->HTCEnable = TRUE;
1728 pAd->CommonCfg.bRdg = TRUE;
1730 DBGPRINT(RT_DEBUG_TRACE, ("HT: RDG = %s\n", (Value==0) ? "Disable" : "Enable(+HTC)"));
1737 if (RTMPGetKeyParameter("HT_AMSDU", pValueStr, 25, pInput))
1739 Value = simple_strtol(pValueStr, 0, 10);
1742 pAd->CommonCfg.BACapability.field.AmsduEnable = FALSE;
1746 pAd->CommonCfg.BACapability.field.AmsduEnable = TRUE;
1748 DBGPRINT(RT_DEBUG_TRACE, ("HT: Tx A-MSDU = %s\n", (Value==0) ? "Disable" : "Enable"));
1752 if (RTMPGetKeyParameter("HT_MpduDensity", pValueStr, 25, pInput))
1754 Value = simple_strtol(pValueStr, 0, 10);
1755 if (Value <=7 && Value >= 0)
1757 pAd->CommonCfg.BACapability.field.MpduDensity = Value;
1758 DBGPRINT(RT_DEBUG_TRACE, ("HT: MPDU Density = %d\n", Value));
1762 pAd->CommonCfg.BACapability.field.MpduDensity = 4;
1763 DBGPRINT(RT_DEBUG_TRACE, ("HT: MPDU Density = %d (Default)\n", 4));
1767 // Max Rx BA Window Size
1768 if (RTMPGetKeyParameter("HT_BAWinSize", pValueStr, 25, pInput))
1770 Value = simple_strtol(pValueStr, 0, 10);
1772 if (Value >=1 && Value <= 64)
1774 pAd->CommonCfg.REGBACapability.field.RxBAWinLimit = Value;
1775 pAd->CommonCfg.BACapability.field.RxBAWinLimit = Value;
1776 DBGPRINT(RT_DEBUG_TRACE, ("HT: BA Windw Size = %d\n", Value));
1780 pAd->CommonCfg.REGBACapability.field.RxBAWinLimit = 64;
1781 pAd->CommonCfg.BACapability.field.RxBAWinLimit = 64;
1782 DBGPRINT(RT_DEBUG_TRACE, ("HT: BA Windw Size = 64 (Defualt)\n"));
1788 if (RTMPGetKeyParameter("HT_GI", pValueStr, 25, pInput))
1790 Value = simple_strtol(pValueStr, 0, 10);
1792 if (Value == GI_400)
1794 pAd->CommonCfg.RegTransmitSetting.field.ShortGI = GI_400;
1798 pAd->CommonCfg.RegTransmitSetting.field.ShortGI = GI_800;
1801 DBGPRINT(RT_DEBUG_TRACE, ("HT: Guard Interval = %s\n", (Value==GI_400) ? "400" : "800" ));
1804 // HT Operation Mode : Mixed Mode , Green Field
1805 if (RTMPGetKeyParameter("HT_OpMode", pValueStr, 25, pInput))
1807 Value = simple_strtol(pValueStr, 0, 10);
1809 if (Value == HTMODE_GF)
1812 pAd->CommonCfg.RegTransmitSetting.field.HTMODE = HTMODE_GF;
1816 pAd->CommonCfg.RegTransmitSetting.field.HTMODE = HTMODE_MM;
1819 DBGPRINT(RT_DEBUG_TRACE, ("HT: Operate Mode = %s\n", (Value==HTMODE_GF) ? "Green Field" : "Mixed Mode" ));
1822 // Fixed Tx mode : CCK, OFDM
1823 if (RTMPGetKeyParameter("FixedTxMode", pValueStr, 25, pInput))
1827 #ifdef CONFIG_STA_SUPPORT
1828 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1830 fix_tx_mode = FIXED_TXMODE_HT;
1832 if (strcmp(pValueStr, "OFDM") == 0 || strcmp(pValueStr, "ofdm") == 0)
1834 fix_tx_mode = FIXED_TXMODE_OFDM;
1836 else if (strcmp(pValueStr, "CCK") == 0 || strcmp(pValueStr, "cck") == 0)
1838 fix_tx_mode = FIXED_TXMODE_CCK;
1840 else if (strcmp(pValueStr, "HT") == 0 || strcmp(pValueStr, "ht") == 0)
1842 fix_tx_mode = FIXED_TXMODE_HT;
1846 Value = simple_strtol(pValueStr, 0, 10);
1850 if (Value == FIXED_TXMODE_CCK || Value == FIXED_TXMODE_OFDM)
1851 fix_tx_mode = Value;
1853 fix_tx_mode = FIXED_TXMODE_HT;
1856 pAd->StaCfg.DesiredTransmitSetting.field.FixedTxMode = fix_tx_mode;
1857 DBGPRINT(RT_DEBUG_TRACE, ("Fixed Tx Mode = %d\n", fix_tx_mode));
1860 #endif // CONFIG_STA_SUPPORT //
1865 if (RTMPGetKeyParameter("HT_BW", pValueStr, 25, pInput))
1867 Value = simple_strtol(pValueStr, 0, 10);
1871 pAd->CommonCfg.RegTransmitSetting.field.BW = BW_40;
1875 pAd->CommonCfg.RegTransmitSetting.field.BW = BW_20;
1878 #ifdef MCAST_RATE_SPECIFIC
1879 pAd->CommonCfg.MCastPhyMode.field.BW = pAd->CommonCfg.RegTransmitSetting.field.BW;
1880 #endif // MCAST_RATE_SPECIFIC //
1882 DBGPRINT(RT_DEBUG_TRACE, ("HT: Channel Width = %s\n", (Value==BW_40) ? "40 MHz" : "20 MHz" ));
1885 if (RTMPGetKeyParameter("HT_EXTCHA", pValueStr, 25, pInput))
1887 Value = simple_strtol(pValueStr, 0, 10);
1892 pAd->CommonCfg.RegTransmitSetting.field.EXTCHA = EXTCHA_BELOW;
1896 pAd->CommonCfg.RegTransmitSetting.field.EXTCHA = EXTCHA_ABOVE;
1899 DBGPRINT(RT_DEBUG_TRACE, ("HT: Ext Channel = %s\n", (Value==0) ? "BELOW" : "ABOVE" ));
1903 if (RTMPGetKeyParameter("HT_MCS", pValueStr, 50, pInput))
1906 #ifdef CONFIG_STA_SUPPORT
1907 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1909 Value = simple_strtol(pValueStr, 0, 10);
1911 // if ((Value >= 0 && Value <= 15) || (Value == 32))
1912 if ((Value >= 0 && Value <= 23) || (Value == 32)) // 3*3
1914 pAd->StaCfg.DesiredTransmitSetting.field.MCS = Value;
1915 pAd->StaCfg.bAutoTxRateSwitch = FALSE;
1916 DBGPRINT(RT_DEBUG_TRACE, ("HT: MCS = %d\n", pAd->StaCfg.DesiredTransmitSetting.field.MCS));
1920 pAd->StaCfg.DesiredTransmitSetting.field.MCS = MCS_AUTO;
1921 pAd->StaCfg.bAutoTxRateSwitch = TRUE;
1922 DBGPRINT(RT_DEBUG_TRACE, ("HT: MCS = AUTO\n"));
1925 #endif // CONFIG_STA_SUPPORT //
1929 if (RTMPGetKeyParameter("HT_STBC", pValueStr, 25, pInput))
1931 Value = simple_strtol(pValueStr, 0, 10);
1932 if (Value == STBC_USE)
1934 pAd->CommonCfg.RegTransmitSetting.field.STBC = STBC_USE;
1938 pAd->CommonCfg.RegTransmitSetting.field.STBC = STBC_NONE;
1940 DBGPRINT(RT_DEBUG_TRACE, ("HT: STBC = %d\n", pAd->CommonCfg.RegTransmitSetting.field.STBC));
1943 // 40_Mhz_Intolerant
1944 if (RTMPGetKeyParameter("HT_40MHZ_INTOLERANT", pValueStr, 25, pInput))
1946 Value = simple_strtol(pValueStr, 0, 10);
1949 pAd->CommonCfg.bForty_Mhz_Intolerant = FALSE;
1953 pAd->CommonCfg.bForty_Mhz_Intolerant = TRUE;
1955 DBGPRINT(RT_DEBUG_TRACE, ("HT: 40MHZ INTOLERANT = %d\n", pAd->CommonCfg.bForty_Mhz_Intolerant));
1958 if(RTMPGetKeyParameter("HT_TxStream", pValueStr, 10, pInput))
1960 switch (simple_strtol(pValueStr, 0, 10))
1963 pAd->CommonCfg.TxStream = 1;
1966 pAd->CommonCfg.TxStream = 2;
1970 pAd->CommonCfg.TxStream = 3;
1972 if (pAd->MACVersion < RALINK_2883_VERSION)
1973 pAd->CommonCfg.TxStream = 2; // only 2 tx streams for RT2860 series
1976 DBGPRINT(RT_DEBUG_TRACE, ("HT: Tx Stream = %d\n", pAd->CommonCfg.TxStream));
1979 if(RTMPGetKeyParameter("HT_RxStream", pValueStr, 10, pInput))
1981 switch (simple_strtol(pValueStr, 0, 10))
1984 pAd->CommonCfg.RxStream = 1;
1987 pAd->CommonCfg.RxStream = 2;
1991 pAd->CommonCfg.RxStream = 3;
1993 if (pAd->MACVersion < RALINK_2883_VERSION)
1994 pAd->CommonCfg.RxStream = 2; // only 2 rx streams for RT2860 series
1997 DBGPRINT(RT_DEBUG_TRACE, ("HT: Rx Stream = %d\n", pAd->CommonCfg.RxStream));
2001 #endif // DOT11_N_SUPPORT //