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)
894 srcf = filp_open(src, O_RDONLY, 0);
897 DBGPRINT(RT_DEBUG_ERROR, ("--> Error %ld opening %s\n", -PTR_ERR(srcf),src));
901 // The object must have a read method
902 if (srcf->f_op && srcf->f_op->read)
904 memset(buffer, 0x00, MAX_INI_BUFFER_SIZE);
905 retval=srcf->f_op->read(srcf, buffer, MAX_INI_BUFFER_SIZE, &srcf->f_pos);
908 DBGPRINT(RT_DEBUG_TRACE, ("--> Read %s error %d\n", src, -retval));
912 // set file parameter to portcfg
914 if(RTMPGetKeyParameter("CountryRegion", tmpbuf, 25, buffer))
916 pAd->CommonCfg.CountryRegion = (UCHAR) simple_strtol(tmpbuf, 0, 10);
917 DBGPRINT(RT_DEBUG_TRACE, ("CountryRegion=%d\n", pAd->CommonCfg.CountryRegion));
920 if(RTMPGetKeyParameter("CountryRegionABand", tmpbuf, 25, buffer))
922 pAd->CommonCfg.CountryRegionForABand= (UCHAR) simple_strtol(tmpbuf, 0, 10);
923 DBGPRINT(RT_DEBUG_TRACE, ("CountryRegionABand=%d\n", pAd->CommonCfg.CountryRegionForABand));
926 if(RTMPGetKeyParameter("CountryCode", tmpbuf, 25, buffer))
928 NdisMoveMemory(pAd->CommonCfg.CountryCode, tmpbuf , 2);
930 if (strlen(pAd->CommonCfg.CountryCode) != 0)
932 pAd->CommonCfg.bCountryFlag = TRUE;
934 DBGPRINT(RT_DEBUG_TRACE, ("CountryCode=%s\n", pAd->CommonCfg.CountryCode));
937 if(RTMPGetKeyParameter("ChannelGeography", tmpbuf, 25, buffer))
939 UCHAR Geography = (UCHAR) simple_strtol(tmpbuf, 0, 10);
940 if (Geography <= BOTH)
942 pAd->CommonCfg.Geography = Geography;
943 pAd->CommonCfg.CountryCode[2] =
944 (pAd->CommonCfg.Geography == BOTH) ? ' ' : ((pAd->CommonCfg.Geography == IDOR) ? 'I' : 'O');
945 DBGPRINT(RT_DEBUG_TRACE, ("ChannelGeography=%d\n", pAd->CommonCfg.Geography));
950 pAd->CommonCfg.Geography = BOTH;
951 pAd->CommonCfg.CountryCode[2] = ' ';
956 if (RTMPGetCriticalParameter("SSID", tmpbuf, 256, buffer))
958 if (strlen(tmpbuf) <= 32)
960 pAd->CommonCfg.SsidLen = (UCHAR) strlen(tmpbuf);
961 NdisZeroMemory(pAd->CommonCfg.Ssid, NDIS_802_11_LENGTH_SSID);
962 NdisMoveMemory(pAd->CommonCfg.Ssid, tmpbuf, pAd->CommonCfg.SsidLen);
963 pAd->MlmeAux.AutoReconnectSsidLen = pAd->CommonCfg.SsidLen;
964 NdisZeroMemory(pAd->MlmeAux.AutoReconnectSsid, NDIS_802_11_LENGTH_SSID);
965 NdisMoveMemory(pAd->MlmeAux.AutoReconnectSsid, tmpbuf, pAd->MlmeAux.AutoReconnectSsidLen);
966 pAd->MlmeAux.SsidLen = pAd->CommonCfg.SsidLen;
967 NdisZeroMemory(pAd->MlmeAux.Ssid, NDIS_802_11_LENGTH_SSID);
968 NdisMoveMemory(pAd->MlmeAux.Ssid, tmpbuf, pAd->MlmeAux.SsidLen);
969 DBGPRINT(RT_DEBUG_TRACE, ("%s::(SSID=%s)\n", __func__, tmpbuf));
976 if (RTMPGetKeyParameter("NetworkType", tmpbuf, 25, buffer))
978 pAd->bConfigChanged = TRUE;
979 if (strcmp(tmpbuf, "Adhoc") == 0)
980 pAd->StaCfg.BssType = BSS_ADHOC;
981 else //Default Infrastructure mode
982 pAd->StaCfg.BssType = BSS_INFRA;
983 // Reset Ralink supplicant to not use, it will be set to start when UI set PMK key
984 pAd->StaCfg.WpaState = SS_NOTUSE;
985 DBGPRINT(RT_DEBUG_TRACE, ("%s::(NetworkType=%d)\n", __func__, pAd->StaCfg.BssType));
990 if(RTMPGetKeyParameter("Channel", tmpbuf, 10, buffer))
992 pAd->CommonCfg.Channel = (UCHAR) simple_strtol(tmpbuf, 0, 10);
993 DBGPRINT(RT_DEBUG_TRACE, ("Channel=%d\n", pAd->CommonCfg.Channel));
996 if(RTMPGetKeyParameter("WirelessMode", tmpbuf, 10, buffer))
998 int value = 0, maxPhyMode = PHY_11G;
1000 maxPhyMode = PHY_11N_5G;
1002 value = simple_strtol(tmpbuf, 0, 10);
1004 if (value <= maxPhyMode)
1006 pAd->CommonCfg.PhyMode = value;
1008 DBGPRINT(RT_DEBUG_TRACE, ("PhyMode=%d\n", pAd->CommonCfg.PhyMode));
1011 if(RTMPGetKeyParameter("BasicRate", tmpbuf, 10, buffer))
1013 pAd->CommonCfg.BasicRateBitmap = (ULONG) simple_strtol(tmpbuf, 0, 10);
1014 DBGPRINT(RT_DEBUG_TRACE, ("BasicRate=%ld\n", pAd->CommonCfg.BasicRateBitmap));
1017 if(RTMPGetKeyParameter("BeaconPeriod", tmpbuf, 10, buffer))
1019 pAd->CommonCfg.BeaconPeriod = (USHORT) simple_strtol(tmpbuf, 0, 10);
1020 DBGPRINT(RT_DEBUG_TRACE, ("BeaconPeriod=%d\n", pAd->CommonCfg.BeaconPeriod));
1023 if(RTMPGetKeyParameter("TxPower", tmpbuf, 10, buffer))
1025 pAd->CommonCfg.TxPowerPercentage = (ULONG) simple_strtol(tmpbuf, 0, 10);
1027 pAd->CommonCfg.TxPowerDefault = pAd->CommonCfg.TxPowerPercentage;
1029 DBGPRINT(RT_DEBUG_TRACE, ("TxPower=%ld\n", pAd->CommonCfg.TxPowerPercentage));
1032 if(RTMPGetKeyParameter("BGProtection", tmpbuf, 10, buffer))
1034 switch (simple_strtol(tmpbuf, 0, 10))
1037 pAd->CommonCfg.UseBGProtection = 1;
1039 case 2: //Always OFF
1040 pAd->CommonCfg.UseBGProtection = 2;
1044 pAd->CommonCfg.UseBGProtection = 0;
1047 DBGPRINT(RT_DEBUG_TRACE, ("BGProtection=%ld\n", pAd->CommonCfg.UseBGProtection));
1050 if(RTMPGetKeyParameter("DisableOLBC", tmpbuf, 10, buffer))
1052 switch (simple_strtol(tmpbuf, 0, 10))
1054 case 1: //disable OLBC Detection
1055 pAd->CommonCfg.DisableOLBCDetect = 1;
1057 case 0: //enable OLBC Detection
1058 pAd->CommonCfg.DisableOLBCDetect = 0;
1061 pAd->CommonCfg.DisableOLBCDetect= 0;
1064 DBGPRINT(RT_DEBUG_TRACE, ("OLBCDetection=%ld\n", pAd->CommonCfg.DisableOLBCDetect));
1067 if(RTMPGetKeyParameter("TxPreamble", tmpbuf, 10, buffer))
1069 switch (simple_strtol(tmpbuf, 0, 10))
1071 case Rt802_11PreambleShort:
1072 pAd->CommonCfg.TxPreamble = Rt802_11PreambleShort;
1074 case Rt802_11PreambleLong:
1076 pAd->CommonCfg.TxPreamble = Rt802_11PreambleLong;
1079 DBGPRINT(RT_DEBUG_TRACE, ("TxPreamble=%ld\n", pAd->CommonCfg.TxPreamble));
1082 if(RTMPGetKeyParameter("RTSThreshold", tmpbuf, 10, buffer))
1084 RtsThresh = simple_strtol(tmpbuf, 0, 10);
1085 if( (RtsThresh >= 1) && (RtsThresh <= MAX_RTS_THRESHOLD) )
1086 pAd->CommonCfg.RtsThreshold = (USHORT)RtsThresh;
1088 pAd->CommonCfg.RtsThreshold = MAX_RTS_THRESHOLD;
1090 DBGPRINT(RT_DEBUG_TRACE, ("RTSThreshold=%d\n", pAd->CommonCfg.RtsThreshold));
1093 if(RTMPGetKeyParameter("FragThreshold", tmpbuf, 10, buffer))
1095 FragThresh = simple_strtol(tmpbuf, 0, 10);
1096 pAd->CommonCfg.bUseZeroToDisableFragment = FALSE;
1098 if (FragThresh > MAX_FRAG_THRESHOLD || FragThresh < MIN_FRAG_THRESHOLD)
1099 { //illegal FragThresh so we set it to default
1100 pAd->CommonCfg.FragmentThreshold = MAX_FRAG_THRESHOLD;
1101 pAd->CommonCfg.bUseZeroToDisableFragment = TRUE;
1103 else if (FragThresh % 2 == 1)
1105 // The length of each fragment shall always be an even number of octets, except for the last fragment
1106 // of an MSDU or MMPDU, which may be either an even or an odd number of octets.
1107 pAd->CommonCfg.FragmentThreshold = (USHORT)(FragThresh - 1);
1111 pAd->CommonCfg.FragmentThreshold = (USHORT)FragThresh;
1113 //pAd->CommonCfg.AllowFragSize = (pAd->CommonCfg.FragmentThreshold) - LENGTH_802_11 - LENGTH_CRC;
1114 DBGPRINT(RT_DEBUG_TRACE, ("FragThreshold=%d\n", pAd->CommonCfg.FragmentThreshold));
1117 if(RTMPGetKeyParameter("TxBurst", tmpbuf, 10, buffer))
1119 if(simple_strtol(tmpbuf, 0, 10) != 0) //Enable
1120 pAd->CommonCfg.bEnableTxBurst = TRUE;
1122 pAd->CommonCfg.bEnableTxBurst = FALSE;
1123 DBGPRINT(RT_DEBUG_TRACE, ("TxBurst=%d\n", pAd->CommonCfg.bEnableTxBurst));
1126 #ifdef AGGREGATION_SUPPORT
1128 if(RTMPGetKeyParameter("PktAggregate", tmpbuf, 10, buffer))
1130 if(simple_strtol(tmpbuf, 0, 10) != 0) //Enable
1131 pAd->CommonCfg.bAggregationCapable = TRUE;
1133 pAd->CommonCfg.bAggregationCapable = FALSE;
1134 #ifdef PIGGYBACK_SUPPORT
1135 pAd->CommonCfg.bPiggyBackCapable = pAd->CommonCfg.bAggregationCapable;
1136 #endif // PIGGYBACK_SUPPORT //
1137 DBGPRINT(RT_DEBUG_TRACE, ("PktAggregate=%d\n", pAd->CommonCfg.bAggregationCapable));
1140 pAd->CommonCfg.bAggregationCapable = FALSE;
1141 pAd->CommonCfg.bPiggyBackCapable = FALSE;
1142 #endif // AGGREGATION_SUPPORT //
1145 rtmp_read_sta_wmm_parms_from_file(pAd, tmpbuf, buffer);
1148 if(RTMPGetKeyParameter("ShortSlot", tmpbuf, 10, buffer))
1150 if(simple_strtol(tmpbuf, 0, 10) != 0) //Enable
1151 pAd->CommonCfg.bUseShortSlotTime = TRUE;
1153 pAd->CommonCfg.bUseShortSlotTime = FALSE;
1155 DBGPRINT(RT_DEBUG_TRACE, ("ShortSlot=%d\n", pAd->CommonCfg.bUseShortSlotTime));
1158 if(RTMPGetKeyParameter("IEEE80211H", tmpbuf, 10, buffer))
1160 for (i = 0, macptr = rstrtok(tmpbuf,";"); macptr; macptr = rstrtok(NULL,";"), i++)
1162 if(simple_strtol(macptr, 0, 10) != 0) //Enable
1163 pAd->CommonCfg.bIEEE80211H = TRUE;
1165 pAd->CommonCfg.bIEEE80211H = FALSE;
1167 DBGPRINT(RT_DEBUG_TRACE, ("IEEE80211H=%d\n", pAd->CommonCfg.bIEEE80211H));
1171 if(RTMPGetKeyParameter("CSPeriod", tmpbuf, 10, buffer))
1173 if(simple_strtol(tmpbuf, 0, 10) != 0)
1174 pAd->CommonCfg.RadarDetect.CSPeriod = simple_strtol(tmpbuf, 0, 10);
1176 pAd->CommonCfg.RadarDetect.CSPeriod = 0;
1178 DBGPRINT(RT_DEBUG_TRACE, ("CSPeriod=%d\n", pAd->CommonCfg.RadarDetect.CSPeriod));
1182 if(RTMPGetKeyParameter("RDRegion", tmpbuf, 128, buffer))
1184 if ((strncmp(tmpbuf, "JAP_W53", 7) == 0) || (strncmp(tmpbuf, "jap_w53", 7) == 0))
1186 pAd->CommonCfg.RadarDetect.RDDurRegion = JAP_W53;
1187 pAd->CommonCfg.RadarDetect.DfsSessionTime = 15;
1189 else if ((strncmp(tmpbuf, "JAP_W56", 7) == 0) || (strncmp(tmpbuf, "jap_w56", 7) == 0))
1191 pAd->CommonCfg.RadarDetect.RDDurRegion = JAP_W56;
1192 pAd->CommonCfg.RadarDetect.DfsSessionTime = 13;
1194 else if ((strncmp(tmpbuf, "JAP", 3) == 0) || (strncmp(tmpbuf, "jap", 3) == 0))
1196 pAd->CommonCfg.RadarDetect.RDDurRegion = JAP;
1197 pAd->CommonCfg.RadarDetect.DfsSessionTime = 5;
1199 else if ((strncmp(tmpbuf, "FCC", 3) == 0) || (strncmp(tmpbuf, "fcc", 3) == 0))
1201 pAd->CommonCfg.RadarDetect.RDDurRegion = FCC;
1202 pAd->CommonCfg.RadarDetect.DfsSessionTime = 5;
1204 else if ((strncmp(tmpbuf, "CE", 2) == 0) || (strncmp(tmpbuf, "ce", 2) == 0))
1206 pAd->CommonCfg.RadarDetect.RDDurRegion = CE;
1207 pAd->CommonCfg.RadarDetect.DfsSessionTime = 13;
1211 pAd->CommonCfg.RadarDetect.RDDurRegion = CE;
1212 pAd->CommonCfg.RadarDetect.DfsSessionTime = 13;
1215 DBGPRINT(RT_DEBUG_TRACE, ("RDRegion=%d\n", pAd->CommonCfg.RadarDetect.RDDurRegion));
1219 pAd->CommonCfg.RadarDetect.RDDurRegion = CE;
1220 pAd->CommonCfg.RadarDetect.DfsSessionTime = 13;
1224 if(RTMPGetKeyParameter("WirelessEvent", tmpbuf, 10, buffer))
1226 #if WIRELESS_EXT >= 15
1227 if(simple_strtol(tmpbuf, 0, 10) != 0)
1228 pAd->CommonCfg.bWirelessEvent = simple_strtol(tmpbuf, 0, 10);
1230 pAd->CommonCfg.bWirelessEvent = 0; // disable
1232 pAd->CommonCfg.bWirelessEvent = 0; // disable
1234 DBGPRINT(RT_DEBUG_TRACE, ("WirelessEvent=%d\n", pAd->CommonCfg.bWirelessEvent));
1236 if(RTMPGetKeyParameter("WiFiTest", tmpbuf, 10, buffer))
1238 if(simple_strtol(tmpbuf, 0, 10) != 0)
1239 pAd->CommonCfg.bWiFiTest= simple_strtol(tmpbuf, 0, 10);
1241 pAd->CommonCfg.bWiFiTest = 0; // disable
1243 DBGPRINT(RT_DEBUG_TRACE, ("WiFiTest=%d\n", pAd->CommonCfg.bWiFiTest));
1246 if(RTMPGetKeyParameter("AuthMode", tmpbuf, 128, buffer))
1249 if ((strcmp(tmpbuf, "WEPAUTO") == 0) || (strcmp(tmpbuf, "wepauto") == 0))
1250 pAd->StaCfg.AuthMode = Ndis802_11AuthModeAutoSwitch;
1251 else if ((strcmp(tmpbuf, "SHARED") == 0) || (strcmp(tmpbuf, "shared") == 0))
1252 pAd->StaCfg.AuthMode = Ndis802_11AuthModeShared;
1253 else if ((strcmp(tmpbuf, "WPAPSK") == 0) || (strcmp(tmpbuf, "wpapsk") == 0))
1254 pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPAPSK;
1255 else if ((strcmp(tmpbuf, "WPANONE") == 0) || (strcmp(tmpbuf, "wpanone") == 0))
1256 pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPANone;
1257 else if ((strcmp(tmpbuf, "WPA2PSK") == 0) || (strcmp(tmpbuf, "wpa2psk") == 0))
1258 pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPA2PSK;
1259 else if ((strcmp(tmpbuf, "WPA") == 0) || (strcmp(tmpbuf, "wpa") == 0))
1260 pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPA;
1261 else if ((strcmp(tmpbuf, "WPA2") == 0) || (strcmp(tmpbuf, "wpa2") == 0))
1262 pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPA2;
1264 pAd->StaCfg.AuthMode = Ndis802_11AuthModeOpen;
1266 pAd->StaCfg.PortSecured = WPA_802_1X_PORT_NOT_SECURED;
1268 DBGPRINT(RT_DEBUG_TRACE, ("%s::(EncrypType=%d)\n", __func__, pAd->StaCfg.WepStatus));
1272 if(RTMPGetKeyParameter("EncrypType", tmpbuf, 128, buffer))
1275 if ((strcmp(tmpbuf, "WEP") == 0) || (strcmp(tmpbuf, "wep") == 0))
1276 pAd->StaCfg.WepStatus = Ndis802_11WEPEnabled;
1277 else if ((strcmp(tmpbuf, "TKIP") == 0) || (strcmp(tmpbuf, "tkip") == 0))
1278 pAd->StaCfg.WepStatus = Ndis802_11Encryption2Enabled;
1279 else if ((strcmp(tmpbuf, "AES") == 0) || (strcmp(tmpbuf, "aes") == 0))
1280 pAd->StaCfg.WepStatus = Ndis802_11Encryption3Enabled;
1282 pAd->StaCfg.WepStatus = Ndis802_11WEPDisabled;
1284 // Update all wepstatus related
1285 pAd->StaCfg.PairCipher = pAd->StaCfg.WepStatus;
1286 pAd->StaCfg.GroupCipher = pAd->StaCfg.WepStatus;
1287 pAd->StaCfg.OrigWepStatus = pAd->StaCfg.WepStatus;
1288 pAd->StaCfg.bMixCipher = FALSE;
1290 DBGPRINT(RT_DEBUG_TRACE, ("%s::(EncrypType=%d)\n", __func__, pAd->StaCfg.WepStatus));
1295 if(RTMPGetCriticalParameter("WPAPSK", tmpbuf, 512, buffer))
1299 tmpbuf[strlen(tmpbuf)] = '\0'; // make STA can process .$^& for WPAPSK input
1301 if ((pAd->StaCfg.AuthMode != Ndis802_11AuthModeWPAPSK) &&
1302 (pAd->StaCfg.AuthMode != Ndis802_11AuthModeWPA2PSK) &&
1303 (pAd->StaCfg.AuthMode != Ndis802_11AuthModeWPANone)
1308 else if ((strlen(tmpbuf) >= 8) && (strlen(tmpbuf) < 64))
1310 PasswordHash((char *)tmpbuf, pAd->CommonCfg.Ssid, pAd->CommonCfg.SsidLen, keyMaterial);
1311 NdisMoveMemory(pAd->StaCfg.PMK, keyMaterial, 32);
1314 else if (strlen(tmpbuf) == 64)
1316 AtoH(tmpbuf, keyMaterial, 32);
1317 NdisMoveMemory(pAd->StaCfg.PMK, keyMaterial, 32);
1322 DBGPRINT(RT_DEBUG_ERROR, ("%s::(WPAPSK key-string required 8 ~ 64 characters!)\n", __func__));
1327 if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPAPSK) ||
1328 (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK))
1330 // Start STA supplicant state machine
1331 pAd->StaCfg.WpaState = SS_START;
1333 else if (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPANone)
1335 pAd->StaCfg.WpaState = SS_NOTUSE;
1338 DBGPRINT(RT_DEBUG_TRACE, ("%s::(WPAPSK=%s)\n", __func__, tmpbuf));
1343 //DefaultKeyID, KeyType, KeyStr
1344 rtmp_read_key_parms_from_file(pAd, tmpbuf, buffer);
1346 HTParametersHook(pAd, tmpbuf, buffer);
1350 if (RTMPGetKeyParameter("PSMode", tmpbuf, 10, buffer))
1352 if (pAd->StaCfg.BssType == BSS_INFRA)
1354 if ((strcmp(tmpbuf, "MAX_PSP") == 0) || (strcmp(tmpbuf, "max_psp") == 0))
1356 // do NOT turn on PSM bit here, wait until MlmeCheckForPsmChange()
1357 // to exclude certain situations.
1358 // MlmeSetPsm(pAd, PWR_SAVE);
1359 OPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM);
1360 if (pAd->StaCfg.bWindowsACCAMEnable == FALSE)
1361 pAd->StaCfg.WindowsPowerMode = Ndis802_11PowerModeMAX_PSP;
1362 pAd->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeMAX_PSP;
1363 pAd->StaCfg.DefaultListenCount = 5;
1365 else if ((strcmp(tmpbuf, "Fast_PSP") == 0) || (strcmp(tmpbuf, "fast_psp") == 0)
1366 || (strcmp(tmpbuf, "FAST_PSP") == 0))
1368 // do NOT turn on PSM bit here, wait until MlmeCheckForPsmChange()
1369 // to exclude certain situations.
1370 // MlmeSetPsmBit(pAd, PWR_SAVE);
1371 OPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM);
1372 if (pAd->StaCfg.bWindowsACCAMEnable == FALSE)
1373 pAd->StaCfg.WindowsPowerMode = Ndis802_11PowerModeFast_PSP;
1374 pAd->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeFast_PSP;
1375 pAd->StaCfg.DefaultListenCount = 3;
1377 else if ((strcmp(tmpbuf, "Legacy_PSP") == 0) || (strcmp(tmpbuf, "legacy_psp") == 0)
1378 || (strcmp(tmpbuf, "LEGACY_PSP") == 0))
1380 // do NOT turn on PSM bit here, wait until MlmeCheckForPsmChange()
1381 // to exclude certain situations.
1382 // MlmeSetPsmBit(pAd, PWR_SAVE);
1383 OPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM);
1384 if (pAd->StaCfg.bWindowsACCAMEnable == FALSE)
1385 pAd->StaCfg.WindowsPowerMode = Ndis802_11PowerModeLegacy_PSP;
1386 pAd->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeLegacy_PSP;
1387 pAd->StaCfg.DefaultListenCount = 3;
1390 { //Default Ndis802_11PowerModeCAM
1391 // clear PSM bit immediately
1392 MlmeSetPsmBit(pAd, PWR_ACTIVE);
1393 OPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM);
1394 if (pAd->StaCfg.bWindowsACCAMEnable == FALSE)
1395 pAd->StaCfg.WindowsPowerMode = Ndis802_11PowerModeCAM;
1396 pAd->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeCAM;
1398 DBGPRINT(RT_DEBUG_TRACE, ("PSMode=%ld\n", pAd->StaCfg.WindowsPowerMode));
1402 if (RTMPGetKeyParameter("FastRoaming", tmpbuf, 32, buffer))
1404 if (simple_strtol(tmpbuf, 0, 10) == 0)
1405 pAd->StaCfg.bFastRoaming = FALSE;
1407 pAd->StaCfg.bFastRoaming = TRUE;
1409 DBGPRINT(RT_DEBUG_TRACE, ("FastRoaming=%d\n", pAd->StaCfg.bFastRoaming));
1412 if (RTMPGetKeyParameter("RoamThreshold", tmpbuf, 32, buffer))
1414 long lInfo = simple_strtol(tmpbuf, 0, 10);
1416 if (lInfo > 90 || lInfo < 60)
1417 pAd->StaCfg.dBmToRoam = -70;
1419 pAd->StaCfg.dBmToRoam = (CHAR)(-1)*lInfo;
1421 DBGPRINT(RT_DEBUG_TRACE, ("RoamThreshold=%d dBm\n", pAd->StaCfg.dBmToRoam));
1424 if(RTMPGetKeyParameter("TGnWifiTest", tmpbuf, 10, buffer))
1426 if(simple_strtol(tmpbuf, 0, 10) == 0)
1427 pAd->StaCfg.bTGnWifiTest = FALSE;
1429 pAd->StaCfg.bTGnWifiTest = TRUE;
1430 DBGPRINT(RT_DEBUG_TRACE, ("TGnWifiTest=%d\n", pAd->StaCfg.bTGnWifiTest));
1436 if(RTMPGetKeyParameter("AntDiversity", tmpbuf, 10, buffer))
1438 for (i = 0, macptr = rstrtok(tmpbuf,";"); macptr; macptr = rstrtok(NULL,";"), i++)
1440 if(simple_strtol(macptr, 0, 10) != 0) //Enable
1441 pAd->CommonCfg.bRxAntDiversity = TRUE;
1443 pAd->CommonCfg.bRxAntDiversity = FALSE;
1445 DBGPRINT(RT_DEBUG_ERROR, ("AntDiversity=%d\n", pAd->CommonCfg.bRxAntDiversity));
1454 DBGPRINT(RT_DEBUG_TRACE, ("--> %s does not have a write method\n", src));
1457 retval=filp_close(srcf,NULL);
1461 DBGPRINT(RT_DEBUG_TRACE, ("--> Error %d closing %s\n", -retval, src));
1471 return (NDIS_STATUS_SUCCESS);
1474 static void HTParametersHook(
1475 IN PRTMP_ADAPTER pAd,
1482 if (RTMPGetKeyParameter("HT_PROTECT", pValueStr, 25, pInput))
1484 Value = simple_strtol(pValueStr, 0, 10);
1487 pAd->CommonCfg.bHTProtect = FALSE;
1491 pAd->CommonCfg.bHTProtect = TRUE;
1493 DBGPRINT(RT_DEBUG_TRACE, ("HT: Protection = %s\n", (Value==0) ? "Disable" : "Enable"));
1496 if (RTMPGetKeyParameter("HT_MIMOPSEnable", pValueStr, 25, pInput))
1498 Value = simple_strtol(pValueStr, 0, 10);
1501 pAd->CommonCfg.bMIMOPSEnable = FALSE;
1505 pAd->CommonCfg.bMIMOPSEnable = TRUE;
1507 DBGPRINT(RT_DEBUG_TRACE, ("HT: MIMOPSEnable = %s\n", (Value==0) ? "Disable" : "Enable"));
1511 if (RTMPGetKeyParameter("HT_MIMOPSMode", pValueStr, 25, pInput))
1513 Value = simple_strtol(pValueStr, 0, 10);
1514 if (Value > MMPS_ENABLE)
1516 pAd->CommonCfg.BACapability.field.MMPSmode = MMPS_ENABLE;
1520 //TODO: add mimo power saving mechanism
1521 pAd->CommonCfg.BACapability.field.MMPSmode = MMPS_ENABLE;
1522 //pAd->CommonCfg.BACapability.field.MMPSmode = Value;
1524 DBGPRINT(RT_DEBUG_TRACE, ("HT: MIMOPS Mode = %d\n", Value));
1527 if (RTMPGetKeyParameter("HT_BADecline", pValueStr, 25, pInput))
1529 Value = simple_strtol(pValueStr, 0, 10);
1532 pAd->CommonCfg.bBADecline = FALSE;
1536 pAd->CommonCfg.bBADecline = TRUE;
1538 DBGPRINT(RT_DEBUG_TRACE, ("HT: BA Decline = %s\n", (Value==0) ? "Disable" : "Enable"));
1542 if (RTMPGetKeyParameter("HT_DisableReordering", pValueStr, 25, pInput))
1544 Value = simple_strtol(pValueStr, 0, 10);
1547 pAd->CommonCfg.bDisableReordering = FALSE;
1551 pAd->CommonCfg.bDisableReordering = TRUE;
1553 DBGPRINT(RT_DEBUG_TRACE, ("HT: DisableReordering = %s\n", (Value==0) ? "Disable" : "Enable"));
1556 if (RTMPGetKeyParameter("HT_AutoBA", pValueStr, 25, pInput))
1558 Value = simple_strtol(pValueStr, 0, 10);
1561 pAd->CommonCfg.BACapability.field.AutoBA = FALSE;
1562 pAd->CommonCfg.BACapability.field.Policy = BA_NOTUSE;
1566 pAd->CommonCfg.BACapability.field.AutoBA = TRUE;
1567 pAd->CommonCfg.BACapability.field.Policy = IMMED_BA;
1569 pAd->CommonCfg.REGBACapability.field.AutoBA = pAd->CommonCfg.BACapability.field.AutoBA;
1570 pAd->CommonCfg.REGBACapability.field.Policy = pAd->CommonCfg.BACapability.field.Policy;
1571 DBGPRINT(RT_DEBUG_TRACE, ("HT: Auto BA = %s\n", (Value==0) ? "Disable" : "Enable"));
1575 if (RTMPGetKeyParameter("HT_HTC", pValueStr, 25, pInput))
1577 Value = simple_strtol(pValueStr, 0, 10);
1580 pAd->HTCEnable = FALSE;
1584 pAd->HTCEnable = TRUE;
1586 DBGPRINT(RT_DEBUG_TRACE, ("HT: Tx +HTC frame = %s\n", (Value==0) ? "Disable" : "Enable"));
1589 // Enable HT Link Adaptation Control
1590 if (RTMPGetKeyParameter("HT_LinkAdapt", pValueStr, 25, pInput))
1592 Value = simple_strtol(pValueStr, 0, 10);
1595 pAd->bLinkAdapt = FALSE;
1599 pAd->HTCEnable = TRUE;
1600 pAd->bLinkAdapt = TRUE;
1602 DBGPRINT(RT_DEBUG_TRACE, ("HT: Link Adaptation Control = %s\n", (Value==0) ? "Disable" : "Enable(+HTC)"));
1605 // Reverse Direction Mechanism
1606 if (RTMPGetKeyParameter("HT_RDG", pValueStr, 25, pInput))
1608 Value = simple_strtol(pValueStr, 0, 10);
1611 pAd->CommonCfg.bRdg = FALSE;
1615 pAd->HTCEnable = TRUE;
1616 pAd->CommonCfg.bRdg = TRUE;
1618 DBGPRINT(RT_DEBUG_TRACE, ("HT: RDG = %s\n", (Value==0) ? "Disable" : "Enable(+HTC)"));
1625 if (RTMPGetKeyParameter("HT_AMSDU", pValueStr, 25, pInput))
1627 Value = simple_strtol(pValueStr, 0, 10);
1630 pAd->CommonCfg.BACapability.field.AmsduEnable = FALSE;
1634 pAd->CommonCfg.BACapability.field.AmsduEnable = TRUE;
1636 DBGPRINT(RT_DEBUG_TRACE, ("HT: Tx A-MSDU = %s\n", (Value==0) ? "Disable" : "Enable"));
1640 if (RTMPGetKeyParameter("HT_MpduDensity", pValueStr, 25, pInput))
1642 Value = simple_strtol(pValueStr, 0, 10);
1643 if (Value <=7 && Value >= 0)
1645 pAd->CommonCfg.BACapability.field.MpduDensity = Value;
1646 DBGPRINT(RT_DEBUG_TRACE, ("HT: MPDU Density = %d\n", Value));
1650 pAd->CommonCfg.BACapability.field.MpduDensity = 4;
1651 DBGPRINT(RT_DEBUG_TRACE, ("HT: MPDU Density = %d (Default)\n", 4));
1655 // Max Rx BA Window Size
1656 if (RTMPGetKeyParameter("HT_BAWinSize", pValueStr, 25, pInput))
1658 Value = simple_strtol(pValueStr, 0, 10);
1660 if (Value >=1 && Value <= 64)
1662 pAd->CommonCfg.REGBACapability.field.RxBAWinLimit = Value;
1663 pAd->CommonCfg.BACapability.field.RxBAWinLimit = Value;
1664 DBGPRINT(RT_DEBUG_TRACE, ("HT: BA Windw Size = %d\n", Value));
1668 pAd->CommonCfg.REGBACapability.field.RxBAWinLimit = 64;
1669 pAd->CommonCfg.BACapability.field.RxBAWinLimit = 64;
1670 DBGPRINT(RT_DEBUG_TRACE, ("HT: BA Windw Size = 64 (Defualt)\n"));
1676 if (RTMPGetKeyParameter("HT_GI", pValueStr, 25, pInput))
1678 Value = simple_strtol(pValueStr, 0, 10);
1680 if (Value == GI_400)
1682 pAd->CommonCfg.RegTransmitSetting.field.ShortGI = GI_400;
1686 pAd->CommonCfg.RegTransmitSetting.field.ShortGI = GI_800;
1689 DBGPRINT(RT_DEBUG_TRACE, ("HT: Guard Interval = %s\n", (Value==GI_400) ? "400" : "800" ));
1692 // HT Operation Mode : Mixed Mode , Green Field
1693 if (RTMPGetKeyParameter("HT_OpMode", pValueStr, 25, pInput))
1695 Value = simple_strtol(pValueStr, 0, 10);
1697 if (Value == HTMODE_GF)
1700 pAd->CommonCfg.RegTransmitSetting.field.HTMODE = HTMODE_GF;
1704 pAd->CommonCfg.RegTransmitSetting.field.HTMODE = HTMODE_MM;
1707 DBGPRINT(RT_DEBUG_TRACE, ("HT: Operate Mode = %s\n", (Value==HTMODE_GF) ? "Green Field" : "Mixed Mode" ));
1710 // Fixed Tx mode : CCK, OFDM
1711 if (RTMPGetKeyParameter("FixedTxMode", pValueStr, 25, pInput))
1716 fix_tx_mode = FIXED_TXMODE_HT;
1718 if (strcmp(pValueStr, "OFDM") == 0 || strcmp(pValueStr, "ofdm") == 0)
1720 fix_tx_mode = FIXED_TXMODE_OFDM;
1722 else if (strcmp(pValueStr, "CCK") == 0 || strcmp(pValueStr, "cck") == 0)
1724 fix_tx_mode = FIXED_TXMODE_CCK;
1726 else if (strcmp(pValueStr, "HT") == 0 || strcmp(pValueStr, "ht") == 0)
1728 fix_tx_mode = FIXED_TXMODE_HT;
1732 Value = simple_strtol(pValueStr, 0, 10);
1736 if (Value == FIXED_TXMODE_CCK || Value == FIXED_TXMODE_OFDM)
1737 fix_tx_mode = Value;
1739 fix_tx_mode = FIXED_TXMODE_HT;
1742 pAd->StaCfg.DesiredTransmitSetting.field.FixedTxMode = fix_tx_mode;
1743 DBGPRINT(RT_DEBUG_TRACE, ("Fixed Tx Mode = %d\n", fix_tx_mode));
1750 if (RTMPGetKeyParameter("HT_BW", pValueStr, 25, pInput))
1752 Value = simple_strtol(pValueStr, 0, 10);
1756 pAd->CommonCfg.RegTransmitSetting.field.BW = BW_40;
1760 pAd->CommonCfg.RegTransmitSetting.field.BW = BW_20;
1763 #ifdef MCAST_RATE_SPECIFIC
1764 pAd->CommonCfg.MCastPhyMode.field.BW = pAd->CommonCfg.RegTransmitSetting.field.BW;
1765 #endif // MCAST_RATE_SPECIFIC //
1767 DBGPRINT(RT_DEBUG_TRACE, ("HT: Channel Width = %s\n", (Value==BW_40) ? "40 MHz" : "20 MHz" ));
1770 if (RTMPGetKeyParameter("HT_EXTCHA", pValueStr, 25, pInput))
1772 Value = simple_strtol(pValueStr, 0, 10);
1777 pAd->CommonCfg.RegTransmitSetting.field.EXTCHA = EXTCHA_BELOW;
1781 pAd->CommonCfg.RegTransmitSetting.field.EXTCHA = EXTCHA_ABOVE;
1784 DBGPRINT(RT_DEBUG_TRACE, ("HT: Ext Channel = %s\n", (Value==0) ? "BELOW" : "ABOVE" ));
1788 if (RTMPGetKeyParameter("HT_MCS", pValueStr, 50, pInput))
1791 Value = simple_strtol(pValueStr, 0, 10);
1793 if ((Value >= 0 && Value <= 23) || (Value == 32)) // 3*3
1795 pAd->StaCfg.DesiredTransmitSetting.field.MCS = Value;
1796 pAd->StaCfg.bAutoTxRateSwitch = FALSE;
1797 DBGPRINT(RT_DEBUG_TRACE, ("HT: MCS = %d\n", pAd->StaCfg.DesiredTransmitSetting.field.MCS));
1801 pAd->StaCfg.DesiredTransmitSetting.field.MCS = MCS_AUTO;
1802 pAd->StaCfg.bAutoTxRateSwitch = TRUE;
1803 DBGPRINT(RT_DEBUG_TRACE, ("HT: MCS = AUTO\n"));
1809 if (RTMPGetKeyParameter("HT_STBC", pValueStr, 25, pInput))
1811 Value = simple_strtol(pValueStr, 0, 10);
1812 if (Value == STBC_USE)
1814 pAd->CommonCfg.RegTransmitSetting.field.STBC = STBC_USE;
1818 pAd->CommonCfg.RegTransmitSetting.field.STBC = STBC_NONE;
1820 DBGPRINT(RT_DEBUG_TRACE, ("HT: STBC = %d\n", pAd->CommonCfg.RegTransmitSetting.field.STBC));
1823 // 40_Mhz_Intolerant
1824 if (RTMPGetKeyParameter("HT_40MHZ_INTOLERANT", pValueStr, 25, pInput))
1826 Value = simple_strtol(pValueStr, 0, 10);
1829 pAd->CommonCfg.bForty_Mhz_Intolerant = FALSE;
1833 pAd->CommonCfg.bForty_Mhz_Intolerant = TRUE;
1835 DBGPRINT(RT_DEBUG_TRACE, ("HT: 40MHZ INTOLERANT = %d\n", pAd->CommonCfg.bForty_Mhz_Intolerant));
1838 if(RTMPGetKeyParameter("HT_TxStream", pValueStr, 10, pInput))
1840 switch (simple_strtol(pValueStr, 0, 10))
1843 pAd->CommonCfg.TxStream = 1;
1846 pAd->CommonCfg.TxStream = 2;
1850 pAd->CommonCfg.TxStream = 3;
1852 if (pAd->MACVersion < RALINK_2883_VERSION)
1853 pAd->CommonCfg.TxStream = 2; // only 2 tx streams for RT2860 series
1856 DBGPRINT(RT_DEBUG_TRACE, ("HT: Tx Stream = %d\n", pAd->CommonCfg.TxStream));
1859 if(RTMPGetKeyParameter("HT_RxStream", pValueStr, 10, pInput))
1861 switch (simple_strtol(pValueStr, 0, 10))
1864 pAd->CommonCfg.RxStream = 1;
1867 pAd->CommonCfg.RxStream = 2;
1871 pAd->CommonCfg.RxStream = 3;
1873 if (pAd->MACVersion < RALINK_2883_VERSION)
1874 pAd->CommonCfg.RxStream = 2; // only 2 rx streams for RT2860 series
1877 DBGPRINT(RT_DEBUG_TRACE, ("HT: Rx Stream = %d\n", pAd->CommonCfg.RxStream));