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 static void HTParametersHook(
35 #define ETH_MAC_ADDR_STR_LEN 17 // in format of xx:xx:xx:xx:xx:xx
37 // We assume the s1 is a sting, s2 is a memory space with 6 bytes. and content of s1 will be changed.
38 BOOLEAN rtstrmactohex(char *s1, char *s2)
41 char *ptokS = s1, *ptokE = s1;
43 if (strlen(s1) != ETH_MAC_ADDR_STR_LEN)
46 while((*ptokS) != '\0')
48 if((ptokE = strchr(ptokS, ':')) != NULL)
50 if ((strlen(ptokS) != 2) || (!isxdigit(*ptokS)) || (!isxdigit(*(ptokS+1))))
52 AtoH(ptokS, &s2[i++], 1);
55 break; // parsing finished
58 return ( i == 6 ? TRUE : FALSE);
63 // we assume the s1 and s2 both are strings.
64 BOOLEAN rtstrcasecmp(char *s1, char *s2)
66 char *p1 = s1, *p2 = s2;
68 if (strlen(s1) != strlen(s2))
73 if((*p1 != *p2) && ((*p1 ^ *p2) != 0x20))
82 // we assume the s1 (buffer) and s2 (key) both are strings.
83 char * rtstrstruncasecmp(char * s1, char * s2)
103 if (('a' <= temp1) && (temp1 <= 'z'))
104 temp1 = 'A'+(temp1-'a');
105 if (('a' <= temp2) && (temp2 <= 'z'))
106 temp2 = 'A'+(temp2-'a');
118 return NULL; // not found
124 * strstr - Find the first substring in a %NUL terminated string
125 * @s1: The string to be searched
126 * @s2: The string to search for
128 char * rtstrstr(const char * s1,const char * s2)
141 if (!memcmp(s1,s2,l2))
150 * rstrtok - Split a string into tokens
151 * @s: The string to be searched
152 * @ct: The characters to search for
153 * * WARNING: strtok is deprecated, use strsep instead. However strsep is not compatible with old architecture.
156 char * rstrtok(char * s,const char * ct)
160 sbegin = s ? s : __rstrtok;
166 sbegin += strspn(sbegin,ct);
173 send = strpbrk( sbegin, ct);
174 if (send && *send != '\0')
183 * delimitcnt - return the count of a given delimiter in a given string.
184 * @s: The string to be searched.
185 * @ct: The delimiter to search for.
186 * Notice : We suppose the delimiter is a single-char string(for example : ";").
188 INT delimitcnt(char * s,const char * ct)
191 /* point to the beginning of the line */
192 const char *token = s;
196 token = strpbrk(token, ct); /* search for delimiters */
200 /* advanced to the terminating null character */
203 /* skip the delimiter */
207 * Print the found text: use len with %.*s to specify field width.
210 /* accumulate delimiter count */
217 * converts the Internet host address from the standard numbers-and-dots notation
219 * returns nonzero if the address is valid, zero if not.
221 int rtinet_aton(const char *cp, unsigned int *addr)
226 unsigned int parts[4];
227 unsigned int *pp = parts;
232 * Collect number up to ``.''.
233 * Values are specified as for C:
234 * 0x=hex, 0=octal, other=decimal.
240 if (*++cp == 'x' || *cp == 'X')
245 while ((c = *cp) != '\0')
247 if (isdigit((unsigned char) c))
249 val = (val * base) + (c - '0');
253 if (base == 16 && isxdigit((unsigned char) c))
256 (c + 10 - (islower((unsigned char) c) ? 'a' : 'A'));
265 * Internet format: a.b.c.d a.b.c (with c treated as 16-bits)
266 * a.b (with b treated as 24 bits)
268 if (pp >= parts + 3 || val > 0xff)
277 * Check for trailing junk.
280 if (!isspace((unsigned char) *cp++))
284 * Concoct the address according to the number of parts specified.
290 case 1: /* a -- 32 bits */
293 case 2: /* a.b -- 8.24 bits */
296 val |= parts[0] << 24;
299 case 3: /* a.b.c -- 8.8.16 bits */
302 val |= (parts[0] << 24) | (parts[1] << 16);
305 case 4: /* a.b.c.d -- 8.8.8.8 bits */
308 val |= (parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8);
318 ========================================================================
321 Find key section for Get key parameter.
324 buffer Pointer to the buffer to start find the key section
325 section the key of the secion to be find
330 ========================================================================
332 PUCHAR RTMPFindSection(
338 strcpy(temp_buf, "Default");
340 if((ptr = rtstrstr(buffer, temp_buf)) != NULL)
341 return (ptr+strlen("\n"));
347 ========================================================================
353 key Pointer to key string
354 dest Pointer to destination
355 destsize The datasize of the destination
356 buffer Pointer to the buffer to start find the key
363 This routine get the value with the matched key (case case-sensitive)
364 ========================================================================
366 INT RTMPGetKeyParameter(
372 UCHAR *temp_buf1 = NULL;
373 UCHAR *temp_buf2 = NULL;
380 //temp_buf1 = kmalloc(MAX_PARAM_BUFFER_SIZE, MEM_ALLOC_FLAG);
381 os_alloc_mem(NULL, &temp_buf1, MAX_PARAM_BUFFER_SIZE);
383 if(temp_buf1 == NULL)
386 //temp_buf2 = kmalloc(MAX_PARAM_BUFFER_SIZE, MEM_ALLOC_FLAG);
387 os_alloc_mem(NULL, &temp_buf2, MAX_PARAM_BUFFER_SIZE);
388 if(temp_buf2 == NULL)
390 os_free_mem(NULL, temp_buf1);
395 if((offset = RTMPFindSection(buffer)) == NULL)
397 os_free_mem(NULL, temp_buf1);
398 os_free_mem(NULL, temp_buf2);
402 strcpy(temp_buf1, "\n");
403 strcat(temp_buf1, key);
404 strcat(temp_buf1, "=");
407 if((start_ptr=rtstrstr(offset, temp_buf1))==NULL)
409 os_free_mem(NULL, temp_buf1);
410 os_free_mem(NULL, temp_buf2);
414 start_ptr+=strlen("\n");
415 if((end_ptr=rtstrstr(start_ptr, "\n"))==NULL)
416 end_ptr=start_ptr+strlen(start_ptr);
418 if (end_ptr<start_ptr)
420 os_free_mem(NULL, temp_buf1);
421 os_free_mem(NULL, temp_buf2);
425 NdisMoveMemory(temp_buf2, start_ptr, end_ptr-start_ptr);
426 temp_buf2[end_ptr-start_ptr]='\0';
427 len = strlen(temp_buf2);
428 strcpy(temp_buf1, temp_buf2);
429 if((start_ptr=rtstrstr(temp_buf1, "=")) == NULL)
431 os_free_mem(NULL, temp_buf1);
432 os_free_mem(NULL, temp_buf2);
436 strcpy(temp_buf2, start_ptr+1);
441 if( (*ptr == ' ') || (*ptr == '\t') )
448 memset(dest, 0x00, destsize);
449 strncpy(dest, ptr, len >= destsize ? destsize: len);
451 os_free_mem(NULL, temp_buf1);
452 os_free_mem(NULL, temp_buf2);
457 ========================================================================
463 key Pointer to key string
464 dest Pointer to destination
465 destsize The datasize of the destination
466 buffer Pointer to the buffer to start find the key
473 This routine get the value with the matched key (case case-sensitive).
474 It is called for parsing SSID and any key string.
475 ========================================================================
477 INT RTMPGetCriticalParameter(
483 UCHAR *temp_buf1 = NULL;
484 UCHAR *temp_buf2 = NULL;
491 //temp_buf1 = kmalloc(MAX_PARAM_BUFFER_SIZE, MEM_ALLOC_FLAG);
492 os_alloc_mem(NULL, &temp_buf1, MAX_PARAM_BUFFER_SIZE);
494 if(temp_buf1 == NULL)
497 //temp_buf2 = kmalloc(MAX_PARAM_BUFFER_SIZE, MEM_ALLOC_FLAG);
498 os_alloc_mem(NULL, &temp_buf2, MAX_PARAM_BUFFER_SIZE);
499 if(temp_buf2 == NULL)
501 os_free_mem(NULL, temp_buf1);
506 if((offset = RTMPFindSection(buffer)) == NULL)
508 os_free_mem(NULL, temp_buf1);
509 os_free_mem(NULL, temp_buf2);
513 strcpy(temp_buf1, "\n");
514 strcat(temp_buf1, key);
515 strcat(temp_buf1, "=");
518 if((start_ptr=rtstrstr(offset, temp_buf1))==NULL)
520 os_free_mem(NULL, temp_buf1);
521 os_free_mem(NULL, temp_buf2);
525 start_ptr+=strlen("\n");
526 if((end_ptr=rtstrstr(start_ptr, "\n"))==NULL)
527 end_ptr=start_ptr+strlen(start_ptr);
529 if (end_ptr<start_ptr)
531 os_free_mem(NULL, temp_buf1);
532 os_free_mem(NULL, temp_buf2);
536 NdisMoveMemory(temp_buf2, start_ptr, end_ptr-start_ptr);
537 temp_buf2[end_ptr-start_ptr]='\0';
538 len = strlen(temp_buf2);
539 strcpy(temp_buf1, temp_buf2);
540 if((start_ptr=rtstrstr(temp_buf1, "=")) == NULL)
542 os_free_mem(NULL, temp_buf1);
543 os_free_mem(NULL, temp_buf2);
547 strcpy(temp_buf2, start_ptr+1);
551 /* We cannot trim space(' ') for SSID and key string. */
554 //if( (*ptr == ' ') || (*ptr == '\t') )
562 memset(dest, 0x00, destsize);
563 strncpy(dest, ptr, len >= destsize ? destsize: len);
565 os_free_mem(NULL, temp_buf1);
566 os_free_mem(NULL, temp_buf2);
571 ========================================================================
574 Get multiple key parameter.
577 key Pointer to key string
578 dest Pointer to destination
579 destsize The datasize of the destination
580 buffer Pointer to the buffer to start find the key
587 This routine get the value with the matched key (case case-sensitive)
588 ========================================================================
590 INT RTMPGetKeyParameterWithOffset(
593 OUT USHORT *end_offset,
596 IN BOOLEAN bTrimSpace)
598 UCHAR *temp_buf1 = NULL;
599 UCHAR *temp_buf2 = NULL;
606 if (*end_offset >= MAX_INI_BUFFER_SIZE)
609 os_alloc_mem(NULL, &temp_buf1, MAX_PARAM_BUFFER_SIZE);
611 if(temp_buf1 == NULL)
614 os_alloc_mem(NULL, &temp_buf2, MAX_PARAM_BUFFER_SIZE);
615 if(temp_buf2 == NULL)
617 os_free_mem(NULL, temp_buf1);
624 if ((offset = RTMPFindSection(buffer)) == NULL)
626 os_free_mem(NULL, temp_buf1);
627 os_free_mem(NULL, temp_buf2);
632 offset = buffer + (*end_offset);
634 strcpy(temp_buf1, "\n");
635 strcat(temp_buf1, key);
636 strcat(temp_buf1, "=");
639 if((start_ptr=rtstrstr(offset, temp_buf1))==NULL)
641 os_free_mem(NULL, temp_buf1);
642 os_free_mem(NULL, temp_buf2);
646 start_ptr+=strlen("\n");
647 if((end_ptr=rtstrstr(start_ptr, "\n"))==NULL)
648 end_ptr=start_ptr+strlen(start_ptr);
650 if (end_ptr<start_ptr)
652 os_free_mem(NULL, temp_buf1);
653 os_free_mem(NULL, temp_buf2);
657 *end_offset = end_ptr - buffer;
659 NdisMoveMemory(temp_buf2, start_ptr, end_ptr-start_ptr);
660 temp_buf2[end_ptr-start_ptr]='\0';
661 len = strlen(temp_buf2);
662 strcpy(temp_buf1, temp_buf2);
663 if((start_ptr=rtstrstr(temp_buf1, "=")) == NULL)
665 os_free_mem(NULL, temp_buf1);
666 os_free_mem(NULL, temp_buf2);
670 strcpy(temp_buf2, start_ptr+1);
675 if((bTrimSpace && (*ptr == ' ')) || (*ptr == '\t') )
682 memset(dest, 0x00, destsize);
683 strncpy(dest, ptr, len >= destsize ? destsize: len);
685 os_free_mem(NULL, temp_buf1);
686 os_free_mem(NULL, temp_buf2);
691 static int rtmp_parse_key_buffer_from_file(IN PRTMP_ADAPTER pAd,IN char *buffer,IN ULONG KeyType,IN INT BSSIdx,IN INT KeyIdx)
694 INT i = BSSIdx, idx = KeyIdx;
696 UCHAR CipherAlg = CIPHER_WEP64;
699 KeyLen = strlen(keybuff);
703 if( (KeyLen == 5) || (KeyLen == 13))
705 pAd->SharedKey[i][idx].KeyLen = KeyLen;
706 NdisMoveMemory(pAd->SharedKey[i][idx].Key, keybuff, KeyLen);
708 CipherAlg = CIPHER_WEP64;
710 CipherAlg = CIPHER_WEP128;
711 pAd->SharedKey[i][idx].CipherAlg = CipherAlg;
713 DBGPRINT(RT_DEBUG_TRACE, ("I/F(ra%d) Key%dStr=%s and type=%s\n", i, idx+1, keybuff, (KeyType == 0) ? "Hex":"Ascii"));
717 {//Invalid key length
718 DBGPRINT(RT_DEBUG_ERROR, ("Key%dStr is Invalid key length! KeyLen = %ld!\n", idx+1, KeyLen));
724 if( (KeyLen == 10) || (KeyLen == 26))
726 pAd->SharedKey[i][idx].KeyLen = KeyLen / 2;
727 AtoH(keybuff, pAd->SharedKey[i][idx].Key, KeyLen / 2);
729 CipherAlg = CIPHER_WEP64;
731 CipherAlg = CIPHER_WEP128;
732 pAd->SharedKey[i][idx].CipherAlg = CipherAlg;
734 DBGPRINT(RT_DEBUG_TRACE, ("I/F(ra%d) Key%dStr=%s and type=%s\n", i, idx+1, keybuff, (KeyType == 0) ? "Hex":"Ascii"));
738 {//Invalid key length
739 DBGPRINT(RT_DEBUG_ERROR, ("I/F(ra%d) Key%dStr is Invalid key length! KeyLen = %ld!\n", i, idx+1, KeyLen));
744 static void rtmp_read_key_parms_from_file(IN PRTMP_ADAPTER pAd, char *tmpbuf, char *buffer)
749 ULONG KeyType[MAX_MBSSID_NUM];
752 NdisZeroMemory(KeyType, MAX_MBSSID_NUM);
755 if(RTMPGetKeyParameter("DefaultKeyID", tmpbuf, 25, buffer))
758 KeyIdx = simple_strtol(tmpbuf, 0, 10);
759 if((KeyIdx >= 1 ) && (KeyIdx <= 4))
760 pAd->StaCfg.DefaultKeyId = (UCHAR) (KeyIdx - 1);
762 pAd->StaCfg.DefaultKeyId = 0;
764 DBGPRINT(RT_DEBUG_TRACE, ("DefaultKeyID(0~3)=%d\n", pAd->StaCfg.DefaultKeyId));
769 for (idx = 0; idx < 4; idx++)
771 sprintf(tok_str, "Key%dType", idx + 1);
773 if (RTMPGetKeyParameter(tok_str, tmpbuf, 128, buffer))
775 for (i = 0, macptr = rstrtok(tmpbuf,";"); macptr; macptr = rstrtok(NULL,";"), i++)
777 KeyType[i] = simple_strtol(macptr, 0, 10);
781 sprintf(tok_str, "Key%dStr", idx + 1);
782 if (RTMPGetCriticalParameter(tok_str, tmpbuf, 128, buffer))
784 rtmp_parse_key_buffer_from_file(pAd, tmpbuf, KeyType[BSS0], BSS0, idx);
791 static void rtmp_read_sta_wmm_parms_from_file(IN PRTMP_ADAPTER pAd, char *tmpbuf, char *buffer)
795 BOOLEAN bWmmEnable = FALSE;
798 if(RTMPGetKeyParameter("WmmCapable", tmpbuf, 32, buffer))
800 if(simple_strtol(tmpbuf, 0, 10) != 0) //Enable
802 pAd->CommonCfg.bWmmCapable = TRUE;
807 pAd->CommonCfg.bWmmCapable = FALSE;
810 DBGPRINT(RT_DEBUG_TRACE, ("WmmCapable=%d\n", pAd->CommonCfg.bWmmCapable));
813 //AckPolicy for AC_BK, AC_BE, AC_VI, AC_VO
814 if(RTMPGetKeyParameter("AckPolicy", tmpbuf, 32, buffer))
816 for (i = 0, macptr = rstrtok(tmpbuf,";"); macptr; macptr = rstrtok(NULL,";"), i++)
818 pAd->CommonCfg.AckPolicy[i] = (UCHAR)simple_strtol(macptr, 0, 10);
820 DBGPRINT(RT_DEBUG_TRACE, ("AckPolicy[%d]=%d\n", i, pAd->CommonCfg.AckPolicy[i]));
827 if(RTMPGetKeyParameter("APSDCapable", tmpbuf, 10, buffer))
829 if(simple_strtol(tmpbuf, 0, 10) != 0) //Enable
830 pAd->CommonCfg.bAPSDCapable = TRUE;
832 pAd->CommonCfg.bAPSDCapable = FALSE;
834 DBGPRINT(RT_DEBUG_TRACE, ("APSDCapable=%d\n", pAd->CommonCfg.bAPSDCapable));
837 //APSDAC for AC_BE, AC_BK, AC_VI, AC_VO
838 if(RTMPGetKeyParameter("APSDAC", tmpbuf, 32, buffer))
842 for (i = 0, macptr = rstrtok(tmpbuf,";"); macptr; macptr = rstrtok(NULL,";"), i++)
844 apsd_ac[i] = (BOOLEAN)simple_strtol(macptr, 0, 10);
846 DBGPRINT(RT_DEBUG_TRACE, ("APSDAC%d %d\n", i, apsd_ac[i]));
849 pAd->CommonCfg.bAPSDAC_BE = apsd_ac[0];
850 pAd->CommonCfg.bAPSDAC_BK = apsd_ac[1];
851 pAd->CommonCfg.bAPSDAC_VI = apsd_ac[2];
852 pAd->CommonCfg.bAPSDAC_VO = apsd_ac[3];
858 NDIS_STATUS RTMPReadParametersHook(
859 IN PRTMP_ADAPTER pAd)
863 INT retval, orgfsuid, orgfsgid;
869 UCHAR keyMaterial[40];
874 buffer = kmalloc(MAX_INI_BUFFER_SIZE, MEM_ALLOC_FLAG);
876 return NDIS_STATUS_FAILURE;
878 tmpbuf = kmalloc(MAX_PARAM_BUFFER_SIZE, MEM_ALLOC_FLAG);
882 return NDIS_STATUS_FAILURE;
885 src = STA_PROFILE_PATH;
887 // Save uid and gid used for filesystem access.
888 // Set user and group to 0 (root)
889 orgfsuid = current_fsuid();
890 orgfsgid = current_fsgid();
891 /* Hm, can't really do this nicely anymore, so rely on these files
892 * being set to the proper permission to read them... */
893 /* current->cred->fsuid = current->cred->fsgid = 0; */
899 srcf = filp_open(src, O_RDONLY, 0);
902 DBGPRINT(RT_DEBUG_ERROR, ("--> Error %ld opening %s\n", -PTR_ERR(srcf),src));
906 // The object must have a read method
907 if (srcf->f_op && srcf->f_op->read)
909 memset(buffer, 0x00, MAX_INI_BUFFER_SIZE);
910 retval=srcf->f_op->read(srcf, buffer, MAX_INI_BUFFER_SIZE, &srcf->f_pos);
913 DBGPRINT(RT_DEBUG_TRACE, ("--> Read %s error %d\n", src, -retval));
917 // set file parameter to portcfg
919 if(RTMPGetKeyParameter("CountryRegion", tmpbuf, 25, buffer))
921 pAd->CommonCfg.CountryRegion = (UCHAR) simple_strtol(tmpbuf, 0, 10);
922 DBGPRINT(RT_DEBUG_TRACE, ("CountryRegion=%d\n", pAd->CommonCfg.CountryRegion));
925 if(RTMPGetKeyParameter("CountryRegionABand", tmpbuf, 25, buffer))
927 pAd->CommonCfg.CountryRegionForABand= (UCHAR) simple_strtol(tmpbuf, 0, 10);
928 DBGPRINT(RT_DEBUG_TRACE, ("CountryRegionABand=%d\n", pAd->CommonCfg.CountryRegionForABand));
931 if(RTMPGetKeyParameter("CountryCode", tmpbuf, 25, buffer))
933 NdisMoveMemory(pAd->CommonCfg.CountryCode, tmpbuf , 2);
935 if (strlen(pAd->CommonCfg.CountryCode) != 0)
937 pAd->CommonCfg.bCountryFlag = TRUE;
939 DBGPRINT(RT_DEBUG_TRACE, ("CountryCode=%s\n", pAd->CommonCfg.CountryCode));
942 if(RTMPGetKeyParameter("ChannelGeography", tmpbuf, 25, buffer))
944 UCHAR Geography = (UCHAR) simple_strtol(tmpbuf, 0, 10);
945 if (Geography <= BOTH)
947 pAd->CommonCfg.Geography = Geography;
948 pAd->CommonCfg.CountryCode[2] =
949 (pAd->CommonCfg.Geography == BOTH) ? ' ' : ((pAd->CommonCfg.Geography == IDOR) ? 'I' : 'O');
950 DBGPRINT(RT_DEBUG_TRACE, ("ChannelGeography=%d\n", pAd->CommonCfg.Geography));
955 pAd->CommonCfg.Geography = BOTH;
956 pAd->CommonCfg.CountryCode[2] = ' ';
961 if (RTMPGetCriticalParameter("SSID", tmpbuf, 256, buffer))
963 if (strlen(tmpbuf) <= 32)
965 pAd->CommonCfg.SsidLen = (UCHAR) strlen(tmpbuf);
966 NdisZeroMemory(pAd->CommonCfg.Ssid, NDIS_802_11_LENGTH_SSID);
967 NdisMoveMemory(pAd->CommonCfg.Ssid, tmpbuf, pAd->CommonCfg.SsidLen);
968 pAd->MlmeAux.AutoReconnectSsidLen = pAd->CommonCfg.SsidLen;
969 NdisZeroMemory(pAd->MlmeAux.AutoReconnectSsid, NDIS_802_11_LENGTH_SSID);
970 NdisMoveMemory(pAd->MlmeAux.AutoReconnectSsid, tmpbuf, pAd->MlmeAux.AutoReconnectSsidLen);
971 pAd->MlmeAux.SsidLen = pAd->CommonCfg.SsidLen;
972 NdisZeroMemory(pAd->MlmeAux.Ssid, NDIS_802_11_LENGTH_SSID);
973 NdisMoveMemory(pAd->MlmeAux.Ssid, tmpbuf, pAd->MlmeAux.SsidLen);
974 DBGPRINT(RT_DEBUG_TRACE, ("%s::(SSID=%s)\n", __func__, tmpbuf));
981 if (RTMPGetKeyParameter("NetworkType", tmpbuf, 25, buffer))
983 pAd->bConfigChanged = TRUE;
984 if (strcmp(tmpbuf, "Adhoc") == 0)
985 pAd->StaCfg.BssType = BSS_ADHOC;
986 else //Default Infrastructure mode
987 pAd->StaCfg.BssType = BSS_INFRA;
988 // Reset Ralink supplicant to not use, it will be set to start when UI set PMK key
989 pAd->StaCfg.WpaState = SS_NOTUSE;
990 DBGPRINT(RT_DEBUG_TRACE, ("%s::(NetworkType=%d)\n", __func__, pAd->StaCfg.BssType));
995 if(RTMPGetKeyParameter("Channel", tmpbuf, 10, buffer))
997 pAd->CommonCfg.Channel = (UCHAR) simple_strtol(tmpbuf, 0, 10);
998 DBGPRINT(RT_DEBUG_TRACE, ("Channel=%d\n", pAd->CommonCfg.Channel));
1001 if(RTMPGetKeyParameter("WirelessMode", tmpbuf, 10, buffer))
1003 int value = 0, maxPhyMode = PHY_11G;
1005 maxPhyMode = PHY_11N_5G;
1007 value = simple_strtol(tmpbuf, 0, 10);
1009 if (value <= maxPhyMode)
1011 pAd->CommonCfg.PhyMode = value;
1013 DBGPRINT(RT_DEBUG_TRACE, ("PhyMode=%d\n", pAd->CommonCfg.PhyMode));
1016 if(RTMPGetKeyParameter("BasicRate", tmpbuf, 10, buffer))
1018 pAd->CommonCfg.BasicRateBitmap = (ULONG) simple_strtol(tmpbuf, 0, 10);
1019 DBGPRINT(RT_DEBUG_TRACE, ("BasicRate=%ld\n", pAd->CommonCfg.BasicRateBitmap));
1022 if(RTMPGetKeyParameter("BeaconPeriod", tmpbuf, 10, buffer))
1024 pAd->CommonCfg.BeaconPeriod = (USHORT) simple_strtol(tmpbuf, 0, 10);
1025 DBGPRINT(RT_DEBUG_TRACE, ("BeaconPeriod=%d\n", pAd->CommonCfg.BeaconPeriod));
1028 if(RTMPGetKeyParameter("TxPower", tmpbuf, 10, buffer))
1030 pAd->CommonCfg.TxPowerPercentage = (ULONG) simple_strtol(tmpbuf, 0, 10);
1032 pAd->CommonCfg.TxPowerDefault = pAd->CommonCfg.TxPowerPercentage;
1034 DBGPRINT(RT_DEBUG_TRACE, ("TxPower=%ld\n", pAd->CommonCfg.TxPowerPercentage));
1037 if(RTMPGetKeyParameter("BGProtection", tmpbuf, 10, buffer))
1039 switch (simple_strtol(tmpbuf, 0, 10))
1042 pAd->CommonCfg.UseBGProtection = 1;
1044 case 2: //Always OFF
1045 pAd->CommonCfg.UseBGProtection = 2;
1049 pAd->CommonCfg.UseBGProtection = 0;
1052 DBGPRINT(RT_DEBUG_TRACE, ("BGProtection=%ld\n", pAd->CommonCfg.UseBGProtection));
1055 if(RTMPGetKeyParameter("DisableOLBC", tmpbuf, 10, buffer))
1057 switch (simple_strtol(tmpbuf, 0, 10))
1059 case 1: //disable OLBC Detection
1060 pAd->CommonCfg.DisableOLBCDetect = 1;
1062 case 0: //enable OLBC Detection
1063 pAd->CommonCfg.DisableOLBCDetect = 0;
1066 pAd->CommonCfg.DisableOLBCDetect= 0;
1069 DBGPRINT(RT_DEBUG_TRACE, ("OLBCDetection=%ld\n", pAd->CommonCfg.DisableOLBCDetect));
1072 if(RTMPGetKeyParameter("TxPreamble", tmpbuf, 10, buffer))
1074 switch (simple_strtol(tmpbuf, 0, 10))
1076 case Rt802_11PreambleShort:
1077 pAd->CommonCfg.TxPreamble = Rt802_11PreambleShort;
1079 case Rt802_11PreambleLong:
1081 pAd->CommonCfg.TxPreamble = Rt802_11PreambleLong;
1084 DBGPRINT(RT_DEBUG_TRACE, ("TxPreamble=%ld\n", pAd->CommonCfg.TxPreamble));
1087 if(RTMPGetKeyParameter("RTSThreshold", tmpbuf, 10, buffer))
1089 RtsThresh = simple_strtol(tmpbuf, 0, 10);
1090 if( (RtsThresh >= 1) && (RtsThresh <= MAX_RTS_THRESHOLD) )
1091 pAd->CommonCfg.RtsThreshold = (USHORT)RtsThresh;
1093 pAd->CommonCfg.RtsThreshold = MAX_RTS_THRESHOLD;
1095 DBGPRINT(RT_DEBUG_TRACE, ("RTSThreshold=%d\n", pAd->CommonCfg.RtsThreshold));
1098 if(RTMPGetKeyParameter("FragThreshold", tmpbuf, 10, buffer))
1100 FragThresh = simple_strtol(tmpbuf, 0, 10);
1101 pAd->CommonCfg.bUseZeroToDisableFragment = FALSE;
1103 if (FragThresh > MAX_FRAG_THRESHOLD || FragThresh < MIN_FRAG_THRESHOLD)
1104 { //illegal FragThresh so we set it to default
1105 pAd->CommonCfg.FragmentThreshold = MAX_FRAG_THRESHOLD;
1106 pAd->CommonCfg.bUseZeroToDisableFragment = TRUE;
1108 else if (FragThresh % 2 == 1)
1110 // The length of each fragment shall always be an even number of octets, except for the last fragment
1111 // of an MSDU or MMPDU, which may be either an even or an odd number of octets.
1112 pAd->CommonCfg.FragmentThreshold = (USHORT)(FragThresh - 1);
1116 pAd->CommonCfg.FragmentThreshold = (USHORT)FragThresh;
1118 //pAd->CommonCfg.AllowFragSize = (pAd->CommonCfg.FragmentThreshold) - LENGTH_802_11 - LENGTH_CRC;
1119 DBGPRINT(RT_DEBUG_TRACE, ("FragThreshold=%d\n", pAd->CommonCfg.FragmentThreshold));
1122 if(RTMPGetKeyParameter("TxBurst", tmpbuf, 10, buffer))
1124 if(simple_strtol(tmpbuf, 0, 10) != 0) //Enable
1125 pAd->CommonCfg.bEnableTxBurst = TRUE;
1127 pAd->CommonCfg.bEnableTxBurst = FALSE;
1128 DBGPRINT(RT_DEBUG_TRACE, ("TxBurst=%d\n", pAd->CommonCfg.bEnableTxBurst));
1131 #ifdef AGGREGATION_SUPPORT
1133 if(RTMPGetKeyParameter("PktAggregate", tmpbuf, 10, buffer))
1135 if(simple_strtol(tmpbuf, 0, 10) != 0) //Enable
1136 pAd->CommonCfg.bAggregationCapable = TRUE;
1138 pAd->CommonCfg.bAggregationCapable = FALSE;
1139 #ifdef PIGGYBACK_SUPPORT
1140 pAd->CommonCfg.bPiggyBackCapable = pAd->CommonCfg.bAggregationCapable;
1141 #endif // PIGGYBACK_SUPPORT //
1142 DBGPRINT(RT_DEBUG_TRACE, ("PktAggregate=%d\n", pAd->CommonCfg.bAggregationCapable));
1145 pAd->CommonCfg.bAggregationCapable = FALSE;
1146 pAd->CommonCfg.bPiggyBackCapable = FALSE;
1147 #endif // AGGREGATION_SUPPORT //
1150 rtmp_read_sta_wmm_parms_from_file(pAd, tmpbuf, buffer);
1153 if(RTMPGetKeyParameter("ShortSlot", tmpbuf, 10, buffer))
1155 if(simple_strtol(tmpbuf, 0, 10) != 0) //Enable
1156 pAd->CommonCfg.bUseShortSlotTime = TRUE;
1158 pAd->CommonCfg.bUseShortSlotTime = FALSE;
1160 DBGPRINT(RT_DEBUG_TRACE, ("ShortSlot=%d\n", pAd->CommonCfg.bUseShortSlotTime));
1163 if(RTMPGetKeyParameter("IEEE80211H", tmpbuf, 10, buffer))
1165 for (i = 0, macptr = rstrtok(tmpbuf,";"); macptr; macptr = rstrtok(NULL,";"), i++)
1167 if(simple_strtol(macptr, 0, 10) != 0) //Enable
1168 pAd->CommonCfg.bIEEE80211H = TRUE;
1170 pAd->CommonCfg.bIEEE80211H = FALSE;
1172 DBGPRINT(RT_DEBUG_TRACE, ("IEEE80211H=%d\n", pAd->CommonCfg.bIEEE80211H));
1176 if(RTMPGetKeyParameter("CSPeriod", tmpbuf, 10, buffer))
1178 if(simple_strtol(tmpbuf, 0, 10) != 0)
1179 pAd->CommonCfg.RadarDetect.CSPeriod = simple_strtol(tmpbuf, 0, 10);
1181 pAd->CommonCfg.RadarDetect.CSPeriod = 0;
1183 DBGPRINT(RT_DEBUG_TRACE, ("CSPeriod=%d\n", pAd->CommonCfg.RadarDetect.CSPeriod));
1187 if(RTMPGetKeyParameter("RDRegion", tmpbuf, 128, buffer))
1189 if ((strncmp(tmpbuf, "JAP_W53", 7) == 0) || (strncmp(tmpbuf, "jap_w53", 7) == 0))
1191 pAd->CommonCfg.RadarDetect.RDDurRegion = JAP_W53;
1192 pAd->CommonCfg.RadarDetect.DfsSessionTime = 15;
1194 else if ((strncmp(tmpbuf, "JAP_W56", 7) == 0) || (strncmp(tmpbuf, "jap_w56", 7) == 0))
1196 pAd->CommonCfg.RadarDetect.RDDurRegion = JAP_W56;
1197 pAd->CommonCfg.RadarDetect.DfsSessionTime = 13;
1199 else if ((strncmp(tmpbuf, "JAP", 3) == 0) || (strncmp(tmpbuf, "jap", 3) == 0))
1201 pAd->CommonCfg.RadarDetect.RDDurRegion = JAP;
1202 pAd->CommonCfg.RadarDetect.DfsSessionTime = 5;
1204 else if ((strncmp(tmpbuf, "FCC", 3) == 0) || (strncmp(tmpbuf, "fcc", 3) == 0))
1206 pAd->CommonCfg.RadarDetect.RDDurRegion = FCC;
1207 pAd->CommonCfg.RadarDetect.DfsSessionTime = 5;
1209 else if ((strncmp(tmpbuf, "CE", 2) == 0) || (strncmp(tmpbuf, "ce", 2) == 0))
1211 pAd->CommonCfg.RadarDetect.RDDurRegion = CE;
1212 pAd->CommonCfg.RadarDetect.DfsSessionTime = 13;
1216 pAd->CommonCfg.RadarDetect.RDDurRegion = CE;
1217 pAd->CommonCfg.RadarDetect.DfsSessionTime = 13;
1220 DBGPRINT(RT_DEBUG_TRACE, ("RDRegion=%d\n", pAd->CommonCfg.RadarDetect.RDDurRegion));
1224 pAd->CommonCfg.RadarDetect.RDDurRegion = CE;
1225 pAd->CommonCfg.RadarDetect.DfsSessionTime = 13;
1229 if(RTMPGetKeyParameter("WirelessEvent", tmpbuf, 10, buffer))
1231 #if WIRELESS_EXT >= 15
1232 if(simple_strtol(tmpbuf, 0, 10) != 0)
1233 pAd->CommonCfg.bWirelessEvent = simple_strtol(tmpbuf, 0, 10);
1235 pAd->CommonCfg.bWirelessEvent = 0; // disable
1237 pAd->CommonCfg.bWirelessEvent = 0; // disable
1239 DBGPRINT(RT_DEBUG_TRACE, ("WirelessEvent=%d\n", pAd->CommonCfg.bWirelessEvent));
1241 if(RTMPGetKeyParameter("WiFiTest", tmpbuf, 10, buffer))
1243 if(simple_strtol(tmpbuf, 0, 10) != 0)
1244 pAd->CommonCfg.bWiFiTest= simple_strtol(tmpbuf, 0, 10);
1246 pAd->CommonCfg.bWiFiTest = 0; // disable
1248 DBGPRINT(RT_DEBUG_TRACE, ("WiFiTest=%d\n", pAd->CommonCfg.bWiFiTest));
1251 if(RTMPGetKeyParameter("AuthMode", tmpbuf, 128, buffer))
1254 if ((strcmp(tmpbuf, "WEPAUTO") == 0) || (strcmp(tmpbuf, "wepauto") == 0))
1255 pAd->StaCfg.AuthMode = Ndis802_11AuthModeAutoSwitch;
1256 else if ((strcmp(tmpbuf, "SHARED") == 0) || (strcmp(tmpbuf, "shared") == 0))
1257 pAd->StaCfg.AuthMode = Ndis802_11AuthModeShared;
1258 else if ((strcmp(tmpbuf, "WPAPSK") == 0) || (strcmp(tmpbuf, "wpapsk") == 0))
1259 pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPAPSK;
1260 else if ((strcmp(tmpbuf, "WPANONE") == 0) || (strcmp(tmpbuf, "wpanone") == 0))
1261 pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPANone;
1262 else if ((strcmp(tmpbuf, "WPA2PSK") == 0) || (strcmp(tmpbuf, "wpa2psk") == 0))
1263 pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPA2PSK;
1264 else if ((strcmp(tmpbuf, "WPA") == 0) || (strcmp(tmpbuf, "wpa") == 0))
1265 pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPA;
1266 else if ((strcmp(tmpbuf, "WPA2") == 0) || (strcmp(tmpbuf, "wpa2") == 0))
1267 pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPA2;
1269 pAd->StaCfg.AuthMode = Ndis802_11AuthModeOpen;
1271 pAd->StaCfg.PortSecured = WPA_802_1X_PORT_NOT_SECURED;
1273 DBGPRINT(RT_DEBUG_TRACE, ("%s::(EncrypType=%d)\n", __func__, pAd->StaCfg.WepStatus));
1277 if(RTMPGetKeyParameter("EncrypType", tmpbuf, 128, buffer))
1280 if ((strcmp(tmpbuf, "WEP") == 0) || (strcmp(tmpbuf, "wep") == 0))
1281 pAd->StaCfg.WepStatus = Ndis802_11WEPEnabled;
1282 else if ((strcmp(tmpbuf, "TKIP") == 0) || (strcmp(tmpbuf, "tkip") == 0))
1283 pAd->StaCfg.WepStatus = Ndis802_11Encryption2Enabled;
1284 else if ((strcmp(tmpbuf, "AES") == 0) || (strcmp(tmpbuf, "aes") == 0))
1285 pAd->StaCfg.WepStatus = Ndis802_11Encryption3Enabled;
1287 pAd->StaCfg.WepStatus = Ndis802_11WEPDisabled;
1289 // Update all wepstatus related
1290 pAd->StaCfg.PairCipher = pAd->StaCfg.WepStatus;
1291 pAd->StaCfg.GroupCipher = pAd->StaCfg.WepStatus;
1292 pAd->StaCfg.OrigWepStatus = pAd->StaCfg.WepStatus;
1293 pAd->StaCfg.bMixCipher = FALSE;
1295 DBGPRINT(RT_DEBUG_TRACE, ("%s::(EncrypType=%d)\n", __func__, pAd->StaCfg.WepStatus));
1300 if(RTMPGetCriticalParameter("WPAPSK", tmpbuf, 512, buffer))
1304 tmpbuf[strlen(tmpbuf)] = '\0'; // make STA can process .$^& for WPAPSK input
1306 if ((pAd->StaCfg.AuthMode != Ndis802_11AuthModeWPAPSK) &&
1307 (pAd->StaCfg.AuthMode != Ndis802_11AuthModeWPA2PSK) &&
1308 (pAd->StaCfg.AuthMode != Ndis802_11AuthModeWPANone)
1313 else if ((strlen(tmpbuf) >= 8) && (strlen(tmpbuf) < 64))
1315 PasswordHash((char *)tmpbuf, pAd->CommonCfg.Ssid, pAd->CommonCfg.SsidLen, keyMaterial);
1316 NdisMoveMemory(pAd->StaCfg.PMK, keyMaterial, 32);
1319 else if (strlen(tmpbuf) == 64)
1321 AtoH(tmpbuf, keyMaterial, 32);
1322 NdisMoveMemory(pAd->StaCfg.PMK, keyMaterial, 32);
1327 DBGPRINT(RT_DEBUG_ERROR, ("%s::(WPAPSK key-string required 8 ~ 64 characters!)\n", __func__));
1332 if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPAPSK) ||
1333 (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK))
1335 // Start STA supplicant state machine
1336 pAd->StaCfg.WpaState = SS_START;
1338 else if (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPANone)
1340 pAd->StaCfg.WpaState = SS_NOTUSE;
1343 DBGPRINT(RT_DEBUG_TRACE, ("%s::(WPAPSK=%s)\n", __func__, tmpbuf));
1348 //DefaultKeyID, KeyType, KeyStr
1349 rtmp_read_key_parms_from_file(pAd, tmpbuf, buffer);
1351 HTParametersHook(pAd, tmpbuf, buffer);
1355 if (RTMPGetKeyParameter("PSMode", tmpbuf, 10, buffer))
1357 if (pAd->StaCfg.BssType == BSS_INFRA)
1359 if ((strcmp(tmpbuf, "MAX_PSP") == 0) || (strcmp(tmpbuf, "max_psp") == 0))
1361 // do NOT turn on PSM bit here, wait until MlmeCheckForPsmChange()
1362 // to exclude certain situations.
1363 // MlmeSetPsm(pAd, PWR_SAVE);
1364 OPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM);
1365 if (pAd->StaCfg.bWindowsACCAMEnable == FALSE)
1366 pAd->StaCfg.WindowsPowerMode = Ndis802_11PowerModeMAX_PSP;
1367 pAd->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeMAX_PSP;
1368 pAd->StaCfg.DefaultListenCount = 5;
1370 else if ((strcmp(tmpbuf, "Fast_PSP") == 0) || (strcmp(tmpbuf, "fast_psp") == 0)
1371 || (strcmp(tmpbuf, "FAST_PSP") == 0))
1373 // do NOT turn on PSM bit here, wait until MlmeCheckForPsmChange()
1374 // to exclude certain situations.
1375 // MlmeSetPsmBit(pAd, PWR_SAVE);
1376 OPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM);
1377 if (pAd->StaCfg.bWindowsACCAMEnable == FALSE)
1378 pAd->StaCfg.WindowsPowerMode = Ndis802_11PowerModeFast_PSP;
1379 pAd->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeFast_PSP;
1380 pAd->StaCfg.DefaultListenCount = 3;
1382 else if ((strcmp(tmpbuf, "Legacy_PSP") == 0) || (strcmp(tmpbuf, "legacy_psp") == 0)
1383 || (strcmp(tmpbuf, "LEGACY_PSP") == 0))
1385 // do NOT turn on PSM bit here, wait until MlmeCheckForPsmChange()
1386 // to exclude certain situations.
1387 // MlmeSetPsmBit(pAd, PWR_SAVE);
1388 OPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM);
1389 if (pAd->StaCfg.bWindowsACCAMEnable == FALSE)
1390 pAd->StaCfg.WindowsPowerMode = Ndis802_11PowerModeLegacy_PSP;
1391 pAd->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeLegacy_PSP;
1392 pAd->StaCfg.DefaultListenCount = 3;
1395 { //Default Ndis802_11PowerModeCAM
1396 // clear PSM bit immediately
1397 MlmeSetPsmBit(pAd, PWR_ACTIVE);
1398 OPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM);
1399 if (pAd->StaCfg.bWindowsACCAMEnable == FALSE)
1400 pAd->StaCfg.WindowsPowerMode = Ndis802_11PowerModeCAM;
1401 pAd->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeCAM;
1403 DBGPRINT(RT_DEBUG_TRACE, ("PSMode=%ld\n", pAd->StaCfg.WindowsPowerMode));
1407 if (RTMPGetKeyParameter("FastRoaming", tmpbuf, 32, buffer))
1409 if (simple_strtol(tmpbuf, 0, 10) == 0)
1410 pAd->StaCfg.bFastRoaming = FALSE;
1412 pAd->StaCfg.bFastRoaming = TRUE;
1414 DBGPRINT(RT_DEBUG_TRACE, ("FastRoaming=%d\n", pAd->StaCfg.bFastRoaming));
1417 if (RTMPGetKeyParameter("RoamThreshold", tmpbuf, 32, buffer))
1419 long lInfo = simple_strtol(tmpbuf, 0, 10);
1421 if (lInfo > 90 || lInfo < 60)
1422 pAd->StaCfg.dBmToRoam = -70;
1424 pAd->StaCfg.dBmToRoam = (CHAR)(-1)*lInfo;
1426 DBGPRINT(RT_DEBUG_TRACE, ("RoamThreshold=%d dBm\n", pAd->StaCfg.dBmToRoam));
1429 if(RTMPGetKeyParameter("TGnWifiTest", tmpbuf, 10, buffer))
1431 if(simple_strtol(tmpbuf, 0, 10) == 0)
1432 pAd->StaCfg.bTGnWifiTest = FALSE;
1434 pAd->StaCfg.bTGnWifiTest = TRUE;
1435 DBGPRINT(RT_DEBUG_TRACE, ("TGnWifiTest=%d\n", pAd->StaCfg.bTGnWifiTest));
1442 DBGPRINT(RT_DEBUG_TRACE, ("--> %s does not have a write method\n", src));
1445 retval=filp_close(srcf,NULL);
1449 DBGPRINT(RT_DEBUG_TRACE, ("--> Error %d closing %s\n", -retval, src));
1459 return (NDIS_STATUS_SUCCESS);
1462 static void HTParametersHook(
1463 IN PRTMP_ADAPTER pAd,
1470 if (RTMPGetKeyParameter("HT_PROTECT", pValueStr, 25, pInput))
1472 Value = simple_strtol(pValueStr, 0, 10);
1475 pAd->CommonCfg.bHTProtect = FALSE;
1479 pAd->CommonCfg.bHTProtect = TRUE;
1481 DBGPRINT(RT_DEBUG_TRACE, ("HT: Protection = %s\n", (Value==0) ? "Disable" : "Enable"));
1484 if (RTMPGetKeyParameter("HT_MIMOPSEnable", pValueStr, 25, pInput))
1486 Value = simple_strtol(pValueStr, 0, 10);
1489 pAd->CommonCfg.bMIMOPSEnable = FALSE;
1493 pAd->CommonCfg.bMIMOPSEnable = TRUE;
1495 DBGPRINT(RT_DEBUG_TRACE, ("HT: MIMOPSEnable = %s\n", (Value==0) ? "Disable" : "Enable"));
1499 if (RTMPGetKeyParameter("HT_MIMOPSMode", pValueStr, 25, pInput))
1501 Value = simple_strtol(pValueStr, 0, 10);
1502 if (Value > MMPS_ENABLE)
1504 pAd->CommonCfg.BACapability.field.MMPSmode = MMPS_ENABLE;
1508 //TODO: add mimo power saving mechanism
1509 pAd->CommonCfg.BACapability.field.MMPSmode = MMPS_ENABLE;
1510 //pAd->CommonCfg.BACapability.field.MMPSmode = Value;
1512 DBGPRINT(RT_DEBUG_TRACE, ("HT: MIMOPS Mode = %d\n", Value));
1515 if (RTMPGetKeyParameter("HT_BADecline", pValueStr, 25, pInput))
1517 Value = simple_strtol(pValueStr, 0, 10);
1520 pAd->CommonCfg.bBADecline = FALSE;
1524 pAd->CommonCfg.bBADecline = TRUE;
1526 DBGPRINT(RT_DEBUG_TRACE, ("HT: BA Decline = %s\n", (Value==0) ? "Disable" : "Enable"));
1530 if (RTMPGetKeyParameter("HT_DisableReordering", pValueStr, 25, pInput))
1532 Value = simple_strtol(pValueStr, 0, 10);
1535 pAd->CommonCfg.bDisableReordering = FALSE;
1539 pAd->CommonCfg.bDisableReordering = TRUE;
1541 DBGPRINT(RT_DEBUG_TRACE, ("HT: DisableReordering = %s\n", (Value==0) ? "Disable" : "Enable"));
1544 if (RTMPGetKeyParameter("HT_AutoBA", pValueStr, 25, pInput))
1546 Value = simple_strtol(pValueStr, 0, 10);
1549 pAd->CommonCfg.BACapability.field.AutoBA = FALSE;
1553 pAd->CommonCfg.BACapability.field.AutoBA = TRUE;
1555 pAd->CommonCfg.REGBACapability.field.AutoBA = pAd->CommonCfg.BACapability.field.AutoBA;
1556 DBGPRINT(RT_DEBUG_TRACE, ("HT: Auto BA = %s\n", (Value==0) ? "Disable" : "Enable"));
1560 if (RTMPGetKeyParameter("HT_HTC", pValueStr, 25, pInput))
1562 Value = simple_strtol(pValueStr, 0, 10);
1565 pAd->HTCEnable = FALSE;
1569 pAd->HTCEnable = TRUE;
1571 DBGPRINT(RT_DEBUG_TRACE, ("HT: Tx +HTC frame = %s\n", (Value==0) ? "Disable" : "Enable"));
1574 // Enable HT Link Adaptation Control
1575 if (RTMPGetKeyParameter("HT_LinkAdapt", pValueStr, 25, pInput))
1577 Value = simple_strtol(pValueStr, 0, 10);
1580 pAd->bLinkAdapt = FALSE;
1584 pAd->HTCEnable = TRUE;
1585 pAd->bLinkAdapt = TRUE;
1587 DBGPRINT(RT_DEBUG_TRACE, ("HT: Link Adaptation Control = %s\n", (Value==0) ? "Disable" : "Enable(+HTC)"));
1590 // Reverse Direction Mechanism
1591 if (RTMPGetKeyParameter("HT_RDG", pValueStr, 25, pInput))
1593 Value = simple_strtol(pValueStr, 0, 10);
1596 pAd->CommonCfg.bRdg = FALSE;
1600 pAd->HTCEnable = TRUE;
1601 pAd->CommonCfg.bRdg = TRUE;
1603 DBGPRINT(RT_DEBUG_TRACE, ("HT: RDG = %s\n", (Value==0) ? "Disable" : "Enable(+HTC)"));
1610 if (RTMPGetKeyParameter("HT_AMSDU", pValueStr, 25, pInput))
1612 Value = simple_strtol(pValueStr, 0, 10);
1615 pAd->CommonCfg.BACapability.field.AmsduEnable = FALSE;
1619 pAd->CommonCfg.BACapability.field.AmsduEnable = TRUE;
1621 DBGPRINT(RT_DEBUG_TRACE, ("HT: Tx A-MSDU = %s\n", (Value==0) ? "Disable" : "Enable"));
1625 if (RTMPGetKeyParameter("HT_MpduDensity", pValueStr, 25, pInput))
1627 Value = simple_strtol(pValueStr, 0, 10);
1628 if (Value <=7 && Value >= 0)
1630 pAd->CommonCfg.BACapability.field.MpduDensity = Value;
1631 DBGPRINT(RT_DEBUG_TRACE, ("HT: MPDU Density = %d\n", Value));
1635 pAd->CommonCfg.BACapability.field.MpduDensity = 4;
1636 DBGPRINT(RT_DEBUG_TRACE, ("HT: MPDU Density = %d (Default)\n", 4));
1640 // Max Rx BA Window Size
1641 if (RTMPGetKeyParameter("HT_BAWinSize", pValueStr, 25, pInput))
1643 Value = simple_strtol(pValueStr, 0, 10);
1645 if (Value >=1 && Value <= 64)
1647 pAd->CommonCfg.REGBACapability.field.RxBAWinLimit = Value;
1648 pAd->CommonCfg.BACapability.field.RxBAWinLimit = Value;
1649 DBGPRINT(RT_DEBUG_TRACE, ("HT: BA Windw Size = %d\n", Value));
1653 pAd->CommonCfg.REGBACapability.field.RxBAWinLimit = 64;
1654 pAd->CommonCfg.BACapability.field.RxBAWinLimit = 64;
1655 DBGPRINT(RT_DEBUG_TRACE, ("HT: BA Windw Size = 64 (Defualt)\n"));
1661 if (RTMPGetKeyParameter("HT_GI", pValueStr, 25, pInput))
1663 Value = simple_strtol(pValueStr, 0, 10);
1665 if (Value == GI_400)
1667 pAd->CommonCfg.RegTransmitSetting.field.ShortGI = GI_400;
1671 pAd->CommonCfg.RegTransmitSetting.field.ShortGI = GI_800;
1674 DBGPRINT(RT_DEBUG_TRACE, ("HT: Guard Interval = %s\n", (Value==GI_400) ? "400" : "800" ));
1677 // HT Operation Mode : Mixed Mode , Green Field
1678 if (RTMPGetKeyParameter("HT_OpMode", pValueStr, 25, pInput))
1680 Value = simple_strtol(pValueStr, 0, 10);
1682 if (Value == HTMODE_GF)
1685 pAd->CommonCfg.RegTransmitSetting.field.HTMODE = HTMODE_GF;
1689 pAd->CommonCfg.RegTransmitSetting.field.HTMODE = HTMODE_MM;
1692 DBGPRINT(RT_DEBUG_TRACE, ("HT: Operate Mode = %s\n", (Value==HTMODE_GF) ? "Green Field" : "Mixed Mode" ));
1695 // Fixed Tx mode : CCK, OFDM
1696 if (RTMPGetKeyParameter("FixedTxMode", pValueStr, 25, pInput))
1701 fix_tx_mode = FIXED_TXMODE_HT;
1703 if (strcmp(pValueStr, "OFDM") == 0 || strcmp(pValueStr, "ofdm") == 0)
1705 fix_tx_mode = FIXED_TXMODE_OFDM;
1707 else if (strcmp(pValueStr, "CCK") == 0 || strcmp(pValueStr, "cck") == 0)
1709 fix_tx_mode = FIXED_TXMODE_CCK;
1711 else if (strcmp(pValueStr, "HT") == 0 || strcmp(pValueStr, "ht") == 0)
1713 fix_tx_mode = FIXED_TXMODE_HT;
1717 Value = simple_strtol(pValueStr, 0, 10);
1721 if (Value == FIXED_TXMODE_CCK || Value == FIXED_TXMODE_OFDM)
1722 fix_tx_mode = Value;
1724 fix_tx_mode = FIXED_TXMODE_HT;
1727 pAd->StaCfg.DesiredTransmitSetting.field.FixedTxMode = fix_tx_mode;
1728 DBGPRINT(RT_DEBUG_TRACE, ("Fixed Tx Mode = %d\n", fix_tx_mode));
1735 if (RTMPGetKeyParameter("HT_BW", pValueStr, 25, pInput))
1737 Value = simple_strtol(pValueStr, 0, 10);
1741 pAd->CommonCfg.RegTransmitSetting.field.BW = BW_40;
1745 pAd->CommonCfg.RegTransmitSetting.field.BW = BW_20;
1748 #ifdef MCAST_RATE_SPECIFIC
1749 pAd->CommonCfg.MCastPhyMode.field.BW = pAd->CommonCfg.RegTransmitSetting.field.BW;
1750 #endif // MCAST_RATE_SPECIFIC //
1752 DBGPRINT(RT_DEBUG_TRACE, ("HT: Channel Width = %s\n", (Value==BW_40) ? "40 MHz" : "20 MHz" ));
1755 if (RTMPGetKeyParameter("HT_EXTCHA", pValueStr, 25, pInput))
1757 Value = simple_strtol(pValueStr, 0, 10);
1762 pAd->CommonCfg.RegTransmitSetting.field.EXTCHA = EXTCHA_BELOW;
1766 pAd->CommonCfg.RegTransmitSetting.field.EXTCHA = EXTCHA_ABOVE;
1769 DBGPRINT(RT_DEBUG_TRACE, ("HT: Ext Channel = %s\n", (Value==0) ? "BELOW" : "ABOVE" ));
1773 if (RTMPGetKeyParameter("HT_MCS", pValueStr, 50, pInput))
1776 Value = simple_strtol(pValueStr, 0, 10);
1778 if ((Value >= 0 && Value <= 23) || (Value == 32)) // 3*3
1780 pAd->StaCfg.DesiredTransmitSetting.field.MCS = Value;
1781 pAd->StaCfg.bAutoTxRateSwitch = FALSE;
1782 DBGPRINT(RT_DEBUG_TRACE, ("HT: MCS = %d\n", pAd->StaCfg.DesiredTransmitSetting.field.MCS));
1786 pAd->StaCfg.DesiredTransmitSetting.field.MCS = MCS_AUTO;
1787 pAd->StaCfg.bAutoTxRateSwitch = TRUE;
1788 DBGPRINT(RT_DEBUG_TRACE, ("HT: MCS = AUTO\n"));
1794 if (RTMPGetKeyParameter("HT_STBC", pValueStr, 25, pInput))
1796 Value = simple_strtol(pValueStr, 0, 10);
1797 if (Value == STBC_USE)
1799 pAd->CommonCfg.RegTransmitSetting.field.STBC = STBC_USE;
1803 pAd->CommonCfg.RegTransmitSetting.field.STBC = STBC_NONE;
1805 DBGPRINT(RT_DEBUG_TRACE, ("HT: STBC = %d\n", pAd->CommonCfg.RegTransmitSetting.field.STBC));
1808 // 40_Mhz_Intolerant
1809 if (RTMPGetKeyParameter("HT_40MHZ_INTOLERANT", pValueStr, 25, pInput))
1811 Value = simple_strtol(pValueStr, 0, 10);
1814 pAd->CommonCfg.bForty_Mhz_Intolerant = FALSE;
1818 pAd->CommonCfg.bForty_Mhz_Intolerant = TRUE;
1820 DBGPRINT(RT_DEBUG_TRACE, ("HT: 40MHZ INTOLERANT = %d\n", pAd->CommonCfg.bForty_Mhz_Intolerant));
1823 if(RTMPGetKeyParameter("HT_TxStream", pValueStr, 10, pInput))
1825 switch (simple_strtol(pValueStr, 0, 10))
1828 pAd->CommonCfg.TxStream = 1;
1831 pAd->CommonCfg.TxStream = 2;
1835 pAd->CommonCfg.TxStream = 3;
1837 if (pAd->MACVersion < RALINK_2883_VERSION)
1838 pAd->CommonCfg.TxStream = 2; // only 2 tx streams for RT2860 series
1841 DBGPRINT(RT_DEBUG_TRACE, ("HT: Tx Stream = %d\n", pAd->CommonCfg.TxStream));
1844 if(RTMPGetKeyParameter("HT_RxStream", pValueStr, 10, pInput))
1846 switch (simple_strtol(pValueStr, 0, 10))
1849 pAd->CommonCfg.RxStream = 1;
1852 pAd->CommonCfg.RxStream = 2;
1856 pAd->CommonCfg.RxStream = 3;
1858 if (pAd->MACVersion < RALINK_2883_VERSION)
1859 pAd->CommonCfg.RxStream = 2; // only 2 rx streams for RT2860 series
1862 DBGPRINT(RT_DEBUG_TRACE, ("HT: Rx Stream = %d\n", pAd->CommonCfg.RxStream));