2 *************************************************************************
4 * 5F., No.36, Taiyuan St., Jhubei City,
8 * (c) Copyright 2002-2007, Ralink Technology, Inc.
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
15 * This program is distributed in the hope that it will be useful, *
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
18 * GNU General Public License for more details. *
20 * You should have received a copy of the GNU General Public License *
21 * along with this program; if not, write to the *
22 * Free Software Foundation, Inc., *
23 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
25 *************************************************************************
28 #include "rt_config.h"
30 #ifdef DOT11_N_SUPPORT
31 static void HTParametersHook(
35 #endif // DOT11_N_SUPPORT //
37 #define ETH_MAC_ADDR_STR_LEN 17 // in format of xx:xx:xx:xx:xx:xx
39 // We assume the s1 is a sting, s2 is a memory space with 6 bytes. and content of s1 will be changed.
40 BOOLEAN rtstrmactohex(char *s1, char *s2)
43 char *ptokS = s1, *ptokE = s1;
45 if (strlen(s1) != ETH_MAC_ADDR_STR_LEN)
48 while((*ptokS) != '\0')
50 if((ptokE = strchr(ptokS, ':')) != NULL)
52 if ((strlen(ptokS) != 2) || (!isxdigit(*ptokS)) || (!isxdigit(*(ptokS+1))))
54 AtoH(ptokS, &s2[i++], 1);
57 break; // parsing finished
60 return ( i == 6 ? TRUE : FALSE);
65 // we assume the s1 and s2 both are strings.
66 BOOLEAN rtstrcasecmp(char *s1, char *s2)
68 char *p1 = s1, *p2 = s2;
70 if (strlen(s1) != strlen(s2))
75 if((*p1 != *p2) && ((*p1 ^ *p2) != 0x20))
84 // we assume the s1 (buffer) and s2 (key) both are strings.
85 char * rtstrstruncasecmp(char * s1, char * s2)
105 if (('a' <= temp1) && (temp1 <= 'z'))
106 temp1 = 'A'+(temp1-'a');
107 if (('a' <= temp2) && (temp2 <= 'z'))
108 temp2 = 'A'+(temp2-'a');
120 return NULL; // not found
126 * strstr - Find the first substring in a %NUL terminated string
127 * @s1: The string to be searched
128 * @s2: The string to search for
130 char * rtstrstr(const char * s1,const char * s2)
143 if (!memcmp(s1,s2,l2))
152 * rstrtok - Split a string into tokens
153 * @s: The string to be searched
154 * @ct: The characters to search for
155 * * WARNING: strtok is deprecated, use strsep instead. However strsep is not compatible with old architecture.
158 char * rstrtok(char * s,const char * ct)
162 sbegin = s ? s : __rstrtok;
168 sbegin += strspn(sbegin,ct);
175 send = strpbrk( sbegin, ct);
176 if (send && *send != '\0')
185 * delimitcnt - return the count of a given delimiter in a given string.
186 * @s: The string to be searched.
187 * @ct: The delimiter to search for.
188 * Notice : We suppose the delimiter is a single-char string(for example : ";").
190 INT delimitcnt(char * s,const char * ct)
193 /* point to the beginning of the line */
194 const char *token = s;
198 token = strpbrk(token, ct); /* search for delimiters */
202 /* advanced to the terminating null character */
205 /* skip the delimiter */
209 * Print the found text: use len with %.*s to specify field width.
212 /* accumulate delimiter count */
219 * converts the Internet host address from the standard numbers-and-dots notation
221 * returns nonzero if the address is valid, zero if not.
223 int rtinet_aton(const char *cp, unsigned int *addr)
228 unsigned int parts[4];
229 unsigned int *pp = parts;
234 * Collect number up to ``.''.
235 * Values are specified as for C:
236 * 0x=hex, 0=octal, other=decimal.
242 if (*++cp == 'x' || *cp == 'X')
247 while ((c = *cp) != '\0')
249 if (isdigit((unsigned char) c))
251 val = (val * base) + (c - '0');
255 if (base == 16 && isxdigit((unsigned char) c))
258 (c + 10 - (islower((unsigned char) c) ? 'a' : 'A'));
267 * Internet format: a.b.c.d a.b.c (with c treated as 16-bits)
268 * a.b (with b treated as 24 bits)
270 if (pp >= parts + 3 || val > 0xff)
279 * Check for trailing junk.
282 if (!isspace((unsigned char) *cp++))
286 * Concoct the address according to the number of parts specified.
292 case 1: /* a -- 32 bits */
295 case 2: /* a.b -- 8.24 bits */
298 val |= parts[0] << 24;
301 case 3: /* a.b.c -- 8.8.16 bits */
304 val |= (parts[0] << 24) | (parts[1] << 16);
307 case 4: /* a.b.c.d -- 8.8.8.8 bits */
310 val |= (parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8);
320 ========================================================================
323 Find key section for Get key parameter.
326 buffer Pointer to the buffer to start find the key section
327 section the key of the secion to be find
332 ========================================================================
334 PUCHAR RTMPFindSection(
340 strcpy(temp_buf, "Default");
342 if((ptr = rtstrstr(buffer, temp_buf)) != NULL)
343 return (ptr+strlen("\n"));
349 ========================================================================
355 key Pointer to key string
356 dest Pointer to destination
357 destsize The datasize of the destination
358 buffer Pointer to the buffer to start find the key
365 This routine get the value with the matched key (case case-sensitive)
366 ========================================================================
368 INT RTMPGetKeyParameter(
374 UCHAR *temp_buf1 = NULL;
375 UCHAR *temp_buf2 = NULL;
382 //temp_buf1 = kmalloc(MAX_PARAM_BUFFER_SIZE, MEM_ALLOC_FLAG);
383 os_alloc_mem(NULL, &temp_buf1, MAX_PARAM_BUFFER_SIZE);
385 if(temp_buf1 == NULL)
388 //temp_buf2 = kmalloc(MAX_PARAM_BUFFER_SIZE, MEM_ALLOC_FLAG);
389 os_alloc_mem(NULL, &temp_buf2, MAX_PARAM_BUFFER_SIZE);
390 if(temp_buf2 == NULL)
392 os_free_mem(NULL, temp_buf1);
397 if((offset = RTMPFindSection(buffer)) == NULL)
399 os_free_mem(NULL, temp_buf1);
400 os_free_mem(NULL, temp_buf2);
404 strcpy(temp_buf1, "\n");
405 strcat(temp_buf1, key);
406 strcat(temp_buf1, "=");
409 if((start_ptr=rtstrstr(offset, temp_buf1))==NULL)
411 os_free_mem(NULL, temp_buf1);
412 os_free_mem(NULL, temp_buf2);
416 start_ptr+=strlen("\n");
417 if((end_ptr=rtstrstr(start_ptr, "\n"))==NULL)
418 end_ptr=start_ptr+strlen(start_ptr);
420 if (end_ptr<start_ptr)
422 os_free_mem(NULL, temp_buf1);
423 os_free_mem(NULL, temp_buf2);
427 NdisMoveMemory(temp_buf2, start_ptr, end_ptr-start_ptr);
428 temp_buf2[end_ptr-start_ptr]='\0';
429 len = strlen(temp_buf2);
430 strcpy(temp_buf1, temp_buf2);
431 if((start_ptr=rtstrstr(temp_buf1, "=")) == NULL)
433 os_free_mem(NULL, temp_buf1);
434 os_free_mem(NULL, temp_buf2);
438 strcpy(temp_buf2, start_ptr+1);
443 if( (*ptr == ' ') || (*ptr == '\t') )
450 memset(dest, 0x00, destsize);
451 strncpy(dest, ptr, len >= destsize ? destsize: len);
453 os_free_mem(NULL, temp_buf1);
454 os_free_mem(NULL, temp_buf2);
459 ========================================================================
465 key Pointer to key string
466 dest Pointer to destination
467 destsize The datasize of the destination
468 buffer Pointer to the buffer to start find the key
475 This routine get the value with the matched key (case case-sensitive).
476 It is called for parsing SSID and any key string.
477 ========================================================================
479 INT RTMPGetCriticalParameter(
485 UCHAR *temp_buf1 = NULL;
486 UCHAR *temp_buf2 = NULL;
493 //temp_buf1 = kmalloc(MAX_PARAM_BUFFER_SIZE, MEM_ALLOC_FLAG);
494 os_alloc_mem(NULL, &temp_buf1, MAX_PARAM_BUFFER_SIZE);
496 if(temp_buf1 == NULL)
499 //temp_buf2 = kmalloc(MAX_PARAM_BUFFER_SIZE, MEM_ALLOC_FLAG);
500 os_alloc_mem(NULL, &temp_buf2, MAX_PARAM_BUFFER_SIZE);
501 if(temp_buf2 == NULL)
503 os_free_mem(NULL, temp_buf1);
508 if((offset = RTMPFindSection(buffer)) == NULL)
510 os_free_mem(NULL, temp_buf1);
511 os_free_mem(NULL, temp_buf2);
515 strcpy(temp_buf1, "\n");
516 strcat(temp_buf1, key);
517 strcat(temp_buf1, "=");
520 if((start_ptr=rtstrstr(offset, temp_buf1))==NULL)
522 os_free_mem(NULL, temp_buf1);
523 os_free_mem(NULL, temp_buf2);
527 start_ptr+=strlen("\n");
528 if((end_ptr=rtstrstr(start_ptr, "\n"))==NULL)
529 end_ptr=start_ptr+strlen(start_ptr);
531 if (end_ptr<start_ptr)
533 os_free_mem(NULL, temp_buf1);
534 os_free_mem(NULL, temp_buf2);
538 NdisMoveMemory(temp_buf2, start_ptr, end_ptr-start_ptr);
539 temp_buf2[end_ptr-start_ptr]='\0';
540 len = strlen(temp_buf2);
541 strcpy(temp_buf1, temp_buf2);
542 if((start_ptr=rtstrstr(temp_buf1, "=")) == NULL)
544 os_free_mem(NULL, temp_buf1);
545 os_free_mem(NULL, temp_buf2);
549 strcpy(temp_buf2, start_ptr+1);
553 /* We cannot trim space(' ') for SSID and key string. */
556 //if( (*ptr == ' ') || (*ptr == '\t') )
564 memset(dest, 0x00, destsize);
565 strncpy(dest, ptr, len >= destsize ? destsize: len);
567 os_free_mem(NULL, temp_buf1);
568 os_free_mem(NULL, temp_buf2);
573 ========================================================================
576 Get multiple key parameter.
579 key Pointer to key string
580 dest Pointer to destination
581 destsize The datasize of the destination
582 buffer Pointer to the buffer to start find the key
589 This routine get the value with the matched key (case case-sensitive)
590 ========================================================================
592 INT RTMPGetKeyParameterWithOffset(
595 OUT USHORT *end_offset,
598 IN BOOLEAN bTrimSpace)
600 UCHAR *temp_buf1 = NULL;
601 UCHAR *temp_buf2 = NULL;
608 if (*end_offset >= MAX_INI_BUFFER_SIZE)
611 os_alloc_mem(NULL, &temp_buf1, MAX_PARAM_BUFFER_SIZE);
613 if(temp_buf1 == NULL)
616 os_alloc_mem(NULL, &temp_buf2, MAX_PARAM_BUFFER_SIZE);
617 if(temp_buf2 == NULL)
619 os_free_mem(NULL, temp_buf1);
626 if ((offset = RTMPFindSection(buffer)) == NULL)
628 os_free_mem(NULL, temp_buf1);
629 os_free_mem(NULL, temp_buf2);
634 offset = buffer + (*end_offset);
636 strcpy(temp_buf1, "\n");
637 strcat(temp_buf1, key);
638 strcat(temp_buf1, "=");
641 if((start_ptr=rtstrstr(offset, temp_buf1))==NULL)
643 os_free_mem(NULL, temp_buf1);
644 os_free_mem(NULL, temp_buf2);
648 start_ptr+=strlen("\n");
649 if((end_ptr=rtstrstr(start_ptr, "\n"))==NULL)
650 end_ptr=start_ptr+strlen(start_ptr);
652 if (end_ptr<start_ptr)
654 os_free_mem(NULL, temp_buf1);
655 os_free_mem(NULL, temp_buf2);
659 *end_offset = end_ptr - buffer;
661 NdisMoveMemory(temp_buf2, start_ptr, end_ptr-start_ptr);
662 temp_buf2[end_ptr-start_ptr]='\0';
663 len = strlen(temp_buf2);
664 strcpy(temp_buf1, temp_buf2);
665 if((start_ptr=rtstrstr(temp_buf1, "=")) == NULL)
667 os_free_mem(NULL, temp_buf1);
668 os_free_mem(NULL, temp_buf2);
672 strcpy(temp_buf2, start_ptr+1);
677 if((bTrimSpace && (*ptr == ' ')) || (*ptr == '\t') )
684 memset(dest, 0x00, destsize);
685 strncpy(dest, ptr, len >= destsize ? destsize: len);
687 os_free_mem(NULL, temp_buf1);
688 os_free_mem(NULL, temp_buf2);
693 static int rtmp_parse_key_buffer_from_file(IN PRTMP_ADAPTER pAd,IN char *buffer,IN ULONG KeyType,IN INT BSSIdx,IN INT KeyIdx)
696 INT i = BSSIdx, idx = KeyIdx;
698 UCHAR CipherAlg = CIPHER_WEP64;
701 KeyLen = strlen(keybuff);
705 if( (KeyLen == 5) || (KeyLen == 13))
707 pAd->SharedKey[i][idx].KeyLen = KeyLen;
708 NdisMoveMemory(pAd->SharedKey[i][idx].Key, keybuff, KeyLen);
710 CipherAlg = CIPHER_WEP64;
712 CipherAlg = CIPHER_WEP128;
713 pAd->SharedKey[i][idx].CipherAlg = CipherAlg;
715 DBGPRINT(RT_DEBUG_TRACE, ("I/F(ra%d) Key%dStr=%s and type=%s\n", i, idx+1, keybuff, (KeyType == 0) ? "Hex":"Ascii"));
719 {//Invalid key length
720 DBGPRINT(RT_DEBUG_ERROR, ("Key%dStr is Invalid key length! KeyLen = %ld!\n", idx+1, KeyLen));
726 if( (KeyLen == 10) || (KeyLen == 26))
728 pAd->SharedKey[i][idx].KeyLen = KeyLen / 2;
729 AtoH(keybuff, pAd->SharedKey[i][idx].Key, KeyLen / 2);
731 CipherAlg = CIPHER_WEP64;
733 CipherAlg = CIPHER_WEP128;
734 pAd->SharedKey[i][idx].CipherAlg = CipherAlg;
736 DBGPRINT(RT_DEBUG_TRACE, ("I/F(ra%d) Key%dStr=%s and type=%s\n", i, idx+1, keybuff, (KeyType == 0) ? "Hex":"Ascii"));
740 {//Invalid key length
741 DBGPRINT(RT_DEBUG_ERROR, ("I/F(ra%d) Key%dStr is Invalid key length! KeyLen = %ld!\n", i, idx+1, KeyLen));
746 static void rtmp_read_key_parms_from_file(IN PRTMP_ADAPTER pAd, char *tmpbuf, char *buffer)
751 ULONG KeyType[MAX_MBSSID_NUM];
754 NdisZeroMemory(KeyType, MAX_MBSSID_NUM);
757 if(RTMPGetKeyParameter("DefaultKeyID", tmpbuf, 25, buffer))
760 #ifdef CONFIG_STA_SUPPORT
761 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
763 KeyIdx = simple_strtol(tmpbuf, 0, 10);
764 if((KeyIdx >= 1 ) && (KeyIdx <= 4))
765 pAd->StaCfg.DefaultKeyId = (UCHAR) (KeyIdx - 1);
767 pAd->StaCfg.DefaultKeyId = 0;
769 DBGPRINT(RT_DEBUG_TRACE, ("DefaultKeyID(0~3)=%d\n", pAd->StaCfg.DefaultKeyId));
771 #endif // CONFIG_STA_SUPPORT //
775 for (idx = 0; idx < 4; idx++)
777 sprintf(tok_str, "Key%dType", idx + 1);
779 if (RTMPGetKeyParameter(tok_str, tmpbuf, 128, buffer))
781 for (i = 0, macptr = rstrtok(tmpbuf,";"); macptr; macptr = rstrtok(NULL,";"), i++)
783 KeyType[i] = simple_strtol(macptr, 0, 10);
786 #ifdef CONFIG_STA_SUPPORT
787 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
789 sprintf(tok_str, "Key%dStr", idx + 1);
790 if (RTMPGetCriticalParameter(tok_str, tmpbuf, 128, buffer))
792 rtmp_parse_key_buffer_from_file(pAd, tmpbuf, KeyType[BSS0], BSS0, idx);
795 #endif // CONFIG_STA_SUPPORT //
801 #ifdef CONFIG_STA_SUPPORT
802 static void rtmp_read_sta_wmm_parms_from_file(IN PRTMP_ADAPTER pAd, char *tmpbuf, char *buffer)
806 BOOLEAN bWmmEnable = FALSE;
809 if(RTMPGetKeyParameter("WmmCapable", tmpbuf, 32, buffer))
811 if(simple_strtol(tmpbuf, 0, 10) != 0) //Enable
813 pAd->CommonCfg.bWmmCapable = TRUE;
818 pAd->CommonCfg.bWmmCapable = FALSE;
821 DBGPRINT(RT_DEBUG_TRACE, ("WmmCapable=%d\n", pAd->CommonCfg.bWmmCapable));
824 //AckPolicy for AC_BK, AC_BE, AC_VI, AC_VO
825 if(RTMPGetKeyParameter("AckPolicy", tmpbuf, 32, buffer))
827 for (i = 0, macptr = rstrtok(tmpbuf,";"); macptr; macptr = rstrtok(NULL,";"), i++)
829 pAd->CommonCfg.AckPolicy[i] = (UCHAR)simple_strtol(macptr, 0, 10);
831 DBGPRINT(RT_DEBUG_TRACE, ("AckPolicy[%d]=%d\n", i, pAd->CommonCfg.AckPolicy[i]));
838 if(RTMPGetKeyParameter("APSDCapable", tmpbuf, 10, buffer))
840 if(simple_strtol(tmpbuf, 0, 10) != 0) //Enable
841 pAd->CommonCfg.bAPSDCapable = TRUE;
843 pAd->CommonCfg.bAPSDCapable = FALSE;
845 DBGPRINT(RT_DEBUG_TRACE, ("APSDCapable=%d\n", pAd->CommonCfg.bAPSDCapable));
848 //APSDAC for AC_BE, AC_BK, AC_VI, AC_VO
849 if(RTMPGetKeyParameter("APSDAC", tmpbuf, 32, buffer))
853 for (i = 0, macptr = rstrtok(tmpbuf,";"); macptr; macptr = rstrtok(NULL,";"), i++)
855 apsd_ac[i] = (BOOLEAN)simple_strtol(macptr, 0, 10);
857 DBGPRINT(RT_DEBUG_TRACE, ("APSDAC%d %d\n", i, apsd_ac[i]));
860 pAd->CommonCfg.bAPSDAC_BE = apsd_ac[0];
861 pAd->CommonCfg.bAPSDAC_BK = apsd_ac[1];
862 pAd->CommonCfg.bAPSDAC_VI = apsd_ac[2];
863 pAd->CommonCfg.bAPSDAC_VO = apsd_ac[3];
868 #endif // CONFIG_STA_SUPPORT //
871 NDIS_STATUS RTMPReadParametersHook(
872 IN PRTMP_ADAPTER pAd)
876 INT retval, orgfsuid, orgfsgid;
882 #ifdef CONFIG_STA_SUPPORT
883 UCHAR keyMaterial[40];
884 #endif // CONFIG_STA_SUPPORT //
890 buffer = kmalloc(MAX_INI_BUFFER_SIZE, MEM_ALLOC_FLAG);
892 return NDIS_STATUS_FAILURE;
894 tmpbuf = kmalloc(MAX_PARAM_BUFFER_SIZE, MEM_ALLOC_FLAG);
898 return NDIS_STATUS_FAILURE;
901 #ifdef CONFIG_STA_SUPPORT
902 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
903 src = STA_PROFILE_PATH;
904 #endif // CONFIG_STA_SUPPORT //
906 // Save uid and gid used for filesystem access.
907 // Set user and group to 0 (root)
908 orgfsuid = current_fsuid();
909 orgfsgid = current_fsgid();
910 /* Hm, can't really do this nicely anymore, so rely on these files
911 * being set to the proper permission to read them... */
912 /* current->cred->fsuid = current->cred->fsgid = 0; */
918 srcf = filp_open(src, O_RDONLY, 0);
921 DBGPRINT(RT_DEBUG_ERROR, ("--> Error %ld opening %s\n", -PTR_ERR(srcf),src));
925 // The object must have a read method
926 if (srcf->f_op && srcf->f_op->read)
928 memset(buffer, 0x00, MAX_INI_BUFFER_SIZE);
929 retval=srcf->f_op->read(srcf, buffer, MAX_INI_BUFFER_SIZE, &srcf->f_pos);
932 DBGPRINT(RT_DEBUG_TRACE, ("--> Read %s error %d\n", src, -retval));
936 // set file parameter to portcfg
938 if(RTMPGetKeyParameter("CountryRegion", tmpbuf, 25, buffer))
940 pAd->CommonCfg.CountryRegion = (UCHAR) simple_strtol(tmpbuf, 0, 10);
941 DBGPRINT(RT_DEBUG_TRACE, ("CountryRegion=%d\n", pAd->CommonCfg.CountryRegion));
944 if(RTMPGetKeyParameter("CountryRegionABand", tmpbuf, 25, buffer))
946 pAd->CommonCfg.CountryRegionForABand= (UCHAR) simple_strtol(tmpbuf, 0, 10);
947 DBGPRINT(RT_DEBUG_TRACE, ("CountryRegionABand=%d\n", pAd->CommonCfg.CountryRegionForABand));
950 if(RTMPGetKeyParameter("CountryCode", tmpbuf, 25, buffer))
952 NdisMoveMemory(pAd->CommonCfg.CountryCode, tmpbuf , 2);
954 if (strlen(pAd->CommonCfg.CountryCode) != 0)
956 pAd->CommonCfg.bCountryFlag = TRUE;
958 DBGPRINT(RT_DEBUG_TRACE, ("CountryCode=%s\n", pAd->CommonCfg.CountryCode));
961 if(RTMPGetKeyParameter("ChannelGeography", tmpbuf, 25, buffer))
963 UCHAR Geography = (UCHAR) simple_strtol(tmpbuf, 0, 10);
964 if (Geography <= BOTH)
966 pAd->CommonCfg.Geography = Geography;
967 pAd->CommonCfg.CountryCode[2] =
968 (pAd->CommonCfg.Geography == BOTH) ? ' ' : ((pAd->CommonCfg.Geography == IDOR) ? 'I' : 'O');
969 DBGPRINT(RT_DEBUG_TRACE, ("ChannelGeography=%d\n", pAd->CommonCfg.Geography));
974 pAd->CommonCfg.Geography = BOTH;
975 pAd->CommonCfg.CountryCode[2] = ' ';
979 #ifdef CONFIG_STA_SUPPORT
980 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
983 if (RTMPGetCriticalParameter("SSID", tmpbuf, 256, buffer))
985 if (strlen(tmpbuf) <= 32)
987 pAd->CommonCfg.SsidLen = (UCHAR) strlen(tmpbuf);
988 NdisZeroMemory(pAd->CommonCfg.Ssid, NDIS_802_11_LENGTH_SSID);
989 NdisMoveMemory(pAd->CommonCfg.Ssid, tmpbuf, pAd->CommonCfg.SsidLen);
990 pAd->MlmeAux.AutoReconnectSsidLen = pAd->CommonCfg.SsidLen;
991 NdisZeroMemory(pAd->MlmeAux.AutoReconnectSsid, NDIS_802_11_LENGTH_SSID);
992 NdisMoveMemory(pAd->MlmeAux.AutoReconnectSsid, tmpbuf, pAd->MlmeAux.AutoReconnectSsidLen);
993 pAd->MlmeAux.SsidLen = pAd->CommonCfg.SsidLen;
994 NdisZeroMemory(pAd->MlmeAux.Ssid, NDIS_802_11_LENGTH_SSID);
995 NdisMoveMemory(pAd->MlmeAux.Ssid, tmpbuf, pAd->MlmeAux.SsidLen);
996 DBGPRINT(RT_DEBUG_TRACE, ("%s::(SSID=%s)\n", __func__, tmpbuf));
1000 #endif // CONFIG_STA_SUPPORT //
1002 #ifdef CONFIG_STA_SUPPORT
1003 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1006 if (RTMPGetKeyParameter("NetworkType", tmpbuf, 25, buffer))
1008 pAd->bConfigChanged = TRUE;
1009 if (strcmp(tmpbuf, "Adhoc") == 0)
1010 pAd->StaCfg.BssType = BSS_ADHOC;
1011 else //Default Infrastructure mode
1012 pAd->StaCfg.BssType = BSS_INFRA;
1013 // Reset Ralink supplicant to not use, it will be set to start when UI set PMK key
1014 pAd->StaCfg.WpaState = SS_NOTUSE;
1015 DBGPRINT(RT_DEBUG_TRACE, ("%s::(NetworkType=%d)\n", __func__, pAd->StaCfg.BssType));
1018 #endif // CONFIG_STA_SUPPORT //
1020 if(RTMPGetKeyParameter("Channel", tmpbuf, 10, buffer))
1022 pAd->CommonCfg.Channel = (UCHAR) simple_strtol(tmpbuf, 0, 10);
1023 DBGPRINT(RT_DEBUG_TRACE, ("Channel=%d\n", pAd->CommonCfg.Channel));
1026 if(RTMPGetKeyParameter("WirelessMode", tmpbuf, 10, buffer))
1028 int value = 0, maxPhyMode = PHY_11G;
1030 #ifdef DOT11_N_SUPPORT
1031 maxPhyMode = PHY_11N_5G;
1032 #endif // DOT11_N_SUPPORT //
1034 value = simple_strtol(tmpbuf, 0, 10);
1036 if (value <= maxPhyMode)
1038 pAd->CommonCfg.PhyMode = value;
1040 DBGPRINT(RT_DEBUG_TRACE, ("PhyMode=%d\n", pAd->CommonCfg.PhyMode));
1043 if(RTMPGetKeyParameter("BasicRate", tmpbuf, 10, buffer))
1045 pAd->CommonCfg.BasicRateBitmap = (ULONG) simple_strtol(tmpbuf, 0, 10);
1046 DBGPRINT(RT_DEBUG_TRACE, ("BasicRate=%ld\n", pAd->CommonCfg.BasicRateBitmap));
1049 if(RTMPGetKeyParameter("BeaconPeriod", tmpbuf, 10, buffer))
1051 pAd->CommonCfg.BeaconPeriod = (USHORT) simple_strtol(tmpbuf, 0, 10);
1052 DBGPRINT(RT_DEBUG_TRACE, ("BeaconPeriod=%d\n", pAd->CommonCfg.BeaconPeriod));
1055 if(RTMPGetKeyParameter("TxPower", tmpbuf, 10, buffer))
1057 pAd->CommonCfg.TxPowerPercentage = (ULONG) simple_strtol(tmpbuf, 0, 10);
1058 #ifdef CONFIG_STA_SUPPORT
1059 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1060 pAd->CommonCfg.TxPowerDefault = pAd->CommonCfg.TxPowerPercentage;
1061 #endif // CONFIG_STA_SUPPORT //
1062 DBGPRINT(RT_DEBUG_TRACE, ("TxPower=%ld\n", pAd->CommonCfg.TxPowerPercentage));
1065 if(RTMPGetKeyParameter("BGProtection", tmpbuf, 10, buffer))
1067 switch (simple_strtol(tmpbuf, 0, 10))
1070 pAd->CommonCfg.UseBGProtection = 1;
1072 case 2: //Always OFF
1073 pAd->CommonCfg.UseBGProtection = 2;
1077 pAd->CommonCfg.UseBGProtection = 0;
1080 DBGPRINT(RT_DEBUG_TRACE, ("BGProtection=%ld\n", pAd->CommonCfg.UseBGProtection));
1083 if(RTMPGetKeyParameter("DisableOLBC", tmpbuf, 10, buffer))
1085 switch (simple_strtol(tmpbuf, 0, 10))
1087 case 1: //disable OLBC Detection
1088 pAd->CommonCfg.DisableOLBCDetect = 1;
1090 case 0: //enable OLBC Detection
1091 pAd->CommonCfg.DisableOLBCDetect = 0;
1094 pAd->CommonCfg.DisableOLBCDetect= 0;
1097 DBGPRINT(RT_DEBUG_TRACE, ("OLBCDetection=%ld\n", pAd->CommonCfg.DisableOLBCDetect));
1100 if(RTMPGetKeyParameter("TxPreamble", tmpbuf, 10, buffer))
1102 switch (simple_strtol(tmpbuf, 0, 10))
1104 case Rt802_11PreambleShort:
1105 pAd->CommonCfg.TxPreamble = Rt802_11PreambleShort;
1107 case Rt802_11PreambleLong:
1109 pAd->CommonCfg.TxPreamble = Rt802_11PreambleLong;
1112 DBGPRINT(RT_DEBUG_TRACE, ("TxPreamble=%ld\n", pAd->CommonCfg.TxPreamble));
1115 if(RTMPGetKeyParameter("RTSThreshold", tmpbuf, 10, buffer))
1117 RtsThresh = simple_strtol(tmpbuf, 0, 10);
1118 if( (RtsThresh >= 1) && (RtsThresh <= MAX_RTS_THRESHOLD) )
1119 pAd->CommonCfg.RtsThreshold = (USHORT)RtsThresh;
1121 pAd->CommonCfg.RtsThreshold = MAX_RTS_THRESHOLD;
1123 DBGPRINT(RT_DEBUG_TRACE, ("RTSThreshold=%d\n", pAd->CommonCfg.RtsThreshold));
1126 if(RTMPGetKeyParameter("FragThreshold", tmpbuf, 10, buffer))
1128 FragThresh = simple_strtol(tmpbuf, 0, 10);
1129 pAd->CommonCfg.bUseZeroToDisableFragment = FALSE;
1131 if (FragThresh > MAX_FRAG_THRESHOLD || FragThresh < MIN_FRAG_THRESHOLD)
1132 { //illegal FragThresh so we set it to default
1133 pAd->CommonCfg.FragmentThreshold = MAX_FRAG_THRESHOLD;
1134 pAd->CommonCfg.bUseZeroToDisableFragment = TRUE;
1136 else if (FragThresh % 2 == 1)
1138 // The length of each fragment shall always be an even number of octets, except for the last fragment
1139 // of an MSDU or MMPDU, which may be either an even or an odd number of octets.
1140 pAd->CommonCfg.FragmentThreshold = (USHORT)(FragThresh - 1);
1144 pAd->CommonCfg.FragmentThreshold = (USHORT)FragThresh;
1146 //pAd->CommonCfg.AllowFragSize = (pAd->CommonCfg.FragmentThreshold) - LENGTH_802_11 - LENGTH_CRC;
1147 DBGPRINT(RT_DEBUG_TRACE, ("FragThreshold=%d\n", pAd->CommonCfg.FragmentThreshold));
1150 if(RTMPGetKeyParameter("TxBurst", tmpbuf, 10, buffer))
1153 // pAd->CommonCfg.bEnableTxBurst = FALSE;
1155 if(simple_strtol(tmpbuf, 0, 10) != 0) //Enable
1156 pAd->CommonCfg.bEnableTxBurst = TRUE;
1158 pAd->CommonCfg.bEnableTxBurst = FALSE;
1160 DBGPRINT(RT_DEBUG_TRACE, ("TxBurst=%d\n", pAd->CommonCfg.bEnableTxBurst));
1163 #ifdef AGGREGATION_SUPPORT
1165 if(RTMPGetKeyParameter("PktAggregate", tmpbuf, 10, buffer))
1167 if(simple_strtol(tmpbuf, 0, 10) != 0) //Enable
1168 pAd->CommonCfg.bAggregationCapable = TRUE;
1170 pAd->CommonCfg.bAggregationCapable = FALSE;
1171 #ifdef PIGGYBACK_SUPPORT
1172 pAd->CommonCfg.bPiggyBackCapable = pAd->CommonCfg.bAggregationCapable;
1173 #endif // PIGGYBACK_SUPPORT //
1174 DBGPRINT(RT_DEBUG_TRACE, ("PktAggregate=%d\n", pAd->CommonCfg.bAggregationCapable));
1177 pAd->CommonCfg.bAggregationCapable = FALSE;
1178 pAd->CommonCfg.bPiggyBackCapable = FALSE;
1179 #endif // AGGREGATION_SUPPORT //
1183 #ifdef CONFIG_STA_SUPPORT
1184 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1185 rtmp_read_sta_wmm_parms_from_file(pAd, tmpbuf, buffer);
1186 #endif // CONFIG_STA_SUPPORT //
1189 if(RTMPGetKeyParameter("ShortSlot", tmpbuf, 10, buffer))
1191 if(simple_strtol(tmpbuf, 0, 10) != 0) //Enable
1192 pAd->CommonCfg.bUseShortSlotTime = TRUE;
1194 pAd->CommonCfg.bUseShortSlotTime = FALSE;
1196 DBGPRINT(RT_DEBUG_TRACE, ("ShortSlot=%d\n", pAd->CommonCfg.bUseShortSlotTime));
1199 if(RTMPGetKeyParameter("IEEE80211H", tmpbuf, 10, buffer))
1201 for (i = 0, macptr = rstrtok(tmpbuf,";"); macptr; macptr = rstrtok(NULL,";"), i++)
1203 if(simple_strtol(macptr, 0, 10) != 0) //Enable
1204 pAd->CommonCfg.bIEEE80211H = TRUE;
1206 pAd->CommonCfg.bIEEE80211H = FALSE;
1208 DBGPRINT(RT_DEBUG_TRACE, ("IEEE80211H=%d\n", pAd->CommonCfg.bIEEE80211H));
1212 if(RTMPGetKeyParameter("CSPeriod", tmpbuf, 10, buffer))
1214 if(simple_strtol(tmpbuf, 0, 10) != 0)
1215 pAd->CommonCfg.RadarDetect.CSPeriod = simple_strtol(tmpbuf, 0, 10);
1217 pAd->CommonCfg.RadarDetect.CSPeriod = 0;
1219 DBGPRINT(RT_DEBUG_TRACE, ("CSPeriod=%d\n", pAd->CommonCfg.RadarDetect.CSPeriod));
1223 if(RTMPGetKeyParameter("RDRegion", tmpbuf, 128, buffer))
1225 if ((strncmp(tmpbuf, "JAP_W53", 7) == 0) || (strncmp(tmpbuf, "jap_w53", 7) == 0))
1227 pAd->CommonCfg.RadarDetect.RDDurRegion = JAP_W53;
1228 pAd->CommonCfg.RadarDetect.DfsSessionTime = 15;
1230 else if ((strncmp(tmpbuf, "JAP_W56", 7) == 0) || (strncmp(tmpbuf, "jap_w56", 7) == 0))
1232 pAd->CommonCfg.RadarDetect.RDDurRegion = JAP_W56;
1233 pAd->CommonCfg.RadarDetect.DfsSessionTime = 13;
1235 else if ((strncmp(tmpbuf, "JAP", 3) == 0) || (strncmp(tmpbuf, "jap", 3) == 0))
1237 pAd->CommonCfg.RadarDetect.RDDurRegion = JAP;
1238 pAd->CommonCfg.RadarDetect.DfsSessionTime = 5;
1240 else if ((strncmp(tmpbuf, "FCC", 3) == 0) || (strncmp(tmpbuf, "fcc", 3) == 0))
1242 pAd->CommonCfg.RadarDetect.RDDurRegion = FCC;
1243 pAd->CommonCfg.RadarDetect.DfsSessionTime = 5;
1245 else if ((strncmp(tmpbuf, "CE", 2) == 0) || (strncmp(tmpbuf, "ce", 2) == 0))
1247 pAd->CommonCfg.RadarDetect.RDDurRegion = CE;
1248 pAd->CommonCfg.RadarDetect.DfsSessionTime = 13;
1252 pAd->CommonCfg.RadarDetect.RDDurRegion = CE;
1253 pAd->CommonCfg.RadarDetect.DfsSessionTime = 13;
1256 DBGPRINT(RT_DEBUG_TRACE, ("RDRegion=%d\n", pAd->CommonCfg.RadarDetect.RDDurRegion));
1260 pAd->CommonCfg.RadarDetect.RDDurRegion = CE;
1261 pAd->CommonCfg.RadarDetect.DfsSessionTime = 13;
1265 if(RTMPGetKeyParameter("WirelessEvent", tmpbuf, 10, buffer))
1267 #if WIRELESS_EXT >= 15
1268 if(simple_strtol(tmpbuf, 0, 10) != 0)
1269 pAd->CommonCfg.bWirelessEvent = simple_strtol(tmpbuf, 0, 10);
1271 pAd->CommonCfg.bWirelessEvent = 0; // disable
1273 pAd->CommonCfg.bWirelessEvent = 0; // disable
1275 DBGPRINT(RT_DEBUG_TRACE, ("WirelessEvent=%d\n", pAd->CommonCfg.bWirelessEvent));
1277 if(RTMPGetKeyParameter("WiFiTest", tmpbuf, 10, buffer))
1279 if(simple_strtol(tmpbuf, 0, 10) != 0)
1280 pAd->CommonCfg.bWiFiTest= simple_strtol(tmpbuf, 0, 10);
1282 pAd->CommonCfg.bWiFiTest = 0; // disable
1284 DBGPRINT(RT_DEBUG_TRACE, ("WiFiTest=%d\n", pAd->CommonCfg.bWiFiTest));
1287 if(RTMPGetKeyParameter("AuthMode", tmpbuf, 128, buffer))
1289 #ifdef CONFIG_STA_SUPPORT
1290 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1292 if ((strcmp(tmpbuf, "WEPAUTO") == 0) || (strcmp(tmpbuf, "wepauto") == 0))
1293 pAd->StaCfg.AuthMode = Ndis802_11AuthModeAutoSwitch;
1294 else if ((strcmp(tmpbuf, "SHARED") == 0) || (strcmp(tmpbuf, "shared") == 0))
1295 pAd->StaCfg.AuthMode = Ndis802_11AuthModeShared;
1296 else if ((strcmp(tmpbuf, "WPAPSK") == 0) || (strcmp(tmpbuf, "wpapsk") == 0))
1297 pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPAPSK;
1298 else if ((strcmp(tmpbuf, "WPANONE") == 0) || (strcmp(tmpbuf, "wpanone") == 0))
1299 pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPANone;
1300 else if ((strcmp(tmpbuf, "WPA2PSK") == 0) || (strcmp(tmpbuf, "wpa2psk") == 0))
1301 pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPA2PSK;
1302 #ifdef WPA_SUPPLICANT_SUPPORT
1303 else if ((strcmp(tmpbuf, "WPA") == 0) || (strcmp(tmpbuf, "wpa") == 0))
1304 pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPA;
1305 else if ((strcmp(tmpbuf, "WPA2") == 0) || (strcmp(tmpbuf, "wpa2") == 0))
1306 pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPA2;
1307 #endif // WPA_SUPPLICANT_SUPPORT //
1309 pAd->StaCfg.AuthMode = Ndis802_11AuthModeOpen;
1311 pAd->StaCfg.PortSecured = WPA_802_1X_PORT_NOT_SECURED;
1313 DBGPRINT(RT_DEBUG_TRACE, ("%s::(EncrypType=%d)\n", __func__, pAd->StaCfg.WepStatus));
1315 #endif // CONFIG_STA_SUPPORT //
1318 if(RTMPGetKeyParameter("EncrypType", tmpbuf, 128, buffer))
1321 #ifdef CONFIG_STA_SUPPORT
1322 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1324 if ((strcmp(tmpbuf, "WEP") == 0) || (strcmp(tmpbuf, "wep") == 0))
1325 pAd->StaCfg.WepStatus = Ndis802_11WEPEnabled;
1326 else if ((strcmp(tmpbuf, "TKIP") == 0) || (strcmp(tmpbuf, "tkip") == 0))
1327 pAd->StaCfg.WepStatus = Ndis802_11Encryption2Enabled;
1328 else if ((strcmp(tmpbuf, "AES") == 0) || (strcmp(tmpbuf, "aes") == 0))
1329 pAd->StaCfg.WepStatus = Ndis802_11Encryption3Enabled;
1331 pAd->StaCfg.WepStatus = Ndis802_11WEPDisabled;
1333 // Update all wepstatus related
1334 pAd->StaCfg.PairCipher = pAd->StaCfg.WepStatus;
1335 pAd->StaCfg.GroupCipher = pAd->StaCfg.WepStatus;
1336 pAd->StaCfg.OrigWepStatus = pAd->StaCfg.WepStatus;
1337 pAd->StaCfg.bMixCipher = FALSE;
1339 //RTMPMakeRSNIE(pAd, pAd->StaCfg.AuthMode, pAd->StaCfg.WepStatus, 0);
1340 DBGPRINT(RT_DEBUG_TRACE, ("%s::(EncrypType=%d)\n", __func__, pAd->StaCfg.WepStatus));
1342 #endif // CONFIG_STA_SUPPORT //
1347 #ifdef CONFIG_STA_SUPPORT
1348 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1350 if(RTMPGetCriticalParameter("WPAPSK", tmpbuf, 512, buffer))
1354 tmpbuf[strlen(tmpbuf)] = '\0'; // make STA can process .$^& for WPAPSK input
1356 if ((pAd->StaCfg.AuthMode != Ndis802_11AuthModeWPAPSK) &&
1357 (pAd->StaCfg.AuthMode != Ndis802_11AuthModeWPA2PSK) &&
1358 (pAd->StaCfg.AuthMode != Ndis802_11AuthModeWPANone)
1363 else if ((strlen(tmpbuf) >= 8) && (strlen(tmpbuf) < 64))
1365 PasswordHash((char *)tmpbuf, pAd->CommonCfg.Ssid, pAd->CommonCfg.SsidLen, keyMaterial);
1366 NdisMoveMemory(pAd->StaCfg.PMK, keyMaterial, 32);
1369 else if (strlen(tmpbuf) == 64)
1371 AtoH(tmpbuf, keyMaterial, 32);
1372 NdisMoveMemory(pAd->StaCfg.PMK, keyMaterial, 32);
1377 DBGPRINT(RT_DEBUG_ERROR, ("%s::(WPAPSK key-string required 8 ~ 64 characters!)\n", __func__));
1382 if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPAPSK) ||
1383 (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK))
1385 // Start STA supplicant state machine
1386 pAd->StaCfg.WpaState = SS_START;
1388 else if (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPANone)
1391 NdisZeroMemory(&pAd->SharedKey[BSS0][0], sizeof(CIPHER_KEY));
1392 pAd->SharedKey[BSS0][0].KeyLen = LEN_TKIP_EK;
1393 NdisMoveMemory(pAd->SharedKey[BSS0][0].Key, pAd->StaCfg.PMK, LEN_TKIP_EK);
1394 NdisMoveMemory(pAd->SharedKey[BSS0][0].RxMic, &pAd->StaCfg.PMK[16], LEN_TKIP_RXMICK);
1395 NdisMoveMemory(pAd->SharedKey[BSS0][0].TxMic, &pAd->StaCfg.PMK[16], LEN_TKIP_TXMICK);
1397 // Decide its ChiperAlg
1398 if (pAd->StaCfg.PairCipher == Ndis802_11Encryption2Enabled)
1399 pAd->SharedKey[BSS0][0].CipherAlg = CIPHER_TKIP;
1400 else if (pAd->StaCfg.PairCipher == Ndis802_11Encryption3Enabled)
1401 pAd->SharedKey[BSS0][0].CipherAlg = CIPHER_AES;
1403 pAd->SharedKey[BSS0][0].CipherAlg = CIPHER_NONE;
1405 pAd->StaCfg.WpaState = SS_NOTUSE;
1408 DBGPRINT(RT_DEBUG_TRACE, ("%s::(WPAPSK=%s)\n", __func__, tmpbuf));
1412 #endif // CONFIG_STA_SUPPORT //
1414 //DefaultKeyID, KeyType, KeyStr
1415 rtmp_read_key_parms_from_file(pAd, tmpbuf, buffer);
1419 /*if(RTMPGetKeyParameter("HSCounter", tmpbuf, 10, buffer))
1421 switch (simple_strtol(tmpbuf, 0, 10))
1424 pAd->CommonCfg.bEnableHSCounter = TRUE;
1428 pAd->CommonCfg.bEnableHSCounter = FALSE;
1431 DBGPRINT(RT_DEBUG_TRACE, "HSCounter=%d\n", pAd->CommonCfg.bEnableHSCounter);
1434 #ifdef DOT11_N_SUPPORT
1435 HTParametersHook(pAd, tmpbuf, buffer);
1436 #endif // DOT11_N_SUPPORT //
1438 #ifdef CONFIG_STA_SUPPORT
1439 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1442 if (RTMPGetKeyParameter("PSMode", tmpbuf, 10, buffer))
1444 if (pAd->StaCfg.BssType == BSS_INFRA)
1446 if ((strcmp(tmpbuf, "MAX_PSP") == 0) || (strcmp(tmpbuf, "max_psp") == 0))
1448 // do NOT turn on PSM bit here, wait until MlmeCheckForPsmChange()
1449 // to exclude certain situations.
1450 // MlmeSetPsm(pAd, PWR_SAVE);
1451 OPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM);
1452 if (pAd->StaCfg.bWindowsACCAMEnable == FALSE)
1453 pAd->StaCfg.WindowsPowerMode = Ndis802_11PowerModeMAX_PSP;
1454 pAd->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeMAX_PSP;
1455 pAd->StaCfg.DefaultListenCount = 5;
1457 else if ((strcmp(tmpbuf, "Fast_PSP") == 0) || (strcmp(tmpbuf, "fast_psp") == 0)
1458 || (strcmp(tmpbuf, "FAST_PSP") == 0))
1460 // do NOT turn on PSM bit here, wait until MlmeCheckForPsmChange()
1461 // to exclude certain situations.
1462 // MlmeSetPsmBit(pAd, PWR_SAVE);
1463 OPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM);
1464 if (pAd->StaCfg.bWindowsACCAMEnable == FALSE)
1465 pAd->StaCfg.WindowsPowerMode = Ndis802_11PowerModeFast_PSP;
1466 pAd->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeFast_PSP;
1467 pAd->StaCfg.DefaultListenCount = 3;
1469 else if ((strcmp(tmpbuf, "Legacy_PSP") == 0) || (strcmp(tmpbuf, "legacy_psp") == 0)
1470 || (strcmp(tmpbuf, "LEGACY_PSP") == 0))
1472 // do NOT turn on PSM bit here, wait until MlmeCheckForPsmChange()
1473 // to exclude certain situations.
1474 // MlmeSetPsmBit(pAd, PWR_SAVE);
1475 OPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM);
1476 if (pAd->StaCfg.bWindowsACCAMEnable == FALSE)
1477 pAd->StaCfg.WindowsPowerMode = Ndis802_11PowerModeLegacy_PSP;
1478 pAd->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeLegacy_PSP;
1479 pAd->StaCfg.DefaultListenCount = 3;
1482 { //Default Ndis802_11PowerModeCAM
1483 // clear PSM bit immediately
1484 MlmeSetPsmBit(pAd, PWR_ACTIVE);
1485 OPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM);
1486 if (pAd->StaCfg.bWindowsACCAMEnable == FALSE)
1487 pAd->StaCfg.WindowsPowerMode = Ndis802_11PowerModeCAM;
1488 pAd->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeCAM;
1490 DBGPRINT(RT_DEBUG_TRACE, ("PSMode=%ld\n", pAd->StaCfg.WindowsPowerMode));
1494 if (RTMPGetKeyParameter("FastRoaming", tmpbuf, 32, buffer))
1496 if (simple_strtol(tmpbuf, 0, 10) == 0)
1497 pAd->StaCfg.bFastRoaming = FALSE;
1499 pAd->StaCfg.bFastRoaming = TRUE;
1501 DBGPRINT(RT_DEBUG_TRACE, ("FastRoaming=%d\n", pAd->StaCfg.bFastRoaming));
1504 if (RTMPGetKeyParameter("RoamThreshold", tmpbuf, 32, buffer))
1506 long lInfo = simple_strtol(tmpbuf, 0, 10);
1508 if (lInfo > 90 || lInfo < 60)
1509 pAd->StaCfg.dBmToRoam = -70;
1511 pAd->StaCfg.dBmToRoam = (CHAR)(-1)*lInfo;
1513 DBGPRINT(RT_DEBUG_TRACE, ("RoamThreshold=%d dBm\n", pAd->StaCfg.dBmToRoam));
1516 if(RTMPGetKeyParameter("TGnWifiTest", tmpbuf, 10, buffer))
1518 if(simple_strtol(tmpbuf, 0, 10) == 0)
1519 pAd->StaCfg.bTGnWifiTest = FALSE;
1521 pAd->StaCfg.bTGnWifiTest = TRUE;
1522 DBGPRINT(RT_DEBUG_TRACE, ("TGnWifiTest=%d\n", pAd->StaCfg.bTGnWifiTest));
1525 #endif // CONFIG_STA_SUPPORT //
1533 DBGPRINT(RT_DEBUG_TRACE, ("--> %s does not have a write method\n", src));
1536 retval=filp_close(srcf,NULL);
1540 DBGPRINT(RT_DEBUG_TRACE, ("--> Error %d closing %s\n", -retval, src));
1547 current->fsuid = orgfsuid;
1548 current->fsgid = orgfsgid;
1554 return (NDIS_STATUS_SUCCESS);
1557 #ifdef DOT11_N_SUPPORT
1558 static void HTParametersHook(
1559 IN PRTMP_ADAPTER pAd,
1566 if (RTMPGetKeyParameter("HT_PROTECT", pValueStr, 25, pInput))
1568 Value = simple_strtol(pValueStr, 0, 10);
1571 pAd->CommonCfg.bHTProtect = FALSE;
1575 pAd->CommonCfg.bHTProtect = TRUE;
1577 DBGPRINT(RT_DEBUG_TRACE, ("HT: Protection = %s\n", (Value==0) ? "Disable" : "Enable"));
1580 if (RTMPGetKeyParameter("HT_MIMOPSEnable", pValueStr, 25, pInput))
1582 Value = simple_strtol(pValueStr, 0, 10);
1585 pAd->CommonCfg.bMIMOPSEnable = FALSE;
1589 pAd->CommonCfg.bMIMOPSEnable = TRUE;
1591 DBGPRINT(RT_DEBUG_TRACE, ("HT: MIMOPSEnable = %s\n", (Value==0) ? "Disable" : "Enable"));
1595 if (RTMPGetKeyParameter("HT_MIMOPSMode", pValueStr, 25, pInput))
1597 Value = simple_strtol(pValueStr, 0, 10);
1598 if (Value > MMPS_ENABLE)
1600 pAd->CommonCfg.BACapability.field.MMPSmode = MMPS_ENABLE;
1604 //TODO: add mimo power saving mechanism
1605 pAd->CommonCfg.BACapability.field.MMPSmode = MMPS_ENABLE;
1606 //pAd->CommonCfg.BACapability.field.MMPSmode = Value;
1608 DBGPRINT(RT_DEBUG_TRACE, ("HT: MIMOPS Mode = %d\n", Value));
1611 if (RTMPGetKeyParameter("HT_BADecline", pValueStr, 25, pInput))
1613 Value = simple_strtol(pValueStr, 0, 10);
1616 pAd->CommonCfg.bBADecline = FALSE;
1620 pAd->CommonCfg.bBADecline = TRUE;
1622 DBGPRINT(RT_DEBUG_TRACE, ("HT: BA Decline = %s\n", (Value==0) ? "Disable" : "Enable"));
1626 if (RTMPGetKeyParameter("HT_DisableReordering", pValueStr, 25, pInput))
1628 Value = simple_strtol(pValueStr, 0, 10);
1631 pAd->CommonCfg.bDisableReordering = FALSE;
1635 pAd->CommonCfg.bDisableReordering = TRUE;
1637 DBGPRINT(RT_DEBUG_TRACE, ("HT: DisableReordering = %s\n", (Value==0) ? "Disable" : "Enable"));
1640 if (RTMPGetKeyParameter("HT_AutoBA", pValueStr, 25, pInput))
1642 Value = simple_strtol(pValueStr, 0, 10);
1645 pAd->CommonCfg.BACapability.field.AutoBA = FALSE;
1649 pAd->CommonCfg.BACapability.field.AutoBA = TRUE;
1651 pAd->CommonCfg.REGBACapability.field.AutoBA = pAd->CommonCfg.BACapability.field.AutoBA;
1652 DBGPRINT(RT_DEBUG_TRACE, ("HT: Auto BA = %s\n", (Value==0) ? "Disable" : "Enable"));
1656 if (RTMPGetKeyParameter("HT_HTC", pValueStr, 25, pInput))
1658 Value = simple_strtol(pValueStr, 0, 10);
1661 pAd->HTCEnable = FALSE;
1665 pAd->HTCEnable = TRUE;
1667 DBGPRINT(RT_DEBUG_TRACE, ("HT: Tx +HTC frame = %s\n", (Value==0) ? "Disable" : "Enable"));
1670 // Enable HT Link Adaptation Control
1671 if (RTMPGetKeyParameter("HT_LinkAdapt", pValueStr, 25, pInput))
1673 Value = simple_strtol(pValueStr, 0, 10);
1676 pAd->bLinkAdapt = FALSE;
1680 pAd->HTCEnable = TRUE;
1681 pAd->bLinkAdapt = TRUE;
1683 DBGPRINT(RT_DEBUG_TRACE, ("HT: Link Adaptation Control = %s\n", (Value==0) ? "Disable" : "Enable(+HTC)"));
1686 // Reverse Direction Mechanism
1687 if (RTMPGetKeyParameter("HT_RDG", pValueStr, 25, pInput))
1689 Value = simple_strtol(pValueStr, 0, 10);
1692 pAd->CommonCfg.bRdg = FALSE;
1696 pAd->HTCEnable = TRUE;
1697 pAd->CommonCfg.bRdg = TRUE;
1699 DBGPRINT(RT_DEBUG_TRACE, ("HT: RDG = %s\n", (Value==0) ? "Disable" : "Enable(+HTC)"));
1706 if (RTMPGetKeyParameter("HT_AMSDU", pValueStr, 25, pInput))
1708 Value = simple_strtol(pValueStr, 0, 10);
1711 pAd->CommonCfg.BACapability.field.AmsduEnable = FALSE;
1715 pAd->CommonCfg.BACapability.field.AmsduEnable = TRUE;
1717 DBGPRINT(RT_DEBUG_TRACE, ("HT: Tx A-MSDU = %s\n", (Value==0) ? "Disable" : "Enable"));
1721 if (RTMPGetKeyParameter("HT_MpduDensity", pValueStr, 25, pInput))
1723 Value = simple_strtol(pValueStr, 0, 10);
1724 if (Value <=7 && Value >= 0)
1726 pAd->CommonCfg.BACapability.field.MpduDensity = Value;
1727 DBGPRINT(RT_DEBUG_TRACE, ("HT: MPDU Density = %d\n", Value));
1731 pAd->CommonCfg.BACapability.field.MpduDensity = 4;
1732 DBGPRINT(RT_DEBUG_TRACE, ("HT: MPDU Density = %d (Default)\n", 4));
1736 // Max Rx BA Window Size
1737 if (RTMPGetKeyParameter("HT_BAWinSize", pValueStr, 25, pInput))
1739 Value = simple_strtol(pValueStr, 0, 10);
1741 if (Value >=1 && Value <= 64)
1743 pAd->CommonCfg.REGBACapability.field.RxBAWinLimit = Value;
1744 pAd->CommonCfg.BACapability.field.RxBAWinLimit = Value;
1745 DBGPRINT(RT_DEBUG_TRACE, ("HT: BA Windw Size = %d\n", Value));
1749 pAd->CommonCfg.REGBACapability.field.RxBAWinLimit = 64;
1750 pAd->CommonCfg.BACapability.field.RxBAWinLimit = 64;
1751 DBGPRINT(RT_DEBUG_TRACE, ("HT: BA Windw Size = 64 (Defualt)\n"));
1757 if (RTMPGetKeyParameter("HT_GI", pValueStr, 25, pInput))
1759 Value = simple_strtol(pValueStr, 0, 10);
1761 if (Value == GI_400)
1763 pAd->CommonCfg.RegTransmitSetting.field.ShortGI = GI_400;
1767 pAd->CommonCfg.RegTransmitSetting.field.ShortGI = GI_800;
1770 DBGPRINT(RT_DEBUG_TRACE, ("HT: Guard Interval = %s\n", (Value==GI_400) ? "400" : "800" ));
1773 // HT Operation Mode : Mixed Mode , Green Field
1774 if (RTMPGetKeyParameter("HT_OpMode", pValueStr, 25, pInput))
1776 Value = simple_strtol(pValueStr, 0, 10);
1778 if (Value == HTMODE_GF)
1781 pAd->CommonCfg.RegTransmitSetting.field.HTMODE = HTMODE_GF;
1785 pAd->CommonCfg.RegTransmitSetting.field.HTMODE = HTMODE_MM;
1788 DBGPRINT(RT_DEBUG_TRACE, ("HT: Operate Mode = %s\n", (Value==HTMODE_GF) ? "Green Field" : "Mixed Mode" ));
1791 // Fixed Tx mode : CCK, OFDM
1792 if (RTMPGetKeyParameter("FixedTxMode", pValueStr, 25, pInput))
1796 #ifdef CONFIG_STA_SUPPORT
1797 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1799 fix_tx_mode = FIXED_TXMODE_HT;
1801 if (strcmp(pValueStr, "OFDM") == 0 || strcmp(pValueStr, "ofdm") == 0)
1803 fix_tx_mode = FIXED_TXMODE_OFDM;
1805 else if (strcmp(pValueStr, "CCK") == 0 || strcmp(pValueStr, "cck") == 0)
1807 fix_tx_mode = FIXED_TXMODE_CCK;
1809 else if (strcmp(pValueStr, "HT") == 0 || strcmp(pValueStr, "ht") == 0)
1811 fix_tx_mode = FIXED_TXMODE_HT;
1815 Value = simple_strtol(pValueStr, 0, 10);
1819 if (Value == FIXED_TXMODE_CCK || Value == FIXED_TXMODE_OFDM)
1820 fix_tx_mode = Value;
1822 fix_tx_mode = FIXED_TXMODE_HT;
1825 pAd->StaCfg.DesiredTransmitSetting.field.FixedTxMode = fix_tx_mode;
1826 DBGPRINT(RT_DEBUG_TRACE, ("Fixed Tx Mode = %d\n", fix_tx_mode));
1829 #endif // CONFIG_STA_SUPPORT //
1834 if (RTMPGetKeyParameter("HT_BW", pValueStr, 25, pInput))
1836 Value = simple_strtol(pValueStr, 0, 10);
1840 pAd->CommonCfg.RegTransmitSetting.field.BW = BW_40;
1844 pAd->CommonCfg.RegTransmitSetting.field.BW = BW_20;
1847 #ifdef MCAST_RATE_SPECIFIC
1848 pAd->CommonCfg.MCastPhyMode.field.BW = pAd->CommonCfg.RegTransmitSetting.field.BW;
1849 #endif // MCAST_RATE_SPECIFIC //
1851 DBGPRINT(RT_DEBUG_TRACE, ("HT: Channel Width = %s\n", (Value==BW_40) ? "40 MHz" : "20 MHz" ));
1854 if (RTMPGetKeyParameter("HT_EXTCHA", pValueStr, 25, pInput))
1856 Value = simple_strtol(pValueStr, 0, 10);
1861 pAd->CommonCfg.RegTransmitSetting.field.EXTCHA = EXTCHA_BELOW;
1865 pAd->CommonCfg.RegTransmitSetting.field.EXTCHA = EXTCHA_ABOVE;
1868 DBGPRINT(RT_DEBUG_TRACE, ("HT: Ext Channel = %s\n", (Value==0) ? "BELOW" : "ABOVE" ));
1872 if (RTMPGetKeyParameter("HT_MCS", pValueStr, 50, pInput))
1875 #ifdef CONFIG_STA_SUPPORT
1876 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1878 Value = simple_strtol(pValueStr, 0, 10);
1880 // if ((Value >= 0 && Value <= 15) || (Value == 32))
1881 if ((Value >= 0 && Value <= 23) || (Value == 32)) // 3*3
1883 pAd->StaCfg.DesiredTransmitSetting.field.MCS = Value;
1884 pAd->StaCfg.bAutoTxRateSwitch = FALSE;
1885 DBGPRINT(RT_DEBUG_TRACE, ("HT: MCS = %d\n", pAd->StaCfg.DesiredTransmitSetting.field.MCS));
1889 pAd->StaCfg.DesiredTransmitSetting.field.MCS = MCS_AUTO;
1890 pAd->StaCfg.bAutoTxRateSwitch = TRUE;
1891 DBGPRINT(RT_DEBUG_TRACE, ("HT: MCS = AUTO\n"));
1894 #endif // CONFIG_STA_SUPPORT //
1898 if (RTMPGetKeyParameter("HT_STBC", pValueStr, 25, pInput))
1900 Value = simple_strtol(pValueStr, 0, 10);
1901 if (Value == STBC_USE)
1903 pAd->CommonCfg.RegTransmitSetting.field.STBC = STBC_USE;
1907 pAd->CommonCfg.RegTransmitSetting.field.STBC = STBC_NONE;
1909 DBGPRINT(RT_DEBUG_TRACE, ("HT: STBC = %d\n", pAd->CommonCfg.RegTransmitSetting.field.STBC));
1912 // 40_Mhz_Intolerant
1913 if (RTMPGetKeyParameter("HT_40MHZ_INTOLERANT", pValueStr, 25, pInput))
1915 Value = simple_strtol(pValueStr, 0, 10);
1918 pAd->CommonCfg.bForty_Mhz_Intolerant = FALSE;
1922 pAd->CommonCfg.bForty_Mhz_Intolerant = TRUE;
1924 DBGPRINT(RT_DEBUG_TRACE, ("HT: 40MHZ INTOLERANT = %d\n", pAd->CommonCfg.bForty_Mhz_Intolerant));
1927 if(RTMPGetKeyParameter("HT_TxStream", pValueStr, 10, pInput))
1929 switch (simple_strtol(pValueStr, 0, 10))
1932 pAd->CommonCfg.TxStream = 1;
1935 pAd->CommonCfg.TxStream = 2;
1939 pAd->CommonCfg.TxStream = 3;
1941 if (pAd->MACVersion < RALINK_2883_VERSION)
1942 pAd->CommonCfg.TxStream = 2; // only 2 tx streams for RT2860 series
1945 DBGPRINT(RT_DEBUG_TRACE, ("HT: Tx Stream = %d\n", pAd->CommonCfg.TxStream));
1948 if(RTMPGetKeyParameter("HT_RxStream", pValueStr, 10, pInput))
1950 switch (simple_strtol(pValueStr, 0, 10))
1953 pAd->CommonCfg.RxStream = 1;
1956 pAd->CommonCfg.RxStream = 2;
1960 pAd->CommonCfg.RxStream = 3;
1962 if (pAd->MACVersion < RALINK_2883_VERSION)
1963 pAd->CommonCfg.RxStream = 2; // only 2 rx streams for RT2860 series
1966 DBGPRINT(RT_DEBUG_TRACE, ("HT: Rx Stream = %d\n", pAd->CommonCfg.RxStream));
1970 #endif // DOT11_N_SUPPORT //