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)
890 orgfsuid = current_fsuid();
891 orgfsgid = current_fsgid();
892 /* Hm, can't really do this nicely anymore, so rely on these files
893 * being set to the proper permission to read them... */
894 /* current->cred->fsuid = current->cred->fsgid = 0; */
901 srcf = filp_open(src, O_RDONLY, 0);
904 DBGPRINT(RT_DEBUG_ERROR, ("--> Error %ld opening %s\n", -PTR_ERR(srcf),src));
908 // The object must have a read method
909 if (srcf->f_op && srcf->f_op->read)
911 memset(buffer, 0x00, MAX_INI_BUFFER_SIZE);
912 retval=srcf->f_op->read(srcf, buffer, MAX_INI_BUFFER_SIZE, &srcf->f_pos);
915 DBGPRINT(RT_DEBUG_TRACE, ("--> Read %s error %d\n", src, -retval));
919 // set file parameter to portcfg
921 if(RTMPGetKeyParameter("CountryRegion", tmpbuf, 25, buffer))
923 pAd->CommonCfg.CountryRegion = (UCHAR) simple_strtol(tmpbuf, 0, 10);
924 DBGPRINT(RT_DEBUG_TRACE, ("CountryRegion=%d\n", pAd->CommonCfg.CountryRegion));
927 if(RTMPGetKeyParameter("CountryRegionABand", tmpbuf, 25, buffer))
929 pAd->CommonCfg.CountryRegionForABand= (UCHAR) simple_strtol(tmpbuf, 0, 10);
930 DBGPRINT(RT_DEBUG_TRACE, ("CountryRegionABand=%d\n", pAd->CommonCfg.CountryRegionForABand));
933 if(RTMPGetKeyParameter("CountryCode", tmpbuf, 25, buffer))
935 NdisMoveMemory(pAd->CommonCfg.CountryCode, tmpbuf , 2);
937 if (strlen(pAd->CommonCfg.CountryCode) != 0)
939 pAd->CommonCfg.bCountryFlag = TRUE;
941 DBGPRINT(RT_DEBUG_TRACE, ("CountryCode=%s\n", pAd->CommonCfg.CountryCode));
944 if(RTMPGetKeyParameter("ChannelGeography", tmpbuf, 25, buffer))
946 UCHAR Geography = (UCHAR) simple_strtol(tmpbuf, 0, 10);
947 if (Geography <= BOTH)
949 pAd->CommonCfg.Geography = Geography;
950 pAd->CommonCfg.CountryCode[2] =
951 (pAd->CommonCfg.Geography == BOTH) ? ' ' : ((pAd->CommonCfg.Geography == IDOR) ? 'I' : 'O');
952 DBGPRINT(RT_DEBUG_TRACE, ("ChannelGeography=%d\n", pAd->CommonCfg.Geography));
957 pAd->CommonCfg.Geography = BOTH;
958 pAd->CommonCfg.CountryCode[2] = ' ';
963 if (RTMPGetCriticalParameter("SSID", tmpbuf, 256, buffer))
965 if (strlen(tmpbuf) <= 32)
967 pAd->CommonCfg.SsidLen = (UCHAR) strlen(tmpbuf);
968 NdisZeroMemory(pAd->CommonCfg.Ssid, NDIS_802_11_LENGTH_SSID);
969 NdisMoveMemory(pAd->CommonCfg.Ssid, tmpbuf, pAd->CommonCfg.SsidLen);
970 pAd->MlmeAux.AutoReconnectSsidLen = pAd->CommonCfg.SsidLen;
971 NdisZeroMemory(pAd->MlmeAux.AutoReconnectSsid, NDIS_802_11_LENGTH_SSID);
972 NdisMoveMemory(pAd->MlmeAux.AutoReconnectSsid, tmpbuf, pAd->MlmeAux.AutoReconnectSsidLen);
973 pAd->MlmeAux.SsidLen = pAd->CommonCfg.SsidLen;
974 NdisZeroMemory(pAd->MlmeAux.Ssid, NDIS_802_11_LENGTH_SSID);
975 NdisMoveMemory(pAd->MlmeAux.Ssid, tmpbuf, pAd->MlmeAux.SsidLen);
976 DBGPRINT(RT_DEBUG_TRACE, ("%s::(SSID=%s)\n", __func__, tmpbuf));
983 if (RTMPGetKeyParameter("NetworkType", tmpbuf, 25, buffer))
985 pAd->bConfigChanged = TRUE;
986 if (strcmp(tmpbuf, "Adhoc") == 0)
987 pAd->StaCfg.BssType = BSS_ADHOC;
988 else //Default Infrastructure mode
989 pAd->StaCfg.BssType = BSS_INFRA;
990 // Reset Ralink supplicant to not use, it will be set to start when UI set PMK key
991 pAd->StaCfg.WpaState = SS_NOTUSE;
992 DBGPRINT(RT_DEBUG_TRACE, ("%s::(NetworkType=%d)\n", __func__, pAd->StaCfg.BssType));
997 if(RTMPGetKeyParameter("Channel", tmpbuf, 10, buffer))
999 pAd->CommonCfg.Channel = (UCHAR) simple_strtol(tmpbuf, 0, 10);
1000 DBGPRINT(RT_DEBUG_TRACE, ("Channel=%d\n", pAd->CommonCfg.Channel));
1003 if(RTMPGetKeyParameter("WirelessMode", tmpbuf, 10, buffer))
1005 int value = 0, maxPhyMode = PHY_11G;
1007 maxPhyMode = PHY_11N_5G;
1009 value = simple_strtol(tmpbuf, 0, 10);
1011 if (value <= maxPhyMode)
1013 pAd->CommonCfg.PhyMode = value;
1015 DBGPRINT(RT_DEBUG_TRACE, ("PhyMode=%d\n", pAd->CommonCfg.PhyMode));
1018 if(RTMPGetKeyParameter("BasicRate", tmpbuf, 10, buffer))
1020 pAd->CommonCfg.BasicRateBitmap = (ULONG) simple_strtol(tmpbuf, 0, 10);
1021 DBGPRINT(RT_DEBUG_TRACE, ("BasicRate=%ld\n", pAd->CommonCfg.BasicRateBitmap));
1024 if(RTMPGetKeyParameter("BeaconPeriod", tmpbuf, 10, buffer))
1026 pAd->CommonCfg.BeaconPeriod = (USHORT) simple_strtol(tmpbuf, 0, 10);
1027 DBGPRINT(RT_DEBUG_TRACE, ("BeaconPeriod=%d\n", pAd->CommonCfg.BeaconPeriod));
1030 if(RTMPGetKeyParameter("TxPower", tmpbuf, 10, buffer))
1032 pAd->CommonCfg.TxPowerPercentage = (ULONG) simple_strtol(tmpbuf, 0, 10);
1034 pAd->CommonCfg.TxPowerDefault = pAd->CommonCfg.TxPowerPercentage;
1036 DBGPRINT(RT_DEBUG_TRACE, ("TxPower=%ld\n", pAd->CommonCfg.TxPowerPercentage));
1039 if(RTMPGetKeyParameter("BGProtection", tmpbuf, 10, buffer))
1041 switch (simple_strtol(tmpbuf, 0, 10))
1044 pAd->CommonCfg.UseBGProtection = 1;
1046 case 2: //Always OFF
1047 pAd->CommonCfg.UseBGProtection = 2;
1051 pAd->CommonCfg.UseBGProtection = 0;
1054 DBGPRINT(RT_DEBUG_TRACE, ("BGProtection=%ld\n", pAd->CommonCfg.UseBGProtection));
1057 if(RTMPGetKeyParameter("DisableOLBC", tmpbuf, 10, buffer))
1059 switch (simple_strtol(tmpbuf, 0, 10))
1061 case 1: //disable OLBC Detection
1062 pAd->CommonCfg.DisableOLBCDetect = 1;
1064 case 0: //enable OLBC Detection
1065 pAd->CommonCfg.DisableOLBCDetect = 0;
1068 pAd->CommonCfg.DisableOLBCDetect= 0;
1071 DBGPRINT(RT_DEBUG_TRACE, ("OLBCDetection=%ld\n", pAd->CommonCfg.DisableOLBCDetect));
1074 if(RTMPGetKeyParameter("TxPreamble", tmpbuf, 10, buffer))
1076 switch (simple_strtol(tmpbuf, 0, 10))
1078 case Rt802_11PreambleShort:
1079 pAd->CommonCfg.TxPreamble = Rt802_11PreambleShort;
1081 case Rt802_11PreambleLong:
1083 pAd->CommonCfg.TxPreamble = Rt802_11PreambleLong;
1086 DBGPRINT(RT_DEBUG_TRACE, ("TxPreamble=%ld\n", pAd->CommonCfg.TxPreamble));
1089 if(RTMPGetKeyParameter("RTSThreshold", tmpbuf, 10, buffer))
1091 RtsThresh = simple_strtol(tmpbuf, 0, 10);
1092 if( (RtsThresh >= 1) && (RtsThresh <= MAX_RTS_THRESHOLD) )
1093 pAd->CommonCfg.RtsThreshold = (USHORT)RtsThresh;
1095 pAd->CommonCfg.RtsThreshold = MAX_RTS_THRESHOLD;
1097 DBGPRINT(RT_DEBUG_TRACE, ("RTSThreshold=%d\n", pAd->CommonCfg.RtsThreshold));
1100 if(RTMPGetKeyParameter("FragThreshold", tmpbuf, 10, buffer))
1102 FragThresh = simple_strtol(tmpbuf, 0, 10);
1103 pAd->CommonCfg.bUseZeroToDisableFragment = FALSE;
1105 if (FragThresh > MAX_FRAG_THRESHOLD || FragThresh < MIN_FRAG_THRESHOLD)
1106 { //illegal FragThresh so we set it to default
1107 pAd->CommonCfg.FragmentThreshold = MAX_FRAG_THRESHOLD;
1108 pAd->CommonCfg.bUseZeroToDisableFragment = TRUE;
1110 else if (FragThresh % 2 == 1)
1112 // The length of each fragment shall always be an even number of octets, except for the last fragment
1113 // of an MSDU or MMPDU, which may be either an even or an odd number of octets.
1114 pAd->CommonCfg.FragmentThreshold = (USHORT)(FragThresh - 1);
1118 pAd->CommonCfg.FragmentThreshold = (USHORT)FragThresh;
1120 //pAd->CommonCfg.AllowFragSize = (pAd->CommonCfg.FragmentThreshold) - LENGTH_802_11 - LENGTH_CRC;
1121 DBGPRINT(RT_DEBUG_TRACE, ("FragThreshold=%d\n", pAd->CommonCfg.FragmentThreshold));
1124 if(RTMPGetKeyParameter("TxBurst", tmpbuf, 10, buffer))
1126 if(simple_strtol(tmpbuf, 0, 10) != 0) //Enable
1127 pAd->CommonCfg.bEnableTxBurst = TRUE;
1129 pAd->CommonCfg.bEnableTxBurst = FALSE;
1130 DBGPRINT(RT_DEBUG_TRACE, ("TxBurst=%d\n", pAd->CommonCfg.bEnableTxBurst));
1133 #ifdef AGGREGATION_SUPPORT
1135 if(RTMPGetKeyParameter("PktAggregate", tmpbuf, 10, buffer))
1137 if(simple_strtol(tmpbuf, 0, 10) != 0) //Enable
1138 pAd->CommonCfg.bAggregationCapable = TRUE;
1140 pAd->CommonCfg.bAggregationCapable = FALSE;
1141 #ifdef PIGGYBACK_SUPPORT
1142 pAd->CommonCfg.bPiggyBackCapable = pAd->CommonCfg.bAggregationCapable;
1143 #endif // PIGGYBACK_SUPPORT //
1144 DBGPRINT(RT_DEBUG_TRACE, ("PktAggregate=%d\n", pAd->CommonCfg.bAggregationCapable));
1147 pAd->CommonCfg.bAggregationCapable = FALSE;
1148 pAd->CommonCfg.bPiggyBackCapable = FALSE;
1149 #endif // AGGREGATION_SUPPORT //
1152 rtmp_read_sta_wmm_parms_from_file(pAd, tmpbuf, buffer);
1155 if(RTMPGetKeyParameter("ShortSlot", tmpbuf, 10, buffer))
1157 if(simple_strtol(tmpbuf, 0, 10) != 0) //Enable
1158 pAd->CommonCfg.bUseShortSlotTime = TRUE;
1160 pAd->CommonCfg.bUseShortSlotTime = FALSE;
1162 DBGPRINT(RT_DEBUG_TRACE, ("ShortSlot=%d\n", pAd->CommonCfg.bUseShortSlotTime));
1165 if(RTMPGetKeyParameter("IEEE80211H", tmpbuf, 10, buffer))
1167 for (i = 0, macptr = rstrtok(tmpbuf,";"); macptr; macptr = rstrtok(NULL,";"), i++)
1169 if(simple_strtol(macptr, 0, 10) != 0) //Enable
1170 pAd->CommonCfg.bIEEE80211H = TRUE;
1172 pAd->CommonCfg.bIEEE80211H = FALSE;
1174 DBGPRINT(RT_DEBUG_TRACE, ("IEEE80211H=%d\n", pAd->CommonCfg.bIEEE80211H));
1178 if(RTMPGetKeyParameter("CSPeriod", tmpbuf, 10, buffer))
1180 if(simple_strtol(tmpbuf, 0, 10) != 0)
1181 pAd->CommonCfg.RadarDetect.CSPeriod = simple_strtol(tmpbuf, 0, 10);
1183 pAd->CommonCfg.RadarDetect.CSPeriod = 0;
1185 DBGPRINT(RT_DEBUG_TRACE, ("CSPeriod=%d\n", pAd->CommonCfg.RadarDetect.CSPeriod));
1189 if(RTMPGetKeyParameter("RDRegion", tmpbuf, 128, buffer))
1191 if ((strncmp(tmpbuf, "JAP_W53", 7) == 0) || (strncmp(tmpbuf, "jap_w53", 7) == 0))
1193 pAd->CommonCfg.RadarDetect.RDDurRegion = JAP_W53;
1194 pAd->CommonCfg.RadarDetect.DfsSessionTime = 15;
1196 else if ((strncmp(tmpbuf, "JAP_W56", 7) == 0) || (strncmp(tmpbuf, "jap_w56", 7) == 0))
1198 pAd->CommonCfg.RadarDetect.RDDurRegion = JAP_W56;
1199 pAd->CommonCfg.RadarDetect.DfsSessionTime = 13;
1201 else if ((strncmp(tmpbuf, "JAP", 3) == 0) || (strncmp(tmpbuf, "jap", 3) == 0))
1203 pAd->CommonCfg.RadarDetect.RDDurRegion = JAP;
1204 pAd->CommonCfg.RadarDetect.DfsSessionTime = 5;
1206 else if ((strncmp(tmpbuf, "FCC", 3) == 0) || (strncmp(tmpbuf, "fcc", 3) == 0))
1208 pAd->CommonCfg.RadarDetect.RDDurRegion = FCC;
1209 pAd->CommonCfg.RadarDetect.DfsSessionTime = 5;
1211 else if ((strncmp(tmpbuf, "CE", 2) == 0) || (strncmp(tmpbuf, "ce", 2) == 0))
1213 pAd->CommonCfg.RadarDetect.RDDurRegion = CE;
1214 pAd->CommonCfg.RadarDetect.DfsSessionTime = 13;
1218 pAd->CommonCfg.RadarDetect.RDDurRegion = CE;
1219 pAd->CommonCfg.RadarDetect.DfsSessionTime = 13;
1222 DBGPRINT(RT_DEBUG_TRACE, ("RDRegion=%d\n", pAd->CommonCfg.RadarDetect.RDDurRegion));
1226 pAd->CommonCfg.RadarDetect.RDDurRegion = CE;
1227 pAd->CommonCfg.RadarDetect.DfsSessionTime = 13;
1231 if(RTMPGetKeyParameter("WirelessEvent", tmpbuf, 10, buffer))
1233 #if WIRELESS_EXT >= 15
1234 if(simple_strtol(tmpbuf, 0, 10) != 0)
1235 pAd->CommonCfg.bWirelessEvent = simple_strtol(tmpbuf, 0, 10);
1237 pAd->CommonCfg.bWirelessEvent = 0; // disable
1239 pAd->CommonCfg.bWirelessEvent = 0; // disable
1241 DBGPRINT(RT_DEBUG_TRACE, ("WirelessEvent=%d\n", pAd->CommonCfg.bWirelessEvent));
1243 if(RTMPGetKeyParameter("WiFiTest", tmpbuf, 10, buffer))
1245 if(simple_strtol(tmpbuf, 0, 10) != 0)
1246 pAd->CommonCfg.bWiFiTest= simple_strtol(tmpbuf, 0, 10);
1248 pAd->CommonCfg.bWiFiTest = 0; // disable
1250 DBGPRINT(RT_DEBUG_TRACE, ("WiFiTest=%d\n", pAd->CommonCfg.bWiFiTest));
1253 if(RTMPGetKeyParameter("AuthMode", tmpbuf, 128, buffer))
1256 if ((strcmp(tmpbuf, "WEPAUTO") == 0) || (strcmp(tmpbuf, "wepauto") == 0))
1257 pAd->StaCfg.AuthMode = Ndis802_11AuthModeAutoSwitch;
1258 else if ((strcmp(tmpbuf, "SHARED") == 0) || (strcmp(tmpbuf, "shared") == 0))
1259 pAd->StaCfg.AuthMode = Ndis802_11AuthModeShared;
1260 else if ((strcmp(tmpbuf, "WPAPSK") == 0) || (strcmp(tmpbuf, "wpapsk") == 0))
1261 pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPAPSK;
1262 else if ((strcmp(tmpbuf, "WPANONE") == 0) || (strcmp(tmpbuf, "wpanone") == 0))
1263 pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPANone;
1264 else if ((strcmp(tmpbuf, "WPA2PSK") == 0) || (strcmp(tmpbuf, "wpa2psk") == 0))
1265 pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPA2PSK;
1266 else if ((strcmp(tmpbuf, "WPA") == 0) || (strcmp(tmpbuf, "wpa") == 0))
1267 pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPA;
1268 else if ((strcmp(tmpbuf, "WPA2") == 0) || (strcmp(tmpbuf, "wpa2") == 0))
1269 pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPA2;
1271 pAd->StaCfg.AuthMode = Ndis802_11AuthModeOpen;
1273 pAd->StaCfg.PortSecured = WPA_802_1X_PORT_NOT_SECURED;
1275 DBGPRINT(RT_DEBUG_TRACE, ("%s::(EncrypType=%d)\n", __func__, pAd->StaCfg.WepStatus));
1279 if(RTMPGetKeyParameter("EncrypType", tmpbuf, 128, buffer))
1282 if ((strcmp(tmpbuf, "WEP") == 0) || (strcmp(tmpbuf, "wep") == 0))
1283 pAd->StaCfg.WepStatus = Ndis802_11WEPEnabled;
1284 else if ((strcmp(tmpbuf, "TKIP") == 0) || (strcmp(tmpbuf, "tkip") == 0))
1285 pAd->StaCfg.WepStatus = Ndis802_11Encryption2Enabled;
1286 else if ((strcmp(tmpbuf, "AES") == 0) || (strcmp(tmpbuf, "aes") == 0))
1287 pAd->StaCfg.WepStatus = Ndis802_11Encryption3Enabled;
1289 pAd->StaCfg.WepStatus = Ndis802_11WEPDisabled;
1291 // Update all wepstatus related
1292 pAd->StaCfg.PairCipher = pAd->StaCfg.WepStatus;
1293 pAd->StaCfg.GroupCipher = pAd->StaCfg.WepStatus;
1294 pAd->StaCfg.OrigWepStatus = pAd->StaCfg.WepStatus;
1295 pAd->StaCfg.bMixCipher = FALSE;
1297 DBGPRINT(RT_DEBUG_TRACE, ("%s::(EncrypType=%d)\n", __func__, pAd->StaCfg.WepStatus));
1302 if(RTMPGetCriticalParameter("WPAPSK", tmpbuf, 512, buffer))
1306 tmpbuf[strlen(tmpbuf)] = '\0'; // make STA can process .$^& for WPAPSK input
1308 if ((pAd->StaCfg.AuthMode != Ndis802_11AuthModeWPAPSK) &&
1309 (pAd->StaCfg.AuthMode != Ndis802_11AuthModeWPA2PSK) &&
1310 (pAd->StaCfg.AuthMode != Ndis802_11AuthModeWPANone)
1315 else if ((strlen(tmpbuf) >= 8) && (strlen(tmpbuf) < 64))
1317 PasswordHash((char *)tmpbuf, pAd->CommonCfg.Ssid, pAd->CommonCfg.SsidLen, keyMaterial);
1318 NdisMoveMemory(pAd->StaCfg.PMK, keyMaterial, 32);
1321 else if (strlen(tmpbuf) == 64)
1323 AtoH(tmpbuf, keyMaterial, 32);
1324 NdisMoveMemory(pAd->StaCfg.PMK, keyMaterial, 32);
1329 DBGPRINT(RT_DEBUG_ERROR, ("%s::(WPAPSK key-string required 8 ~ 64 characters!)\n", __func__));
1334 if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPAPSK) ||
1335 (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK))
1337 // Start STA supplicant state machine
1338 pAd->StaCfg.WpaState = SS_START;
1340 else if (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPANone)
1342 pAd->StaCfg.WpaState = SS_NOTUSE;
1345 DBGPRINT(RT_DEBUG_TRACE, ("%s::(WPAPSK=%s)\n", __func__, tmpbuf));
1350 //DefaultKeyID, KeyType, KeyStr
1351 rtmp_read_key_parms_from_file(pAd, tmpbuf, buffer);
1353 HTParametersHook(pAd, tmpbuf, buffer);
1358 if (RTMPGetKeyParameter("PSMode", tmpbuf, 32, buffer))
1361 if (RTMPGetKeyParameter("PSMode", tmpbuf, 10, buffer))
1364 if (pAd->StaCfg.BssType == BSS_INFRA)
1366 if ((strcmp(tmpbuf, "MAX_PSP") == 0) || (strcmp(tmpbuf, "max_psp") == 0))
1368 // do NOT turn on PSM bit here, wait until MlmeCheckForPsmChange()
1369 // to exclude certain situations.
1370 // MlmeSetPsm(pAd, PWR_SAVE);
1371 OPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM);
1372 if (pAd->StaCfg.bWindowsACCAMEnable == FALSE)
1373 pAd->StaCfg.WindowsPowerMode = Ndis802_11PowerModeMAX_PSP;
1374 pAd->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeMAX_PSP;
1375 pAd->StaCfg.DefaultListenCount = 5;
1377 else if ((strcmp(tmpbuf, "Fast_PSP") == 0) || (strcmp(tmpbuf, "fast_psp") == 0)
1378 || (strcmp(tmpbuf, "FAST_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_11PowerModeFast_PSP;
1386 pAd->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeFast_PSP;
1387 pAd->StaCfg.DefaultListenCount = 3;
1389 else if ((strcmp(tmpbuf, "Legacy_PSP") == 0) || (strcmp(tmpbuf, "legacy_psp") == 0)
1390 || (strcmp(tmpbuf, "LEGACY_PSP") == 0))
1392 // do NOT turn on PSM bit here, wait until MlmeCheckForPsmChange()
1393 // to exclude certain situations.
1394 // MlmeSetPsmBit(pAd, PWR_SAVE);
1395 OPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM);
1396 if (pAd->StaCfg.bWindowsACCAMEnable == FALSE)
1397 pAd->StaCfg.WindowsPowerMode = Ndis802_11PowerModeLegacy_PSP;
1398 pAd->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeLegacy_PSP;
1399 pAd->StaCfg.DefaultListenCount = 3;
1402 { //Default Ndis802_11PowerModeCAM
1403 // clear PSM bit immediately
1404 MlmeSetPsmBit(pAd, PWR_ACTIVE);
1405 OPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM);
1406 if (pAd->StaCfg.bWindowsACCAMEnable == FALSE)
1407 pAd->StaCfg.WindowsPowerMode = Ndis802_11PowerModeCAM;
1408 pAd->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeCAM;
1410 DBGPRINT(RT_DEBUG_TRACE, ("PSMode=%ld\n", pAd->StaCfg.WindowsPowerMode));
1414 if (RTMPGetKeyParameter("FastRoaming", tmpbuf, 32, buffer))
1416 if (simple_strtol(tmpbuf, 0, 10) == 0)
1417 pAd->StaCfg.bFastRoaming = FALSE;
1419 pAd->StaCfg.bFastRoaming = TRUE;
1421 DBGPRINT(RT_DEBUG_TRACE, ("FastRoaming=%d\n", pAd->StaCfg.bFastRoaming));
1424 if (RTMPGetKeyParameter("RoamThreshold", tmpbuf, 32, buffer))
1426 long lInfo = simple_strtol(tmpbuf, 0, 10);
1428 if (lInfo > 90 || lInfo < 60)
1429 pAd->StaCfg.dBmToRoam = -70;
1431 pAd->StaCfg.dBmToRoam = (CHAR)(-1)*lInfo;
1433 DBGPRINT(RT_DEBUG_TRACE, ("RoamThreshold=%d dBm\n", pAd->StaCfg.dBmToRoam));
1436 if(RTMPGetKeyParameter("TGnWifiTest", tmpbuf, 10, buffer))
1438 if(simple_strtol(tmpbuf, 0, 10) == 0)
1439 pAd->StaCfg.bTGnWifiTest = FALSE;
1441 pAd->StaCfg.bTGnWifiTest = TRUE;
1442 DBGPRINT(RT_DEBUG_TRACE, ("TGnWifiTest=%d\n", pAd->StaCfg.bTGnWifiTest));
1448 if(RTMPGetKeyParameter("AntDiversity", tmpbuf, 10, buffer))
1450 for (i = 0, macptr = rstrtok(tmpbuf,";"); macptr; macptr = rstrtok(NULL,";"), i++)
1452 if(simple_strtol(macptr, 0, 10) != 0) //Enable
1453 pAd->CommonCfg.bRxAntDiversity = TRUE;
1455 pAd->CommonCfg.bRxAntDiversity = FALSE;
1457 DBGPRINT(RT_DEBUG_ERROR, ("AntDiversity=%d\n", pAd->CommonCfg.bRxAntDiversity));
1466 DBGPRINT(RT_DEBUG_TRACE, ("--> %s does not have a write method\n", src));
1469 retval=filp_close(srcf,NULL);
1473 DBGPRINT(RT_DEBUG_TRACE, ("--> Error %d closing %s\n", -retval, src));
1483 return (NDIS_STATUS_SUCCESS);
1486 static void HTParametersHook(
1487 IN PRTMP_ADAPTER pAd,
1494 if (RTMPGetKeyParameter("HT_PROTECT", pValueStr, 25, pInput))
1496 Value = simple_strtol(pValueStr, 0, 10);
1499 pAd->CommonCfg.bHTProtect = FALSE;
1503 pAd->CommonCfg.bHTProtect = TRUE;
1505 DBGPRINT(RT_DEBUG_TRACE, ("HT: Protection = %s\n", (Value==0) ? "Disable" : "Enable"));
1508 if (RTMPGetKeyParameter("HT_MIMOPSEnable", pValueStr, 25, pInput))
1510 Value = simple_strtol(pValueStr, 0, 10);
1513 pAd->CommonCfg.bMIMOPSEnable = FALSE;
1517 pAd->CommonCfg.bMIMOPSEnable = TRUE;
1519 DBGPRINT(RT_DEBUG_TRACE, ("HT: MIMOPSEnable = %s\n", (Value==0) ? "Disable" : "Enable"));
1523 if (RTMPGetKeyParameter("HT_MIMOPSMode", pValueStr, 25, pInput))
1525 Value = simple_strtol(pValueStr, 0, 10);
1526 if (Value > MMPS_ENABLE)
1528 pAd->CommonCfg.BACapability.field.MMPSmode = MMPS_ENABLE;
1532 //TODO: add mimo power saving mechanism
1533 pAd->CommonCfg.BACapability.field.MMPSmode = MMPS_ENABLE;
1534 //pAd->CommonCfg.BACapability.field.MMPSmode = Value;
1536 DBGPRINT(RT_DEBUG_TRACE, ("HT: MIMOPS Mode = %d\n", Value));
1539 if (RTMPGetKeyParameter("HT_BADecline", pValueStr, 25, pInput))
1541 Value = simple_strtol(pValueStr, 0, 10);
1544 pAd->CommonCfg.bBADecline = FALSE;
1548 pAd->CommonCfg.bBADecline = TRUE;
1550 DBGPRINT(RT_DEBUG_TRACE, ("HT: BA Decline = %s\n", (Value==0) ? "Disable" : "Enable"));
1554 if (RTMPGetKeyParameter("HT_DisableReordering", pValueStr, 25, pInput))
1556 Value = simple_strtol(pValueStr, 0, 10);
1559 pAd->CommonCfg.bDisableReordering = FALSE;
1563 pAd->CommonCfg.bDisableReordering = TRUE;
1565 DBGPRINT(RT_DEBUG_TRACE, ("HT: DisableReordering = %s\n", (Value==0) ? "Disable" : "Enable"));
1568 if (RTMPGetKeyParameter("HT_AutoBA", pValueStr, 25, pInput))
1570 Value = simple_strtol(pValueStr, 0, 10);
1573 pAd->CommonCfg.BACapability.field.AutoBA = FALSE;
1575 pAd->CommonCfg.BACapability.field.Policy = BA_NOTUSE;
1580 pAd->CommonCfg.BACapability.field.AutoBA = TRUE;
1582 pAd->CommonCfg.BACapability.field.Policy = IMMED_BA;
1585 pAd->CommonCfg.REGBACapability.field.AutoBA = pAd->CommonCfg.BACapability.field.AutoBA;
1587 pAd->CommonCfg.REGBACapability.field.Policy = pAd->CommonCfg.BACapability.field.Policy;
1589 DBGPRINT(RT_DEBUG_TRACE, ("HT: Auto BA = %s\n", (Value==0) ? "Disable" : "Enable"));
1593 if (RTMPGetKeyParameter("HT_HTC", pValueStr, 25, pInput))
1595 Value = simple_strtol(pValueStr, 0, 10);
1598 pAd->HTCEnable = FALSE;
1602 pAd->HTCEnable = TRUE;
1604 DBGPRINT(RT_DEBUG_TRACE, ("HT: Tx +HTC frame = %s\n", (Value==0) ? "Disable" : "Enable"));
1607 // Enable HT Link Adaptation Control
1608 if (RTMPGetKeyParameter("HT_LinkAdapt", pValueStr, 25, pInput))
1610 Value = simple_strtol(pValueStr, 0, 10);
1613 pAd->bLinkAdapt = FALSE;
1617 pAd->HTCEnable = TRUE;
1618 pAd->bLinkAdapt = TRUE;
1620 DBGPRINT(RT_DEBUG_TRACE, ("HT: Link Adaptation Control = %s\n", (Value==0) ? "Disable" : "Enable(+HTC)"));
1623 // Reverse Direction Mechanism
1624 if (RTMPGetKeyParameter("HT_RDG", pValueStr, 25, pInput))
1626 Value = simple_strtol(pValueStr, 0, 10);
1629 pAd->CommonCfg.bRdg = FALSE;
1633 pAd->HTCEnable = TRUE;
1634 pAd->CommonCfg.bRdg = TRUE;
1636 DBGPRINT(RT_DEBUG_TRACE, ("HT: RDG = %s\n", (Value==0) ? "Disable" : "Enable(+HTC)"));
1643 if (RTMPGetKeyParameter("HT_AMSDU", pValueStr, 25, pInput))
1645 Value = simple_strtol(pValueStr, 0, 10);
1648 pAd->CommonCfg.BACapability.field.AmsduEnable = FALSE;
1652 pAd->CommonCfg.BACapability.field.AmsduEnable = TRUE;
1654 DBGPRINT(RT_DEBUG_TRACE, ("HT: Tx A-MSDU = %s\n", (Value==0) ? "Disable" : "Enable"));
1658 if (RTMPGetKeyParameter("HT_MpduDensity", pValueStr, 25, pInput))
1660 Value = simple_strtol(pValueStr, 0, 10);
1661 if (Value <=7 && Value >= 0)
1663 pAd->CommonCfg.BACapability.field.MpduDensity = Value;
1664 DBGPRINT(RT_DEBUG_TRACE, ("HT: MPDU Density = %d\n", Value));
1668 pAd->CommonCfg.BACapability.field.MpduDensity = 4;
1669 DBGPRINT(RT_DEBUG_TRACE, ("HT: MPDU Density = %d (Default)\n", 4));
1673 // Max Rx BA Window Size
1674 if (RTMPGetKeyParameter("HT_BAWinSize", pValueStr, 25, pInput))
1676 Value = simple_strtol(pValueStr, 0, 10);
1678 if (Value >=1 && Value <= 64)
1680 pAd->CommonCfg.REGBACapability.field.RxBAWinLimit = Value;
1681 pAd->CommonCfg.BACapability.field.RxBAWinLimit = Value;
1682 DBGPRINT(RT_DEBUG_TRACE, ("HT: BA Windw Size = %d\n", Value));
1686 pAd->CommonCfg.REGBACapability.field.RxBAWinLimit = 64;
1687 pAd->CommonCfg.BACapability.field.RxBAWinLimit = 64;
1688 DBGPRINT(RT_DEBUG_TRACE, ("HT: BA Windw Size = 64 (Defualt)\n"));
1694 if (RTMPGetKeyParameter("HT_GI", pValueStr, 25, pInput))
1696 Value = simple_strtol(pValueStr, 0, 10);
1698 if (Value == GI_400)
1700 pAd->CommonCfg.RegTransmitSetting.field.ShortGI = GI_400;
1704 pAd->CommonCfg.RegTransmitSetting.field.ShortGI = GI_800;
1707 DBGPRINT(RT_DEBUG_TRACE, ("HT: Guard Interval = %s\n", (Value==GI_400) ? "400" : "800" ));
1710 // HT Operation Mode : Mixed Mode , Green Field
1711 if (RTMPGetKeyParameter("HT_OpMode", pValueStr, 25, pInput))
1713 Value = simple_strtol(pValueStr, 0, 10);
1715 if (Value == HTMODE_GF)
1718 pAd->CommonCfg.RegTransmitSetting.field.HTMODE = HTMODE_GF;
1722 pAd->CommonCfg.RegTransmitSetting.field.HTMODE = HTMODE_MM;
1725 DBGPRINT(RT_DEBUG_TRACE, ("HT: Operate Mode = %s\n", (Value==HTMODE_GF) ? "Green Field" : "Mixed Mode" ));
1728 // Fixed Tx mode : CCK, OFDM
1729 if (RTMPGetKeyParameter("FixedTxMode", pValueStr, 25, pInput))
1734 fix_tx_mode = FIXED_TXMODE_HT;
1736 if (strcmp(pValueStr, "OFDM") == 0 || strcmp(pValueStr, "ofdm") == 0)
1738 fix_tx_mode = FIXED_TXMODE_OFDM;
1740 else if (strcmp(pValueStr, "CCK") == 0 || strcmp(pValueStr, "cck") == 0)
1742 fix_tx_mode = FIXED_TXMODE_CCK;
1744 else if (strcmp(pValueStr, "HT") == 0 || strcmp(pValueStr, "ht") == 0)
1746 fix_tx_mode = FIXED_TXMODE_HT;
1750 Value = simple_strtol(pValueStr, 0, 10);
1754 if (Value == FIXED_TXMODE_CCK || Value == FIXED_TXMODE_OFDM)
1755 fix_tx_mode = Value;
1757 fix_tx_mode = FIXED_TXMODE_HT;
1760 pAd->StaCfg.DesiredTransmitSetting.field.FixedTxMode = fix_tx_mode;
1761 DBGPRINT(RT_DEBUG_TRACE, ("Fixed Tx Mode = %d\n", fix_tx_mode));
1768 if (RTMPGetKeyParameter("HT_BW", pValueStr, 25, pInput))
1770 Value = simple_strtol(pValueStr, 0, 10);
1774 pAd->CommonCfg.RegTransmitSetting.field.BW = BW_40;
1778 pAd->CommonCfg.RegTransmitSetting.field.BW = BW_20;
1781 #ifdef MCAST_RATE_SPECIFIC
1782 pAd->CommonCfg.MCastPhyMode.field.BW = pAd->CommonCfg.RegTransmitSetting.field.BW;
1783 #endif // MCAST_RATE_SPECIFIC //
1785 DBGPRINT(RT_DEBUG_TRACE, ("HT: Channel Width = %s\n", (Value==BW_40) ? "40 MHz" : "20 MHz" ));
1788 if (RTMPGetKeyParameter("HT_EXTCHA", pValueStr, 25, pInput))
1790 Value = simple_strtol(pValueStr, 0, 10);
1795 pAd->CommonCfg.RegTransmitSetting.field.EXTCHA = EXTCHA_BELOW;
1799 pAd->CommonCfg.RegTransmitSetting.field.EXTCHA = EXTCHA_ABOVE;
1802 DBGPRINT(RT_DEBUG_TRACE, ("HT: Ext Channel = %s\n", (Value==0) ? "BELOW" : "ABOVE" ));
1806 if (RTMPGetKeyParameter("HT_MCS", pValueStr, 50, pInput))
1809 Value = simple_strtol(pValueStr, 0, 10);
1811 if ((Value >= 0 && Value <= 23) || (Value == 32)) // 3*3
1813 pAd->StaCfg.DesiredTransmitSetting.field.MCS = Value;
1814 pAd->StaCfg.bAutoTxRateSwitch = FALSE;
1815 DBGPRINT(RT_DEBUG_TRACE, ("HT: MCS = %d\n", pAd->StaCfg.DesiredTransmitSetting.field.MCS));
1819 pAd->StaCfg.DesiredTransmitSetting.field.MCS = MCS_AUTO;
1820 pAd->StaCfg.bAutoTxRateSwitch = TRUE;
1821 DBGPRINT(RT_DEBUG_TRACE, ("HT: MCS = AUTO\n"));
1827 if (RTMPGetKeyParameter("HT_STBC", pValueStr, 25, pInput))
1829 Value = simple_strtol(pValueStr, 0, 10);
1830 if (Value == STBC_USE)
1832 pAd->CommonCfg.RegTransmitSetting.field.STBC = STBC_USE;
1836 pAd->CommonCfg.RegTransmitSetting.field.STBC = STBC_NONE;
1838 DBGPRINT(RT_DEBUG_TRACE, ("HT: STBC = %d\n", pAd->CommonCfg.RegTransmitSetting.field.STBC));
1841 // 40_Mhz_Intolerant
1842 if (RTMPGetKeyParameter("HT_40MHZ_INTOLERANT", pValueStr, 25, pInput))
1844 Value = simple_strtol(pValueStr, 0, 10);
1847 pAd->CommonCfg.bForty_Mhz_Intolerant = FALSE;
1851 pAd->CommonCfg.bForty_Mhz_Intolerant = TRUE;
1853 DBGPRINT(RT_DEBUG_TRACE, ("HT: 40MHZ INTOLERANT = %d\n", pAd->CommonCfg.bForty_Mhz_Intolerant));
1856 if(RTMPGetKeyParameter("HT_TxStream", pValueStr, 10, pInput))
1858 switch (simple_strtol(pValueStr, 0, 10))
1861 pAd->CommonCfg.TxStream = 1;
1864 pAd->CommonCfg.TxStream = 2;
1868 pAd->CommonCfg.TxStream = 3;
1870 if (pAd->MACVersion < RALINK_2883_VERSION)
1871 pAd->CommonCfg.TxStream = 2; // only 2 tx streams for RT2860 series
1874 DBGPRINT(RT_DEBUG_TRACE, ("HT: Tx Stream = %d\n", pAd->CommonCfg.TxStream));
1877 if(RTMPGetKeyParameter("HT_RxStream", pValueStr, 10, pInput))
1879 switch (simple_strtol(pValueStr, 0, 10))
1882 pAd->CommonCfg.RxStream = 1;
1885 pAd->CommonCfg.RxStream = 2;
1889 pAd->CommonCfg.RxStream = 3;
1891 if (pAd->MACVersion < RALINK_2883_VERSION)
1892 pAd->CommonCfg.RxStream = 2; // only 2 rx streams for RT2860 series
1895 DBGPRINT(RT_DEBUG_TRACE, ("HT: Rx Stream = %d\n", pAd->CommonCfg.RxStream));