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))
757 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
759 KeyIdx = simple_strtol(tmpbuf, 0, 10);
760 if((KeyIdx >= 1 ) && (KeyIdx <= 4))
761 pAd->StaCfg.DefaultKeyId = (UCHAR) (KeyIdx - 1);
763 pAd->StaCfg.DefaultKeyId = 0;
765 DBGPRINT(RT_DEBUG_TRACE, ("DefaultKeyID(0~3)=%d\n", pAd->StaCfg.DefaultKeyId));
770 for (idx = 0; idx < 4; idx++)
772 sprintf(tok_str, "Key%dType", idx + 1);
774 if (RTMPGetKeyParameter(tok_str, tmpbuf, 128, buffer))
776 for (i = 0, macptr = rstrtok(tmpbuf,";"); macptr; macptr = rstrtok(NULL,";"), i++)
778 KeyType[i] = simple_strtol(macptr, 0, 10);
781 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
783 sprintf(tok_str, "Key%dStr", idx + 1);
784 if (RTMPGetCriticalParameter(tok_str, tmpbuf, 128, buffer))
786 rtmp_parse_key_buffer_from_file(pAd, tmpbuf, KeyType[BSS0], BSS0, idx);
793 static void rtmp_read_sta_wmm_parms_from_file(IN PRTMP_ADAPTER pAd, char *tmpbuf, char *buffer)
797 BOOLEAN bWmmEnable = FALSE;
800 if(RTMPGetKeyParameter("WmmCapable", tmpbuf, 32, buffer))
802 if(simple_strtol(tmpbuf, 0, 10) != 0) //Enable
804 pAd->CommonCfg.bWmmCapable = TRUE;
809 pAd->CommonCfg.bWmmCapable = FALSE;
812 DBGPRINT(RT_DEBUG_TRACE, ("WmmCapable=%d\n", pAd->CommonCfg.bWmmCapable));
815 //AckPolicy for AC_BK, AC_BE, AC_VI, AC_VO
816 if(RTMPGetKeyParameter("AckPolicy", tmpbuf, 32, buffer))
818 for (i = 0, macptr = rstrtok(tmpbuf,";"); macptr; macptr = rstrtok(NULL,";"), i++)
820 pAd->CommonCfg.AckPolicy[i] = (UCHAR)simple_strtol(macptr, 0, 10);
822 DBGPRINT(RT_DEBUG_TRACE, ("AckPolicy[%d]=%d\n", i, pAd->CommonCfg.AckPolicy[i]));
829 if(RTMPGetKeyParameter("APSDCapable", tmpbuf, 10, buffer))
831 if(simple_strtol(tmpbuf, 0, 10) != 0) //Enable
832 pAd->CommonCfg.bAPSDCapable = TRUE;
834 pAd->CommonCfg.bAPSDCapable = FALSE;
836 DBGPRINT(RT_DEBUG_TRACE, ("APSDCapable=%d\n", pAd->CommonCfg.bAPSDCapable));
839 //APSDAC for AC_BE, AC_BK, AC_VI, AC_VO
840 if(RTMPGetKeyParameter("APSDAC", tmpbuf, 32, buffer))
844 for (i = 0, macptr = rstrtok(tmpbuf,";"); macptr; macptr = rstrtok(NULL,";"), i++)
846 apsd_ac[i] = (BOOLEAN)simple_strtol(macptr, 0, 10);
848 DBGPRINT(RT_DEBUG_TRACE, ("APSDAC%d %d\n", i, apsd_ac[i]));
851 pAd->CommonCfg.bAPSDAC_BE = apsd_ac[0];
852 pAd->CommonCfg.bAPSDAC_BK = apsd_ac[1];
853 pAd->CommonCfg.bAPSDAC_VI = apsd_ac[2];
854 pAd->CommonCfg.bAPSDAC_VO = apsd_ac[3];
860 NDIS_STATUS RTMPReadParametersHook(
861 IN PRTMP_ADAPTER pAd)
865 INT retval, orgfsuid, orgfsgid;
871 UCHAR keyMaterial[40];
876 buffer = kmalloc(MAX_INI_BUFFER_SIZE, MEM_ALLOC_FLAG);
878 return NDIS_STATUS_FAILURE;
880 tmpbuf = kmalloc(MAX_PARAM_BUFFER_SIZE, MEM_ALLOC_FLAG);
884 return NDIS_STATUS_FAILURE;
887 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
888 src = STA_PROFILE_PATH;
890 // Save uid and gid used for filesystem access.
891 // Set user and group to 0 (root)
892 orgfsuid = current_fsuid();
893 orgfsgid = current_fsgid();
894 /* Hm, can't really do this nicely anymore, so rely on these files
895 * being set to the proper permission to read them... */
896 /* current->cred->fsuid = current->cred->fsgid = 0; */
902 srcf = filp_open(src, O_RDONLY, 0);
905 DBGPRINT(RT_DEBUG_ERROR, ("--> Error %ld opening %s\n", -PTR_ERR(srcf),src));
909 // The object must have a read method
910 if (srcf->f_op && srcf->f_op->read)
912 memset(buffer, 0x00, MAX_INI_BUFFER_SIZE);
913 retval=srcf->f_op->read(srcf, buffer, MAX_INI_BUFFER_SIZE, &srcf->f_pos);
916 DBGPRINT(RT_DEBUG_TRACE, ("--> Read %s error %d\n", src, -retval));
920 // set file parameter to portcfg
922 if(RTMPGetKeyParameter("CountryRegion", tmpbuf, 25, buffer))
924 pAd->CommonCfg.CountryRegion = (UCHAR) simple_strtol(tmpbuf, 0, 10);
925 DBGPRINT(RT_DEBUG_TRACE, ("CountryRegion=%d\n", pAd->CommonCfg.CountryRegion));
928 if(RTMPGetKeyParameter("CountryRegionABand", tmpbuf, 25, buffer))
930 pAd->CommonCfg.CountryRegionForABand= (UCHAR) simple_strtol(tmpbuf, 0, 10);
931 DBGPRINT(RT_DEBUG_TRACE, ("CountryRegionABand=%d\n", pAd->CommonCfg.CountryRegionForABand));
934 if(RTMPGetKeyParameter("CountryCode", tmpbuf, 25, buffer))
936 NdisMoveMemory(pAd->CommonCfg.CountryCode, tmpbuf , 2);
938 if (strlen(pAd->CommonCfg.CountryCode) != 0)
940 pAd->CommonCfg.bCountryFlag = TRUE;
942 DBGPRINT(RT_DEBUG_TRACE, ("CountryCode=%s\n", pAd->CommonCfg.CountryCode));
945 if(RTMPGetKeyParameter("ChannelGeography", tmpbuf, 25, buffer))
947 UCHAR Geography = (UCHAR) simple_strtol(tmpbuf, 0, 10);
948 if (Geography <= BOTH)
950 pAd->CommonCfg.Geography = Geography;
951 pAd->CommonCfg.CountryCode[2] =
952 (pAd->CommonCfg.Geography == BOTH) ? ' ' : ((pAd->CommonCfg.Geography == IDOR) ? 'I' : 'O');
953 DBGPRINT(RT_DEBUG_TRACE, ("ChannelGeography=%d\n", pAd->CommonCfg.Geography));
958 pAd->CommonCfg.Geography = BOTH;
959 pAd->CommonCfg.CountryCode[2] = ' ';
962 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
965 if (RTMPGetCriticalParameter("SSID", tmpbuf, 256, buffer))
967 if (strlen(tmpbuf) <= 32)
969 pAd->CommonCfg.SsidLen = (UCHAR) strlen(tmpbuf);
970 NdisZeroMemory(pAd->CommonCfg.Ssid, NDIS_802_11_LENGTH_SSID);
971 NdisMoveMemory(pAd->CommonCfg.Ssid, tmpbuf, pAd->CommonCfg.SsidLen);
972 pAd->MlmeAux.AutoReconnectSsidLen = pAd->CommonCfg.SsidLen;
973 NdisZeroMemory(pAd->MlmeAux.AutoReconnectSsid, NDIS_802_11_LENGTH_SSID);
974 NdisMoveMemory(pAd->MlmeAux.AutoReconnectSsid, tmpbuf, pAd->MlmeAux.AutoReconnectSsidLen);
975 pAd->MlmeAux.SsidLen = pAd->CommonCfg.SsidLen;
976 NdisZeroMemory(pAd->MlmeAux.Ssid, NDIS_802_11_LENGTH_SSID);
977 NdisMoveMemory(pAd->MlmeAux.Ssid, tmpbuf, pAd->MlmeAux.SsidLen);
978 DBGPRINT(RT_DEBUG_TRACE, ("%s::(SSID=%s)\n", __func__, tmpbuf));
983 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
986 if (RTMPGetKeyParameter("NetworkType", tmpbuf, 25, buffer))
988 pAd->bConfigChanged = TRUE;
989 if (strcmp(tmpbuf, "Adhoc") == 0)
990 pAd->StaCfg.BssType = BSS_ADHOC;
991 else //Default Infrastructure mode
992 pAd->StaCfg.BssType = BSS_INFRA;
993 // Reset Ralink supplicant to not use, it will be set to start when UI set PMK key
994 pAd->StaCfg.WpaState = SS_NOTUSE;
995 DBGPRINT(RT_DEBUG_TRACE, ("%s::(NetworkType=%d)\n", __func__, pAd->StaCfg.BssType));
1000 if(RTMPGetKeyParameter("Channel", tmpbuf, 10, buffer))
1002 pAd->CommonCfg.Channel = (UCHAR) simple_strtol(tmpbuf, 0, 10);
1003 DBGPRINT(RT_DEBUG_TRACE, ("Channel=%d\n", pAd->CommonCfg.Channel));
1006 if(RTMPGetKeyParameter("WirelessMode", tmpbuf, 10, buffer))
1008 int value = 0, maxPhyMode = PHY_11G;
1010 maxPhyMode = PHY_11N_5G;
1012 value = simple_strtol(tmpbuf, 0, 10);
1014 if (value <= maxPhyMode)
1016 pAd->CommonCfg.PhyMode = value;
1018 DBGPRINT(RT_DEBUG_TRACE, ("PhyMode=%d\n", pAd->CommonCfg.PhyMode));
1021 if(RTMPGetKeyParameter("BasicRate", tmpbuf, 10, buffer))
1023 pAd->CommonCfg.BasicRateBitmap = (ULONG) simple_strtol(tmpbuf, 0, 10);
1024 DBGPRINT(RT_DEBUG_TRACE, ("BasicRate=%ld\n", pAd->CommonCfg.BasicRateBitmap));
1027 if(RTMPGetKeyParameter("BeaconPeriod", tmpbuf, 10, buffer))
1029 pAd->CommonCfg.BeaconPeriod = (USHORT) simple_strtol(tmpbuf, 0, 10);
1030 DBGPRINT(RT_DEBUG_TRACE, ("BeaconPeriod=%d\n", pAd->CommonCfg.BeaconPeriod));
1033 if(RTMPGetKeyParameter("TxPower", tmpbuf, 10, buffer))
1035 pAd->CommonCfg.TxPowerPercentage = (ULONG) simple_strtol(tmpbuf, 0, 10);
1037 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1038 pAd->CommonCfg.TxPowerDefault = pAd->CommonCfg.TxPowerPercentage;
1040 DBGPRINT(RT_DEBUG_TRACE, ("TxPower=%ld\n", pAd->CommonCfg.TxPowerPercentage));
1043 if(RTMPGetKeyParameter("BGProtection", tmpbuf, 10, buffer))
1045 switch (simple_strtol(tmpbuf, 0, 10))
1048 pAd->CommonCfg.UseBGProtection = 1;
1050 case 2: //Always OFF
1051 pAd->CommonCfg.UseBGProtection = 2;
1055 pAd->CommonCfg.UseBGProtection = 0;
1058 DBGPRINT(RT_DEBUG_TRACE, ("BGProtection=%ld\n", pAd->CommonCfg.UseBGProtection));
1061 if(RTMPGetKeyParameter("DisableOLBC", tmpbuf, 10, buffer))
1063 switch (simple_strtol(tmpbuf, 0, 10))
1065 case 1: //disable OLBC Detection
1066 pAd->CommonCfg.DisableOLBCDetect = 1;
1068 case 0: //enable OLBC Detection
1069 pAd->CommonCfg.DisableOLBCDetect = 0;
1072 pAd->CommonCfg.DisableOLBCDetect= 0;
1075 DBGPRINT(RT_DEBUG_TRACE, ("OLBCDetection=%ld\n", pAd->CommonCfg.DisableOLBCDetect));
1078 if(RTMPGetKeyParameter("TxPreamble", tmpbuf, 10, buffer))
1080 switch (simple_strtol(tmpbuf, 0, 10))
1082 case Rt802_11PreambleShort:
1083 pAd->CommonCfg.TxPreamble = Rt802_11PreambleShort;
1085 case Rt802_11PreambleLong:
1087 pAd->CommonCfg.TxPreamble = Rt802_11PreambleLong;
1090 DBGPRINT(RT_DEBUG_TRACE, ("TxPreamble=%ld\n", pAd->CommonCfg.TxPreamble));
1093 if(RTMPGetKeyParameter("RTSThreshold", tmpbuf, 10, buffer))
1095 RtsThresh = simple_strtol(tmpbuf, 0, 10);
1096 if( (RtsThresh >= 1) && (RtsThresh <= MAX_RTS_THRESHOLD) )
1097 pAd->CommonCfg.RtsThreshold = (USHORT)RtsThresh;
1099 pAd->CommonCfg.RtsThreshold = MAX_RTS_THRESHOLD;
1101 DBGPRINT(RT_DEBUG_TRACE, ("RTSThreshold=%d\n", pAd->CommonCfg.RtsThreshold));
1104 if(RTMPGetKeyParameter("FragThreshold", tmpbuf, 10, buffer))
1106 FragThresh = simple_strtol(tmpbuf, 0, 10);
1107 pAd->CommonCfg.bUseZeroToDisableFragment = FALSE;
1109 if (FragThresh > MAX_FRAG_THRESHOLD || FragThresh < MIN_FRAG_THRESHOLD)
1110 { //illegal FragThresh so we set it to default
1111 pAd->CommonCfg.FragmentThreshold = MAX_FRAG_THRESHOLD;
1112 pAd->CommonCfg.bUseZeroToDisableFragment = TRUE;
1114 else if (FragThresh % 2 == 1)
1116 // The length of each fragment shall always be an even number of octets, except for the last fragment
1117 // of an MSDU or MMPDU, which may be either an even or an odd number of octets.
1118 pAd->CommonCfg.FragmentThreshold = (USHORT)(FragThresh - 1);
1122 pAd->CommonCfg.FragmentThreshold = (USHORT)FragThresh;
1124 //pAd->CommonCfg.AllowFragSize = (pAd->CommonCfg.FragmentThreshold) - LENGTH_802_11 - LENGTH_CRC;
1125 DBGPRINT(RT_DEBUG_TRACE, ("FragThreshold=%d\n", pAd->CommonCfg.FragmentThreshold));
1128 if(RTMPGetKeyParameter("TxBurst", tmpbuf, 10, buffer))
1130 if(simple_strtol(tmpbuf, 0, 10) != 0) //Enable
1131 pAd->CommonCfg.bEnableTxBurst = TRUE;
1133 pAd->CommonCfg.bEnableTxBurst = FALSE;
1134 DBGPRINT(RT_DEBUG_TRACE, ("TxBurst=%d\n", pAd->CommonCfg.bEnableTxBurst));
1137 #ifdef AGGREGATION_SUPPORT
1139 if(RTMPGetKeyParameter("PktAggregate", tmpbuf, 10, buffer))
1141 if(simple_strtol(tmpbuf, 0, 10) != 0) //Enable
1142 pAd->CommonCfg.bAggregationCapable = TRUE;
1144 pAd->CommonCfg.bAggregationCapable = FALSE;
1145 #ifdef PIGGYBACK_SUPPORT
1146 pAd->CommonCfg.bPiggyBackCapable = pAd->CommonCfg.bAggregationCapable;
1147 #endif // PIGGYBACK_SUPPORT //
1148 DBGPRINT(RT_DEBUG_TRACE, ("PktAggregate=%d\n", pAd->CommonCfg.bAggregationCapable));
1151 pAd->CommonCfg.bAggregationCapable = FALSE;
1152 pAd->CommonCfg.bPiggyBackCapable = FALSE;
1153 #endif // AGGREGATION_SUPPORT //
1156 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1157 rtmp_read_sta_wmm_parms_from_file(pAd, tmpbuf, buffer);
1160 if(RTMPGetKeyParameter("ShortSlot", tmpbuf, 10, buffer))
1162 if(simple_strtol(tmpbuf, 0, 10) != 0) //Enable
1163 pAd->CommonCfg.bUseShortSlotTime = TRUE;
1165 pAd->CommonCfg.bUseShortSlotTime = FALSE;
1167 DBGPRINT(RT_DEBUG_TRACE, ("ShortSlot=%d\n", pAd->CommonCfg.bUseShortSlotTime));
1170 if(RTMPGetKeyParameter("IEEE80211H", tmpbuf, 10, buffer))
1172 for (i = 0, macptr = rstrtok(tmpbuf,";"); macptr; macptr = rstrtok(NULL,";"), i++)
1174 if(simple_strtol(macptr, 0, 10) != 0) //Enable
1175 pAd->CommonCfg.bIEEE80211H = TRUE;
1177 pAd->CommonCfg.bIEEE80211H = FALSE;
1179 DBGPRINT(RT_DEBUG_TRACE, ("IEEE80211H=%d\n", pAd->CommonCfg.bIEEE80211H));
1183 if(RTMPGetKeyParameter("CSPeriod", tmpbuf, 10, buffer))
1185 if(simple_strtol(tmpbuf, 0, 10) != 0)
1186 pAd->CommonCfg.RadarDetect.CSPeriod = simple_strtol(tmpbuf, 0, 10);
1188 pAd->CommonCfg.RadarDetect.CSPeriod = 0;
1190 DBGPRINT(RT_DEBUG_TRACE, ("CSPeriod=%d\n", pAd->CommonCfg.RadarDetect.CSPeriod));
1194 if(RTMPGetKeyParameter("RDRegion", tmpbuf, 128, buffer))
1196 if ((strncmp(tmpbuf, "JAP_W53", 7) == 0) || (strncmp(tmpbuf, "jap_w53", 7) == 0))
1198 pAd->CommonCfg.RadarDetect.RDDurRegion = JAP_W53;
1199 pAd->CommonCfg.RadarDetect.DfsSessionTime = 15;
1201 else if ((strncmp(tmpbuf, "JAP_W56", 7) == 0) || (strncmp(tmpbuf, "jap_w56", 7) == 0))
1203 pAd->CommonCfg.RadarDetect.RDDurRegion = JAP_W56;
1204 pAd->CommonCfg.RadarDetect.DfsSessionTime = 13;
1206 else if ((strncmp(tmpbuf, "JAP", 3) == 0) || (strncmp(tmpbuf, "jap", 3) == 0))
1208 pAd->CommonCfg.RadarDetect.RDDurRegion = JAP;
1209 pAd->CommonCfg.RadarDetect.DfsSessionTime = 5;
1211 else if ((strncmp(tmpbuf, "FCC", 3) == 0) || (strncmp(tmpbuf, "fcc", 3) == 0))
1213 pAd->CommonCfg.RadarDetect.RDDurRegion = FCC;
1214 pAd->CommonCfg.RadarDetect.DfsSessionTime = 5;
1216 else if ((strncmp(tmpbuf, "CE", 2) == 0) || (strncmp(tmpbuf, "ce", 2) == 0))
1218 pAd->CommonCfg.RadarDetect.RDDurRegion = CE;
1219 pAd->CommonCfg.RadarDetect.DfsSessionTime = 13;
1223 pAd->CommonCfg.RadarDetect.RDDurRegion = CE;
1224 pAd->CommonCfg.RadarDetect.DfsSessionTime = 13;
1227 DBGPRINT(RT_DEBUG_TRACE, ("RDRegion=%d\n", pAd->CommonCfg.RadarDetect.RDDurRegion));
1231 pAd->CommonCfg.RadarDetect.RDDurRegion = CE;
1232 pAd->CommonCfg.RadarDetect.DfsSessionTime = 13;
1236 if(RTMPGetKeyParameter("WirelessEvent", tmpbuf, 10, buffer))
1238 #if WIRELESS_EXT >= 15
1239 if(simple_strtol(tmpbuf, 0, 10) != 0)
1240 pAd->CommonCfg.bWirelessEvent = simple_strtol(tmpbuf, 0, 10);
1242 pAd->CommonCfg.bWirelessEvent = 0; // disable
1244 pAd->CommonCfg.bWirelessEvent = 0; // disable
1246 DBGPRINT(RT_DEBUG_TRACE, ("WirelessEvent=%d\n", pAd->CommonCfg.bWirelessEvent));
1248 if(RTMPGetKeyParameter("WiFiTest", tmpbuf, 10, buffer))
1250 if(simple_strtol(tmpbuf, 0, 10) != 0)
1251 pAd->CommonCfg.bWiFiTest= simple_strtol(tmpbuf, 0, 10);
1253 pAd->CommonCfg.bWiFiTest = 0; // disable
1255 DBGPRINT(RT_DEBUG_TRACE, ("WiFiTest=%d\n", pAd->CommonCfg.bWiFiTest));
1258 if(RTMPGetKeyParameter("AuthMode", tmpbuf, 128, buffer))
1260 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1262 if ((strcmp(tmpbuf, "WEPAUTO") == 0) || (strcmp(tmpbuf, "wepauto") == 0))
1263 pAd->StaCfg.AuthMode = Ndis802_11AuthModeAutoSwitch;
1264 else if ((strcmp(tmpbuf, "SHARED") == 0) || (strcmp(tmpbuf, "shared") == 0))
1265 pAd->StaCfg.AuthMode = Ndis802_11AuthModeShared;
1266 else if ((strcmp(tmpbuf, "WPAPSK") == 0) || (strcmp(tmpbuf, "wpapsk") == 0))
1267 pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPAPSK;
1268 else if ((strcmp(tmpbuf, "WPANONE") == 0) || (strcmp(tmpbuf, "wpanone") == 0))
1269 pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPANone;
1270 else if ((strcmp(tmpbuf, "WPA2PSK") == 0) || (strcmp(tmpbuf, "wpa2psk") == 0))
1271 pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPA2PSK;
1272 else if ((strcmp(tmpbuf, "WPA") == 0) || (strcmp(tmpbuf, "wpa") == 0))
1273 pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPA;
1274 else if ((strcmp(tmpbuf, "WPA2") == 0) || (strcmp(tmpbuf, "wpa2") == 0))
1275 pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPA2;
1277 pAd->StaCfg.AuthMode = Ndis802_11AuthModeOpen;
1279 pAd->StaCfg.PortSecured = WPA_802_1X_PORT_NOT_SECURED;
1281 DBGPRINT(RT_DEBUG_TRACE, ("%s::(EncrypType=%d)\n", __func__, pAd->StaCfg.WepStatus));
1285 if(RTMPGetKeyParameter("EncrypType", tmpbuf, 128, buffer))
1287 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1289 if ((strcmp(tmpbuf, "WEP") == 0) || (strcmp(tmpbuf, "wep") == 0))
1290 pAd->StaCfg.WepStatus = Ndis802_11WEPEnabled;
1291 else if ((strcmp(tmpbuf, "TKIP") == 0) || (strcmp(tmpbuf, "tkip") == 0))
1292 pAd->StaCfg.WepStatus = Ndis802_11Encryption2Enabled;
1293 else if ((strcmp(tmpbuf, "AES") == 0) || (strcmp(tmpbuf, "aes") == 0))
1294 pAd->StaCfg.WepStatus = Ndis802_11Encryption3Enabled;
1296 pAd->StaCfg.WepStatus = Ndis802_11WEPDisabled;
1298 // Update all wepstatus related
1299 pAd->StaCfg.PairCipher = pAd->StaCfg.WepStatus;
1300 pAd->StaCfg.GroupCipher = pAd->StaCfg.WepStatus;
1301 pAd->StaCfg.OrigWepStatus = pAd->StaCfg.WepStatus;
1302 pAd->StaCfg.bMixCipher = FALSE;
1304 DBGPRINT(RT_DEBUG_TRACE, ("%s::(EncrypType=%d)\n", __func__, pAd->StaCfg.WepStatus));
1308 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1310 if(RTMPGetCriticalParameter("WPAPSK", tmpbuf, 512, buffer))
1314 tmpbuf[strlen(tmpbuf)] = '\0'; // make STA can process .$^& for WPAPSK input
1316 if ((pAd->StaCfg.AuthMode != Ndis802_11AuthModeWPAPSK) &&
1317 (pAd->StaCfg.AuthMode != Ndis802_11AuthModeWPA2PSK) &&
1318 (pAd->StaCfg.AuthMode != Ndis802_11AuthModeWPANone)
1323 else if ((strlen(tmpbuf) >= 8) && (strlen(tmpbuf) < 64))
1325 PasswordHash((char *)tmpbuf, pAd->CommonCfg.Ssid, pAd->CommonCfg.SsidLen, keyMaterial);
1326 NdisMoveMemory(pAd->StaCfg.PMK, keyMaterial, 32);
1329 else if (strlen(tmpbuf) == 64)
1331 AtoH(tmpbuf, keyMaterial, 32);
1332 NdisMoveMemory(pAd->StaCfg.PMK, keyMaterial, 32);
1337 DBGPRINT(RT_DEBUG_ERROR, ("%s::(WPAPSK key-string required 8 ~ 64 characters!)\n", __func__));
1342 if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPAPSK) ||
1343 (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK))
1345 // Start STA supplicant state machine
1346 pAd->StaCfg.WpaState = SS_START;
1348 else if (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPANone)
1350 pAd->StaCfg.WpaState = SS_NOTUSE;
1353 DBGPRINT(RT_DEBUG_TRACE, ("%s::(WPAPSK=%s)\n", __func__, tmpbuf));
1358 //DefaultKeyID, KeyType, KeyStr
1359 rtmp_read_key_parms_from_file(pAd, tmpbuf, buffer);
1361 HTParametersHook(pAd, tmpbuf, buffer);
1363 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1366 if (RTMPGetKeyParameter("PSMode", tmpbuf, 32, buffer))
1368 if (pAd->StaCfg.BssType == BSS_INFRA)
1370 if ((strcmp(tmpbuf, "MAX_PSP") == 0) || (strcmp(tmpbuf, "max_psp") == 0))
1372 // do NOT turn on PSM bit here, wait until MlmeCheckForPsmChange()
1373 // to exclude certain situations.
1374 // MlmeSetPsm(pAd, PWR_SAVE);
1375 OPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM);
1376 if (pAd->StaCfg.bWindowsACCAMEnable == FALSE)
1377 pAd->StaCfg.WindowsPowerMode = Ndis802_11PowerModeMAX_PSP;
1378 pAd->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeMAX_PSP;
1379 pAd->StaCfg.DefaultListenCount = 5;
1381 else if ((strcmp(tmpbuf, "Fast_PSP") == 0) || (strcmp(tmpbuf, "fast_psp") == 0)
1382 || (strcmp(tmpbuf, "FAST_PSP") == 0))
1384 // do NOT turn on PSM bit here, wait until MlmeCheckForPsmChange()
1385 // to exclude certain situations.
1386 // MlmeSetPsmBit(pAd, PWR_SAVE);
1387 OPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM);
1388 if (pAd->StaCfg.bWindowsACCAMEnable == FALSE)
1389 pAd->StaCfg.WindowsPowerMode = Ndis802_11PowerModeFast_PSP;
1390 pAd->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeFast_PSP;
1391 pAd->StaCfg.DefaultListenCount = 3;
1393 else if ((strcmp(tmpbuf, "Legacy_PSP") == 0) || (strcmp(tmpbuf, "legacy_psp") == 0)
1394 || (strcmp(tmpbuf, "LEGACY_PSP") == 0))
1396 // do NOT turn on PSM bit here, wait until MlmeCheckForPsmChange()
1397 // to exclude certain situations.
1398 // MlmeSetPsmBit(pAd, PWR_SAVE);
1399 OPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM);
1400 if (pAd->StaCfg.bWindowsACCAMEnable == FALSE)
1401 pAd->StaCfg.WindowsPowerMode = Ndis802_11PowerModeLegacy_PSP;
1402 pAd->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeLegacy_PSP;
1403 pAd->StaCfg.DefaultListenCount = 3;
1406 { //Default Ndis802_11PowerModeCAM
1407 // clear PSM bit immediately
1408 MlmeSetPsmBit(pAd, PWR_ACTIVE);
1409 OPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM);
1410 if (pAd->StaCfg.bWindowsACCAMEnable == FALSE)
1411 pAd->StaCfg.WindowsPowerMode = Ndis802_11PowerModeCAM;
1412 pAd->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeCAM;
1414 DBGPRINT(RT_DEBUG_TRACE, ("PSMode=%ld\n", pAd->StaCfg.WindowsPowerMode));
1418 if (RTMPGetKeyParameter("FastRoaming", tmpbuf, 32, buffer))
1420 if (simple_strtol(tmpbuf, 0, 10) == 0)
1421 pAd->StaCfg.bFastRoaming = FALSE;
1423 pAd->StaCfg.bFastRoaming = TRUE;
1425 DBGPRINT(RT_DEBUG_TRACE, ("FastRoaming=%d\n", pAd->StaCfg.bFastRoaming));
1428 if (RTMPGetKeyParameter("RoamThreshold", tmpbuf, 32, buffer))
1430 long lInfo = simple_strtol(tmpbuf, 0, 10);
1432 if (lInfo > 90 || lInfo < 60)
1433 pAd->StaCfg.dBmToRoam = -70;
1435 pAd->StaCfg.dBmToRoam = (CHAR)(-1)*lInfo;
1437 DBGPRINT(RT_DEBUG_TRACE, ("RoamThreshold=%d dBm\n", pAd->StaCfg.dBmToRoam));
1440 if(RTMPGetKeyParameter("TGnWifiTest", tmpbuf, 10, buffer))
1442 if(simple_strtol(tmpbuf, 0, 10) == 0)
1443 pAd->StaCfg.bTGnWifiTest = FALSE;
1445 pAd->StaCfg.bTGnWifiTest = TRUE;
1446 DBGPRINT(RT_DEBUG_TRACE, ("TGnWifiTest=%d\n", pAd->StaCfg.bTGnWifiTest));
1453 DBGPRINT(RT_DEBUG_TRACE, ("--> %s does not have a write method\n", src));
1456 retval=filp_close(srcf,NULL);
1460 DBGPRINT(RT_DEBUG_TRACE, ("--> Error %d closing %s\n", -retval, src));
1468 current->cred->fsuid = orgfsuid;
1469 current->cred->fsgid = orgfsgid;
1475 return (NDIS_STATUS_SUCCESS);
1478 static void HTParametersHook(
1479 IN PRTMP_ADAPTER pAd,
1486 if (RTMPGetKeyParameter("HT_PROTECT", pValueStr, 25, pInput))
1488 Value = simple_strtol(pValueStr, 0, 10);
1491 pAd->CommonCfg.bHTProtect = FALSE;
1495 pAd->CommonCfg.bHTProtect = TRUE;
1497 DBGPRINT(RT_DEBUG_TRACE, ("HT: Protection = %s\n", (Value==0) ? "Disable" : "Enable"));
1500 if (RTMPGetKeyParameter("HT_MIMOPSEnable", pValueStr, 25, pInput))
1502 Value = simple_strtol(pValueStr, 0, 10);
1505 pAd->CommonCfg.bMIMOPSEnable = FALSE;
1509 pAd->CommonCfg.bMIMOPSEnable = TRUE;
1511 DBGPRINT(RT_DEBUG_TRACE, ("HT: MIMOPSEnable = %s\n", (Value==0) ? "Disable" : "Enable"));
1515 if (RTMPGetKeyParameter("HT_MIMOPSMode", pValueStr, 25, pInput))
1517 Value = simple_strtol(pValueStr, 0, 10);
1518 if (Value > MMPS_ENABLE)
1520 pAd->CommonCfg.BACapability.field.MMPSmode = MMPS_ENABLE;
1524 //TODO: add mimo power saving mechanism
1525 pAd->CommonCfg.BACapability.field.MMPSmode = MMPS_ENABLE;
1526 //pAd->CommonCfg.BACapability.field.MMPSmode = Value;
1528 DBGPRINT(RT_DEBUG_TRACE, ("HT: MIMOPS Mode = %d\n", Value));
1531 if (RTMPGetKeyParameter("HT_BADecline", pValueStr, 25, pInput))
1533 Value = simple_strtol(pValueStr, 0, 10);
1536 pAd->CommonCfg.bBADecline = FALSE;
1540 pAd->CommonCfg.bBADecline = TRUE;
1542 DBGPRINT(RT_DEBUG_TRACE, ("HT: BA Decline = %s\n", (Value==0) ? "Disable" : "Enable"));
1546 if (RTMPGetKeyParameter("HT_DisableReordering", pValueStr, 25, pInput))
1548 Value = simple_strtol(pValueStr, 0, 10);
1551 pAd->CommonCfg.bDisableReordering = FALSE;
1555 pAd->CommonCfg.bDisableReordering = TRUE;
1557 DBGPRINT(RT_DEBUG_TRACE, ("HT: DisableReordering = %s\n", (Value==0) ? "Disable" : "Enable"));
1560 if (RTMPGetKeyParameter("HT_AutoBA", pValueStr, 25, pInput))
1562 Value = simple_strtol(pValueStr, 0, 10);
1565 pAd->CommonCfg.BACapability.field.AutoBA = FALSE;
1569 pAd->CommonCfg.BACapability.field.AutoBA = TRUE;
1571 pAd->CommonCfg.REGBACapability.field.AutoBA = pAd->CommonCfg.BACapability.field.AutoBA;
1572 DBGPRINT(RT_DEBUG_TRACE, ("HT: Auto BA = %s\n", (Value==0) ? "Disable" : "Enable"));
1576 if (RTMPGetKeyParameter("HT_HTC", pValueStr, 25, pInput))
1578 Value = simple_strtol(pValueStr, 0, 10);
1581 pAd->HTCEnable = FALSE;
1585 pAd->HTCEnable = TRUE;
1587 DBGPRINT(RT_DEBUG_TRACE, ("HT: Tx +HTC frame = %s\n", (Value==0) ? "Disable" : "Enable"));
1590 // Enable HT Link Adaptation Control
1591 if (RTMPGetKeyParameter("HT_LinkAdapt", pValueStr, 25, pInput))
1593 Value = simple_strtol(pValueStr, 0, 10);
1596 pAd->bLinkAdapt = FALSE;
1600 pAd->HTCEnable = TRUE;
1601 pAd->bLinkAdapt = TRUE;
1603 DBGPRINT(RT_DEBUG_TRACE, ("HT: Link Adaptation Control = %s\n", (Value==0) ? "Disable" : "Enable(+HTC)"));
1606 // Reverse Direction Mechanism
1607 if (RTMPGetKeyParameter("HT_RDG", pValueStr, 25, pInput))
1609 Value = simple_strtol(pValueStr, 0, 10);
1612 pAd->CommonCfg.bRdg = FALSE;
1616 pAd->HTCEnable = TRUE;
1617 pAd->CommonCfg.bRdg = TRUE;
1619 DBGPRINT(RT_DEBUG_TRACE, ("HT: RDG = %s\n", (Value==0) ? "Disable" : "Enable(+HTC)"));
1626 if (RTMPGetKeyParameter("HT_AMSDU", pValueStr, 25, pInput))
1628 Value = simple_strtol(pValueStr, 0, 10);
1631 pAd->CommonCfg.BACapability.field.AmsduEnable = FALSE;
1635 pAd->CommonCfg.BACapability.field.AmsduEnable = TRUE;
1637 DBGPRINT(RT_DEBUG_TRACE, ("HT: Tx A-MSDU = %s\n", (Value==0) ? "Disable" : "Enable"));
1641 if (RTMPGetKeyParameter("HT_MpduDensity", pValueStr, 25, pInput))
1643 Value = simple_strtol(pValueStr, 0, 10);
1644 if (Value <=7 && Value >= 0)
1646 pAd->CommonCfg.BACapability.field.MpduDensity = Value;
1647 DBGPRINT(RT_DEBUG_TRACE, ("HT: MPDU Density = %d\n", Value));
1651 pAd->CommonCfg.BACapability.field.MpduDensity = 4;
1652 DBGPRINT(RT_DEBUG_TRACE, ("HT: MPDU Density = %d (Default)\n", 4));
1656 // Max Rx BA Window Size
1657 if (RTMPGetKeyParameter("HT_BAWinSize", pValueStr, 25, pInput))
1659 Value = simple_strtol(pValueStr, 0, 10);
1661 if (Value >=1 && Value <= 64)
1663 pAd->CommonCfg.REGBACapability.field.RxBAWinLimit = Value;
1664 pAd->CommonCfg.BACapability.field.RxBAWinLimit = Value;
1665 DBGPRINT(RT_DEBUG_TRACE, ("HT: BA Windw Size = %d\n", Value));
1669 pAd->CommonCfg.REGBACapability.field.RxBAWinLimit = 64;
1670 pAd->CommonCfg.BACapability.field.RxBAWinLimit = 64;
1671 DBGPRINT(RT_DEBUG_TRACE, ("HT: BA Windw Size = 64 (Defualt)\n"));
1677 if (RTMPGetKeyParameter("HT_GI", pValueStr, 25, pInput))
1679 Value = simple_strtol(pValueStr, 0, 10);
1681 if (Value == GI_400)
1683 pAd->CommonCfg.RegTransmitSetting.field.ShortGI = GI_400;
1687 pAd->CommonCfg.RegTransmitSetting.field.ShortGI = GI_800;
1690 DBGPRINT(RT_DEBUG_TRACE, ("HT: Guard Interval = %s\n", (Value==GI_400) ? "400" : "800" ));
1693 // HT Operation Mode : Mixed Mode , Green Field
1694 if (RTMPGetKeyParameter("HT_OpMode", pValueStr, 25, pInput))
1696 Value = simple_strtol(pValueStr, 0, 10);
1698 if (Value == HTMODE_GF)
1701 pAd->CommonCfg.RegTransmitSetting.field.HTMODE = HTMODE_GF;
1705 pAd->CommonCfg.RegTransmitSetting.field.HTMODE = HTMODE_MM;
1708 DBGPRINT(RT_DEBUG_TRACE, ("HT: Operate Mode = %s\n", (Value==HTMODE_GF) ? "Green Field" : "Mixed Mode" ));
1711 // Fixed Tx mode : CCK, OFDM
1712 if (RTMPGetKeyParameter("FixedTxMode", pValueStr, 25, pInput))
1716 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1718 fix_tx_mode = FIXED_TXMODE_HT;
1720 if (strcmp(pValueStr, "OFDM") == 0 || strcmp(pValueStr, "ofdm") == 0)
1722 fix_tx_mode = FIXED_TXMODE_OFDM;
1724 else if (strcmp(pValueStr, "CCK") == 0 || strcmp(pValueStr, "cck") == 0)
1726 fix_tx_mode = FIXED_TXMODE_CCK;
1728 else if (strcmp(pValueStr, "HT") == 0 || strcmp(pValueStr, "ht") == 0)
1730 fix_tx_mode = FIXED_TXMODE_HT;
1734 Value = simple_strtol(pValueStr, 0, 10);
1738 if (Value == FIXED_TXMODE_CCK || Value == FIXED_TXMODE_OFDM)
1739 fix_tx_mode = Value;
1741 fix_tx_mode = FIXED_TXMODE_HT;
1744 pAd->StaCfg.DesiredTransmitSetting.field.FixedTxMode = fix_tx_mode;
1745 DBGPRINT(RT_DEBUG_TRACE, ("Fixed Tx Mode = %d\n", fix_tx_mode));
1752 if (RTMPGetKeyParameter("HT_BW", pValueStr, 25, pInput))
1754 Value = simple_strtol(pValueStr, 0, 10);
1758 pAd->CommonCfg.RegTransmitSetting.field.BW = BW_40;
1762 pAd->CommonCfg.RegTransmitSetting.field.BW = BW_20;
1765 #ifdef MCAST_RATE_SPECIFIC
1766 pAd->CommonCfg.MCastPhyMode.field.BW = pAd->CommonCfg.RegTransmitSetting.field.BW;
1767 #endif // MCAST_RATE_SPECIFIC //
1769 DBGPRINT(RT_DEBUG_TRACE, ("HT: Channel Width = %s\n", (Value==BW_40) ? "40 MHz" : "20 MHz" ));
1772 if (RTMPGetKeyParameter("HT_EXTCHA", pValueStr, 25, pInput))
1774 Value = simple_strtol(pValueStr, 0, 10);
1779 pAd->CommonCfg.RegTransmitSetting.field.EXTCHA = EXTCHA_BELOW;
1783 pAd->CommonCfg.RegTransmitSetting.field.EXTCHA = EXTCHA_ABOVE;
1786 DBGPRINT(RT_DEBUG_TRACE, ("HT: Ext Channel = %s\n", (Value==0) ? "BELOW" : "ABOVE" ));
1790 if (RTMPGetKeyParameter("HT_MCS", pValueStr, 50, pInput))
1792 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1794 Value = simple_strtol(pValueStr, 0, 10);
1796 if ((Value >= 0 && Value <= 23) || (Value == 32)) // 3*3
1798 pAd->StaCfg.DesiredTransmitSetting.field.MCS = Value;
1799 pAd->StaCfg.bAutoTxRateSwitch = FALSE;
1800 DBGPRINT(RT_DEBUG_TRACE, ("HT: MCS = %d\n", pAd->StaCfg.DesiredTransmitSetting.field.MCS));
1804 pAd->StaCfg.DesiredTransmitSetting.field.MCS = MCS_AUTO;
1805 pAd->StaCfg.bAutoTxRateSwitch = TRUE;
1806 DBGPRINT(RT_DEBUG_TRACE, ("HT: MCS = AUTO\n"));
1812 if (RTMPGetKeyParameter("HT_STBC", pValueStr, 25, pInput))
1814 Value = simple_strtol(pValueStr, 0, 10);
1815 if (Value == STBC_USE)
1817 pAd->CommonCfg.RegTransmitSetting.field.STBC = STBC_USE;
1821 pAd->CommonCfg.RegTransmitSetting.field.STBC = STBC_NONE;
1823 DBGPRINT(RT_DEBUG_TRACE, ("HT: STBC = %d\n", pAd->CommonCfg.RegTransmitSetting.field.STBC));
1826 // 40_Mhz_Intolerant
1827 if (RTMPGetKeyParameter("HT_40MHZ_INTOLERANT", pValueStr, 25, pInput))
1829 Value = simple_strtol(pValueStr, 0, 10);
1832 pAd->CommonCfg.bForty_Mhz_Intolerant = FALSE;
1836 pAd->CommonCfg.bForty_Mhz_Intolerant = TRUE;
1838 DBGPRINT(RT_DEBUG_TRACE, ("HT: 40MHZ INTOLERANT = %d\n", pAd->CommonCfg.bForty_Mhz_Intolerant));
1841 if(RTMPGetKeyParameter("HT_TxStream", pValueStr, 10, pInput))
1843 switch (simple_strtol(pValueStr, 0, 10))
1846 pAd->CommonCfg.TxStream = 1;
1849 pAd->CommonCfg.TxStream = 2;
1853 pAd->CommonCfg.TxStream = 3;
1855 if (pAd->MACVersion < RALINK_2883_VERSION)
1856 pAd->CommonCfg.TxStream = 2; // only 2 tx streams for RT2860 series
1859 DBGPRINT(RT_DEBUG_TRACE, ("HT: Tx Stream = %d\n", pAd->CommonCfg.TxStream));
1862 if(RTMPGetKeyParameter("HT_RxStream", pValueStr, 10, pInput))
1864 switch (simple_strtol(pValueStr, 0, 10))
1867 pAd->CommonCfg.RxStream = 1;
1870 pAd->CommonCfg.RxStream = 2;
1874 pAd->CommonCfg.RxStream = 3;
1876 if (pAd->MACVersion < RALINK_2883_VERSION)
1877 pAd->CommonCfg.RxStream = 2; // only 2 rx streams for RT2860 series
1880 DBGPRINT(RT_DEBUG_TRACE, ("HT: Rx Stream = %d\n", pAd->CommonCfg.RxStream));