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))
759 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
761 KeyIdx = simple_strtol(tmpbuf, 0, 10);
762 if((KeyIdx >= 1 ) && (KeyIdx <= 4))
763 pAd->StaCfg.DefaultKeyId = (UCHAR) (KeyIdx - 1);
765 pAd->StaCfg.DefaultKeyId = 0;
767 DBGPRINT(RT_DEBUG_TRACE, ("DefaultKeyID(0~3)=%d\n", pAd->StaCfg.DefaultKeyId));
772 for (idx = 0; idx < 4; idx++)
774 sprintf(tok_str, "Key%dType", idx + 1);
776 if (RTMPGetKeyParameter(tok_str, tmpbuf, 128, buffer))
778 for (i = 0, macptr = rstrtok(tmpbuf,";"); macptr; macptr = rstrtok(NULL,";"), i++)
780 KeyType[i] = simple_strtol(macptr, 0, 10);
783 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
785 sprintf(tok_str, "Key%dStr", idx + 1);
786 if (RTMPGetCriticalParameter(tok_str, tmpbuf, 128, buffer))
788 rtmp_parse_key_buffer_from_file(pAd, tmpbuf, KeyType[BSS0], BSS0, idx);
795 static void rtmp_read_sta_wmm_parms_from_file(IN PRTMP_ADAPTER pAd, char *tmpbuf, char *buffer)
799 BOOLEAN bWmmEnable = FALSE;
802 if(RTMPGetKeyParameter("WmmCapable", tmpbuf, 32, buffer))
804 if(simple_strtol(tmpbuf, 0, 10) != 0) //Enable
806 pAd->CommonCfg.bWmmCapable = TRUE;
811 pAd->CommonCfg.bWmmCapable = FALSE;
814 DBGPRINT(RT_DEBUG_TRACE, ("WmmCapable=%d\n", pAd->CommonCfg.bWmmCapable));
817 //AckPolicy for AC_BK, AC_BE, AC_VI, AC_VO
818 if(RTMPGetKeyParameter("AckPolicy", tmpbuf, 32, buffer))
820 for (i = 0, macptr = rstrtok(tmpbuf,";"); macptr; macptr = rstrtok(NULL,";"), i++)
822 pAd->CommonCfg.AckPolicy[i] = (UCHAR)simple_strtol(macptr, 0, 10);
824 DBGPRINT(RT_DEBUG_TRACE, ("AckPolicy[%d]=%d\n", i, pAd->CommonCfg.AckPolicy[i]));
831 if(RTMPGetKeyParameter("APSDCapable", tmpbuf, 10, buffer))
833 if(simple_strtol(tmpbuf, 0, 10) != 0) //Enable
834 pAd->CommonCfg.bAPSDCapable = TRUE;
836 pAd->CommonCfg.bAPSDCapable = FALSE;
838 DBGPRINT(RT_DEBUG_TRACE, ("APSDCapable=%d\n", pAd->CommonCfg.bAPSDCapable));
841 //APSDAC for AC_BE, AC_BK, AC_VI, AC_VO
842 if(RTMPGetKeyParameter("APSDAC", tmpbuf, 32, buffer))
846 for (i = 0, macptr = rstrtok(tmpbuf,";"); macptr; macptr = rstrtok(NULL,";"), i++)
848 apsd_ac[i] = (BOOLEAN)simple_strtol(macptr, 0, 10);
850 DBGPRINT(RT_DEBUG_TRACE, ("APSDAC%d %d\n", i, apsd_ac[i]));
853 pAd->CommonCfg.bAPSDAC_BE = apsd_ac[0];
854 pAd->CommonCfg.bAPSDAC_BK = apsd_ac[1];
855 pAd->CommonCfg.bAPSDAC_VI = apsd_ac[2];
856 pAd->CommonCfg.bAPSDAC_VO = apsd_ac[3];
862 NDIS_STATUS RTMPReadParametersHook(
863 IN PRTMP_ADAPTER pAd)
867 INT retval, orgfsuid, orgfsgid;
873 UCHAR keyMaterial[40];
878 buffer = kmalloc(MAX_INI_BUFFER_SIZE, MEM_ALLOC_FLAG);
880 return NDIS_STATUS_FAILURE;
882 tmpbuf = kmalloc(MAX_PARAM_BUFFER_SIZE, MEM_ALLOC_FLAG);
886 return NDIS_STATUS_FAILURE;
889 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
890 src = STA_PROFILE_PATH;
892 // Save uid and gid used for filesystem access.
893 // Set user and group to 0 (root)
894 orgfsuid = current_fsuid();
895 orgfsgid = current_fsgid();
896 /* Hm, can't really do this nicely anymore, so rely on these files
897 * being set to the proper permission to read them... */
898 /* current->cred->fsuid = current->cred->fsgid = 0; */
904 srcf = filp_open(src, O_RDONLY, 0);
907 DBGPRINT(RT_DEBUG_ERROR, ("--> Error %ld opening %s\n", -PTR_ERR(srcf),src));
911 // The object must have a read method
912 if (srcf->f_op && srcf->f_op->read)
914 memset(buffer, 0x00, MAX_INI_BUFFER_SIZE);
915 retval=srcf->f_op->read(srcf, buffer, MAX_INI_BUFFER_SIZE, &srcf->f_pos);
918 DBGPRINT(RT_DEBUG_TRACE, ("--> Read %s error %d\n", src, -retval));
922 // set file parameter to portcfg
924 if(RTMPGetKeyParameter("CountryRegion", tmpbuf, 25, buffer))
926 pAd->CommonCfg.CountryRegion = (UCHAR) simple_strtol(tmpbuf, 0, 10);
927 DBGPRINT(RT_DEBUG_TRACE, ("CountryRegion=%d\n", pAd->CommonCfg.CountryRegion));
930 if(RTMPGetKeyParameter("CountryRegionABand", tmpbuf, 25, buffer))
932 pAd->CommonCfg.CountryRegionForABand= (UCHAR) simple_strtol(tmpbuf, 0, 10);
933 DBGPRINT(RT_DEBUG_TRACE, ("CountryRegionABand=%d\n", pAd->CommonCfg.CountryRegionForABand));
936 if(RTMPGetKeyParameter("CountryCode", tmpbuf, 25, buffer))
938 NdisMoveMemory(pAd->CommonCfg.CountryCode, tmpbuf , 2);
940 if (strlen(pAd->CommonCfg.CountryCode) != 0)
942 pAd->CommonCfg.bCountryFlag = TRUE;
944 DBGPRINT(RT_DEBUG_TRACE, ("CountryCode=%s\n", pAd->CommonCfg.CountryCode));
947 if(RTMPGetKeyParameter("ChannelGeography", tmpbuf, 25, buffer))
949 UCHAR Geography = (UCHAR) simple_strtol(tmpbuf, 0, 10);
950 if (Geography <= BOTH)
952 pAd->CommonCfg.Geography = Geography;
953 pAd->CommonCfg.CountryCode[2] =
954 (pAd->CommonCfg.Geography == BOTH) ? ' ' : ((pAd->CommonCfg.Geography == IDOR) ? 'I' : 'O');
955 DBGPRINT(RT_DEBUG_TRACE, ("ChannelGeography=%d\n", pAd->CommonCfg.Geography));
960 pAd->CommonCfg.Geography = BOTH;
961 pAd->CommonCfg.CountryCode[2] = ' ';
964 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
967 if (RTMPGetCriticalParameter("SSID", tmpbuf, 256, buffer))
969 if (strlen(tmpbuf) <= 32)
971 pAd->CommonCfg.SsidLen = (UCHAR) strlen(tmpbuf);
972 NdisZeroMemory(pAd->CommonCfg.Ssid, NDIS_802_11_LENGTH_SSID);
973 NdisMoveMemory(pAd->CommonCfg.Ssid, tmpbuf, pAd->CommonCfg.SsidLen);
974 pAd->MlmeAux.AutoReconnectSsidLen = pAd->CommonCfg.SsidLen;
975 NdisZeroMemory(pAd->MlmeAux.AutoReconnectSsid, NDIS_802_11_LENGTH_SSID);
976 NdisMoveMemory(pAd->MlmeAux.AutoReconnectSsid, tmpbuf, pAd->MlmeAux.AutoReconnectSsidLen);
977 pAd->MlmeAux.SsidLen = pAd->CommonCfg.SsidLen;
978 NdisZeroMemory(pAd->MlmeAux.Ssid, NDIS_802_11_LENGTH_SSID);
979 NdisMoveMemory(pAd->MlmeAux.Ssid, tmpbuf, pAd->MlmeAux.SsidLen);
980 DBGPRINT(RT_DEBUG_TRACE, ("%s::(SSID=%s)\n", __func__, tmpbuf));
985 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
988 if (RTMPGetKeyParameter("NetworkType", tmpbuf, 25, buffer))
990 pAd->bConfigChanged = TRUE;
991 if (strcmp(tmpbuf, "Adhoc") == 0)
992 pAd->StaCfg.BssType = BSS_ADHOC;
993 else //Default Infrastructure mode
994 pAd->StaCfg.BssType = BSS_INFRA;
995 // Reset Ralink supplicant to not use, it will be set to start when UI set PMK key
996 pAd->StaCfg.WpaState = SS_NOTUSE;
997 DBGPRINT(RT_DEBUG_TRACE, ("%s::(NetworkType=%d)\n", __func__, pAd->StaCfg.BssType));
1002 if(RTMPGetKeyParameter("Channel", tmpbuf, 10, buffer))
1004 pAd->CommonCfg.Channel = (UCHAR) simple_strtol(tmpbuf, 0, 10);
1005 DBGPRINT(RT_DEBUG_TRACE, ("Channel=%d\n", pAd->CommonCfg.Channel));
1008 if(RTMPGetKeyParameter("WirelessMode", tmpbuf, 10, buffer))
1010 int value = 0, maxPhyMode = PHY_11G;
1012 #ifdef DOT11_N_SUPPORT
1013 maxPhyMode = PHY_11N_5G;
1014 #endif // DOT11_N_SUPPORT //
1016 value = simple_strtol(tmpbuf, 0, 10);
1018 if (value <= maxPhyMode)
1020 pAd->CommonCfg.PhyMode = value;
1022 DBGPRINT(RT_DEBUG_TRACE, ("PhyMode=%d\n", pAd->CommonCfg.PhyMode));
1025 if(RTMPGetKeyParameter("BasicRate", tmpbuf, 10, buffer))
1027 pAd->CommonCfg.BasicRateBitmap = (ULONG) simple_strtol(tmpbuf, 0, 10);
1028 DBGPRINT(RT_DEBUG_TRACE, ("BasicRate=%ld\n", pAd->CommonCfg.BasicRateBitmap));
1031 if(RTMPGetKeyParameter("BeaconPeriod", tmpbuf, 10, buffer))
1033 pAd->CommonCfg.BeaconPeriod = (USHORT) simple_strtol(tmpbuf, 0, 10);
1034 DBGPRINT(RT_DEBUG_TRACE, ("BeaconPeriod=%d\n", pAd->CommonCfg.BeaconPeriod));
1037 if(RTMPGetKeyParameter("TxPower", tmpbuf, 10, buffer))
1039 pAd->CommonCfg.TxPowerPercentage = (ULONG) simple_strtol(tmpbuf, 0, 10);
1041 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1042 pAd->CommonCfg.TxPowerDefault = pAd->CommonCfg.TxPowerPercentage;
1044 DBGPRINT(RT_DEBUG_TRACE, ("TxPower=%ld\n", pAd->CommonCfg.TxPowerPercentage));
1047 if(RTMPGetKeyParameter("BGProtection", tmpbuf, 10, buffer))
1049 switch (simple_strtol(tmpbuf, 0, 10))
1052 pAd->CommonCfg.UseBGProtection = 1;
1054 case 2: //Always OFF
1055 pAd->CommonCfg.UseBGProtection = 2;
1059 pAd->CommonCfg.UseBGProtection = 0;
1062 DBGPRINT(RT_DEBUG_TRACE, ("BGProtection=%ld\n", pAd->CommonCfg.UseBGProtection));
1065 if(RTMPGetKeyParameter("DisableOLBC", tmpbuf, 10, buffer))
1067 switch (simple_strtol(tmpbuf, 0, 10))
1069 case 1: //disable OLBC Detection
1070 pAd->CommonCfg.DisableOLBCDetect = 1;
1072 case 0: //enable OLBC Detection
1073 pAd->CommonCfg.DisableOLBCDetect = 0;
1076 pAd->CommonCfg.DisableOLBCDetect= 0;
1079 DBGPRINT(RT_DEBUG_TRACE, ("OLBCDetection=%ld\n", pAd->CommonCfg.DisableOLBCDetect));
1082 if(RTMPGetKeyParameter("TxPreamble", tmpbuf, 10, buffer))
1084 switch (simple_strtol(tmpbuf, 0, 10))
1086 case Rt802_11PreambleShort:
1087 pAd->CommonCfg.TxPreamble = Rt802_11PreambleShort;
1089 case Rt802_11PreambleLong:
1091 pAd->CommonCfg.TxPreamble = Rt802_11PreambleLong;
1094 DBGPRINT(RT_DEBUG_TRACE, ("TxPreamble=%ld\n", pAd->CommonCfg.TxPreamble));
1097 if(RTMPGetKeyParameter("RTSThreshold", tmpbuf, 10, buffer))
1099 RtsThresh = simple_strtol(tmpbuf, 0, 10);
1100 if( (RtsThresh >= 1) && (RtsThresh <= MAX_RTS_THRESHOLD) )
1101 pAd->CommonCfg.RtsThreshold = (USHORT)RtsThresh;
1103 pAd->CommonCfg.RtsThreshold = MAX_RTS_THRESHOLD;
1105 DBGPRINT(RT_DEBUG_TRACE, ("RTSThreshold=%d\n", pAd->CommonCfg.RtsThreshold));
1108 if(RTMPGetKeyParameter("FragThreshold", tmpbuf, 10, buffer))
1110 FragThresh = simple_strtol(tmpbuf, 0, 10);
1111 pAd->CommonCfg.bUseZeroToDisableFragment = FALSE;
1113 if (FragThresh > MAX_FRAG_THRESHOLD || FragThresh < MIN_FRAG_THRESHOLD)
1114 { //illegal FragThresh so we set it to default
1115 pAd->CommonCfg.FragmentThreshold = MAX_FRAG_THRESHOLD;
1116 pAd->CommonCfg.bUseZeroToDisableFragment = TRUE;
1118 else if (FragThresh % 2 == 1)
1120 // The length of each fragment shall always be an even number of octets, except for the last fragment
1121 // of an MSDU or MMPDU, which may be either an even or an odd number of octets.
1122 pAd->CommonCfg.FragmentThreshold = (USHORT)(FragThresh - 1);
1126 pAd->CommonCfg.FragmentThreshold = (USHORT)FragThresh;
1128 //pAd->CommonCfg.AllowFragSize = (pAd->CommonCfg.FragmentThreshold) - LENGTH_802_11 - LENGTH_CRC;
1129 DBGPRINT(RT_DEBUG_TRACE, ("FragThreshold=%d\n", pAd->CommonCfg.FragmentThreshold));
1132 if(RTMPGetKeyParameter("TxBurst", tmpbuf, 10, buffer))
1134 if(simple_strtol(tmpbuf, 0, 10) != 0) //Enable
1135 pAd->CommonCfg.bEnableTxBurst = TRUE;
1137 pAd->CommonCfg.bEnableTxBurst = FALSE;
1138 DBGPRINT(RT_DEBUG_TRACE, ("TxBurst=%d\n", pAd->CommonCfg.bEnableTxBurst));
1141 #ifdef AGGREGATION_SUPPORT
1143 if(RTMPGetKeyParameter("PktAggregate", tmpbuf, 10, buffer))
1145 if(simple_strtol(tmpbuf, 0, 10) != 0) //Enable
1146 pAd->CommonCfg.bAggregationCapable = TRUE;
1148 pAd->CommonCfg.bAggregationCapable = FALSE;
1149 #ifdef PIGGYBACK_SUPPORT
1150 pAd->CommonCfg.bPiggyBackCapable = pAd->CommonCfg.bAggregationCapable;
1151 #endif // PIGGYBACK_SUPPORT //
1152 DBGPRINT(RT_DEBUG_TRACE, ("PktAggregate=%d\n", pAd->CommonCfg.bAggregationCapable));
1155 pAd->CommonCfg.bAggregationCapable = FALSE;
1156 pAd->CommonCfg.bPiggyBackCapable = FALSE;
1157 #endif // AGGREGATION_SUPPORT //
1160 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1161 rtmp_read_sta_wmm_parms_from_file(pAd, tmpbuf, buffer);
1164 if(RTMPGetKeyParameter("ShortSlot", tmpbuf, 10, buffer))
1166 if(simple_strtol(tmpbuf, 0, 10) != 0) //Enable
1167 pAd->CommonCfg.bUseShortSlotTime = TRUE;
1169 pAd->CommonCfg.bUseShortSlotTime = FALSE;
1171 DBGPRINT(RT_DEBUG_TRACE, ("ShortSlot=%d\n", pAd->CommonCfg.bUseShortSlotTime));
1174 if(RTMPGetKeyParameter("IEEE80211H", tmpbuf, 10, buffer))
1176 for (i = 0, macptr = rstrtok(tmpbuf,";"); macptr; macptr = rstrtok(NULL,";"), i++)
1178 if(simple_strtol(macptr, 0, 10) != 0) //Enable
1179 pAd->CommonCfg.bIEEE80211H = TRUE;
1181 pAd->CommonCfg.bIEEE80211H = FALSE;
1183 DBGPRINT(RT_DEBUG_TRACE, ("IEEE80211H=%d\n", pAd->CommonCfg.bIEEE80211H));
1187 if(RTMPGetKeyParameter("CSPeriod", tmpbuf, 10, buffer))
1189 if(simple_strtol(tmpbuf, 0, 10) != 0)
1190 pAd->CommonCfg.RadarDetect.CSPeriod = simple_strtol(tmpbuf, 0, 10);
1192 pAd->CommonCfg.RadarDetect.CSPeriod = 0;
1194 DBGPRINT(RT_DEBUG_TRACE, ("CSPeriod=%d\n", pAd->CommonCfg.RadarDetect.CSPeriod));
1198 if(RTMPGetKeyParameter("RDRegion", tmpbuf, 128, buffer))
1200 if ((strncmp(tmpbuf, "JAP_W53", 7) == 0) || (strncmp(tmpbuf, "jap_w53", 7) == 0))
1202 pAd->CommonCfg.RadarDetect.RDDurRegion = JAP_W53;
1203 pAd->CommonCfg.RadarDetect.DfsSessionTime = 15;
1205 else if ((strncmp(tmpbuf, "JAP_W56", 7) == 0) || (strncmp(tmpbuf, "jap_w56", 7) == 0))
1207 pAd->CommonCfg.RadarDetect.RDDurRegion = JAP_W56;
1208 pAd->CommonCfg.RadarDetect.DfsSessionTime = 13;
1210 else if ((strncmp(tmpbuf, "JAP", 3) == 0) || (strncmp(tmpbuf, "jap", 3) == 0))
1212 pAd->CommonCfg.RadarDetect.RDDurRegion = JAP;
1213 pAd->CommonCfg.RadarDetect.DfsSessionTime = 5;
1215 else if ((strncmp(tmpbuf, "FCC", 3) == 0) || (strncmp(tmpbuf, "fcc", 3) == 0))
1217 pAd->CommonCfg.RadarDetect.RDDurRegion = FCC;
1218 pAd->CommonCfg.RadarDetect.DfsSessionTime = 5;
1220 else if ((strncmp(tmpbuf, "CE", 2) == 0) || (strncmp(tmpbuf, "ce", 2) == 0))
1222 pAd->CommonCfg.RadarDetect.RDDurRegion = CE;
1223 pAd->CommonCfg.RadarDetect.DfsSessionTime = 13;
1227 pAd->CommonCfg.RadarDetect.RDDurRegion = CE;
1228 pAd->CommonCfg.RadarDetect.DfsSessionTime = 13;
1231 DBGPRINT(RT_DEBUG_TRACE, ("RDRegion=%d\n", pAd->CommonCfg.RadarDetect.RDDurRegion));
1235 pAd->CommonCfg.RadarDetect.RDDurRegion = CE;
1236 pAd->CommonCfg.RadarDetect.DfsSessionTime = 13;
1240 if(RTMPGetKeyParameter("WirelessEvent", tmpbuf, 10, buffer))
1242 #if WIRELESS_EXT >= 15
1243 if(simple_strtol(tmpbuf, 0, 10) != 0)
1244 pAd->CommonCfg.bWirelessEvent = simple_strtol(tmpbuf, 0, 10);
1246 pAd->CommonCfg.bWirelessEvent = 0; // disable
1248 pAd->CommonCfg.bWirelessEvent = 0; // disable
1250 DBGPRINT(RT_DEBUG_TRACE, ("WirelessEvent=%d\n", pAd->CommonCfg.bWirelessEvent));
1252 if(RTMPGetKeyParameter("WiFiTest", tmpbuf, 10, buffer))
1254 if(simple_strtol(tmpbuf, 0, 10) != 0)
1255 pAd->CommonCfg.bWiFiTest= simple_strtol(tmpbuf, 0, 10);
1257 pAd->CommonCfg.bWiFiTest = 0; // disable
1259 DBGPRINT(RT_DEBUG_TRACE, ("WiFiTest=%d\n", pAd->CommonCfg.bWiFiTest));
1262 if(RTMPGetKeyParameter("AuthMode", tmpbuf, 128, buffer))
1264 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1266 if ((strcmp(tmpbuf, "WEPAUTO") == 0) || (strcmp(tmpbuf, "wepauto") == 0))
1267 pAd->StaCfg.AuthMode = Ndis802_11AuthModeAutoSwitch;
1268 else if ((strcmp(tmpbuf, "SHARED") == 0) || (strcmp(tmpbuf, "shared") == 0))
1269 pAd->StaCfg.AuthMode = Ndis802_11AuthModeShared;
1270 else if ((strcmp(tmpbuf, "WPAPSK") == 0) || (strcmp(tmpbuf, "wpapsk") == 0))
1271 pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPAPSK;
1272 else if ((strcmp(tmpbuf, "WPANONE") == 0) || (strcmp(tmpbuf, "wpanone") == 0))
1273 pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPANone;
1274 else if ((strcmp(tmpbuf, "WPA2PSK") == 0) || (strcmp(tmpbuf, "wpa2psk") == 0))
1275 pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPA2PSK;
1276 #ifdef WPA_SUPPLICANT_SUPPORT
1277 else if ((strcmp(tmpbuf, "WPA") == 0) || (strcmp(tmpbuf, "wpa") == 0))
1278 pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPA;
1279 else if ((strcmp(tmpbuf, "WPA2") == 0) || (strcmp(tmpbuf, "wpa2") == 0))
1280 pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPA2;
1281 #endif // WPA_SUPPLICANT_SUPPORT //
1283 pAd->StaCfg.AuthMode = Ndis802_11AuthModeOpen;
1285 pAd->StaCfg.PortSecured = WPA_802_1X_PORT_NOT_SECURED;
1287 DBGPRINT(RT_DEBUG_TRACE, ("%s::(EncrypType=%d)\n", __func__, pAd->StaCfg.WepStatus));
1291 if(RTMPGetKeyParameter("EncrypType", tmpbuf, 128, buffer))
1293 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1295 if ((strcmp(tmpbuf, "WEP") == 0) || (strcmp(tmpbuf, "wep") == 0))
1296 pAd->StaCfg.WepStatus = Ndis802_11WEPEnabled;
1297 else if ((strcmp(tmpbuf, "TKIP") == 0) || (strcmp(tmpbuf, "tkip") == 0))
1298 pAd->StaCfg.WepStatus = Ndis802_11Encryption2Enabled;
1299 else if ((strcmp(tmpbuf, "AES") == 0) || (strcmp(tmpbuf, "aes") == 0))
1300 pAd->StaCfg.WepStatus = Ndis802_11Encryption3Enabled;
1302 pAd->StaCfg.WepStatus = Ndis802_11WEPDisabled;
1304 // Update all wepstatus related
1305 pAd->StaCfg.PairCipher = pAd->StaCfg.WepStatus;
1306 pAd->StaCfg.GroupCipher = pAd->StaCfg.WepStatus;
1307 pAd->StaCfg.OrigWepStatus = pAd->StaCfg.WepStatus;
1308 pAd->StaCfg.bMixCipher = FALSE;
1310 DBGPRINT(RT_DEBUG_TRACE, ("%s::(EncrypType=%d)\n", __func__, pAd->StaCfg.WepStatus));
1314 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1316 if(RTMPGetCriticalParameter("WPAPSK", tmpbuf, 512, buffer))
1320 tmpbuf[strlen(tmpbuf)] = '\0'; // make STA can process .$^& for WPAPSK input
1322 if ((pAd->StaCfg.AuthMode != Ndis802_11AuthModeWPAPSK) &&
1323 (pAd->StaCfg.AuthMode != Ndis802_11AuthModeWPA2PSK) &&
1324 (pAd->StaCfg.AuthMode != Ndis802_11AuthModeWPANone)
1329 else if ((strlen(tmpbuf) >= 8) && (strlen(tmpbuf) < 64))
1331 PasswordHash((char *)tmpbuf, pAd->CommonCfg.Ssid, pAd->CommonCfg.SsidLen, keyMaterial);
1332 NdisMoveMemory(pAd->StaCfg.PMK, keyMaterial, 32);
1335 else if (strlen(tmpbuf) == 64)
1337 AtoH(tmpbuf, keyMaterial, 32);
1338 NdisMoveMemory(pAd->StaCfg.PMK, keyMaterial, 32);
1343 DBGPRINT(RT_DEBUG_ERROR, ("%s::(WPAPSK key-string required 8 ~ 64 characters!)\n", __func__));
1348 if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPAPSK) ||
1349 (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK))
1351 // Start STA supplicant state machine
1352 pAd->StaCfg.WpaState = SS_START;
1354 else if (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPANone)
1356 pAd->StaCfg.WpaState = SS_NOTUSE;
1359 DBGPRINT(RT_DEBUG_TRACE, ("%s::(WPAPSK=%s)\n", __func__, tmpbuf));
1364 //DefaultKeyID, KeyType, KeyStr
1365 rtmp_read_key_parms_from_file(pAd, tmpbuf, buffer);
1367 #ifdef DOT11_N_SUPPORT
1368 HTParametersHook(pAd, tmpbuf, buffer);
1369 #endif // DOT11_N_SUPPORT //
1371 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1374 if (RTMPGetKeyParameter("PSMode", tmpbuf, 32, buffer))
1376 if (pAd->StaCfg.BssType == BSS_INFRA)
1378 if ((strcmp(tmpbuf, "MAX_PSP") == 0) || (strcmp(tmpbuf, "max_psp") == 0))
1380 // do NOT turn on PSM bit here, wait until MlmeCheckForPsmChange()
1381 // to exclude certain situations.
1382 // MlmeSetPsm(pAd, PWR_SAVE);
1383 OPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM);
1384 if (pAd->StaCfg.bWindowsACCAMEnable == FALSE)
1385 pAd->StaCfg.WindowsPowerMode = Ndis802_11PowerModeMAX_PSP;
1386 pAd->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeMAX_PSP;
1387 pAd->StaCfg.DefaultListenCount = 5;
1389 else if ((strcmp(tmpbuf, "Fast_PSP") == 0) || (strcmp(tmpbuf, "fast_psp") == 0)
1390 || (strcmp(tmpbuf, "FAST_PSP") == 0))
1392 // do NOT turn on PSM bit here, wait until MlmeCheckForPsmChange()
1393 // to exclude certain situations.
1394 // MlmeSetPsmBit(pAd, PWR_SAVE);
1395 OPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM);
1396 if (pAd->StaCfg.bWindowsACCAMEnable == FALSE)
1397 pAd->StaCfg.WindowsPowerMode = Ndis802_11PowerModeFast_PSP;
1398 pAd->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeFast_PSP;
1399 pAd->StaCfg.DefaultListenCount = 3;
1401 else if ((strcmp(tmpbuf, "Legacy_PSP") == 0) || (strcmp(tmpbuf, "legacy_psp") == 0)
1402 || (strcmp(tmpbuf, "LEGACY_PSP") == 0))
1404 // do NOT turn on PSM bit here, wait until MlmeCheckForPsmChange()
1405 // to exclude certain situations.
1406 // MlmeSetPsmBit(pAd, PWR_SAVE);
1407 OPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM);
1408 if (pAd->StaCfg.bWindowsACCAMEnable == FALSE)
1409 pAd->StaCfg.WindowsPowerMode = Ndis802_11PowerModeLegacy_PSP;
1410 pAd->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeLegacy_PSP;
1411 pAd->StaCfg.DefaultListenCount = 3;
1414 { //Default Ndis802_11PowerModeCAM
1415 // clear PSM bit immediately
1416 MlmeSetPsmBit(pAd, PWR_ACTIVE);
1417 OPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM);
1418 if (pAd->StaCfg.bWindowsACCAMEnable == FALSE)
1419 pAd->StaCfg.WindowsPowerMode = Ndis802_11PowerModeCAM;
1420 pAd->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeCAM;
1422 DBGPRINT(RT_DEBUG_TRACE, ("PSMode=%ld\n", pAd->StaCfg.WindowsPowerMode));
1426 if (RTMPGetKeyParameter("FastRoaming", tmpbuf, 32, buffer))
1428 if (simple_strtol(tmpbuf, 0, 10) == 0)
1429 pAd->StaCfg.bFastRoaming = FALSE;
1431 pAd->StaCfg.bFastRoaming = TRUE;
1433 DBGPRINT(RT_DEBUG_TRACE, ("FastRoaming=%d\n", pAd->StaCfg.bFastRoaming));
1436 if (RTMPGetKeyParameter("RoamThreshold", tmpbuf, 32, buffer))
1438 long lInfo = simple_strtol(tmpbuf, 0, 10);
1440 if (lInfo > 90 || lInfo < 60)
1441 pAd->StaCfg.dBmToRoam = -70;
1443 pAd->StaCfg.dBmToRoam = (CHAR)(-1)*lInfo;
1445 DBGPRINT(RT_DEBUG_TRACE, ("RoamThreshold=%d dBm\n", pAd->StaCfg.dBmToRoam));
1448 if(RTMPGetKeyParameter("TGnWifiTest", tmpbuf, 10, buffer))
1450 if(simple_strtol(tmpbuf, 0, 10) == 0)
1451 pAd->StaCfg.bTGnWifiTest = FALSE;
1453 pAd->StaCfg.bTGnWifiTest = TRUE;
1454 DBGPRINT(RT_DEBUG_TRACE, ("TGnWifiTest=%d\n", pAd->StaCfg.bTGnWifiTest));
1461 DBGPRINT(RT_DEBUG_TRACE, ("--> %s does not have a write method\n", src));
1464 retval=filp_close(srcf,NULL);
1468 DBGPRINT(RT_DEBUG_TRACE, ("--> Error %d closing %s\n", -retval, src));
1476 current->cred->fsuid = orgfsuid;
1477 current->cred->fsgid = orgfsgid;
1483 return (NDIS_STATUS_SUCCESS);
1486 #ifdef DOT11_N_SUPPORT
1487 static void HTParametersHook(
1488 IN PRTMP_ADAPTER pAd,
1495 if (RTMPGetKeyParameter("HT_PROTECT", pValueStr, 25, pInput))
1497 Value = simple_strtol(pValueStr, 0, 10);
1500 pAd->CommonCfg.bHTProtect = FALSE;
1504 pAd->CommonCfg.bHTProtect = TRUE;
1506 DBGPRINT(RT_DEBUG_TRACE, ("HT: Protection = %s\n", (Value==0) ? "Disable" : "Enable"));
1509 if (RTMPGetKeyParameter("HT_MIMOPSEnable", pValueStr, 25, pInput))
1511 Value = simple_strtol(pValueStr, 0, 10);
1514 pAd->CommonCfg.bMIMOPSEnable = FALSE;
1518 pAd->CommonCfg.bMIMOPSEnable = TRUE;
1520 DBGPRINT(RT_DEBUG_TRACE, ("HT: MIMOPSEnable = %s\n", (Value==0) ? "Disable" : "Enable"));
1524 if (RTMPGetKeyParameter("HT_MIMOPSMode", pValueStr, 25, pInput))
1526 Value = simple_strtol(pValueStr, 0, 10);
1527 if (Value > MMPS_ENABLE)
1529 pAd->CommonCfg.BACapability.field.MMPSmode = MMPS_ENABLE;
1533 //TODO: add mimo power saving mechanism
1534 pAd->CommonCfg.BACapability.field.MMPSmode = MMPS_ENABLE;
1535 //pAd->CommonCfg.BACapability.field.MMPSmode = Value;
1537 DBGPRINT(RT_DEBUG_TRACE, ("HT: MIMOPS Mode = %d\n", Value));
1540 if (RTMPGetKeyParameter("HT_BADecline", pValueStr, 25, pInput))
1542 Value = simple_strtol(pValueStr, 0, 10);
1545 pAd->CommonCfg.bBADecline = FALSE;
1549 pAd->CommonCfg.bBADecline = TRUE;
1551 DBGPRINT(RT_DEBUG_TRACE, ("HT: BA Decline = %s\n", (Value==0) ? "Disable" : "Enable"));
1555 if (RTMPGetKeyParameter("HT_DisableReordering", pValueStr, 25, pInput))
1557 Value = simple_strtol(pValueStr, 0, 10);
1560 pAd->CommonCfg.bDisableReordering = FALSE;
1564 pAd->CommonCfg.bDisableReordering = TRUE;
1566 DBGPRINT(RT_DEBUG_TRACE, ("HT: DisableReordering = %s\n", (Value==0) ? "Disable" : "Enable"));
1569 if (RTMPGetKeyParameter("HT_AutoBA", pValueStr, 25, pInput))
1571 Value = simple_strtol(pValueStr, 0, 10);
1574 pAd->CommonCfg.BACapability.field.AutoBA = FALSE;
1578 pAd->CommonCfg.BACapability.field.AutoBA = TRUE;
1580 pAd->CommonCfg.REGBACapability.field.AutoBA = pAd->CommonCfg.BACapability.field.AutoBA;
1581 DBGPRINT(RT_DEBUG_TRACE, ("HT: Auto BA = %s\n", (Value==0) ? "Disable" : "Enable"));
1585 if (RTMPGetKeyParameter("HT_HTC", pValueStr, 25, pInput))
1587 Value = simple_strtol(pValueStr, 0, 10);
1590 pAd->HTCEnable = FALSE;
1594 pAd->HTCEnable = TRUE;
1596 DBGPRINT(RT_DEBUG_TRACE, ("HT: Tx +HTC frame = %s\n", (Value==0) ? "Disable" : "Enable"));
1599 // Enable HT Link Adaptation Control
1600 if (RTMPGetKeyParameter("HT_LinkAdapt", pValueStr, 25, pInput))
1602 Value = simple_strtol(pValueStr, 0, 10);
1605 pAd->bLinkAdapt = FALSE;
1609 pAd->HTCEnable = TRUE;
1610 pAd->bLinkAdapt = TRUE;
1612 DBGPRINT(RT_DEBUG_TRACE, ("HT: Link Adaptation Control = %s\n", (Value==0) ? "Disable" : "Enable(+HTC)"));
1615 // Reverse Direction Mechanism
1616 if (RTMPGetKeyParameter("HT_RDG", pValueStr, 25, pInput))
1618 Value = simple_strtol(pValueStr, 0, 10);
1621 pAd->CommonCfg.bRdg = FALSE;
1625 pAd->HTCEnable = TRUE;
1626 pAd->CommonCfg.bRdg = TRUE;
1628 DBGPRINT(RT_DEBUG_TRACE, ("HT: RDG = %s\n", (Value==0) ? "Disable" : "Enable(+HTC)"));
1635 if (RTMPGetKeyParameter("HT_AMSDU", pValueStr, 25, pInput))
1637 Value = simple_strtol(pValueStr, 0, 10);
1640 pAd->CommonCfg.BACapability.field.AmsduEnable = FALSE;
1644 pAd->CommonCfg.BACapability.field.AmsduEnable = TRUE;
1646 DBGPRINT(RT_DEBUG_TRACE, ("HT: Tx A-MSDU = %s\n", (Value==0) ? "Disable" : "Enable"));
1650 if (RTMPGetKeyParameter("HT_MpduDensity", pValueStr, 25, pInput))
1652 Value = simple_strtol(pValueStr, 0, 10);
1653 if (Value <=7 && Value >= 0)
1655 pAd->CommonCfg.BACapability.field.MpduDensity = Value;
1656 DBGPRINT(RT_DEBUG_TRACE, ("HT: MPDU Density = %d\n", Value));
1660 pAd->CommonCfg.BACapability.field.MpduDensity = 4;
1661 DBGPRINT(RT_DEBUG_TRACE, ("HT: MPDU Density = %d (Default)\n", 4));
1665 // Max Rx BA Window Size
1666 if (RTMPGetKeyParameter("HT_BAWinSize", pValueStr, 25, pInput))
1668 Value = simple_strtol(pValueStr, 0, 10);
1670 if (Value >=1 && Value <= 64)
1672 pAd->CommonCfg.REGBACapability.field.RxBAWinLimit = Value;
1673 pAd->CommonCfg.BACapability.field.RxBAWinLimit = Value;
1674 DBGPRINT(RT_DEBUG_TRACE, ("HT: BA Windw Size = %d\n", Value));
1678 pAd->CommonCfg.REGBACapability.field.RxBAWinLimit = 64;
1679 pAd->CommonCfg.BACapability.field.RxBAWinLimit = 64;
1680 DBGPRINT(RT_DEBUG_TRACE, ("HT: BA Windw Size = 64 (Defualt)\n"));
1686 if (RTMPGetKeyParameter("HT_GI", pValueStr, 25, pInput))
1688 Value = simple_strtol(pValueStr, 0, 10);
1690 if (Value == GI_400)
1692 pAd->CommonCfg.RegTransmitSetting.field.ShortGI = GI_400;
1696 pAd->CommonCfg.RegTransmitSetting.field.ShortGI = GI_800;
1699 DBGPRINT(RT_DEBUG_TRACE, ("HT: Guard Interval = %s\n", (Value==GI_400) ? "400" : "800" ));
1702 // HT Operation Mode : Mixed Mode , Green Field
1703 if (RTMPGetKeyParameter("HT_OpMode", pValueStr, 25, pInput))
1705 Value = simple_strtol(pValueStr, 0, 10);
1707 if (Value == HTMODE_GF)
1710 pAd->CommonCfg.RegTransmitSetting.field.HTMODE = HTMODE_GF;
1714 pAd->CommonCfg.RegTransmitSetting.field.HTMODE = HTMODE_MM;
1717 DBGPRINT(RT_DEBUG_TRACE, ("HT: Operate Mode = %s\n", (Value==HTMODE_GF) ? "Green Field" : "Mixed Mode" ));
1720 // Fixed Tx mode : CCK, OFDM
1721 if (RTMPGetKeyParameter("FixedTxMode", pValueStr, 25, pInput))
1725 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1727 fix_tx_mode = FIXED_TXMODE_HT;
1729 if (strcmp(pValueStr, "OFDM") == 0 || strcmp(pValueStr, "ofdm") == 0)
1731 fix_tx_mode = FIXED_TXMODE_OFDM;
1733 else if (strcmp(pValueStr, "CCK") == 0 || strcmp(pValueStr, "cck") == 0)
1735 fix_tx_mode = FIXED_TXMODE_CCK;
1737 else if (strcmp(pValueStr, "HT") == 0 || strcmp(pValueStr, "ht") == 0)
1739 fix_tx_mode = FIXED_TXMODE_HT;
1743 Value = simple_strtol(pValueStr, 0, 10);
1747 if (Value == FIXED_TXMODE_CCK || Value == FIXED_TXMODE_OFDM)
1748 fix_tx_mode = Value;
1750 fix_tx_mode = FIXED_TXMODE_HT;
1753 pAd->StaCfg.DesiredTransmitSetting.field.FixedTxMode = fix_tx_mode;
1754 DBGPRINT(RT_DEBUG_TRACE, ("Fixed Tx Mode = %d\n", fix_tx_mode));
1761 if (RTMPGetKeyParameter("HT_BW", pValueStr, 25, pInput))
1763 Value = simple_strtol(pValueStr, 0, 10);
1767 pAd->CommonCfg.RegTransmitSetting.field.BW = BW_40;
1771 pAd->CommonCfg.RegTransmitSetting.field.BW = BW_20;
1774 #ifdef MCAST_RATE_SPECIFIC
1775 pAd->CommonCfg.MCastPhyMode.field.BW = pAd->CommonCfg.RegTransmitSetting.field.BW;
1776 #endif // MCAST_RATE_SPECIFIC //
1778 DBGPRINT(RT_DEBUG_TRACE, ("HT: Channel Width = %s\n", (Value==BW_40) ? "40 MHz" : "20 MHz" ));
1781 if (RTMPGetKeyParameter("HT_EXTCHA", pValueStr, 25, pInput))
1783 Value = simple_strtol(pValueStr, 0, 10);
1788 pAd->CommonCfg.RegTransmitSetting.field.EXTCHA = EXTCHA_BELOW;
1792 pAd->CommonCfg.RegTransmitSetting.field.EXTCHA = EXTCHA_ABOVE;
1795 DBGPRINT(RT_DEBUG_TRACE, ("HT: Ext Channel = %s\n", (Value==0) ? "BELOW" : "ABOVE" ));
1799 if (RTMPGetKeyParameter("HT_MCS", pValueStr, 50, pInput))
1801 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1803 Value = simple_strtol(pValueStr, 0, 10);
1805 if ((Value >= 0 && Value <= 23) || (Value == 32)) // 3*3
1807 pAd->StaCfg.DesiredTransmitSetting.field.MCS = Value;
1808 pAd->StaCfg.bAutoTxRateSwitch = FALSE;
1809 DBGPRINT(RT_DEBUG_TRACE, ("HT: MCS = %d\n", pAd->StaCfg.DesiredTransmitSetting.field.MCS));
1813 pAd->StaCfg.DesiredTransmitSetting.field.MCS = MCS_AUTO;
1814 pAd->StaCfg.bAutoTxRateSwitch = TRUE;
1815 DBGPRINT(RT_DEBUG_TRACE, ("HT: MCS = AUTO\n"));
1821 if (RTMPGetKeyParameter("HT_STBC", pValueStr, 25, pInput))
1823 Value = simple_strtol(pValueStr, 0, 10);
1824 if (Value == STBC_USE)
1826 pAd->CommonCfg.RegTransmitSetting.field.STBC = STBC_USE;
1830 pAd->CommonCfg.RegTransmitSetting.field.STBC = STBC_NONE;
1832 DBGPRINT(RT_DEBUG_TRACE, ("HT: STBC = %d\n", pAd->CommonCfg.RegTransmitSetting.field.STBC));
1835 // 40_Mhz_Intolerant
1836 if (RTMPGetKeyParameter("HT_40MHZ_INTOLERANT", pValueStr, 25, pInput))
1838 Value = simple_strtol(pValueStr, 0, 10);
1841 pAd->CommonCfg.bForty_Mhz_Intolerant = FALSE;
1845 pAd->CommonCfg.bForty_Mhz_Intolerant = TRUE;
1847 DBGPRINT(RT_DEBUG_TRACE, ("HT: 40MHZ INTOLERANT = %d\n", pAd->CommonCfg.bForty_Mhz_Intolerant));
1850 if(RTMPGetKeyParameter("HT_TxStream", pValueStr, 10, pInput))
1852 switch (simple_strtol(pValueStr, 0, 10))
1855 pAd->CommonCfg.TxStream = 1;
1858 pAd->CommonCfg.TxStream = 2;
1862 pAd->CommonCfg.TxStream = 3;
1864 if (pAd->MACVersion < RALINK_2883_VERSION)
1865 pAd->CommonCfg.TxStream = 2; // only 2 tx streams for RT2860 series
1868 DBGPRINT(RT_DEBUG_TRACE, ("HT: Tx Stream = %d\n", pAd->CommonCfg.TxStream));
1871 if(RTMPGetKeyParameter("HT_RxStream", pValueStr, 10, pInput))
1873 switch (simple_strtol(pValueStr, 0, 10))
1876 pAd->CommonCfg.RxStream = 1;
1879 pAd->CommonCfg.RxStream = 2;
1883 pAd->CommonCfg.RxStream = 3;
1885 if (pAd->MACVersion < RALINK_2883_VERSION)
1886 pAd->CommonCfg.RxStream = 2; // only 2 rx streams for RT2860 series
1889 DBGPRINT(RT_DEBUG_TRACE, ("HT: Rx Stream = %d\n", pAd->CommonCfg.RxStream));
1893 #endif // DOT11_N_SUPPORT //