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 //
923 // Save uid and gid used for filesystem access.
924 // Set user and group to 0 (root)
925 orgfsuid = current_fsuid();
926 orgfsgid = current_fsgid();
927 /* Hm, can't really do this nicely anymore, so rely on these files
928 * being set to the proper permission to read them... */
929 /* current->cred->fsuid = current->cred->fsgid = 0; */
935 srcf = filp_open(src, O_RDONLY, 0);
938 DBGPRINT(RT_DEBUG_ERROR, ("--> Error %ld opening %s\n", -PTR_ERR(srcf),src));
942 // The object must have a read method
943 if (srcf->f_op && srcf->f_op->read)
945 memset(buffer, 0x00, MAX_INI_BUFFER_SIZE);
946 retval=srcf->f_op->read(srcf, buffer, MAX_INI_BUFFER_SIZE, &srcf->f_pos);
949 DBGPRINT(RT_DEBUG_TRACE, ("--> Read %s error %d\n", src, -retval));
953 // set file parameter to portcfg
955 if(RTMPGetKeyParameter("CountryRegion", tmpbuf, 25, buffer))
957 pAd->CommonCfg.CountryRegion = (UCHAR) simple_strtol(tmpbuf, 0, 10);
958 DBGPRINT(RT_DEBUG_TRACE, ("CountryRegion=%d\n", pAd->CommonCfg.CountryRegion));
961 if(RTMPGetKeyParameter("CountryRegionABand", tmpbuf, 25, buffer))
963 pAd->CommonCfg.CountryRegionForABand= (UCHAR) simple_strtol(tmpbuf, 0, 10);
964 DBGPRINT(RT_DEBUG_TRACE, ("CountryRegionABand=%d\n", pAd->CommonCfg.CountryRegionForABand));
967 if(RTMPGetKeyParameter("CountryCode", tmpbuf, 25, buffer))
969 NdisMoveMemory(pAd->CommonCfg.CountryCode, tmpbuf , 2);
970 #ifdef CONFIG_STA_SUPPORT
971 #ifdef EXT_BUILD_CHANNEL_LIST
972 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
973 NdisMoveMemory(pAd->StaCfg.StaOriCountryCode, tmpbuf , 2);
974 #endif // EXT_BUILD_CHANNEL_LIST //
975 #endif // CONFIG_STA_SUPPORT //
976 if (strlen(pAd->CommonCfg.CountryCode) != 0)
978 pAd->CommonCfg.bCountryFlag = TRUE;
980 DBGPRINT(RT_DEBUG_TRACE, ("CountryCode=%s\n", pAd->CommonCfg.CountryCode));
983 if(RTMPGetKeyParameter("ChannelGeography", tmpbuf, 25, buffer))
985 UCHAR Geography = (UCHAR) simple_strtol(tmpbuf, 0, 10);
986 if (Geography <= BOTH)
988 pAd->CommonCfg.Geography = Geography;
989 pAd->CommonCfg.CountryCode[2] =
990 (pAd->CommonCfg.Geography == BOTH) ? ' ' : ((pAd->CommonCfg.Geography == IDOR) ? 'I' : 'O');
991 #ifdef CONFIG_STA_SUPPORT
992 #ifdef EXT_BUILD_CHANNEL_LIST
993 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
994 pAd->StaCfg.StaOriGeography = pAd->CommonCfg.Geography;
995 #endif // EXT_BUILD_CHANNEL_LIST //
996 #endif // CONFIG_STA_SUPPORT //
997 DBGPRINT(RT_DEBUG_TRACE, ("ChannelGeography=%d\n", pAd->CommonCfg.Geography));
1002 pAd->CommonCfg.Geography = BOTH;
1003 pAd->CommonCfg.CountryCode[2] = ' ';
1007 #ifdef CONFIG_STA_SUPPORT
1008 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1011 if (RTMPGetCriticalParameter("SSID", tmpbuf, 256, buffer))
1013 if (strlen(tmpbuf) <= 32)
1015 pAd->CommonCfg.SsidLen = (UCHAR) strlen(tmpbuf);
1016 NdisZeroMemory(pAd->CommonCfg.Ssid, NDIS_802_11_LENGTH_SSID);
1017 NdisMoveMemory(pAd->CommonCfg.Ssid, tmpbuf, pAd->CommonCfg.SsidLen);
1018 pAd->MlmeAux.AutoReconnectSsidLen = pAd->CommonCfg.SsidLen;
1019 NdisZeroMemory(pAd->MlmeAux.AutoReconnectSsid, NDIS_802_11_LENGTH_SSID);
1020 NdisMoveMemory(pAd->MlmeAux.AutoReconnectSsid, tmpbuf, pAd->MlmeAux.AutoReconnectSsidLen);
1021 pAd->MlmeAux.SsidLen = pAd->CommonCfg.SsidLen;
1022 NdisZeroMemory(pAd->MlmeAux.Ssid, NDIS_802_11_LENGTH_SSID);
1023 NdisMoveMemory(pAd->MlmeAux.Ssid, tmpbuf, pAd->MlmeAux.SsidLen);
1024 DBGPRINT(RT_DEBUG_TRACE, ("%s::(SSID=%s)\n", __func__, tmpbuf));
1028 #endif // CONFIG_STA_SUPPORT //
1030 #ifdef CONFIG_STA_SUPPORT
1031 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1034 if (RTMPGetKeyParameter("NetworkType", tmpbuf, 25, buffer))
1036 pAd->bConfigChanged = TRUE;
1037 if (strcmp(tmpbuf, "Adhoc") == 0)
1038 pAd->StaCfg.BssType = BSS_ADHOC;
1039 else //Default Infrastructure mode
1040 pAd->StaCfg.BssType = BSS_INFRA;
1041 // Reset Ralink supplicant to not use, it will be set to start when UI set PMK key
1042 pAd->StaCfg.WpaState = SS_NOTUSE;
1043 DBGPRINT(RT_DEBUG_TRACE, ("%s::(NetworkType=%d)\n", __func__, pAd->StaCfg.BssType));
1046 #endif // CONFIG_STA_SUPPORT //
1048 if(RTMPGetKeyParameter("Channel", tmpbuf, 10, buffer))
1050 pAd->CommonCfg.Channel = (UCHAR) simple_strtol(tmpbuf, 0, 10);
1051 DBGPRINT(RT_DEBUG_TRACE, ("Channel=%d\n", pAd->CommonCfg.Channel));
1054 if(RTMPGetKeyParameter("WirelessMode", tmpbuf, 10, buffer))
1056 int value = 0, maxPhyMode = PHY_11G;
1058 #ifdef DOT11_N_SUPPORT
1059 maxPhyMode = PHY_11N_5G;
1060 #endif // DOT11_N_SUPPORT //
1062 value = simple_strtol(tmpbuf, 0, 10);
1064 if (value <= maxPhyMode)
1066 pAd->CommonCfg.PhyMode = value;
1068 DBGPRINT(RT_DEBUG_TRACE, ("PhyMode=%d\n", pAd->CommonCfg.PhyMode));
1071 if(RTMPGetKeyParameter("BasicRate", tmpbuf, 10, buffer))
1073 pAd->CommonCfg.BasicRateBitmap = (ULONG) simple_strtol(tmpbuf, 0, 10);
1074 DBGPRINT(RT_DEBUG_TRACE, ("BasicRate=%ld\n", pAd->CommonCfg.BasicRateBitmap));
1077 if(RTMPGetKeyParameter("BeaconPeriod", tmpbuf, 10, buffer))
1079 pAd->CommonCfg.BeaconPeriod = (USHORT) simple_strtol(tmpbuf, 0, 10);
1080 DBGPRINT(RT_DEBUG_TRACE, ("BeaconPeriod=%d\n", pAd->CommonCfg.BeaconPeriod));
1083 if(RTMPGetKeyParameter("TxPower", tmpbuf, 10, buffer))
1085 pAd->CommonCfg.TxPowerPercentage = (ULONG) simple_strtol(tmpbuf, 0, 10);
1086 #ifdef CONFIG_STA_SUPPORT
1087 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1088 pAd->CommonCfg.TxPowerDefault = pAd->CommonCfg.TxPowerPercentage;
1089 #endif // CONFIG_STA_SUPPORT //
1090 DBGPRINT(RT_DEBUG_TRACE, ("TxPower=%ld\n", pAd->CommonCfg.TxPowerPercentage));
1093 if(RTMPGetKeyParameter("BGProtection", tmpbuf, 10, buffer))
1095 switch (simple_strtol(tmpbuf, 0, 10))
1098 pAd->CommonCfg.UseBGProtection = 1;
1100 case 2: //Always OFF
1101 pAd->CommonCfg.UseBGProtection = 2;
1105 pAd->CommonCfg.UseBGProtection = 0;
1108 DBGPRINT(RT_DEBUG_TRACE, ("BGProtection=%ld\n", pAd->CommonCfg.UseBGProtection));
1111 if(RTMPGetKeyParameter("DisableOLBC", tmpbuf, 10, buffer))
1113 switch (simple_strtol(tmpbuf, 0, 10))
1115 case 1: //disable OLBC Detection
1116 pAd->CommonCfg.DisableOLBCDetect = 1;
1118 case 0: //enable OLBC Detection
1119 pAd->CommonCfg.DisableOLBCDetect = 0;
1122 pAd->CommonCfg.DisableOLBCDetect= 0;
1125 DBGPRINT(RT_DEBUG_TRACE, ("OLBCDetection=%ld\n", pAd->CommonCfg.DisableOLBCDetect));
1128 if(RTMPGetKeyParameter("TxPreamble", tmpbuf, 10, buffer))
1130 switch (simple_strtol(tmpbuf, 0, 10))
1132 case Rt802_11PreambleShort:
1133 pAd->CommonCfg.TxPreamble = Rt802_11PreambleShort;
1135 case Rt802_11PreambleLong:
1137 pAd->CommonCfg.TxPreamble = Rt802_11PreambleLong;
1140 DBGPRINT(RT_DEBUG_TRACE, ("TxPreamble=%ld\n", pAd->CommonCfg.TxPreamble));
1143 if(RTMPGetKeyParameter("RTSThreshold", tmpbuf, 10, buffer))
1145 RtsThresh = simple_strtol(tmpbuf, 0, 10);
1146 if( (RtsThresh >= 1) && (RtsThresh <= MAX_RTS_THRESHOLD) )
1147 pAd->CommonCfg.RtsThreshold = (USHORT)RtsThresh;
1149 pAd->CommonCfg.RtsThreshold = MAX_RTS_THRESHOLD;
1151 DBGPRINT(RT_DEBUG_TRACE, ("RTSThreshold=%d\n", pAd->CommonCfg.RtsThreshold));
1154 if(RTMPGetKeyParameter("FragThreshold", tmpbuf, 10, buffer))
1156 FragThresh = simple_strtol(tmpbuf, 0, 10);
1157 pAd->CommonCfg.bUseZeroToDisableFragment = FALSE;
1159 if (FragThresh > MAX_FRAG_THRESHOLD || FragThresh < MIN_FRAG_THRESHOLD)
1160 { //illegal FragThresh so we set it to default
1161 pAd->CommonCfg.FragmentThreshold = MAX_FRAG_THRESHOLD;
1162 pAd->CommonCfg.bUseZeroToDisableFragment = TRUE;
1164 else if (FragThresh % 2 == 1)
1166 // The length of each fragment shall always be an even number of octets, except for the last fragment
1167 // of an MSDU or MMPDU, which may be either an even or an odd number of octets.
1168 pAd->CommonCfg.FragmentThreshold = (USHORT)(FragThresh - 1);
1172 pAd->CommonCfg.FragmentThreshold = (USHORT)FragThresh;
1174 //pAd->CommonCfg.AllowFragSize = (pAd->CommonCfg.FragmentThreshold) - LENGTH_802_11 - LENGTH_CRC;
1175 DBGPRINT(RT_DEBUG_TRACE, ("FragThreshold=%d\n", pAd->CommonCfg.FragmentThreshold));
1178 if(RTMPGetKeyParameter("TxBurst", tmpbuf, 10, buffer))
1181 // pAd->CommonCfg.bEnableTxBurst = FALSE;
1183 if(simple_strtol(tmpbuf, 0, 10) != 0) //Enable
1184 pAd->CommonCfg.bEnableTxBurst = TRUE;
1186 pAd->CommonCfg.bEnableTxBurst = FALSE;
1188 DBGPRINT(RT_DEBUG_TRACE, ("TxBurst=%d\n", pAd->CommonCfg.bEnableTxBurst));
1191 #ifdef AGGREGATION_SUPPORT
1193 if(RTMPGetKeyParameter("PktAggregate", tmpbuf, 10, buffer))
1195 if(simple_strtol(tmpbuf, 0, 10) != 0) //Enable
1196 pAd->CommonCfg.bAggregationCapable = TRUE;
1198 pAd->CommonCfg.bAggregationCapable = FALSE;
1199 #ifdef PIGGYBACK_SUPPORT
1200 pAd->CommonCfg.bPiggyBackCapable = pAd->CommonCfg.bAggregationCapable;
1201 #endif // PIGGYBACK_SUPPORT //
1202 DBGPRINT(RT_DEBUG_TRACE, ("PktAggregate=%d\n", pAd->CommonCfg.bAggregationCapable));
1205 pAd->CommonCfg.bAggregationCapable = FALSE;
1206 pAd->CommonCfg.bPiggyBackCapable = FALSE;
1207 #endif // AGGREGATION_SUPPORT //
1211 #ifdef CONFIG_STA_SUPPORT
1212 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1213 rtmp_read_sta_wmm_parms_from_file(pAd, tmpbuf, buffer);
1214 #endif // CONFIG_STA_SUPPORT //
1217 if(RTMPGetKeyParameter("ShortSlot", tmpbuf, 10, buffer))
1219 if(simple_strtol(tmpbuf, 0, 10) != 0) //Enable
1220 pAd->CommonCfg.bUseShortSlotTime = TRUE;
1222 pAd->CommonCfg.bUseShortSlotTime = FALSE;
1224 DBGPRINT(RT_DEBUG_TRACE, ("ShortSlot=%d\n", pAd->CommonCfg.bUseShortSlotTime));
1227 if(RTMPGetKeyParameter("IEEE80211H", tmpbuf, 10, buffer))
1229 for (i = 0, macptr = rstrtok(tmpbuf,";"); macptr; macptr = rstrtok(NULL,";"), i++)
1231 if(simple_strtol(macptr, 0, 10) != 0) //Enable
1232 pAd->CommonCfg.bIEEE80211H = TRUE;
1234 pAd->CommonCfg.bIEEE80211H = FALSE;
1236 DBGPRINT(RT_DEBUG_TRACE, ("IEEE80211H=%d\n", pAd->CommonCfg.bIEEE80211H));
1240 if(RTMPGetKeyParameter("CSPeriod", tmpbuf, 10, buffer))
1242 if(simple_strtol(tmpbuf, 0, 10) != 0)
1243 pAd->CommonCfg.RadarDetect.CSPeriod = simple_strtol(tmpbuf, 0, 10);
1245 pAd->CommonCfg.RadarDetect.CSPeriod = 0;
1247 DBGPRINT(RT_DEBUG_TRACE, ("CSPeriod=%d\n", pAd->CommonCfg.RadarDetect.CSPeriod));
1251 if(RTMPGetKeyParameter("RDRegion", tmpbuf, 128, buffer))
1253 if ((strncmp(tmpbuf, "JAP_W53", 7) == 0) || (strncmp(tmpbuf, "jap_w53", 7) == 0))
1255 pAd->CommonCfg.RadarDetect.RDDurRegion = JAP_W53;
1256 pAd->CommonCfg.RadarDetect.DfsSessionTime = 15;
1258 else if ((strncmp(tmpbuf, "JAP_W56", 7) == 0) || (strncmp(tmpbuf, "jap_w56", 7) == 0))
1260 pAd->CommonCfg.RadarDetect.RDDurRegion = JAP_W56;
1261 pAd->CommonCfg.RadarDetect.DfsSessionTime = 13;
1263 else if ((strncmp(tmpbuf, "JAP", 3) == 0) || (strncmp(tmpbuf, "jap", 3) == 0))
1265 pAd->CommonCfg.RadarDetect.RDDurRegion = JAP;
1266 pAd->CommonCfg.RadarDetect.DfsSessionTime = 5;
1268 else if ((strncmp(tmpbuf, "FCC", 3) == 0) || (strncmp(tmpbuf, "fcc", 3) == 0))
1270 pAd->CommonCfg.RadarDetect.RDDurRegion = FCC;
1271 pAd->CommonCfg.RadarDetect.DfsSessionTime = 5;
1273 else if ((strncmp(tmpbuf, "CE", 2) == 0) || (strncmp(tmpbuf, "ce", 2) == 0))
1275 pAd->CommonCfg.RadarDetect.RDDurRegion = CE;
1276 pAd->CommonCfg.RadarDetect.DfsSessionTime = 13;
1280 pAd->CommonCfg.RadarDetect.RDDurRegion = CE;
1281 pAd->CommonCfg.RadarDetect.DfsSessionTime = 13;
1284 DBGPRINT(RT_DEBUG_TRACE, ("RDRegion=%d\n", pAd->CommonCfg.RadarDetect.RDDurRegion));
1288 pAd->CommonCfg.RadarDetect.RDDurRegion = CE;
1289 pAd->CommonCfg.RadarDetect.DfsSessionTime = 13;
1293 if(RTMPGetKeyParameter("WirelessEvent", tmpbuf, 10, buffer))
1295 #if WIRELESS_EXT >= 15
1296 if(simple_strtol(tmpbuf, 0, 10) != 0)
1297 pAd->CommonCfg.bWirelessEvent = simple_strtol(tmpbuf, 0, 10);
1299 pAd->CommonCfg.bWirelessEvent = 0; // disable
1301 pAd->CommonCfg.bWirelessEvent = 0; // disable
1303 DBGPRINT(RT_DEBUG_TRACE, ("WirelessEvent=%d\n", pAd->CommonCfg.bWirelessEvent));
1305 if(RTMPGetKeyParameter("WiFiTest", tmpbuf, 10, buffer))
1307 if(simple_strtol(tmpbuf, 0, 10) != 0)
1308 pAd->CommonCfg.bWiFiTest= simple_strtol(tmpbuf, 0, 10);
1310 pAd->CommonCfg.bWiFiTest = 0; // disable
1312 DBGPRINT(RT_DEBUG_TRACE, ("WiFiTest=%d\n", pAd->CommonCfg.bWiFiTest));
1315 if(RTMPGetKeyParameter("AuthMode", tmpbuf, 128, buffer))
1317 #ifdef CONFIG_STA_SUPPORT
1318 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1320 if ((strcmp(tmpbuf, "WEPAUTO") == 0) || (strcmp(tmpbuf, "wepauto") == 0))
1321 pAd->StaCfg.AuthMode = Ndis802_11AuthModeAutoSwitch;
1322 else if ((strcmp(tmpbuf, "SHARED") == 0) || (strcmp(tmpbuf, "shared") == 0))
1323 pAd->StaCfg.AuthMode = Ndis802_11AuthModeShared;
1324 else if ((strcmp(tmpbuf, "WPAPSK") == 0) || (strcmp(tmpbuf, "wpapsk") == 0))
1325 pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPAPSK;
1326 else if ((strcmp(tmpbuf, "WPANONE") == 0) || (strcmp(tmpbuf, "wpanone") == 0))
1327 pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPANone;
1328 else if ((strcmp(tmpbuf, "WPA2PSK") == 0) || (strcmp(tmpbuf, "wpa2psk") == 0))
1329 pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPA2PSK;
1330 #ifdef WPA_SUPPLICANT_SUPPORT
1331 else if ((strcmp(tmpbuf, "WPA") == 0) || (strcmp(tmpbuf, "wpa") == 0))
1332 pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPA;
1333 else if ((strcmp(tmpbuf, "WPA2") == 0) || (strcmp(tmpbuf, "wpa2") == 0))
1334 pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPA2;
1335 #endif // WPA_SUPPLICANT_SUPPORT //
1337 pAd->StaCfg.AuthMode = Ndis802_11AuthModeOpen;
1339 pAd->StaCfg.PortSecured = WPA_802_1X_PORT_NOT_SECURED;
1341 DBGPRINT(RT_DEBUG_TRACE, ("%s::(EncrypType=%d)\n", __func__, pAd->StaCfg.WepStatus));
1343 #endif // CONFIG_STA_SUPPORT //
1346 if(RTMPGetKeyParameter("EncrypType", tmpbuf, 128, buffer))
1349 #ifdef CONFIG_STA_SUPPORT
1350 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1352 if ((strcmp(tmpbuf, "WEP") == 0) || (strcmp(tmpbuf, "wep") == 0))
1353 pAd->StaCfg.WepStatus = Ndis802_11WEPEnabled;
1354 else if ((strcmp(tmpbuf, "TKIP") == 0) || (strcmp(tmpbuf, "tkip") == 0))
1355 pAd->StaCfg.WepStatus = Ndis802_11Encryption2Enabled;
1356 else if ((strcmp(tmpbuf, "AES") == 0) || (strcmp(tmpbuf, "aes") == 0))
1357 pAd->StaCfg.WepStatus = Ndis802_11Encryption3Enabled;
1359 pAd->StaCfg.WepStatus = Ndis802_11WEPDisabled;
1361 // Update all wepstatus related
1362 pAd->StaCfg.PairCipher = pAd->StaCfg.WepStatus;
1363 pAd->StaCfg.GroupCipher = pAd->StaCfg.WepStatus;
1364 pAd->StaCfg.OrigWepStatus = pAd->StaCfg.WepStatus;
1365 pAd->StaCfg.bMixCipher = FALSE;
1367 //RTMPMakeRSNIE(pAd, pAd->StaCfg.AuthMode, pAd->StaCfg.WepStatus, 0);
1368 DBGPRINT(RT_DEBUG_TRACE, ("%s::(EncrypType=%d)\n", __func__, pAd->StaCfg.WepStatus));
1370 #endif // CONFIG_STA_SUPPORT //
1375 #ifdef CONFIG_STA_SUPPORT
1376 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1378 if(RTMPGetCriticalParameter("WPAPSK", tmpbuf, 512, buffer))
1382 tmpbuf[strlen(tmpbuf)] = '\0'; // make STA can process .$^& for WPAPSK input
1384 if ((pAd->StaCfg.AuthMode != Ndis802_11AuthModeWPAPSK) &&
1385 (pAd->StaCfg.AuthMode != Ndis802_11AuthModeWPA2PSK) &&
1386 (pAd->StaCfg.AuthMode != Ndis802_11AuthModeWPANone)
1391 else if ((strlen(tmpbuf) >= 8) && (strlen(tmpbuf) < 64))
1393 PasswordHash((char *)tmpbuf, pAd->CommonCfg.Ssid, pAd->CommonCfg.SsidLen, keyMaterial);
1394 NdisMoveMemory(pAd->StaCfg.PMK, keyMaterial, 32);
1397 else if (strlen(tmpbuf) == 64)
1399 AtoH(tmpbuf, keyMaterial, 32);
1400 NdisMoveMemory(pAd->StaCfg.PMK, keyMaterial, 32);
1405 DBGPRINT(RT_DEBUG_ERROR, ("%s::(WPAPSK key-string required 8 ~ 64 characters!)\n", __func__));
1410 if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPAPSK) ||
1411 (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK))
1413 // Start STA supplicant state machine
1414 pAd->StaCfg.WpaState = SS_START;
1416 else if (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPANone)
1419 NdisZeroMemory(&pAd->SharedKey[BSS0][0], sizeof(CIPHER_KEY));
1420 pAd->SharedKey[BSS0][0].KeyLen = LEN_TKIP_EK;
1421 NdisMoveMemory(pAd->SharedKey[BSS0][0].Key, pAd->StaCfg.PMK, LEN_TKIP_EK);
1422 NdisMoveMemory(pAd->SharedKey[BSS0][0].RxMic, &pAd->StaCfg.PMK[16], LEN_TKIP_RXMICK);
1423 NdisMoveMemory(pAd->SharedKey[BSS0][0].TxMic, &pAd->StaCfg.PMK[16], LEN_TKIP_TXMICK);
1425 // Decide its ChiperAlg
1426 if (pAd->StaCfg.PairCipher == Ndis802_11Encryption2Enabled)
1427 pAd->SharedKey[BSS0][0].CipherAlg = CIPHER_TKIP;
1428 else if (pAd->StaCfg.PairCipher == Ndis802_11Encryption3Enabled)
1429 pAd->SharedKey[BSS0][0].CipherAlg = CIPHER_AES;
1431 pAd->SharedKey[BSS0][0].CipherAlg = CIPHER_NONE;
1433 pAd->StaCfg.WpaState = SS_NOTUSE;
1436 DBGPRINT(RT_DEBUG_TRACE, ("%s::(WPAPSK=%s)\n", __func__, tmpbuf));
1440 #endif // CONFIG_STA_SUPPORT //
1442 //DefaultKeyID, KeyType, KeyStr
1443 rtmp_read_key_parms_from_file(pAd, tmpbuf, buffer);
1447 /*if(RTMPGetKeyParameter("HSCounter", tmpbuf, 10, buffer))
1449 switch (simple_strtol(tmpbuf, 0, 10))
1452 pAd->CommonCfg.bEnableHSCounter = TRUE;
1456 pAd->CommonCfg.bEnableHSCounter = FALSE;
1459 DBGPRINT(RT_DEBUG_TRACE, "HSCounter=%d\n", pAd->CommonCfg.bEnableHSCounter);
1462 #ifdef DOT11_N_SUPPORT
1463 HTParametersHook(pAd, tmpbuf, buffer);
1464 #endif // DOT11_N_SUPPORT //
1466 #ifdef CONFIG_STA_SUPPORT
1467 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1470 if (RTMPGetKeyParameter("PSMode", tmpbuf, 10, buffer))
1472 if (pAd->StaCfg.BssType == BSS_INFRA)
1474 if ((strcmp(tmpbuf, "MAX_PSP") == 0) || (strcmp(tmpbuf, "max_psp") == 0))
1476 // do NOT turn on PSM bit here, wait until MlmeCheckForPsmChange()
1477 // to exclude certain situations.
1478 // MlmeSetPsm(pAd, PWR_SAVE);
1479 OPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM);
1480 if (pAd->StaCfg.bWindowsACCAMEnable == FALSE)
1481 pAd->StaCfg.WindowsPowerMode = Ndis802_11PowerModeMAX_PSP;
1482 pAd->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeMAX_PSP;
1483 pAd->StaCfg.DefaultListenCount = 5;
1485 else if ((strcmp(tmpbuf, "Fast_PSP") == 0) || (strcmp(tmpbuf, "fast_psp") == 0)
1486 || (strcmp(tmpbuf, "FAST_PSP") == 0))
1488 // do NOT turn on PSM bit here, wait until MlmeCheckForPsmChange()
1489 // to exclude certain situations.
1490 // MlmeSetPsmBit(pAd, PWR_SAVE);
1491 OPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM);
1492 if (pAd->StaCfg.bWindowsACCAMEnable == FALSE)
1493 pAd->StaCfg.WindowsPowerMode = Ndis802_11PowerModeFast_PSP;
1494 pAd->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeFast_PSP;
1495 pAd->StaCfg.DefaultListenCount = 3;
1497 else if ((strcmp(tmpbuf, "Legacy_PSP") == 0) || (strcmp(tmpbuf, "legacy_psp") == 0)
1498 || (strcmp(tmpbuf, "LEGACY_PSP") == 0))
1500 // do NOT turn on PSM bit here, wait until MlmeCheckForPsmChange()
1501 // to exclude certain situations.
1502 // MlmeSetPsmBit(pAd, PWR_SAVE);
1503 OPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM);
1504 if (pAd->StaCfg.bWindowsACCAMEnable == FALSE)
1505 pAd->StaCfg.WindowsPowerMode = Ndis802_11PowerModeLegacy_PSP;
1506 pAd->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeLegacy_PSP;
1507 pAd->StaCfg.DefaultListenCount = 3;
1510 { //Default Ndis802_11PowerModeCAM
1511 // clear PSM bit immediately
1512 MlmeSetPsmBit(pAd, PWR_ACTIVE);
1513 OPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM);
1514 if (pAd->StaCfg.bWindowsACCAMEnable == FALSE)
1515 pAd->StaCfg.WindowsPowerMode = Ndis802_11PowerModeCAM;
1516 pAd->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeCAM;
1518 DBGPRINT(RT_DEBUG_TRACE, ("PSMode=%ld\n", pAd->StaCfg.WindowsPowerMode));
1522 if (RTMPGetKeyParameter("FastRoaming", tmpbuf, 32, buffer))
1524 if (simple_strtol(tmpbuf, 0, 10) == 0)
1525 pAd->StaCfg.bFastRoaming = FALSE;
1527 pAd->StaCfg.bFastRoaming = TRUE;
1529 DBGPRINT(RT_DEBUG_TRACE, ("FastRoaming=%d\n", pAd->StaCfg.bFastRoaming));
1532 if (RTMPGetKeyParameter("RoamThreshold", tmpbuf, 32, buffer))
1534 long lInfo = simple_strtol(tmpbuf, 0, 10);
1536 if (lInfo > 90 || lInfo < 60)
1537 pAd->StaCfg.dBmToRoam = -70;
1539 pAd->StaCfg.dBmToRoam = (CHAR)(-1)*lInfo;
1541 DBGPRINT(RT_DEBUG_TRACE, ("RoamThreshold=%d dBm\n", pAd->StaCfg.dBmToRoam));
1544 if(RTMPGetKeyParameter("TGnWifiTest", tmpbuf, 10, buffer))
1546 if(simple_strtol(tmpbuf, 0, 10) == 0)
1547 pAd->StaCfg.bTGnWifiTest = FALSE;
1549 pAd->StaCfg.bTGnWifiTest = TRUE;
1550 DBGPRINT(RT_DEBUG_TRACE, ("TGnWifiTest=%d\n", pAd->StaCfg.bTGnWifiTest));
1553 #endif // CONFIG_STA_SUPPORT //
1561 DBGPRINT(RT_DEBUG_TRACE, ("--> %s does not have a write method\n", src));
1564 retval=filp_close(srcf,NULL);
1568 DBGPRINT(RT_DEBUG_TRACE, ("--> Error %d closing %s\n", -retval, src));
1575 current->fsuid = orgfsuid;
1576 current->fsgid = orgfsgid;
1582 return (NDIS_STATUS_SUCCESS);
1585 #ifdef DOT11_N_SUPPORT
1586 static void HTParametersHook(
1587 IN PRTMP_ADAPTER pAd,
1594 if (RTMPGetKeyParameter("HT_PROTECT", pValueStr, 25, pInput))
1596 Value = simple_strtol(pValueStr, 0, 10);
1599 pAd->CommonCfg.bHTProtect = FALSE;
1603 pAd->CommonCfg.bHTProtect = TRUE;
1605 DBGPRINT(RT_DEBUG_TRACE, ("HT: Protection = %s\n", (Value==0) ? "Disable" : "Enable"));
1608 if (RTMPGetKeyParameter("HT_MIMOPSEnable", pValueStr, 25, pInput))
1610 Value = simple_strtol(pValueStr, 0, 10);
1613 pAd->CommonCfg.bMIMOPSEnable = FALSE;
1617 pAd->CommonCfg.bMIMOPSEnable = TRUE;
1619 DBGPRINT(RT_DEBUG_TRACE, ("HT: MIMOPSEnable = %s\n", (Value==0) ? "Disable" : "Enable"));
1623 if (RTMPGetKeyParameter("HT_MIMOPSMode", pValueStr, 25, pInput))
1625 Value = simple_strtol(pValueStr, 0, 10);
1626 if (Value > MMPS_ENABLE)
1628 pAd->CommonCfg.BACapability.field.MMPSmode = MMPS_ENABLE;
1632 //TODO: add mimo power saving mechanism
1633 pAd->CommonCfg.BACapability.field.MMPSmode = MMPS_ENABLE;
1634 //pAd->CommonCfg.BACapability.field.MMPSmode = Value;
1636 DBGPRINT(RT_DEBUG_TRACE, ("HT: MIMOPS Mode = %d\n", Value));
1639 if (RTMPGetKeyParameter("HT_BADecline", pValueStr, 25, pInput))
1641 Value = simple_strtol(pValueStr, 0, 10);
1644 pAd->CommonCfg.bBADecline = FALSE;
1648 pAd->CommonCfg.bBADecline = TRUE;
1650 DBGPRINT(RT_DEBUG_TRACE, ("HT: BA Decline = %s\n", (Value==0) ? "Disable" : "Enable"));
1654 if (RTMPGetKeyParameter("HT_DisableReordering", pValueStr, 25, pInput))
1656 Value = simple_strtol(pValueStr, 0, 10);
1659 pAd->CommonCfg.bDisableReordering = FALSE;
1663 pAd->CommonCfg.bDisableReordering = TRUE;
1665 DBGPRINT(RT_DEBUG_TRACE, ("HT: DisableReordering = %s\n", (Value==0) ? "Disable" : "Enable"));
1668 if (RTMPGetKeyParameter("HT_AutoBA", pValueStr, 25, pInput))
1670 Value = simple_strtol(pValueStr, 0, 10);
1673 pAd->CommonCfg.BACapability.field.AutoBA = FALSE;
1677 pAd->CommonCfg.BACapability.field.AutoBA = TRUE;
1679 pAd->CommonCfg.REGBACapability.field.AutoBA = pAd->CommonCfg.BACapability.field.AutoBA;
1680 DBGPRINT(RT_DEBUG_TRACE, ("HT: Auto BA = %s\n", (Value==0) ? "Disable" : "Enable"));
1684 if (RTMPGetKeyParameter("HT_HTC", pValueStr, 25, pInput))
1686 Value = simple_strtol(pValueStr, 0, 10);
1689 pAd->HTCEnable = FALSE;
1693 pAd->HTCEnable = TRUE;
1695 DBGPRINT(RT_DEBUG_TRACE, ("HT: Tx +HTC frame = %s\n", (Value==0) ? "Disable" : "Enable"));
1698 // Enable HT Link Adaptation Control
1699 if (RTMPGetKeyParameter("HT_LinkAdapt", pValueStr, 25, pInput))
1701 Value = simple_strtol(pValueStr, 0, 10);
1704 pAd->bLinkAdapt = FALSE;
1708 pAd->HTCEnable = TRUE;
1709 pAd->bLinkAdapt = TRUE;
1711 DBGPRINT(RT_DEBUG_TRACE, ("HT: Link Adaptation Control = %s\n", (Value==0) ? "Disable" : "Enable(+HTC)"));
1714 // Reverse Direction Mechanism
1715 if (RTMPGetKeyParameter("HT_RDG", pValueStr, 25, pInput))
1717 Value = simple_strtol(pValueStr, 0, 10);
1720 pAd->CommonCfg.bRdg = FALSE;
1724 pAd->HTCEnable = TRUE;
1725 pAd->CommonCfg.bRdg = TRUE;
1727 DBGPRINT(RT_DEBUG_TRACE, ("HT: RDG = %s\n", (Value==0) ? "Disable" : "Enable(+HTC)"));
1734 if (RTMPGetKeyParameter("HT_AMSDU", pValueStr, 25, pInput))
1736 Value = simple_strtol(pValueStr, 0, 10);
1739 pAd->CommonCfg.BACapability.field.AmsduEnable = FALSE;
1743 pAd->CommonCfg.BACapability.field.AmsduEnable = TRUE;
1745 DBGPRINT(RT_DEBUG_TRACE, ("HT: Tx A-MSDU = %s\n", (Value==0) ? "Disable" : "Enable"));
1749 if (RTMPGetKeyParameter("HT_MpduDensity", pValueStr, 25, pInput))
1751 Value = simple_strtol(pValueStr, 0, 10);
1752 if (Value <=7 && Value >= 0)
1754 pAd->CommonCfg.BACapability.field.MpduDensity = Value;
1755 DBGPRINT(RT_DEBUG_TRACE, ("HT: MPDU Density = %d\n", Value));
1759 pAd->CommonCfg.BACapability.field.MpduDensity = 4;
1760 DBGPRINT(RT_DEBUG_TRACE, ("HT: MPDU Density = %d (Default)\n", 4));
1764 // Max Rx BA Window Size
1765 if (RTMPGetKeyParameter("HT_BAWinSize", pValueStr, 25, pInput))
1767 Value = simple_strtol(pValueStr, 0, 10);
1769 if (Value >=1 && Value <= 64)
1771 pAd->CommonCfg.REGBACapability.field.RxBAWinLimit = Value;
1772 pAd->CommonCfg.BACapability.field.RxBAWinLimit = Value;
1773 DBGPRINT(RT_DEBUG_TRACE, ("HT: BA Windw Size = %d\n", Value));
1777 pAd->CommonCfg.REGBACapability.field.RxBAWinLimit = 64;
1778 pAd->CommonCfg.BACapability.field.RxBAWinLimit = 64;
1779 DBGPRINT(RT_DEBUG_TRACE, ("HT: BA Windw Size = 64 (Defualt)\n"));
1785 if (RTMPGetKeyParameter("HT_GI", pValueStr, 25, pInput))
1787 Value = simple_strtol(pValueStr, 0, 10);
1789 if (Value == GI_400)
1791 pAd->CommonCfg.RegTransmitSetting.field.ShortGI = GI_400;
1795 pAd->CommonCfg.RegTransmitSetting.field.ShortGI = GI_800;
1798 DBGPRINT(RT_DEBUG_TRACE, ("HT: Guard Interval = %s\n", (Value==GI_400) ? "400" : "800" ));
1801 // HT Operation Mode : Mixed Mode , Green Field
1802 if (RTMPGetKeyParameter("HT_OpMode", pValueStr, 25, pInput))
1804 Value = simple_strtol(pValueStr, 0, 10);
1806 if (Value == HTMODE_GF)
1809 pAd->CommonCfg.RegTransmitSetting.field.HTMODE = HTMODE_GF;
1813 pAd->CommonCfg.RegTransmitSetting.field.HTMODE = HTMODE_MM;
1816 DBGPRINT(RT_DEBUG_TRACE, ("HT: Operate Mode = %s\n", (Value==HTMODE_GF) ? "Green Field" : "Mixed Mode" ));
1819 // Fixed Tx mode : CCK, OFDM
1820 if (RTMPGetKeyParameter("FixedTxMode", pValueStr, 25, pInput))
1824 #ifdef CONFIG_STA_SUPPORT
1825 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1827 fix_tx_mode = FIXED_TXMODE_HT;
1829 if (strcmp(pValueStr, "OFDM") == 0 || strcmp(pValueStr, "ofdm") == 0)
1831 fix_tx_mode = FIXED_TXMODE_OFDM;
1833 else if (strcmp(pValueStr, "CCK") == 0 || strcmp(pValueStr, "cck") == 0)
1835 fix_tx_mode = FIXED_TXMODE_CCK;
1837 else if (strcmp(pValueStr, "HT") == 0 || strcmp(pValueStr, "ht") == 0)
1839 fix_tx_mode = FIXED_TXMODE_HT;
1843 Value = simple_strtol(pValueStr, 0, 10);
1847 if (Value == FIXED_TXMODE_CCK || Value == FIXED_TXMODE_OFDM)
1848 fix_tx_mode = Value;
1850 fix_tx_mode = FIXED_TXMODE_HT;
1853 pAd->StaCfg.DesiredTransmitSetting.field.FixedTxMode = fix_tx_mode;
1854 DBGPRINT(RT_DEBUG_TRACE, ("Fixed Tx Mode = %d\n", fix_tx_mode));
1857 #endif // CONFIG_STA_SUPPORT //
1862 if (RTMPGetKeyParameter("HT_BW", pValueStr, 25, pInput))
1864 Value = simple_strtol(pValueStr, 0, 10);
1868 pAd->CommonCfg.RegTransmitSetting.field.BW = BW_40;
1872 pAd->CommonCfg.RegTransmitSetting.field.BW = BW_20;
1875 #ifdef MCAST_RATE_SPECIFIC
1876 pAd->CommonCfg.MCastPhyMode.field.BW = pAd->CommonCfg.RegTransmitSetting.field.BW;
1877 #endif // MCAST_RATE_SPECIFIC //
1879 DBGPRINT(RT_DEBUG_TRACE, ("HT: Channel Width = %s\n", (Value==BW_40) ? "40 MHz" : "20 MHz" ));
1882 if (RTMPGetKeyParameter("HT_EXTCHA", pValueStr, 25, pInput))
1884 Value = simple_strtol(pValueStr, 0, 10);
1889 pAd->CommonCfg.RegTransmitSetting.field.EXTCHA = EXTCHA_BELOW;
1893 pAd->CommonCfg.RegTransmitSetting.field.EXTCHA = EXTCHA_ABOVE;
1896 DBGPRINT(RT_DEBUG_TRACE, ("HT: Ext Channel = %s\n", (Value==0) ? "BELOW" : "ABOVE" ));
1900 if (RTMPGetKeyParameter("HT_MCS", pValueStr, 50, pInput))
1903 #ifdef CONFIG_STA_SUPPORT
1904 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1906 Value = simple_strtol(pValueStr, 0, 10);
1908 // if ((Value >= 0 && Value <= 15) || (Value == 32))
1909 if ((Value >= 0 && Value <= 23) || (Value == 32)) // 3*3
1911 pAd->StaCfg.DesiredTransmitSetting.field.MCS = Value;
1912 pAd->StaCfg.bAutoTxRateSwitch = FALSE;
1913 DBGPRINT(RT_DEBUG_TRACE, ("HT: MCS = %d\n", pAd->StaCfg.DesiredTransmitSetting.field.MCS));
1917 pAd->StaCfg.DesiredTransmitSetting.field.MCS = MCS_AUTO;
1918 pAd->StaCfg.bAutoTxRateSwitch = TRUE;
1919 DBGPRINT(RT_DEBUG_TRACE, ("HT: MCS = AUTO\n"));
1922 #endif // CONFIG_STA_SUPPORT //
1926 if (RTMPGetKeyParameter("HT_STBC", pValueStr, 25, pInput))
1928 Value = simple_strtol(pValueStr, 0, 10);
1929 if (Value == STBC_USE)
1931 pAd->CommonCfg.RegTransmitSetting.field.STBC = STBC_USE;
1935 pAd->CommonCfg.RegTransmitSetting.field.STBC = STBC_NONE;
1937 DBGPRINT(RT_DEBUG_TRACE, ("HT: STBC = %d\n", pAd->CommonCfg.RegTransmitSetting.field.STBC));
1940 // 40_Mhz_Intolerant
1941 if (RTMPGetKeyParameter("HT_40MHZ_INTOLERANT", pValueStr, 25, pInput))
1943 Value = simple_strtol(pValueStr, 0, 10);
1946 pAd->CommonCfg.bForty_Mhz_Intolerant = FALSE;
1950 pAd->CommonCfg.bForty_Mhz_Intolerant = TRUE;
1952 DBGPRINT(RT_DEBUG_TRACE, ("HT: 40MHZ INTOLERANT = %d\n", pAd->CommonCfg.bForty_Mhz_Intolerant));
1955 if(RTMPGetKeyParameter("HT_TxStream", pValueStr, 10, pInput))
1957 switch (simple_strtol(pValueStr, 0, 10))
1960 pAd->CommonCfg.TxStream = 1;
1963 pAd->CommonCfg.TxStream = 2;
1967 pAd->CommonCfg.TxStream = 3;
1969 if (pAd->MACVersion < RALINK_2883_VERSION)
1970 pAd->CommonCfg.TxStream = 2; // only 2 tx streams for RT2860 series
1973 DBGPRINT(RT_DEBUG_TRACE, ("HT: Tx Stream = %d\n", pAd->CommonCfg.TxStream));
1976 if(RTMPGetKeyParameter("HT_RxStream", pValueStr, 10, pInput))
1978 switch (simple_strtol(pValueStr, 0, 10))
1981 pAd->CommonCfg.RxStream = 1;
1984 pAd->CommonCfg.RxStream = 2;
1988 pAd->CommonCfg.RxStream = 3;
1990 if (pAd->MACVersion < RALINK_2883_VERSION)
1991 pAd->CommonCfg.RxStream = 2; // only 2 rx streams for RT2860 series
1994 DBGPRINT(RT_DEBUG_TRACE, ("HT: Rx Stream = %d\n", pAd->CommonCfg.RxStream));
1998 #endif // DOT11_N_SUPPORT //