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 else if ((strcmp(tmpbuf, "WPA") == 0) || (strcmp(tmpbuf, "wpa") == 0))
1277 pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPA;
1278 else if ((strcmp(tmpbuf, "WPA2") == 0) || (strcmp(tmpbuf, "wpa2") == 0))
1279 pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPA2;
1281 pAd->StaCfg.AuthMode = Ndis802_11AuthModeOpen;
1283 pAd->StaCfg.PortSecured = WPA_802_1X_PORT_NOT_SECURED;
1285 DBGPRINT(RT_DEBUG_TRACE, ("%s::(EncrypType=%d)\n", __func__, pAd->StaCfg.WepStatus));
1289 if(RTMPGetKeyParameter("EncrypType", tmpbuf, 128, buffer))
1291 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1293 if ((strcmp(tmpbuf, "WEP") == 0) || (strcmp(tmpbuf, "wep") == 0))
1294 pAd->StaCfg.WepStatus = Ndis802_11WEPEnabled;
1295 else if ((strcmp(tmpbuf, "TKIP") == 0) || (strcmp(tmpbuf, "tkip") == 0))
1296 pAd->StaCfg.WepStatus = Ndis802_11Encryption2Enabled;
1297 else if ((strcmp(tmpbuf, "AES") == 0) || (strcmp(tmpbuf, "aes") == 0))
1298 pAd->StaCfg.WepStatus = Ndis802_11Encryption3Enabled;
1300 pAd->StaCfg.WepStatus = Ndis802_11WEPDisabled;
1302 // Update all wepstatus related
1303 pAd->StaCfg.PairCipher = pAd->StaCfg.WepStatus;
1304 pAd->StaCfg.GroupCipher = pAd->StaCfg.WepStatus;
1305 pAd->StaCfg.OrigWepStatus = pAd->StaCfg.WepStatus;
1306 pAd->StaCfg.bMixCipher = FALSE;
1308 DBGPRINT(RT_DEBUG_TRACE, ("%s::(EncrypType=%d)\n", __func__, pAd->StaCfg.WepStatus));
1312 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1314 if(RTMPGetCriticalParameter("WPAPSK", tmpbuf, 512, buffer))
1318 tmpbuf[strlen(tmpbuf)] = '\0'; // make STA can process .$^& for WPAPSK input
1320 if ((pAd->StaCfg.AuthMode != Ndis802_11AuthModeWPAPSK) &&
1321 (pAd->StaCfg.AuthMode != Ndis802_11AuthModeWPA2PSK) &&
1322 (pAd->StaCfg.AuthMode != Ndis802_11AuthModeWPANone)
1327 else if ((strlen(tmpbuf) >= 8) && (strlen(tmpbuf) < 64))
1329 PasswordHash((char *)tmpbuf, pAd->CommonCfg.Ssid, pAd->CommonCfg.SsidLen, keyMaterial);
1330 NdisMoveMemory(pAd->StaCfg.PMK, keyMaterial, 32);
1333 else if (strlen(tmpbuf) == 64)
1335 AtoH(tmpbuf, keyMaterial, 32);
1336 NdisMoveMemory(pAd->StaCfg.PMK, keyMaterial, 32);
1341 DBGPRINT(RT_DEBUG_ERROR, ("%s::(WPAPSK key-string required 8 ~ 64 characters!)\n", __func__));
1346 if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPAPSK) ||
1347 (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK))
1349 // Start STA supplicant state machine
1350 pAd->StaCfg.WpaState = SS_START;
1352 else if (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPANone)
1354 pAd->StaCfg.WpaState = SS_NOTUSE;
1357 DBGPRINT(RT_DEBUG_TRACE, ("%s::(WPAPSK=%s)\n", __func__, tmpbuf));
1362 //DefaultKeyID, KeyType, KeyStr
1363 rtmp_read_key_parms_from_file(pAd, tmpbuf, buffer);
1365 #ifdef DOT11_N_SUPPORT
1366 HTParametersHook(pAd, tmpbuf, buffer);
1367 #endif // DOT11_N_SUPPORT //
1369 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1372 if (RTMPGetKeyParameter("PSMode", tmpbuf, 32, buffer))
1374 if (pAd->StaCfg.BssType == BSS_INFRA)
1376 if ((strcmp(tmpbuf, "MAX_PSP") == 0) || (strcmp(tmpbuf, "max_psp") == 0))
1378 // do NOT turn on PSM bit here, wait until MlmeCheckForPsmChange()
1379 // to exclude certain situations.
1380 // MlmeSetPsm(pAd, PWR_SAVE);
1381 OPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM);
1382 if (pAd->StaCfg.bWindowsACCAMEnable == FALSE)
1383 pAd->StaCfg.WindowsPowerMode = Ndis802_11PowerModeMAX_PSP;
1384 pAd->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeMAX_PSP;
1385 pAd->StaCfg.DefaultListenCount = 5;
1387 else if ((strcmp(tmpbuf, "Fast_PSP") == 0) || (strcmp(tmpbuf, "fast_psp") == 0)
1388 || (strcmp(tmpbuf, "FAST_PSP") == 0))
1390 // do NOT turn on PSM bit here, wait until MlmeCheckForPsmChange()
1391 // to exclude certain situations.
1392 // MlmeSetPsmBit(pAd, PWR_SAVE);
1393 OPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM);
1394 if (pAd->StaCfg.bWindowsACCAMEnable == FALSE)
1395 pAd->StaCfg.WindowsPowerMode = Ndis802_11PowerModeFast_PSP;
1396 pAd->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeFast_PSP;
1397 pAd->StaCfg.DefaultListenCount = 3;
1399 else if ((strcmp(tmpbuf, "Legacy_PSP") == 0) || (strcmp(tmpbuf, "legacy_psp") == 0)
1400 || (strcmp(tmpbuf, "LEGACY_PSP") == 0))
1402 // do NOT turn on PSM bit here, wait until MlmeCheckForPsmChange()
1403 // to exclude certain situations.
1404 // MlmeSetPsmBit(pAd, PWR_SAVE);
1405 OPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM);
1406 if (pAd->StaCfg.bWindowsACCAMEnable == FALSE)
1407 pAd->StaCfg.WindowsPowerMode = Ndis802_11PowerModeLegacy_PSP;
1408 pAd->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeLegacy_PSP;
1409 pAd->StaCfg.DefaultListenCount = 3;
1412 { //Default Ndis802_11PowerModeCAM
1413 // clear PSM bit immediately
1414 MlmeSetPsmBit(pAd, PWR_ACTIVE);
1415 OPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM);
1416 if (pAd->StaCfg.bWindowsACCAMEnable == FALSE)
1417 pAd->StaCfg.WindowsPowerMode = Ndis802_11PowerModeCAM;
1418 pAd->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeCAM;
1420 DBGPRINT(RT_DEBUG_TRACE, ("PSMode=%ld\n", pAd->StaCfg.WindowsPowerMode));
1424 if (RTMPGetKeyParameter("FastRoaming", tmpbuf, 32, buffer))
1426 if (simple_strtol(tmpbuf, 0, 10) == 0)
1427 pAd->StaCfg.bFastRoaming = FALSE;
1429 pAd->StaCfg.bFastRoaming = TRUE;
1431 DBGPRINT(RT_DEBUG_TRACE, ("FastRoaming=%d\n", pAd->StaCfg.bFastRoaming));
1434 if (RTMPGetKeyParameter("RoamThreshold", tmpbuf, 32, buffer))
1436 long lInfo = simple_strtol(tmpbuf, 0, 10);
1438 if (lInfo > 90 || lInfo < 60)
1439 pAd->StaCfg.dBmToRoam = -70;
1441 pAd->StaCfg.dBmToRoam = (CHAR)(-1)*lInfo;
1443 DBGPRINT(RT_DEBUG_TRACE, ("RoamThreshold=%d dBm\n", pAd->StaCfg.dBmToRoam));
1446 if(RTMPGetKeyParameter("TGnWifiTest", tmpbuf, 10, buffer))
1448 if(simple_strtol(tmpbuf, 0, 10) == 0)
1449 pAd->StaCfg.bTGnWifiTest = FALSE;
1451 pAd->StaCfg.bTGnWifiTest = TRUE;
1452 DBGPRINT(RT_DEBUG_TRACE, ("TGnWifiTest=%d\n", pAd->StaCfg.bTGnWifiTest));
1459 DBGPRINT(RT_DEBUG_TRACE, ("--> %s does not have a write method\n", src));
1462 retval=filp_close(srcf,NULL);
1466 DBGPRINT(RT_DEBUG_TRACE, ("--> Error %d closing %s\n", -retval, src));
1474 current->cred->fsuid = orgfsuid;
1475 current->cred->fsgid = orgfsgid;
1481 return (NDIS_STATUS_SUCCESS);
1484 #ifdef DOT11_N_SUPPORT
1485 static void HTParametersHook(
1486 IN PRTMP_ADAPTER pAd,
1493 if (RTMPGetKeyParameter("HT_PROTECT", pValueStr, 25, pInput))
1495 Value = simple_strtol(pValueStr, 0, 10);
1498 pAd->CommonCfg.bHTProtect = FALSE;
1502 pAd->CommonCfg.bHTProtect = TRUE;
1504 DBGPRINT(RT_DEBUG_TRACE, ("HT: Protection = %s\n", (Value==0) ? "Disable" : "Enable"));
1507 if (RTMPGetKeyParameter("HT_MIMOPSEnable", pValueStr, 25, pInput))
1509 Value = simple_strtol(pValueStr, 0, 10);
1512 pAd->CommonCfg.bMIMOPSEnable = FALSE;
1516 pAd->CommonCfg.bMIMOPSEnable = TRUE;
1518 DBGPRINT(RT_DEBUG_TRACE, ("HT: MIMOPSEnable = %s\n", (Value==0) ? "Disable" : "Enable"));
1522 if (RTMPGetKeyParameter("HT_MIMOPSMode", pValueStr, 25, pInput))
1524 Value = simple_strtol(pValueStr, 0, 10);
1525 if (Value > MMPS_ENABLE)
1527 pAd->CommonCfg.BACapability.field.MMPSmode = MMPS_ENABLE;
1531 //TODO: add mimo power saving mechanism
1532 pAd->CommonCfg.BACapability.field.MMPSmode = MMPS_ENABLE;
1533 //pAd->CommonCfg.BACapability.field.MMPSmode = Value;
1535 DBGPRINT(RT_DEBUG_TRACE, ("HT: MIMOPS Mode = %d\n", Value));
1538 if (RTMPGetKeyParameter("HT_BADecline", pValueStr, 25, pInput))
1540 Value = simple_strtol(pValueStr, 0, 10);
1543 pAd->CommonCfg.bBADecline = FALSE;
1547 pAd->CommonCfg.bBADecline = TRUE;
1549 DBGPRINT(RT_DEBUG_TRACE, ("HT: BA Decline = %s\n", (Value==0) ? "Disable" : "Enable"));
1553 if (RTMPGetKeyParameter("HT_DisableReordering", pValueStr, 25, pInput))
1555 Value = simple_strtol(pValueStr, 0, 10);
1558 pAd->CommonCfg.bDisableReordering = FALSE;
1562 pAd->CommonCfg.bDisableReordering = TRUE;
1564 DBGPRINT(RT_DEBUG_TRACE, ("HT: DisableReordering = %s\n", (Value==0) ? "Disable" : "Enable"));
1567 if (RTMPGetKeyParameter("HT_AutoBA", pValueStr, 25, pInput))
1569 Value = simple_strtol(pValueStr, 0, 10);
1572 pAd->CommonCfg.BACapability.field.AutoBA = FALSE;
1576 pAd->CommonCfg.BACapability.field.AutoBA = TRUE;
1578 pAd->CommonCfg.REGBACapability.field.AutoBA = pAd->CommonCfg.BACapability.field.AutoBA;
1579 DBGPRINT(RT_DEBUG_TRACE, ("HT: Auto BA = %s\n", (Value==0) ? "Disable" : "Enable"));
1583 if (RTMPGetKeyParameter("HT_HTC", pValueStr, 25, pInput))
1585 Value = simple_strtol(pValueStr, 0, 10);
1588 pAd->HTCEnable = FALSE;
1592 pAd->HTCEnable = TRUE;
1594 DBGPRINT(RT_DEBUG_TRACE, ("HT: Tx +HTC frame = %s\n", (Value==0) ? "Disable" : "Enable"));
1597 // Enable HT Link Adaptation Control
1598 if (RTMPGetKeyParameter("HT_LinkAdapt", pValueStr, 25, pInput))
1600 Value = simple_strtol(pValueStr, 0, 10);
1603 pAd->bLinkAdapt = FALSE;
1607 pAd->HTCEnable = TRUE;
1608 pAd->bLinkAdapt = TRUE;
1610 DBGPRINT(RT_DEBUG_TRACE, ("HT: Link Adaptation Control = %s\n", (Value==0) ? "Disable" : "Enable(+HTC)"));
1613 // Reverse Direction Mechanism
1614 if (RTMPGetKeyParameter("HT_RDG", pValueStr, 25, pInput))
1616 Value = simple_strtol(pValueStr, 0, 10);
1619 pAd->CommonCfg.bRdg = FALSE;
1623 pAd->HTCEnable = TRUE;
1624 pAd->CommonCfg.bRdg = TRUE;
1626 DBGPRINT(RT_DEBUG_TRACE, ("HT: RDG = %s\n", (Value==0) ? "Disable" : "Enable(+HTC)"));
1633 if (RTMPGetKeyParameter("HT_AMSDU", pValueStr, 25, pInput))
1635 Value = simple_strtol(pValueStr, 0, 10);
1638 pAd->CommonCfg.BACapability.field.AmsduEnable = FALSE;
1642 pAd->CommonCfg.BACapability.field.AmsduEnable = TRUE;
1644 DBGPRINT(RT_DEBUG_TRACE, ("HT: Tx A-MSDU = %s\n", (Value==0) ? "Disable" : "Enable"));
1648 if (RTMPGetKeyParameter("HT_MpduDensity", pValueStr, 25, pInput))
1650 Value = simple_strtol(pValueStr, 0, 10);
1651 if (Value <=7 && Value >= 0)
1653 pAd->CommonCfg.BACapability.field.MpduDensity = Value;
1654 DBGPRINT(RT_DEBUG_TRACE, ("HT: MPDU Density = %d\n", Value));
1658 pAd->CommonCfg.BACapability.field.MpduDensity = 4;
1659 DBGPRINT(RT_DEBUG_TRACE, ("HT: MPDU Density = %d (Default)\n", 4));
1663 // Max Rx BA Window Size
1664 if (RTMPGetKeyParameter("HT_BAWinSize", pValueStr, 25, pInput))
1666 Value = simple_strtol(pValueStr, 0, 10);
1668 if (Value >=1 && Value <= 64)
1670 pAd->CommonCfg.REGBACapability.field.RxBAWinLimit = Value;
1671 pAd->CommonCfg.BACapability.field.RxBAWinLimit = Value;
1672 DBGPRINT(RT_DEBUG_TRACE, ("HT: BA Windw Size = %d\n", Value));
1676 pAd->CommonCfg.REGBACapability.field.RxBAWinLimit = 64;
1677 pAd->CommonCfg.BACapability.field.RxBAWinLimit = 64;
1678 DBGPRINT(RT_DEBUG_TRACE, ("HT: BA Windw Size = 64 (Defualt)\n"));
1684 if (RTMPGetKeyParameter("HT_GI", pValueStr, 25, pInput))
1686 Value = simple_strtol(pValueStr, 0, 10);
1688 if (Value == GI_400)
1690 pAd->CommonCfg.RegTransmitSetting.field.ShortGI = GI_400;
1694 pAd->CommonCfg.RegTransmitSetting.field.ShortGI = GI_800;
1697 DBGPRINT(RT_DEBUG_TRACE, ("HT: Guard Interval = %s\n", (Value==GI_400) ? "400" : "800" ));
1700 // HT Operation Mode : Mixed Mode , Green Field
1701 if (RTMPGetKeyParameter("HT_OpMode", pValueStr, 25, pInput))
1703 Value = simple_strtol(pValueStr, 0, 10);
1705 if (Value == HTMODE_GF)
1708 pAd->CommonCfg.RegTransmitSetting.field.HTMODE = HTMODE_GF;
1712 pAd->CommonCfg.RegTransmitSetting.field.HTMODE = HTMODE_MM;
1715 DBGPRINT(RT_DEBUG_TRACE, ("HT: Operate Mode = %s\n", (Value==HTMODE_GF) ? "Green Field" : "Mixed Mode" ));
1718 // Fixed Tx mode : CCK, OFDM
1719 if (RTMPGetKeyParameter("FixedTxMode", pValueStr, 25, pInput))
1723 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1725 fix_tx_mode = FIXED_TXMODE_HT;
1727 if (strcmp(pValueStr, "OFDM") == 0 || strcmp(pValueStr, "ofdm") == 0)
1729 fix_tx_mode = FIXED_TXMODE_OFDM;
1731 else if (strcmp(pValueStr, "CCK") == 0 || strcmp(pValueStr, "cck") == 0)
1733 fix_tx_mode = FIXED_TXMODE_CCK;
1735 else if (strcmp(pValueStr, "HT") == 0 || strcmp(pValueStr, "ht") == 0)
1737 fix_tx_mode = FIXED_TXMODE_HT;
1741 Value = simple_strtol(pValueStr, 0, 10);
1745 if (Value == FIXED_TXMODE_CCK || Value == FIXED_TXMODE_OFDM)
1746 fix_tx_mode = Value;
1748 fix_tx_mode = FIXED_TXMODE_HT;
1751 pAd->StaCfg.DesiredTransmitSetting.field.FixedTxMode = fix_tx_mode;
1752 DBGPRINT(RT_DEBUG_TRACE, ("Fixed Tx Mode = %d\n", fix_tx_mode));
1759 if (RTMPGetKeyParameter("HT_BW", pValueStr, 25, pInput))
1761 Value = simple_strtol(pValueStr, 0, 10);
1765 pAd->CommonCfg.RegTransmitSetting.field.BW = BW_40;
1769 pAd->CommonCfg.RegTransmitSetting.field.BW = BW_20;
1772 #ifdef MCAST_RATE_SPECIFIC
1773 pAd->CommonCfg.MCastPhyMode.field.BW = pAd->CommonCfg.RegTransmitSetting.field.BW;
1774 #endif // MCAST_RATE_SPECIFIC //
1776 DBGPRINT(RT_DEBUG_TRACE, ("HT: Channel Width = %s\n", (Value==BW_40) ? "40 MHz" : "20 MHz" ));
1779 if (RTMPGetKeyParameter("HT_EXTCHA", pValueStr, 25, pInput))
1781 Value = simple_strtol(pValueStr, 0, 10);
1786 pAd->CommonCfg.RegTransmitSetting.field.EXTCHA = EXTCHA_BELOW;
1790 pAd->CommonCfg.RegTransmitSetting.field.EXTCHA = EXTCHA_ABOVE;
1793 DBGPRINT(RT_DEBUG_TRACE, ("HT: Ext Channel = %s\n", (Value==0) ? "BELOW" : "ABOVE" ));
1797 if (RTMPGetKeyParameter("HT_MCS", pValueStr, 50, pInput))
1799 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1801 Value = simple_strtol(pValueStr, 0, 10);
1803 if ((Value >= 0 && Value <= 23) || (Value == 32)) // 3*3
1805 pAd->StaCfg.DesiredTransmitSetting.field.MCS = Value;
1806 pAd->StaCfg.bAutoTxRateSwitch = FALSE;
1807 DBGPRINT(RT_DEBUG_TRACE, ("HT: MCS = %d\n", pAd->StaCfg.DesiredTransmitSetting.field.MCS));
1811 pAd->StaCfg.DesiredTransmitSetting.field.MCS = MCS_AUTO;
1812 pAd->StaCfg.bAutoTxRateSwitch = TRUE;
1813 DBGPRINT(RT_DEBUG_TRACE, ("HT: MCS = AUTO\n"));
1819 if (RTMPGetKeyParameter("HT_STBC", pValueStr, 25, pInput))
1821 Value = simple_strtol(pValueStr, 0, 10);
1822 if (Value == STBC_USE)
1824 pAd->CommonCfg.RegTransmitSetting.field.STBC = STBC_USE;
1828 pAd->CommonCfg.RegTransmitSetting.field.STBC = STBC_NONE;
1830 DBGPRINT(RT_DEBUG_TRACE, ("HT: STBC = %d\n", pAd->CommonCfg.RegTransmitSetting.field.STBC));
1833 // 40_Mhz_Intolerant
1834 if (RTMPGetKeyParameter("HT_40MHZ_INTOLERANT", pValueStr, 25, pInput))
1836 Value = simple_strtol(pValueStr, 0, 10);
1839 pAd->CommonCfg.bForty_Mhz_Intolerant = FALSE;
1843 pAd->CommonCfg.bForty_Mhz_Intolerant = TRUE;
1845 DBGPRINT(RT_DEBUG_TRACE, ("HT: 40MHZ INTOLERANT = %d\n", pAd->CommonCfg.bForty_Mhz_Intolerant));
1848 if(RTMPGetKeyParameter("HT_TxStream", pValueStr, 10, pInput))
1850 switch (simple_strtol(pValueStr, 0, 10))
1853 pAd->CommonCfg.TxStream = 1;
1856 pAd->CommonCfg.TxStream = 2;
1860 pAd->CommonCfg.TxStream = 3;
1862 if (pAd->MACVersion < RALINK_2883_VERSION)
1863 pAd->CommonCfg.TxStream = 2; // only 2 tx streams for RT2860 series
1866 DBGPRINT(RT_DEBUG_TRACE, ("HT: Tx Stream = %d\n", pAd->CommonCfg.TxStream));
1869 if(RTMPGetKeyParameter("HT_RxStream", pValueStr, 10, pInput))
1871 switch (simple_strtol(pValueStr, 0, 10))
1874 pAd->CommonCfg.RxStream = 1;
1877 pAd->CommonCfg.RxStream = 2;
1881 pAd->CommonCfg.RxStream = 3;
1883 if (pAd->MACVersion < RALINK_2883_VERSION)
1884 pAd->CommonCfg.RxStream = 2; // only 2 rx streams for RT2860 series
1887 DBGPRINT(RT_DEBUG_TRACE, ("HT: Rx Stream = %d\n", pAd->CommonCfg.RxStream));
1891 #endif // DOT11_N_SUPPORT //