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)
926 orgfsuid = current->fsuid;
927 orgfsgid = current->fsgid;
928 current->fsuid=current->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 //
1557 #ifdef CONFIG_STA_SUPPORT
1558 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1560 if(RTMPGetKeyParameter("AntDiversity", tmpbuf, 10, buffer))
1562 for (i = 0, macptr = rstrtok(tmpbuf,";"); macptr; macptr = rstrtok(NULL,";"), i++)
1564 if(simple_strtol(macptr, 0, 10) != 0) //Enable
1565 pAd->CommonCfg.bRxAntDiversity = TRUE;
1567 pAd->CommonCfg.bRxAntDiversity = FALSE;
1569 DBGPRINT(RT_DEBUG_ERROR, ("AntDiversity=%d\n", pAd->CommonCfg.bRxAntDiversity));
1573 #endif // CONFIG_STA_SUPPORT //
1579 DBGPRINT(RT_DEBUG_TRACE, ("--> %s does not have a write method\n", src));
1582 retval=filp_close(srcf,NULL);
1586 DBGPRINT(RT_DEBUG_TRACE, ("--> Error %d closing %s\n", -retval, src));
1593 current->fsuid = orgfsuid;
1594 current->fsgid = orgfsgid;
1600 return (NDIS_STATUS_SUCCESS);
1603 #ifdef DOT11_N_SUPPORT
1604 static void HTParametersHook(
1605 IN PRTMP_ADAPTER pAd,
1612 if (RTMPGetKeyParameter("HT_PROTECT", pValueStr, 25, pInput))
1614 Value = simple_strtol(pValueStr, 0, 10);
1617 pAd->CommonCfg.bHTProtect = FALSE;
1621 pAd->CommonCfg.bHTProtect = TRUE;
1623 DBGPRINT(RT_DEBUG_TRACE, ("HT: Protection = %s\n", (Value==0) ? "Disable" : "Enable"));
1626 if (RTMPGetKeyParameter("HT_MIMOPSEnable", pValueStr, 25, pInput))
1628 Value = simple_strtol(pValueStr, 0, 10);
1631 pAd->CommonCfg.bMIMOPSEnable = FALSE;
1635 pAd->CommonCfg.bMIMOPSEnable = TRUE;
1637 DBGPRINT(RT_DEBUG_TRACE, ("HT: MIMOPSEnable = %s\n", (Value==0) ? "Disable" : "Enable"));
1641 if (RTMPGetKeyParameter("HT_MIMOPSMode", pValueStr, 25, pInput))
1643 Value = simple_strtol(pValueStr, 0, 10);
1644 if (Value > MMPS_ENABLE)
1646 pAd->CommonCfg.BACapability.field.MMPSmode = MMPS_ENABLE;
1650 //TODO: add mimo power saving mechanism
1651 pAd->CommonCfg.BACapability.field.MMPSmode = MMPS_ENABLE;
1652 //pAd->CommonCfg.BACapability.field.MMPSmode = Value;
1654 DBGPRINT(RT_DEBUG_TRACE, ("HT: MIMOPS Mode = %d\n", Value));
1657 if (RTMPGetKeyParameter("HT_BADecline", pValueStr, 25, pInput))
1659 Value = simple_strtol(pValueStr, 0, 10);
1662 pAd->CommonCfg.bBADecline = FALSE;
1666 pAd->CommonCfg.bBADecline = TRUE;
1668 DBGPRINT(RT_DEBUG_TRACE, ("HT: BA Decline = %s\n", (Value==0) ? "Disable" : "Enable"));
1672 if (RTMPGetKeyParameter("HT_DisableReordering", pValueStr, 25, pInput))
1674 Value = simple_strtol(pValueStr, 0, 10);
1677 pAd->CommonCfg.bDisableReordering = FALSE;
1681 pAd->CommonCfg.bDisableReordering = TRUE;
1683 DBGPRINT(RT_DEBUG_TRACE, ("HT: DisableReordering = %s\n", (Value==0) ? "Disable" : "Enable"));
1686 if (RTMPGetKeyParameter("HT_AutoBA", pValueStr, 25, pInput))
1688 Value = simple_strtol(pValueStr, 0, 10);
1691 pAd->CommonCfg.BACapability.field.AutoBA = FALSE;
1692 pAd->CommonCfg.BACapability.field.Policy = BA_NOTUSE;
1696 pAd->CommonCfg.BACapability.field.AutoBA = TRUE;
1697 pAd->CommonCfg.BACapability.field.Policy = IMMED_BA;
1699 pAd->CommonCfg.REGBACapability.field.AutoBA = pAd->CommonCfg.BACapability.field.AutoBA;
1700 pAd->CommonCfg.REGBACapability.field.Policy = pAd->CommonCfg.BACapability.field.Policy;
1701 DBGPRINT(RT_DEBUG_TRACE, ("HT: Auto BA = %s\n", (Value==0) ? "Disable" : "Enable"));
1705 if (RTMPGetKeyParameter("HT_HTC", pValueStr, 25, pInput))
1707 Value = simple_strtol(pValueStr, 0, 10);
1710 pAd->HTCEnable = FALSE;
1714 pAd->HTCEnable = TRUE;
1716 DBGPRINT(RT_DEBUG_TRACE, ("HT: Tx +HTC frame = %s\n", (Value==0) ? "Disable" : "Enable"));
1719 // Enable HT Link Adaptation Control
1720 if (RTMPGetKeyParameter("HT_LinkAdapt", pValueStr, 25, pInput))
1722 Value = simple_strtol(pValueStr, 0, 10);
1725 pAd->bLinkAdapt = FALSE;
1729 pAd->HTCEnable = TRUE;
1730 pAd->bLinkAdapt = TRUE;
1732 DBGPRINT(RT_DEBUG_TRACE, ("HT: Link Adaptation Control = %s\n", (Value==0) ? "Disable" : "Enable(+HTC)"));
1735 // Reverse Direction Mechanism
1736 if (RTMPGetKeyParameter("HT_RDG", pValueStr, 25, pInput))
1738 Value = simple_strtol(pValueStr, 0, 10);
1741 pAd->CommonCfg.bRdg = FALSE;
1745 pAd->HTCEnable = TRUE;
1746 pAd->CommonCfg.bRdg = TRUE;
1748 DBGPRINT(RT_DEBUG_TRACE, ("HT: RDG = %s\n", (Value==0) ? "Disable" : "Enable(+HTC)"));
1755 if (RTMPGetKeyParameter("HT_AMSDU", pValueStr, 25, pInput))
1757 Value = simple_strtol(pValueStr, 0, 10);
1760 pAd->CommonCfg.BACapability.field.AmsduEnable = FALSE;
1764 pAd->CommonCfg.BACapability.field.AmsduEnable = TRUE;
1766 DBGPRINT(RT_DEBUG_TRACE, ("HT: Tx A-MSDU = %s\n", (Value==0) ? "Disable" : "Enable"));
1770 if (RTMPGetKeyParameter("HT_MpduDensity", pValueStr, 25, pInput))
1772 Value = simple_strtol(pValueStr, 0, 10);
1773 if (Value <=7 && Value >= 0)
1775 pAd->CommonCfg.BACapability.field.MpduDensity = Value;
1776 DBGPRINT(RT_DEBUG_TRACE, ("HT: MPDU Density = %d\n", Value));
1780 pAd->CommonCfg.BACapability.field.MpduDensity = 4;
1781 DBGPRINT(RT_DEBUG_TRACE, ("HT: MPDU Density = %d (Default)\n", 4));
1785 // Max Rx BA Window Size
1786 if (RTMPGetKeyParameter("HT_BAWinSize", pValueStr, 25, pInput))
1788 Value = simple_strtol(pValueStr, 0, 10);
1790 if (Value >=1 && Value <= 64)
1792 pAd->CommonCfg.REGBACapability.field.RxBAWinLimit = Value;
1793 pAd->CommonCfg.BACapability.field.RxBAWinLimit = Value;
1794 DBGPRINT(RT_DEBUG_TRACE, ("HT: BA Windw Size = %d\n", Value));
1798 pAd->CommonCfg.REGBACapability.field.RxBAWinLimit = 64;
1799 pAd->CommonCfg.BACapability.field.RxBAWinLimit = 64;
1800 DBGPRINT(RT_DEBUG_TRACE, ("HT: BA Windw Size = 64 (Defualt)\n"));
1806 if (RTMPGetKeyParameter("HT_GI", pValueStr, 25, pInput))
1808 Value = simple_strtol(pValueStr, 0, 10);
1810 if (Value == GI_400)
1812 pAd->CommonCfg.RegTransmitSetting.field.ShortGI = GI_400;
1816 pAd->CommonCfg.RegTransmitSetting.field.ShortGI = GI_800;
1819 DBGPRINT(RT_DEBUG_TRACE, ("HT: Guard Interval = %s\n", (Value==GI_400) ? "400" : "800" ));
1822 // HT Operation Mode : Mixed Mode , Green Field
1823 if (RTMPGetKeyParameter("HT_OpMode", pValueStr, 25, pInput))
1825 Value = simple_strtol(pValueStr, 0, 10);
1827 if (Value == HTMODE_GF)
1830 pAd->CommonCfg.RegTransmitSetting.field.HTMODE = HTMODE_GF;
1834 pAd->CommonCfg.RegTransmitSetting.field.HTMODE = HTMODE_MM;
1837 DBGPRINT(RT_DEBUG_TRACE, ("HT: Operate Mode = %s\n", (Value==HTMODE_GF) ? "Green Field" : "Mixed Mode" ));
1840 // Fixed Tx mode : CCK, OFDM
1841 if (RTMPGetKeyParameter("FixedTxMode", pValueStr, 25, pInput))
1845 #ifdef CONFIG_STA_SUPPORT
1846 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1848 fix_tx_mode = FIXED_TXMODE_HT;
1850 if (strcmp(pValueStr, "OFDM") == 0 || strcmp(pValueStr, "ofdm") == 0)
1852 fix_tx_mode = FIXED_TXMODE_OFDM;
1854 else if (strcmp(pValueStr, "CCK") == 0 || strcmp(pValueStr, "cck") == 0)
1856 fix_tx_mode = FIXED_TXMODE_CCK;
1858 else if (strcmp(pValueStr, "HT") == 0 || strcmp(pValueStr, "ht") == 0)
1860 fix_tx_mode = FIXED_TXMODE_HT;
1864 Value = simple_strtol(pValueStr, 0, 10);
1868 if (Value == FIXED_TXMODE_CCK || Value == FIXED_TXMODE_OFDM)
1869 fix_tx_mode = Value;
1871 fix_tx_mode = FIXED_TXMODE_HT;
1874 pAd->StaCfg.DesiredTransmitSetting.field.FixedTxMode = fix_tx_mode;
1875 DBGPRINT(RT_DEBUG_TRACE, ("Fixed Tx Mode = %d\n", fix_tx_mode));
1878 #endif // CONFIG_STA_SUPPORT //
1883 if (RTMPGetKeyParameter("HT_BW", pValueStr, 25, pInput))
1885 Value = simple_strtol(pValueStr, 0, 10);
1889 pAd->CommonCfg.RegTransmitSetting.field.BW = BW_40;
1893 pAd->CommonCfg.RegTransmitSetting.field.BW = BW_20;
1896 #ifdef MCAST_RATE_SPECIFIC
1897 pAd->CommonCfg.MCastPhyMode.field.BW = pAd->CommonCfg.RegTransmitSetting.field.BW;
1898 #endif // MCAST_RATE_SPECIFIC //
1900 DBGPRINT(RT_DEBUG_TRACE, ("HT: Channel Width = %s\n", (Value==BW_40) ? "40 MHz" : "20 MHz" ));
1903 if (RTMPGetKeyParameter("HT_EXTCHA", pValueStr, 25, pInput))
1905 Value = simple_strtol(pValueStr, 0, 10);
1910 pAd->CommonCfg.RegTransmitSetting.field.EXTCHA = EXTCHA_BELOW;
1914 pAd->CommonCfg.RegTransmitSetting.field.EXTCHA = EXTCHA_ABOVE;
1917 DBGPRINT(RT_DEBUG_TRACE, ("HT: Ext Channel = %s\n", (Value==0) ? "BELOW" : "ABOVE" ));
1921 if (RTMPGetKeyParameter("HT_MCS", pValueStr, 50, pInput))
1924 #ifdef CONFIG_STA_SUPPORT
1925 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1927 Value = simple_strtol(pValueStr, 0, 10);
1929 // if ((Value >= 0 && Value <= 15) || (Value == 32))
1930 if ((Value >= 0 && Value <= 23) || (Value == 32)) // 3*3
1932 pAd->StaCfg.DesiredTransmitSetting.field.MCS = Value;
1933 pAd->StaCfg.bAutoTxRateSwitch = FALSE;
1934 DBGPRINT(RT_DEBUG_TRACE, ("HT: MCS = %d\n", pAd->StaCfg.DesiredTransmitSetting.field.MCS));
1938 pAd->StaCfg.DesiredTransmitSetting.field.MCS = MCS_AUTO;
1939 pAd->StaCfg.bAutoTxRateSwitch = TRUE;
1940 DBGPRINT(RT_DEBUG_TRACE, ("HT: MCS = AUTO\n"));
1943 #endif // CONFIG_STA_SUPPORT //
1947 if (RTMPGetKeyParameter("HT_STBC", pValueStr, 25, pInput))
1949 Value = simple_strtol(pValueStr, 0, 10);
1950 if (Value == STBC_USE)
1952 pAd->CommonCfg.RegTransmitSetting.field.STBC = STBC_USE;
1956 pAd->CommonCfg.RegTransmitSetting.field.STBC = STBC_NONE;
1958 DBGPRINT(RT_DEBUG_TRACE, ("HT: STBC = %d\n", pAd->CommonCfg.RegTransmitSetting.field.STBC));
1961 // 40_Mhz_Intolerant
1962 if (RTMPGetKeyParameter("HT_40MHZ_INTOLERANT", pValueStr, 25, pInput))
1964 Value = simple_strtol(pValueStr, 0, 10);
1967 pAd->CommonCfg.bForty_Mhz_Intolerant = FALSE;
1971 pAd->CommonCfg.bForty_Mhz_Intolerant = TRUE;
1973 DBGPRINT(RT_DEBUG_TRACE, ("HT: 40MHZ INTOLERANT = %d\n", pAd->CommonCfg.bForty_Mhz_Intolerant));
1976 if(RTMPGetKeyParameter("HT_TxStream", pValueStr, 10, pInput))
1978 switch (simple_strtol(pValueStr, 0, 10))
1981 pAd->CommonCfg.TxStream = 1;
1984 pAd->CommonCfg.TxStream = 2;
1988 pAd->CommonCfg.TxStream = 3;
1990 if (pAd->MACVersion < RALINK_2883_VERSION)
1991 pAd->CommonCfg.TxStream = 2; // only 2 tx streams for RT2860 series
1994 DBGPRINT(RT_DEBUG_TRACE, ("HT: Tx Stream = %d\n", pAd->CommonCfg.TxStream));
1997 if(RTMPGetKeyParameter("HT_RxStream", pValueStr, 10, pInput))
1999 switch (simple_strtol(pValueStr, 0, 10))
2002 pAd->CommonCfg.RxStream = 1;
2005 pAd->CommonCfg.RxStream = 2;
2009 pAd->CommonCfg.RxStream = 3;
2011 if (pAd->MACVersion < RALINK_2883_VERSION)
2012 pAd->CommonCfg.RxStream = 2; // only 2 rx streams for RT2860 series
2015 DBGPRINT(RT_DEBUG_TRACE, ("HT: Rx Stream = %d\n", pAd->CommonCfg.RxStream));
2019 #endif // DOT11_N_SUPPORT //