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);
1357 if (RTMPGetKeyParameter("PSMode", tmpbuf, 10, buffer))
1359 if (pAd->StaCfg.BssType == BSS_INFRA)
1361 if ((strcmp(tmpbuf, "MAX_PSP") == 0) || (strcmp(tmpbuf, "max_psp") == 0))
1363 // do NOT turn on PSM bit here, wait until MlmeCheckForPsmChange()
1364 // to exclude certain situations.
1365 // MlmeSetPsm(pAd, PWR_SAVE);
1366 OPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM);
1367 if (pAd->StaCfg.bWindowsACCAMEnable == FALSE)
1368 pAd->StaCfg.WindowsPowerMode = Ndis802_11PowerModeMAX_PSP;
1369 pAd->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeMAX_PSP;
1370 pAd->StaCfg.DefaultListenCount = 5;
1372 else if ((strcmp(tmpbuf, "Fast_PSP") == 0) || (strcmp(tmpbuf, "fast_psp") == 0)
1373 || (strcmp(tmpbuf, "FAST_PSP") == 0))
1375 // do NOT turn on PSM bit here, wait until MlmeCheckForPsmChange()
1376 // to exclude certain situations.
1377 // MlmeSetPsmBit(pAd, PWR_SAVE);
1378 OPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM);
1379 if (pAd->StaCfg.bWindowsACCAMEnable == FALSE)
1380 pAd->StaCfg.WindowsPowerMode = Ndis802_11PowerModeFast_PSP;
1381 pAd->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeFast_PSP;
1382 pAd->StaCfg.DefaultListenCount = 3;
1384 else if ((strcmp(tmpbuf, "Legacy_PSP") == 0) || (strcmp(tmpbuf, "legacy_psp") == 0)
1385 || (strcmp(tmpbuf, "LEGACY_PSP") == 0))
1387 // do NOT turn on PSM bit here, wait until MlmeCheckForPsmChange()
1388 // to exclude certain situations.
1389 // MlmeSetPsmBit(pAd, PWR_SAVE);
1390 OPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM);
1391 if (pAd->StaCfg.bWindowsACCAMEnable == FALSE)
1392 pAd->StaCfg.WindowsPowerMode = Ndis802_11PowerModeLegacy_PSP;
1393 pAd->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeLegacy_PSP;
1394 pAd->StaCfg.DefaultListenCount = 3;
1397 { //Default Ndis802_11PowerModeCAM
1398 // clear PSM bit immediately
1399 MlmeSetPsmBit(pAd, PWR_ACTIVE);
1400 OPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM);
1401 if (pAd->StaCfg.bWindowsACCAMEnable == FALSE)
1402 pAd->StaCfg.WindowsPowerMode = Ndis802_11PowerModeCAM;
1403 pAd->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeCAM;
1405 DBGPRINT(RT_DEBUG_TRACE, ("PSMode=%ld\n", pAd->StaCfg.WindowsPowerMode));
1409 if (RTMPGetKeyParameter("FastRoaming", tmpbuf, 32, buffer))
1411 if (simple_strtol(tmpbuf, 0, 10) == 0)
1412 pAd->StaCfg.bFastRoaming = FALSE;
1414 pAd->StaCfg.bFastRoaming = TRUE;
1416 DBGPRINT(RT_DEBUG_TRACE, ("FastRoaming=%d\n", pAd->StaCfg.bFastRoaming));
1419 if (RTMPGetKeyParameter("RoamThreshold", tmpbuf, 32, buffer))
1421 long lInfo = simple_strtol(tmpbuf, 0, 10);
1423 if (lInfo > 90 || lInfo < 60)
1424 pAd->StaCfg.dBmToRoam = -70;
1426 pAd->StaCfg.dBmToRoam = (CHAR)(-1)*lInfo;
1428 DBGPRINT(RT_DEBUG_TRACE, ("RoamThreshold=%d dBm\n", pAd->StaCfg.dBmToRoam));
1431 if(RTMPGetKeyParameter("TGnWifiTest", tmpbuf, 10, buffer))
1433 if(simple_strtol(tmpbuf, 0, 10) == 0)
1434 pAd->StaCfg.bTGnWifiTest = FALSE;
1436 pAd->StaCfg.bTGnWifiTest = TRUE;
1437 DBGPRINT(RT_DEBUG_TRACE, ("TGnWifiTest=%d\n", pAd->StaCfg.bTGnWifiTest));
1443 if(RTMPGetKeyParameter("AntDiversity", tmpbuf, 10, buffer))
1445 for (i = 0, macptr = rstrtok(tmpbuf,";"); macptr; macptr = rstrtok(NULL,";"), i++)
1447 if(simple_strtol(macptr, 0, 10) != 0) //Enable
1448 pAd->CommonCfg.bRxAntDiversity = TRUE;
1450 pAd->CommonCfg.bRxAntDiversity = FALSE;
1452 DBGPRINT(RT_DEBUG_ERROR, ("AntDiversity=%d\n", pAd->CommonCfg.bRxAntDiversity));
1461 DBGPRINT(RT_DEBUG_TRACE, ("--> %s does not have a write method\n", src));
1464 retval=filp_close(srcf,NULL);
1468 DBGPRINT(RT_DEBUG_TRACE, ("--> Error %d closing %s\n", -retval, src));
1478 return (NDIS_STATUS_SUCCESS);
1481 static void HTParametersHook(
1482 IN PRTMP_ADAPTER pAd,
1489 if (RTMPGetKeyParameter("HT_PROTECT", pValueStr, 25, pInput))
1491 Value = simple_strtol(pValueStr, 0, 10);
1494 pAd->CommonCfg.bHTProtect = FALSE;
1498 pAd->CommonCfg.bHTProtect = TRUE;
1500 DBGPRINT(RT_DEBUG_TRACE, ("HT: Protection = %s\n", (Value==0) ? "Disable" : "Enable"));
1503 if (RTMPGetKeyParameter("HT_MIMOPSEnable", pValueStr, 25, pInput))
1505 Value = simple_strtol(pValueStr, 0, 10);
1508 pAd->CommonCfg.bMIMOPSEnable = FALSE;
1512 pAd->CommonCfg.bMIMOPSEnable = TRUE;
1514 DBGPRINT(RT_DEBUG_TRACE, ("HT: MIMOPSEnable = %s\n", (Value==0) ? "Disable" : "Enable"));
1518 if (RTMPGetKeyParameter("HT_MIMOPSMode", pValueStr, 25, pInput))
1520 Value = simple_strtol(pValueStr, 0, 10);
1521 if (Value > MMPS_ENABLE)
1523 pAd->CommonCfg.BACapability.field.MMPSmode = MMPS_ENABLE;
1527 //TODO: add mimo power saving mechanism
1528 pAd->CommonCfg.BACapability.field.MMPSmode = MMPS_ENABLE;
1529 //pAd->CommonCfg.BACapability.field.MMPSmode = Value;
1531 DBGPRINT(RT_DEBUG_TRACE, ("HT: MIMOPS Mode = %d\n", Value));
1534 if (RTMPGetKeyParameter("HT_BADecline", pValueStr, 25, pInput))
1536 Value = simple_strtol(pValueStr, 0, 10);
1539 pAd->CommonCfg.bBADecline = FALSE;
1543 pAd->CommonCfg.bBADecline = TRUE;
1545 DBGPRINT(RT_DEBUG_TRACE, ("HT: BA Decline = %s\n", (Value==0) ? "Disable" : "Enable"));
1549 if (RTMPGetKeyParameter("HT_DisableReordering", pValueStr, 25, pInput))
1551 Value = simple_strtol(pValueStr, 0, 10);
1554 pAd->CommonCfg.bDisableReordering = FALSE;
1558 pAd->CommonCfg.bDisableReordering = TRUE;
1560 DBGPRINT(RT_DEBUG_TRACE, ("HT: DisableReordering = %s\n", (Value==0) ? "Disable" : "Enable"));
1563 if (RTMPGetKeyParameter("HT_AutoBA", pValueStr, 25, pInput))
1565 Value = simple_strtol(pValueStr, 0, 10);
1568 pAd->CommonCfg.BACapability.field.AutoBA = FALSE;
1570 pAd->CommonCfg.BACapability.field.Policy = BA_NOTUSE;
1575 pAd->CommonCfg.BACapability.field.AutoBA = TRUE;
1577 pAd->CommonCfg.BACapability.field.Policy = IMMED_BA;
1580 pAd->CommonCfg.REGBACapability.field.AutoBA = pAd->CommonCfg.BACapability.field.AutoBA;
1582 pAd->CommonCfg.REGBACapability.field.Policy = pAd->CommonCfg.BACapability.field.Policy;
1584 DBGPRINT(RT_DEBUG_TRACE, ("HT: Auto BA = %s\n", (Value==0) ? "Disable" : "Enable"));
1588 if (RTMPGetKeyParameter("HT_HTC", pValueStr, 25, pInput))
1590 Value = simple_strtol(pValueStr, 0, 10);
1593 pAd->HTCEnable = FALSE;
1597 pAd->HTCEnable = TRUE;
1599 DBGPRINT(RT_DEBUG_TRACE, ("HT: Tx +HTC frame = %s\n", (Value==0) ? "Disable" : "Enable"));
1602 // Enable HT Link Adaptation Control
1603 if (RTMPGetKeyParameter("HT_LinkAdapt", pValueStr, 25, pInput))
1605 Value = simple_strtol(pValueStr, 0, 10);
1608 pAd->bLinkAdapt = FALSE;
1612 pAd->HTCEnable = TRUE;
1613 pAd->bLinkAdapt = TRUE;
1615 DBGPRINT(RT_DEBUG_TRACE, ("HT: Link Adaptation Control = %s\n", (Value==0) ? "Disable" : "Enable(+HTC)"));
1618 // Reverse Direction Mechanism
1619 if (RTMPGetKeyParameter("HT_RDG", pValueStr, 25, pInput))
1621 Value = simple_strtol(pValueStr, 0, 10);
1624 pAd->CommonCfg.bRdg = FALSE;
1628 pAd->HTCEnable = TRUE;
1629 pAd->CommonCfg.bRdg = TRUE;
1631 DBGPRINT(RT_DEBUG_TRACE, ("HT: RDG = %s\n", (Value==0) ? "Disable" : "Enable(+HTC)"));
1638 if (RTMPGetKeyParameter("HT_AMSDU", pValueStr, 25, pInput))
1640 Value = simple_strtol(pValueStr, 0, 10);
1643 pAd->CommonCfg.BACapability.field.AmsduEnable = FALSE;
1647 pAd->CommonCfg.BACapability.field.AmsduEnable = TRUE;
1649 DBGPRINT(RT_DEBUG_TRACE, ("HT: Tx A-MSDU = %s\n", (Value==0) ? "Disable" : "Enable"));
1653 if (RTMPGetKeyParameter("HT_MpduDensity", pValueStr, 25, pInput))
1655 Value = simple_strtol(pValueStr, 0, 10);
1656 if (Value <=7 && Value >= 0)
1658 pAd->CommonCfg.BACapability.field.MpduDensity = Value;
1659 DBGPRINT(RT_DEBUG_TRACE, ("HT: MPDU Density = %d\n", Value));
1663 pAd->CommonCfg.BACapability.field.MpduDensity = 4;
1664 DBGPRINT(RT_DEBUG_TRACE, ("HT: MPDU Density = %d (Default)\n", 4));
1668 // Max Rx BA Window Size
1669 if (RTMPGetKeyParameter("HT_BAWinSize", pValueStr, 25, pInput))
1671 Value = simple_strtol(pValueStr, 0, 10);
1673 if (Value >=1 && Value <= 64)
1675 pAd->CommonCfg.REGBACapability.field.RxBAWinLimit = Value;
1676 pAd->CommonCfg.BACapability.field.RxBAWinLimit = Value;
1677 DBGPRINT(RT_DEBUG_TRACE, ("HT: BA Windw Size = %d\n", Value));
1681 pAd->CommonCfg.REGBACapability.field.RxBAWinLimit = 64;
1682 pAd->CommonCfg.BACapability.field.RxBAWinLimit = 64;
1683 DBGPRINT(RT_DEBUG_TRACE, ("HT: BA Windw Size = 64 (Defualt)\n"));
1689 if (RTMPGetKeyParameter("HT_GI", pValueStr, 25, pInput))
1691 Value = simple_strtol(pValueStr, 0, 10);
1693 if (Value == GI_400)
1695 pAd->CommonCfg.RegTransmitSetting.field.ShortGI = GI_400;
1699 pAd->CommonCfg.RegTransmitSetting.field.ShortGI = GI_800;
1702 DBGPRINT(RT_DEBUG_TRACE, ("HT: Guard Interval = %s\n", (Value==GI_400) ? "400" : "800" ));
1705 // HT Operation Mode : Mixed Mode , Green Field
1706 if (RTMPGetKeyParameter("HT_OpMode", pValueStr, 25, pInput))
1708 Value = simple_strtol(pValueStr, 0, 10);
1710 if (Value == HTMODE_GF)
1713 pAd->CommonCfg.RegTransmitSetting.field.HTMODE = HTMODE_GF;
1717 pAd->CommonCfg.RegTransmitSetting.field.HTMODE = HTMODE_MM;
1720 DBGPRINT(RT_DEBUG_TRACE, ("HT: Operate Mode = %s\n", (Value==HTMODE_GF) ? "Green Field" : "Mixed Mode" ));
1723 // Fixed Tx mode : CCK, OFDM
1724 if (RTMPGetKeyParameter("FixedTxMode", pValueStr, 25, pInput))
1729 fix_tx_mode = FIXED_TXMODE_HT;
1731 if (strcmp(pValueStr, "OFDM") == 0 || strcmp(pValueStr, "ofdm") == 0)
1733 fix_tx_mode = FIXED_TXMODE_OFDM;
1735 else if (strcmp(pValueStr, "CCK") == 0 || strcmp(pValueStr, "cck") == 0)
1737 fix_tx_mode = FIXED_TXMODE_CCK;
1739 else if (strcmp(pValueStr, "HT") == 0 || strcmp(pValueStr, "ht") == 0)
1741 fix_tx_mode = FIXED_TXMODE_HT;
1745 Value = simple_strtol(pValueStr, 0, 10);
1749 if (Value == FIXED_TXMODE_CCK || Value == FIXED_TXMODE_OFDM)
1750 fix_tx_mode = Value;
1752 fix_tx_mode = FIXED_TXMODE_HT;
1755 pAd->StaCfg.DesiredTransmitSetting.field.FixedTxMode = fix_tx_mode;
1756 DBGPRINT(RT_DEBUG_TRACE, ("Fixed Tx Mode = %d\n", fix_tx_mode));
1763 if (RTMPGetKeyParameter("HT_BW", pValueStr, 25, pInput))
1765 Value = simple_strtol(pValueStr, 0, 10);
1769 pAd->CommonCfg.RegTransmitSetting.field.BW = BW_40;
1773 pAd->CommonCfg.RegTransmitSetting.field.BW = BW_20;
1776 #ifdef MCAST_RATE_SPECIFIC
1777 pAd->CommonCfg.MCastPhyMode.field.BW = pAd->CommonCfg.RegTransmitSetting.field.BW;
1778 #endif // MCAST_RATE_SPECIFIC //
1780 DBGPRINT(RT_DEBUG_TRACE, ("HT: Channel Width = %s\n", (Value==BW_40) ? "40 MHz" : "20 MHz" ));
1783 if (RTMPGetKeyParameter("HT_EXTCHA", pValueStr, 25, pInput))
1785 Value = simple_strtol(pValueStr, 0, 10);
1790 pAd->CommonCfg.RegTransmitSetting.field.EXTCHA = EXTCHA_BELOW;
1794 pAd->CommonCfg.RegTransmitSetting.field.EXTCHA = EXTCHA_ABOVE;
1797 DBGPRINT(RT_DEBUG_TRACE, ("HT: Ext Channel = %s\n", (Value==0) ? "BELOW" : "ABOVE" ));
1801 if (RTMPGetKeyParameter("HT_MCS", pValueStr, 50, pInput))
1804 Value = simple_strtol(pValueStr, 0, 10);
1806 if ((Value >= 0 && Value <= 23) || (Value == 32)) // 3*3
1808 pAd->StaCfg.DesiredTransmitSetting.field.MCS = Value;
1809 pAd->StaCfg.bAutoTxRateSwitch = FALSE;
1810 DBGPRINT(RT_DEBUG_TRACE, ("HT: MCS = %d\n", pAd->StaCfg.DesiredTransmitSetting.field.MCS));
1814 pAd->StaCfg.DesiredTransmitSetting.field.MCS = MCS_AUTO;
1815 pAd->StaCfg.bAutoTxRateSwitch = TRUE;
1816 DBGPRINT(RT_DEBUG_TRACE, ("HT: MCS = AUTO\n"));
1822 if (RTMPGetKeyParameter("HT_STBC", pValueStr, 25, pInput))
1824 Value = simple_strtol(pValueStr, 0, 10);
1825 if (Value == STBC_USE)
1827 pAd->CommonCfg.RegTransmitSetting.field.STBC = STBC_USE;
1831 pAd->CommonCfg.RegTransmitSetting.field.STBC = STBC_NONE;
1833 DBGPRINT(RT_DEBUG_TRACE, ("HT: STBC = %d\n", pAd->CommonCfg.RegTransmitSetting.field.STBC));
1836 // 40_Mhz_Intolerant
1837 if (RTMPGetKeyParameter("HT_40MHZ_INTOLERANT", pValueStr, 25, pInput))
1839 Value = simple_strtol(pValueStr, 0, 10);
1842 pAd->CommonCfg.bForty_Mhz_Intolerant = FALSE;
1846 pAd->CommonCfg.bForty_Mhz_Intolerant = TRUE;
1848 DBGPRINT(RT_DEBUG_TRACE, ("HT: 40MHZ INTOLERANT = %d\n", pAd->CommonCfg.bForty_Mhz_Intolerant));
1851 if(RTMPGetKeyParameter("HT_TxStream", pValueStr, 10, pInput))
1853 switch (simple_strtol(pValueStr, 0, 10))
1856 pAd->CommonCfg.TxStream = 1;
1859 pAd->CommonCfg.TxStream = 2;
1863 pAd->CommonCfg.TxStream = 3;
1865 if (pAd->MACVersion < RALINK_2883_VERSION)
1866 pAd->CommonCfg.TxStream = 2; // only 2 tx streams for RT2860 series
1869 DBGPRINT(RT_DEBUG_TRACE, ("HT: Tx Stream = %d\n", pAd->CommonCfg.TxStream));
1872 if(RTMPGetKeyParameter("HT_RxStream", pValueStr, 10, pInput))
1874 switch (simple_strtol(pValueStr, 0, 10))
1877 pAd->CommonCfg.RxStream = 1;
1880 pAd->CommonCfg.RxStream = 2;
1884 pAd->CommonCfg.RxStream = 3;
1886 if (pAd->MACVersion < RALINK_2883_VERSION)
1887 pAd->CommonCfg.RxStream = 2; // only 2 rx streams for RT2860 series
1890 DBGPRINT(RT_DEBUG_TRACE, ("HT: Rx Stream = %d\n", pAd->CommonCfg.RxStream));