2322 lines
63 KiB
C
2322 lines
63 KiB
C
|
/*
|
||
|
*************************************************************************
|
||
|
* Ralink Tech Inc.
|
||
|
* 5F., No.36, Taiyuan St., Jhubei City,
|
||
|
* Hsinchu County 302,
|
||
|
* Taiwan, R.O.C.
|
||
|
*
|
||
|
* (c) Copyright 2002-2007, Ralink Technology, Inc.
|
||
|
*
|
||
|
* This program is free software; you can redistribute it and/or modify *
|
||
|
* it under the terms of the GNU General Public License as published by *
|
||
|
* the Free Software Foundation; either version 2 of the License, or *
|
||
|
* (at your option) any later version. *
|
||
|
* *
|
||
|
* This program is distributed in the hope that it will be useful, *
|
||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||
|
* GNU General Public License for more details. *
|
||
|
* *
|
||
|
* You should have received a copy of the GNU General Public License *
|
||
|
* along with this program; if not, write to the *
|
||
|
* Free Software Foundation, Inc., *
|
||
|
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
|
||
|
* *
|
||
|
*************************************************************************
|
||
|
|
||
|
Module Name:
|
||
|
cmm_profile.c
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
Revision History:
|
||
|
Who When What
|
||
|
--------- ---------- ----------------------------------------------
|
||
|
*/
|
||
|
|
||
|
#include "../rt_config.h"
|
||
|
|
||
|
|
||
|
#define ETH_MAC_ADDR_STR_LEN 17 // in format of xx:xx:xx:xx:xx:xx
|
||
|
|
||
|
// We assume the s1 is a sting, s2 is a memory space with 6 bytes. and content of s1 will be changed.
|
||
|
BOOLEAN rtstrmactohex(PSTRING s1, PSTRING s2)
|
||
|
{
|
||
|
int i = 0;
|
||
|
PSTRING ptokS = s1, ptokE = s1;
|
||
|
|
||
|
if (strlen(s1) != ETH_MAC_ADDR_STR_LEN)
|
||
|
return FALSE;
|
||
|
|
||
|
while((*ptokS) != '\0')
|
||
|
{
|
||
|
if((ptokE = strchr(ptokS, ':')) != NULL)
|
||
|
*ptokE++ = '\0';
|
||
|
if ((strlen(ptokS) != 2) || (!isxdigit(*ptokS)) || (!isxdigit(*(ptokS+1))))
|
||
|
break; // fail
|
||
|
AtoH(ptokS, (PUCHAR)&s2[i++], 1);
|
||
|
ptokS = ptokE;
|
||
|
if (i == 6)
|
||
|
break; // parsing finished
|
||
|
}
|
||
|
|
||
|
return ( i == 6 ? TRUE : FALSE);
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
// we assume the s1 and s2 both are strings.
|
||
|
BOOLEAN rtstrcasecmp(PSTRING s1, PSTRING s2)
|
||
|
{
|
||
|
PSTRING p1 = s1, p2 = s2;
|
||
|
|
||
|
if (strlen(s1) != strlen(s2))
|
||
|
return FALSE;
|
||
|
|
||
|
while(*p1 != '\0')
|
||
|
{
|
||
|
if((*p1 != *p2) && ((*p1 ^ *p2) != 0x20))
|
||
|
return FALSE;
|
||
|
p1++;
|
||
|
p2++;
|
||
|
}
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
// we assume the s1 (buffer) and s2 (key) both are strings.
|
||
|
PSTRING rtstrstruncasecmp(PSTRING s1, PSTRING s2)
|
||
|
{
|
||
|
INT l1, l2, i;
|
||
|
char temp1, temp2;
|
||
|
|
||
|
l2 = strlen(s2);
|
||
|
if (!l2)
|
||
|
return (char *) s1;
|
||
|
|
||
|
l1 = strlen(s1);
|
||
|
|
||
|
while (l1 >= l2)
|
||
|
{
|
||
|
l1--;
|
||
|
|
||
|
for(i=0; i<l2; i++)
|
||
|
{
|
||
|
temp1 = *(s1+i);
|
||
|
temp2 = *(s2+i);
|
||
|
|
||
|
if (('a' <= temp1) && (temp1 <= 'z'))
|
||
|
temp1 = 'A'+(temp1-'a');
|
||
|
if (('a' <= temp2) && (temp2 <= 'z'))
|
||
|
temp2 = 'A'+(temp2-'a');
|
||
|
|
||
|
if (temp1 != temp2)
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
if (i == l2)
|
||
|
return (char *) s1;
|
||
|
|
||
|
s1++;
|
||
|
}
|
||
|
|
||
|
return NULL; // not found
|
||
|
}
|
||
|
|
||
|
//add by kathy
|
||
|
|
||
|
/**
|
||
|
* strstr - Find the first substring in a %NUL terminated string
|
||
|
* @s1: The string to be searched
|
||
|
* @s2: The string to search for
|
||
|
*/
|
||
|
PSTRING rtstrstr(PSTRING s1,const PSTRING s2)
|
||
|
{
|
||
|
INT l1, l2;
|
||
|
|
||
|
l2 = strlen(s2);
|
||
|
if (!l2)
|
||
|
return s1;
|
||
|
|
||
|
l1 = strlen(s1);
|
||
|
|
||
|
while (l1 >= l2)
|
||
|
{
|
||
|
l1--;
|
||
|
if (!memcmp(s1,s2,l2))
|
||
|
return s1;
|
||
|
s1++;
|
||
|
}
|
||
|
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* rstrtok - Split a string into tokens
|
||
|
* @s: The string to be searched
|
||
|
* @ct: The characters to search for
|
||
|
* * WARNING: strtok is deprecated, use strsep instead. However strsep is not compatible with old architecture.
|
||
|
*/
|
||
|
PSTRING __rstrtok;
|
||
|
PSTRING rstrtok(PSTRING s,const PSTRING ct)
|
||
|
{
|
||
|
PSTRING sbegin, send;
|
||
|
|
||
|
sbegin = s ? s : __rstrtok;
|
||
|
if (!sbegin)
|
||
|
{
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
sbegin += strspn(sbegin,ct);
|
||
|
if (*sbegin == '\0')
|
||
|
{
|
||
|
__rstrtok = NULL;
|
||
|
return( NULL );
|
||
|
}
|
||
|
|
||
|
send = strpbrk( sbegin, ct);
|
||
|
if (send && *send != '\0')
|
||
|
*send++ = '\0';
|
||
|
|
||
|
__rstrtok = send;
|
||
|
|
||
|
return (sbegin);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* delimitcnt - return the count of a given delimiter in a given string.
|
||
|
* @s: The string to be searched.
|
||
|
* @ct: The delimiter to search for.
|
||
|
* Notice : We suppose the delimiter is a single-char string(for example : ";").
|
||
|
*/
|
||
|
INT delimitcnt(PSTRING s,PSTRING ct)
|
||
|
{
|
||
|
INT count = 0;
|
||
|
/* point to the beginning of the line */
|
||
|
PSTRING token = s;
|
||
|
|
||
|
for ( ;; )
|
||
|
{
|
||
|
token = strpbrk(token, ct); /* search for delimiters */
|
||
|
|
||
|
if ( token == NULL )
|
||
|
{
|
||
|
/* advanced to the terminating null character */
|
||
|
break;
|
||
|
}
|
||
|
/* skip the delimiter */
|
||
|
++token;
|
||
|
|
||
|
/*
|
||
|
* Print the found text: use len with %.*s to specify field width.
|
||
|
*/
|
||
|
|
||
|
/* accumulate delimiter count */
|
||
|
++count;
|
||
|
}
|
||
|
return count;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* converts the Internet host address from the standard numbers-and-dots notation
|
||
|
* into binary data.
|
||
|
* returns nonzero if the address is valid, zero if not.
|
||
|
*/
|
||
|
int rtinet_aton(PSTRING cp, unsigned int *addr)
|
||
|
{
|
||
|
unsigned int val;
|
||
|
int base, n;
|
||
|
STRING c;
|
||
|
unsigned int parts[4];
|
||
|
unsigned int *pp = parts;
|
||
|
|
||
|
for (;;)
|
||
|
{
|
||
|
/*
|
||
|
* Collect number up to ``.''.
|
||
|
* Values are specified as for C:
|
||
|
* 0x=hex, 0=octal, other=decimal.
|
||
|
*/
|
||
|
val = 0;
|
||
|
base = 10;
|
||
|
if (*cp == '0')
|
||
|
{
|
||
|
if (*++cp == 'x' || *cp == 'X')
|
||
|
base = 16, cp++;
|
||
|
else
|
||
|
base = 8;
|
||
|
}
|
||
|
while ((c = *cp) != '\0')
|
||
|
{
|
||
|
if (isdigit((unsigned char) c))
|
||
|
{
|
||
|
val = (val * base) + (c - '0');
|
||
|
cp++;
|
||
|
continue;
|
||
|
}
|
||
|
if (base == 16 && isxdigit((unsigned char) c))
|
||
|
{
|
||
|
val = (val << 4) +
|
||
|
(c + 10 - (islower((unsigned char) c) ? 'a' : 'A'));
|
||
|
cp++;
|
||
|
continue;
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
if (*cp == '.')
|
||
|
{
|
||
|
/*
|
||
|
* Internet format: a.b.c.d a.b.c (with c treated as 16-bits)
|
||
|
* a.b (with b treated as 24 bits)
|
||
|
*/
|
||
|
if (pp >= parts + 3 || val > 0xff)
|
||
|
return 0;
|
||
|
*pp++ = val, cp++;
|
||
|
}
|
||
|
else
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* Check for trailing junk.
|
||
|
*/
|
||
|
while (*cp)
|
||
|
if (!isspace((unsigned char) *cp++))
|
||
|
return 0;
|
||
|
|
||
|
/*
|
||
|
* Concoct the address according to the number of parts specified.
|
||
|
*/
|
||
|
n = pp - parts + 1;
|
||
|
switch (n)
|
||
|
{
|
||
|
|
||
|
case 1: /* a -- 32 bits */
|
||
|
break;
|
||
|
|
||
|
case 2: /* a.b -- 8.24 bits */
|
||
|
if (val > 0xffffff)
|
||
|
return 0;
|
||
|
val |= parts[0] << 24;
|
||
|
break;
|
||
|
|
||
|
case 3: /* a.b.c -- 8.8.16 bits */
|
||
|
if (val > 0xffff)
|
||
|
return 0;
|
||
|
val |= (parts[0] << 24) | (parts[1] << 16);
|
||
|
break;
|
||
|
|
||
|
case 4: /* a.b.c.d -- 8.8.8.8 bits */
|
||
|
if (val > 0xff)
|
||
|
return 0;
|
||
|
val |= (parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8);
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
*addr = htonl(val);
|
||
|
return 1;
|
||
|
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
========================================================================
|
||
|
|
||
|
Routine Description:
|
||
|
Find key section for Get key parameter.
|
||
|
|
||
|
Arguments:
|
||
|
buffer Pointer to the buffer to start find the key section
|
||
|
section the key of the secion to be find
|
||
|
|
||
|
Return Value:
|
||
|
NULL Fail
|
||
|
Others Success
|
||
|
========================================================================
|
||
|
*/
|
||
|
PSTRING RTMPFindSection(
|
||
|
IN PSTRING buffer)
|
||
|
{
|
||
|
STRING temp_buf[32];
|
||
|
PSTRING ptr;
|
||
|
|
||
|
strcpy(temp_buf, "Default");
|
||
|
|
||
|
if((ptr = rtstrstr(buffer, temp_buf)) != NULL)
|
||
|
return (ptr+strlen("\n"));
|
||
|
else
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
========================================================================
|
||
|
|
||
|
Routine Description:
|
||
|
Get key parameter.
|
||
|
|
||
|
Arguments:
|
||
|
key Pointer to key string
|
||
|
dest Pointer to destination
|
||
|
destsize The datasize of the destination
|
||
|
buffer Pointer to the buffer to start find the key
|
||
|
bTrimSpace Set true if you want to strip the space character of the result pattern
|
||
|
|
||
|
Return Value:
|
||
|
TRUE Success
|
||
|
FALSE Fail
|
||
|
|
||
|
Note:
|
||
|
This routine get the value with the matched key (case case-sensitive)
|
||
|
For SSID and security key related parameters, we SHALL NOT trim the space(' ') character.
|
||
|
========================================================================
|
||
|
*/
|
||
|
INT RTMPGetKeyParameter(
|
||
|
IN PSTRING key,
|
||
|
OUT PSTRING dest,
|
||
|
IN INT destsize,
|
||
|
IN PSTRING buffer,
|
||
|
IN BOOLEAN bTrimSpace)
|
||
|
{
|
||
|
PSTRING pMemBuf, temp_buf1 = NULL, temp_buf2 = NULL;
|
||
|
PSTRING start_ptr, end_ptr;
|
||
|
PSTRING ptr;
|
||
|
PSTRING offset = NULL;
|
||
|
INT len, keyLen;
|
||
|
|
||
|
|
||
|
keyLen = strlen(key);
|
||
|
os_alloc_mem(NULL, (PUCHAR *)&pMemBuf, MAX_PARAM_BUFFER_SIZE * 2);
|
||
|
if (pMemBuf == NULL)
|
||
|
return (FALSE);
|
||
|
|
||
|
memset(pMemBuf, 0, MAX_PARAM_BUFFER_SIZE * 2);
|
||
|
temp_buf1 = pMemBuf;
|
||
|
temp_buf2 = (PSTRING)(pMemBuf + MAX_PARAM_BUFFER_SIZE);
|
||
|
|
||
|
|
||
|
//find section
|
||
|
if((offset = RTMPFindSection(buffer)) == NULL)
|
||
|
{
|
||
|
os_free_mem(NULL, (PUCHAR)pMemBuf);
|
||
|
return (FALSE);
|
||
|
}
|
||
|
|
||
|
strcpy(temp_buf1, "\n");
|
||
|
strcat(temp_buf1, key);
|
||
|
strcat(temp_buf1, "=");
|
||
|
|
||
|
//search key
|
||
|
if((start_ptr=rtstrstr(offset, temp_buf1)) == NULL)
|
||
|
{
|
||
|
os_free_mem(NULL, (PUCHAR)pMemBuf);
|
||
|
return (FALSE);
|
||
|
}
|
||
|
|
||
|
start_ptr += strlen("\n");
|
||
|
if((end_ptr = rtstrstr(start_ptr, "\n"))==NULL)
|
||
|
end_ptr = start_ptr+strlen(start_ptr);
|
||
|
|
||
|
if (end_ptr<start_ptr)
|
||
|
{
|
||
|
os_free_mem(NULL, (PUCHAR)pMemBuf);
|
||
|
return (FALSE);
|
||
|
}
|
||
|
|
||
|
NdisMoveMemory(temp_buf2, start_ptr, end_ptr-start_ptr);
|
||
|
temp_buf2[end_ptr-start_ptr]='\0';
|
||
|
if((start_ptr=rtstrstr(temp_buf2, "=")) == NULL)
|
||
|
{
|
||
|
os_free_mem(NULL, (PUCHAR)pMemBuf);
|
||
|
return (FALSE);
|
||
|
}
|
||
|
ptr = (start_ptr +1);
|
||
|
//trim special characters, i.e., TAB or space
|
||
|
while(*start_ptr != 0x00)
|
||
|
{
|
||
|
if( ((*ptr == ' ') && bTrimSpace) || (*ptr == '\t') )
|
||
|
ptr++;
|
||
|
else
|
||
|
break;
|
||
|
}
|
||
|
len = strlen(start_ptr);
|
||
|
|
||
|
memset(dest, 0x00, destsize);
|
||
|
strncpy(dest, ptr, ((len >= destsize) ? destsize: len));
|
||
|
|
||
|
os_free_mem(NULL, (PUCHAR)pMemBuf);
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
|
||
|
/*
|
||
|
========================================================================
|
||
|
|
||
|
Routine Description:
|
||
|
Get multiple key parameter.
|
||
|
|
||
|
Arguments:
|
||
|
key Pointer to key string
|
||
|
dest Pointer to destination
|
||
|
destsize The datasize of the destination
|
||
|
buffer Pointer to the buffer to start find the key
|
||
|
|
||
|
Return Value:
|
||
|
TRUE Success
|
||
|
FALSE Fail
|
||
|
|
||
|
Note:
|
||
|
This routine get the value with the matched key (case case-sensitive)
|
||
|
========================================================================
|
||
|
*/
|
||
|
INT RTMPGetKeyParameterWithOffset(
|
||
|
IN PSTRING key,
|
||
|
OUT PSTRING dest,
|
||
|
OUT USHORT *end_offset,
|
||
|
IN INT destsize,
|
||
|
IN PSTRING buffer,
|
||
|
IN BOOLEAN bTrimSpace)
|
||
|
{
|
||
|
PSTRING temp_buf1 = NULL;
|
||
|
PSTRING temp_buf2 = NULL;
|
||
|
PSTRING start_ptr;
|
||
|
PSTRING end_ptr;
|
||
|
PSTRING ptr;
|
||
|
PSTRING offset = 0;
|
||
|
INT len;
|
||
|
|
||
|
if (*end_offset >= MAX_INI_BUFFER_SIZE)
|
||
|
return (FALSE);
|
||
|
|
||
|
os_alloc_mem(NULL, (PUCHAR *)&temp_buf1, MAX_PARAM_BUFFER_SIZE);
|
||
|
|
||
|
if(temp_buf1 == NULL)
|
||
|
return (FALSE);
|
||
|
|
||
|
os_alloc_mem(NULL, (PUCHAR *)&temp_buf2, MAX_PARAM_BUFFER_SIZE);
|
||
|
if(temp_buf2 == NULL)
|
||
|
{
|
||
|
os_free_mem(NULL, (PUCHAR)temp_buf1);
|
||
|
return (FALSE);
|
||
|
}
|
||
|
|
||
|
//find section
|
||
|
if(*end_offset == 0)
|
||
|
{
|
||
|
if ((offset = RTMPFindSection(buffer)) == NULL)
|
||
|
{
|
||
|
os_free_mem(NULL, (PUCHAR)temp_buf1);
|
||
|
os_free_mem(NULL, (PUCHAR)temp_buf2);
|
||
|
return (FALSE);
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
offset = buffer + (*end_offset);
|
||
|
|
||
|
strcpy(temp_buf1, "\n");
|
||
|
strcat(temp_buf1, key);
|
||
|
strcat(temp_buf1, "=");
|
||
|
|
||
|
//search key
|
||
|
if((start_ptr=rtstrstr(offset, temp_buf1))==NULL)
|
||
|
{
|
||
|
os_free_mem(NULL, (PUCHAR)temp_buf1);
|
||
|
os_free_mem(NULL, (PUCHAR)temp_buf2);
|
||
|
return (FALSE);
|
||
|
}
|
||
|
|
||
|
start_ptr+=strlen("\n");
|
||
|
if((end_ptr=rtstrstr(start_ptr, "\n"))==NULL)
|
||
|
end_ptr=start_ptr+strlen(start_ptr);
|
||
|
|
||
|
if (end_ptr<start_ptr)
|
||
|
{
|
||
|
os_free_mem(NULL, (PUCHAR)temp_buf1);
|
||
|
os_free_mem(NULL, (PUCHAR)temp_buf2);
|
||
|
return (FALSE);
|
||
|
}
|
||
|
|
||
|
*end_offset = end_ptr - buffer;
|
||
|
|
||
|
NdisMoveMemory(temp_buf2, start_ptr, end_ptr-start_ptr);
|
||
|
temp_buf2[end_ptr-start_ptr]='\0';
|
||
|
len = strlen(temp_buf2);
|
||
|
strcpy(temp_buf1, temp_buf2);
|
||
|
if((start_ptr=rtstrstr(temp_buf1, "=")) == NULL)
|
||
|
{
|
||
|
os_free_mem(NULL, (PUCHAR)temp_buf1);
|
||
|
os_free_mem(NULL, (PUCHAR)temp_buf2);
|
||
|
return (FALSE);
|
||
|
}
|
||
|
|
||
|
strcpy(temp_buf2, start_ptr+1);
|
||
|
ptr = temp_buf2;
|
||
|
//trim space or tab
|
||
|
while(*ptr != 0x00)
|
||
|
{
|
||
|
if((bTrimSpace && (*ptr == ' ')) || (*ptr == '\t') )
|
||
|
ptr++;
|
||
|
else
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
len = strlen(ptr);
|
||
|
memset(dest, 0x00, destsize);
|
||
|
strncpy(dest, ptr, len >= destsize ? destsize: len);
|
||
|
|
||
|
os_free_mem(NULL, (PUCHAR)temp_buf1);
|
||
|
os_free_mem(NULL, (PUCHAR)temp_buf2);
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
|
||
|
static int rtmp_parse_key_buffer_from_file(IN PRTMP_ADAPTER pAd,IN PSTRING buffer,IN ULONG KeyType,IN INT BSSIdx,IN INT KeyIdx)
|
||
|
{
|
||
|
PSTRING keybuff;
|
||
|
//INT i = BSSIdx, idx = KeyIdx, retVal;
|
||
|
ULONG KeyLen;
|
||
|
//UCHAR CipherAlg = CIPHER_WEP64;
|
||
|
CIPHER_KEY *pSharedKey;
|
||
|
|
||
|
keybuff = buffer;
|
||
|
KeyLen = strlen(keybuff);
|
||
|
pSharedKey = &pAd->SharedKey[BSSIdx][KeyIdx];
|
||
|
|
||
|
if(((KeyType != 0) && (KeyType != 1)) ||
|
||
|
((KeyType == 0) && (KeyLen != 10) && (KeyLen != 26)) ||
|
||
|
((KeyType== 1) && (KeyLen != 5) && (KeyLen != 13)))
|
||
|
{
|
||
|
DBGPRINT(RT_DEBUG_ERROR, ("Key%dStr is Invalid key length(%ld) or Type(%ld)\n",
|
||
|
KeyIdx+1, KeyLen, KeyType));
|
||
|
return FALSE;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
return RT_CfgSetWepKey(pAd, buffer, pSharedKey, KeyIdx);
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
static void rtmp_read_key_parms_from_file(IN PRTMP_ADAPTER pAd, PSTRING tmpbuf, PSTRING buffer)
|
||
|
{
|
||
|
STRING tok_str[16];
|
||
|
PSTRING macptr;
|
||
|
INT i = 0, idx;
|
||
|
ULONG KeyType[MAX_MBSSID_NUM];
|
||
|
ULONG KeyIdx;
|
||
|
|
||
|
NdisZeroMemory(KeyType, sizeof(KeyType));
|
||
|
|
||
|
//DefaultKeyID
|
||
|
if(RTMPGetKeyParameter("DefaultKeyID", tmpbuf, 25, buffer, TRUE))
|
||
|
{
|
||
|
|
||
|
#ifdef CONFIG_STA_SUPPORT
|
||
|
IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
|
||
|
{
|
||
|
KeyIdx = simple_strtol(tmpbuf, 0, 10);
|
||
|
if((KeyIdx >= 1 ) && (KeyIdx <= 4))
|
||
|
pAd->StaCfg.DefaultKeyId = (UCHAR) (KeyIdx - 1);
|
||
|
else
|
||
|
pAd->StaCfg.DefaultKeyId = 0;
|
||
|
|
||
|
DBGPRINT(RT_DEBUG_TRACE, ("DefaultKeyID(0~3)=%d\n", pAd->StaCfg.DefaultKeyId));
|
||
|
}
|
||
|
#endif // CONFIG_STA_SUPPORT //
|
||
|
}
|
||
|
|
||
|
|
||
|
for (idx = 0; idx < 4; idx++)
|
||
|
{
|
||
|
sprintf(tok_str, "Key%dType", idx + 1);
|
||
|
//Key1Type
|
||
|
if (RTMPGetKeyParameter(tok_str, tmpbuf, 128, buffer, TRUE))
|
||
|
{
|
||
|
for (i = 0, macptr = rstrtok(tmpbuf,";"); macptr; macptr = rstrtok(NULL,";"), i++)
|
||
|
{
|
||
|
/*
|
||
|
do sanity check for KeyType length;
|
||
|
or in station mode, the KeyType length > 1,
|
||
|
the code will overwrite the stack of caller
|
||
|
(RTMPSetProfileParameters) and cause srcbuf = NULL
|
||
|
*/
|
||
|
if (i < MAX_MBSSID_NUM)
|
||
|
KeyType[i] = simple_strtol(macptr, 0, 10);
|
||
|
}
|
||
|
|
||
|
#ifdef CONFIG_STA_SUPPORT
|
||
|
IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
|
||
|
{
|
||
|
sprintf(tok_str, "Key%dStr", idx + 1);
|
||
|
if (RTMPGetKeyParameter(tok_str, tmpbuf, 128, buffer, FALSE))
|
||
|
{
|
||
|
rtmp_parse_key_buffer_from_file(pAd, tmpbuf, KeyType[BSS0], BSS0, idx);
|
||
|
}
|
||
|
}
|
||
|
#endif // CONFIG_STA_SUPPORT //
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
#ifdef CONFIG_STA_SUPPORT
|
||
|
static void rtmp_read_sta_wmm_parms_from_file(IN PRTMP_ADAPTER pAd, char *tmpbuf, char *buffer)
|
||
|
{
|
||
|
PSTRING macptr;
|
||
|
INT i=0;
|
||
|
BOOLEAN bWmmEnable = FALSE;
|
||
|
|
||
|
//WmmCapable
|
||
|
if(RTMPGetKeyParameter("WmmCapable", tmpbuf, 32, buffer, TRUE))
|
||
|
{
|
||
|
if(simple_strtol(tmpbuf, 0, 10) != 0) //Enable
|
||
|
{
|
||
|
pAd->CommonCfg.bWmmCapable = TRUE;
|
||
|
bWmmEnable = TRUE;
|
||
|
}
|
||
|
else //Disable
|
||
|
{
|
||
|
pAd->CommonCfg.bWmmCapable = FALSE;
|
||
|
}
|
||
|
|
||
|
DBGPRINT(RT_DEBUG_TRACE, ("WmmCapable=%d\n", pAd->CommonCfg.bWmmCapable));
|
||
|
}
|
||
|
|
||
|
#ifdef QOS_DLS_SUPPORT
|
||
|
//DLSCapable
|
||
|
if(RTMPGetKeyParameter("DLSCapable", tmpbuf, 32, buffer, TRUE))
|
||
|
{
|
||
|
if(simple_strtol(tmpbuf, 0, 10) != 0) //Enable
|
||
|
{
|
||
|
pAd->CommonCfg.bDLSCapable = TRUE;
|
||
|
}
|
||
|
else //Disable
|
||
|
{
|
||
|
pAd->CommonCfg.bDLSCapable = FALSE;
|
||
|
}
|
||
|
|
||
|
DBGPRINT(RT_DEBUG_TRACE, ("bDLSCapable=%d\n", pAd->CommonCfg.bDLSCapable));
|
||
|
}
|
||
|
#endif // QOS_DLS_SUPPORT //
|
||
|
|
||
|
//AckPolicy for AC_BK, AC_BE, AC_VI, AC_VO
|
||
|
if(RTMPGetKeyParameter("AckPolicy", tmpbuf, 32, buffer, TRUE))
|
||
|
{
|
||
|
for (i = 0, macptr = rstrtok(tmpbuf,";"); macptr; macptr = rstrtok(NULL,";"), i++)
|
||
|
{
|
||
|
pAd->CommonCfg.AckPolicy[i] = (UCHAR)simple_strtol(macptr, 0, 10);
|
||
|
|
||
|
DBGPRINT(RT_DEBUG_TRACE, ("AckPolicy[%d]=%d\n", i, pAd->CommonCfg.AckPolicy[i]));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (bWmmEnable)
|
||
|
{
|
||
|
//APSDCapable
|
||
|
if(RTMPGetKeyParameter("APSDCapable", tmpbuf, 10, buffer, TRUE))
|
||
|
{
|
||
|
if(simple_strtol(tmpbuf, 0, 10) != 0) //Enable
|
||
|
pAd->CommonCfg.bAPSDCapable = TRUE;
|
||
|
else
|
||
|
pAd->CommonCfg.bAPSDCapable = FALSE;
|
||
|
|
||
|
DBGPRINT(RT_DEBUG_TRACE, ("APSDCapable=%d\n", pAd->CommonCfg.bAPSDCapable));
|
||
|
}
|
||
|
|
||
|
//MaxSPLength
|
||
|
if(RTMPGetKeyParameter("MaxSPLength", tmpbuf, 10, buffer, TRUE))
|
||
|
{
|
||
|
pAd->CommonCfg.MaxSPLength = simple_strtol(tmpbuf, 0, 10);
|
||
|
|
||
|
DBGPRINT(RT_DEBUG_TRACE, ("MaxSPLength=%d\n", pAd->CommonCfg.MaxSPLength));
|
||
|
}
|
||
|
|
||
|
//APSDAC for AC_BE, AC_BK, AC_VI, AC_VO
|
||
|
if(RTMPGetKeyParameter("APSDAC", tmpbuf, 32, buffer, TRUE))
|
||
|
{
|
||
|
BOOLEAN apsd_ac[4];
|
||
|
|
||
|
for (i = 0, macptr = rstrtok(tmpbuf,";"); macptr; macptr = rstrtok(NULL,";"), i++)
|
||
|
{
|
||
|
apsd_ac[i] = (BOOLEAN)simple_strtol(macptr, 0, 10);
|
||
|
|
||
|
DBGPRINT(RT_DEBUG_TRACE, ("APSDAC%d %d\n", i, apsd_ac[i]));
|
||
|
}
|
||
|
|
||
|
pAd->CommonCfg.bAPSDAC_BE = apsd_ac[0];
|
||
|
pAd->CommonCfg.bAPSDAC_BK = apsd_ac[1];
|
||
|
pAd->CommonCfg.bAPSDAC_VI = apsd_ac[2];
|
||
|
pAd->CommonCfg.bAPSDAC_VO = apsd_ac[3];
|
||
|
|
||
|
pAd->CommonCfg.bACMAPSDTr[0] = apsd_ac[0];
|
||
|
pAd->CommonCfg.bACMAPSDTr[1] = apsd_ac[1];
|
||
|
pAd->CommonCfg.bACMAPSDTr[2] = apsd_ac[2];
|
||
|
pAd->CommonCfg.bACMAPSDTr[3] = apsd_ac[3];
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|
||
|
#endif // CONFIG_STA_SUPPORT //
|
||
|
|
||
|
|
||
|
#ifdef DOT11_N_SUPPORT
|
||
|
static void HTParametersHook(
|
||
|
IN PRTMP_ADAPTER pAd,
|
||
|
IN PSTRING pValueStr,
|
||
|
IN PSTRING pInput)
|
||
|
{
|
||
|
|
||
|
long Value;
|
||
|
|
||
|
if (RTMPGetKeyParameter("HT_PROTECT", pValueStr, 25, pInput, TRUE))
|
||
|
{
|
||
|
Value = simple_strtol(pValueStr, 0, 10);
|
||
|
if (Value == 0)
|
||
|
{
|
||
|
pAd->CommonCfg.bHTProtect = FALSE;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
pAd->CommonCfg.bHTProtect = TRUE;
|
||
|
}
|
||
|
DBGPRINT(RT_DEBUG_TRACE, ("HT: Protection = %s\n", (Value==0) ? "Disable" : "Enable"));
|
||
|
}
|
||
|
|
||
|
if (RTMPGetKeyParameter("HT_MIMOPSEnable", pValueStr, 25, pInput, TRUE))
|
||
|
{
|
||
|
Value = simple_strtol(pValueStr, 0, 10);
|
||
|
if (Value == 0)
|
||
|
{
|
||
|
pAd->CommonCfg.bMIMOPSEnable = FALSE;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
pAd->CommonCfg.bMIMOPSEnable = TRUE;
|
||
|
}
|
||
|
DBGPRINT(RT_DEBUG_TRACE, ("HT: MIMOPSEnable = %s\n", (Value==0) ? "Disable" : "Enable"));
|
||
|
}
|
||
|
|
||
|
|
||
|
if (RTMPGetKeyParameter("HT_MIMOPSMode", pValueStr, 25, pInput, TRUE))
|
||
|
{
|
||
|
Value = simple_strtol(pValueStr, 0, 10);
|
||
|
if (Value > MMPS_ENABLE)
|
||
|
{
|
||
|
pAd->CommonCfg.BACapability.field.MMPSmode = MMPS_ENABLE;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
//TODO: add mimo power saving mechanism
|
||
|
pAd->CommonCfg.BACapability.field.MMPSmode = MMPS_ENABLE;
|
||
|
//pAd->CommonCfg.BACapability.field.MMPSmode = Value;
|
||
|
}
|
||
|
DBGPRINT(RT_DEBUG_TRACE, ("HT: MIMOPS Mode = %d\n", (INT) Value));
|
||
|
}
|
||
|
|
||
|
if (RTMPGetKeyParameter("HT_BADecline", pValueStr, 25, pInput, TRUE))
|
||
|
{
|
||
|
Value = simple_strtol(pValueStr, 0, 10);
|
||
|
if (Value == 0)
|
||
|
{
|
||
|
pAd->CommonCfg.bBADecline = FALSE;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
pAd->CommonCfg.bBADecline = TRUE;
|
||
|
}
|
||
|
DBGPRINT(RT_DEBUG_TRACE, ("HT: BA Decline = %s\n", (Value==0) ? "Disable" : "Enable"));
|
||
|
}
|
||
|
|
||
|
|
||
|
if (RTMPGetKeyParameter("HT_DisableReordering", pValueStr, 25, pInput, TRUE))
|
||
|
{
|
||
|
Value = simple_strtol(pValueStr, 0, 10);
|
||
|
if (Value == 0)
|
||
|
{
|
||
|
pAd->CommonCfg.bDisableReordering = FALSE;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
pAd->CommonCfg.bDisableReordering = TRUE;
|
||
|
}
|
||
|
DBGPRINT(RT_DEBUG_TRACE, ("HT: DisableReordering = %s\n", (Value==0) ? "Disable" : "Enable"));
|
||
|
}
|
||
|
|
||
|
if (RTMPGetKeyParameter("HT_AutoBA", pValueStr, 25, pInput, TRUE))
|
||
|
{
|
||
|
Value = simple_strtol(pValueStr, 0, 10);
|
||
|
if (Value == 0)
|
||
|
{
|
||
|
pAd->CommonCfg.BACapability.field.AutoBA = FALSE;
|
||
|
pAd->CommonCfg.BACapability.field.Policy = BA_NOTUSE;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
pAd->CommonCfg.BACapability.field.AutoBA = TRUE;
|
||
|
pAd->CommonCfg.BACapability.field.Policy = IMMED_BA;
|
||
|
}
|
||
|
pAd->CommonCfg.REGBACapability.field.AutoBA = pAd->CommonCfg.BACapability.field.AutoBA;
|
||
|
DBGPRINT(RT_DEBUG_TRACE, ("HT: Auto BA = %s\n", (Value==0) ? "Disable" : "Enable"));
|
||
|
}
|
||
|
|
||
|
// Tx_+HTC frame
|
||
|
if (RTMPGetKeyParameter("HT_HTC", pValueStr, 25, pInput, TRUE))
|
||
|
{
|
||
|
Value = simple_strtol(pValueStr, 0, 10);
|
||
|
if (Value == 0)
|
||
|
{
|
||
|
pAd->HTCEnable = FALSE;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
pAd->HTCEnable = TRUE;
|
||
|
}
|
||
|
DBGPRINT(RT_DEBUG_TRACE, ("HT: Tx +HTC frame = %s\n", (Value==0) ? "Disable" : "Enable"));
|
||
|
}
|
||
|
|
||
|
// Enable HT Link Adaptation Control
|
||
|
if (RTMPGetKeyParameter("HT_LinkAdapt", pValueStr, 25, pInput, TRUE))
|
||
|
{
|
||
|
Value = simple_strtol(pValueStr, 0, 10);
|
||
|
if (Value == 0)
|
||
|
{
|
||
|
pAd->bLinkAdapt = FALSE;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
pAd->HTCEnable = TRUE;
|
||
|
pAd->bLinkAdapt = TRUE;
|
||
|
}
|
||
|
DBGPRINT(RT_DEBUG_TRACE, ("HT: Link Adaptation Control = %s\n", (Value==0) ? "Disable" : "Enable(+HTC)"));
|
||
|
}
|
||
|
|
||
|
// Reverse Direction Mechanism
|
||
|
if (RTMPGetKeyParameter("HT_RDG", pValueStr, 25, pInput, TRUE))
|
||
|
{
|
||
|
Value = simple_strtol(pValueStr, 0, 10);
|
||
|
if (Value == 0)
|
||
|
{
|
||
|
pAd->CommonCfg.bRdg = FALSE;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
pAd->HTCEnable = TRUE;
|
||
|
pAd->CommonCfg.bRdg = TRUE;
|
||
|
}
|
||
|
DBGPRINT(RT_DEBUG_TRACE, ("HT: RDG = %s\n", (Value==0) ? "Disable" : "Enable(+HTC)"));
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
// Tx A-MSUD ?
|
||
|
if (RTMPGetKeyParameter("HT_AMSDU", pValueStr, 25, pInput, TRUE))
|
||
|
{
|
||
|
Value = simple_strtol(pValueStr, 0, 10);
|
||
|
if (Value == 0)
|
||
|
{
|
||
|
pAd->CommonCfg.BACapability.field.AmsduEnable = FALSE;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
pAd->CommonCfg.BACapability.field.AmsduEnable = TRUE;
|
||
|
}
|
||
|
DBGPRINT(RT_DEBUG_TRACE, ("HT: Tx A-MSDU = %s\n", (Value==0) ? "Disable" : "Enable"));
|
||
|
}
|
||
|
|
||
|
// MPDU Density
|
||
|
if (RTMPGetKeyParameter("HT_MpduDensity", pValueStr, 25, pInput, TRUE))
|
||
|
{
|
||
|
Value = simple_strtol(pValueStr, 0, 10);
|
||
|
if (Value <=7 && Value >= 0)
|
||
|
{
|
||
|
pAd->CommonCfg.BACapability.field.MpduDensity = Value;
|
||
|
DBGPRINT(RT_DEBUG_TRACE, ("HT: MPDU Density = %d\n", (INT) Value));
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
pAd->CommonCfg.BACapability.field.MpduDensity = 4;
|
||
|
DBGPRINT(RT_DEBUG_TRACE, ("HT: MPDU Density = %d (Default)\n", 4));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Max Rx BA Window Size
|
||
|
if (RTMPGetKeyParameter("HT_BAWinSize", pValueStr, 25, pInput, TRUE))
|
||
|
{
|
||
|
Value = simple_strtol(pValueStr, 0, 10);
|
||
|
|
||
|
if (Value >=1 && Value <= 64)
|
||
|
{
|
||
|
pAd->CommonCfg.REGBACapability.field.RxBAWinLimit = Value;
|
||
|
pAd->CommonCfg.BACapability.field.RxBAWinLimit = Value;
|
||
|
DBGPRINT(RT_DEBUG_TRACE, ("HT: BA Windw Size = %d\n", (INT) Value));
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
pAd->CommonCfg.REGBACapability.field.RxBAWinLimit = 64;
|
||
|
pAd->CommonCfg.BACapability.field.RxBAWinLimit = 64;
|
||
|
DBGPRINT(RT_DEBUG_TRACE, ("HT: BA Windw Size = 64 (Defualt)\n"));
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
// Guard Interval
|
||
|
if (RTMPGetKeyParameter("HT_GI", pValueStr, 25, pInput, TRUE))
|
||
|
{
|
||
|
Value = simple_strtol(pValueStr, 0, 10);
|
||
|
|
||
|
if (Value == GI_400)
|
||
|
{
|
||
|
pAd->CommonCfg.RegTransmitSetting.field.ShortGI = GI_400;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
pAd->CommonCfg.RegTransmitSetting.field.ShortGI = GI_800;
|
||
|
}
|
||
|
|
||
|
DBGPRINT(RT_DEBUG_TRACE, ("HT: Guard Interval = %s\n", (Value==GI_400) ? "400" : "800" ));
|
||
|
}
|
||
|
|
||
|
// HT Operation Mode : Mixed Mode , Green Field
|
||
|
if (RTMPGetKeyParameter("HT_OpMode", pValueStr, 25, pInput, TRUE))
|
||
|
{
|
||
|
Value = simple_strtol(pValueStr, 0, 10);
|
||
|
|
||
|
if (Value == HTMODE_GF)
|
||
|
{
|
||
|
|
||
|
pAd->CommonCfg.RegTransmitSetting.field.HTMODE = HTMODE_GF;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
pAd->CommonCfg.RegTransmitSetting.field.HTMODE = HTMODE_MM;
|
||
|
}
|
||
|
|
||
|
DBGPRINT(RT_DEBUG_TRACE, ("HT: Operate Mode = %s\n", (Value==HTMODE_GF) ? "Green Field" : "Mixed Mode" ));
|
||
|
}
|
||
|
|
||
|
// Fixed Tx mode : CCK, OFDM
|
||
|
if (RTMPGetKeyParameter("FixedTxMode", pValueStr, 25, pInput, TRUE))
|
||
|
{
|
||
|
UCHAR fix_tx_mode;
|
||
|
|
||
|
#ifdef CONFIG_STA_SUPPORT
|
||
|
IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
|
||
|
{
|
||
|
fix_tx_mode = FIXED_TXMODE_HT;
|
||
|
|
||
|
if (strcmp(pValueStr, "OFDM") == 0 || strcmp(pValueStr, "ofdm") == 0)
|
||
|
{
|
||
|
fix_tx_mode = FIXED_TXMODE_OFDM;
|
||
|
}
|
||
|
else if (strcmp(pValueStr, "CCK") == 0 || strcmp(pValueStr, "cck") == 0)
|
||
|
{
|
||
|
fix_tx_mode = FIXED_TXMODE_CCK;
|
||
|
}
|
||
|
else if (strcmp(pValueStr, "HT") == 0 || strcmp(pValueStr, "ht") == 0)
|
||
|
{
|
||
|
fix_tx_mode = FIXED_TXMODE_HT;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
Value = simple_strtol(pValueStr, 0, 10);
|
||
|
// 1 : CCK
|
||
|
// 2 : OFDM
|
||
|
// otherwise : HT
|
||
|
if (Value == FIXED_TXMODE_CCK || Value == FIXED_TXMODE_OFDM)
|
||
|
fix_tx_mode = Value;
|
||
|
else
|
||
|
fix_tx_mode = FIXED_TXMODE_HT;
|
||
|
}
|
||
|
|
||
|
pAd->StaCfg.DesiredTransmitSetting.field.FixedTxMode = fix_tx_mode;
|
||
|
DBGPRINT(RT_DEBUG_TRACE, ("Fixed Tx Mode = %d\n", fix_tx_mode));
|
||
|
|
||
|
}
|
||
|
#endif // CONFIG_STA_SUPPORT //
|
||
|
}
|
||
|
|
||
|
|
||
|
// Channel Width
|
||
|
if (RTMPGetKeyParameter("HT_BW", pValueStr, 25, pInput, TRUE))
|
||
|
{
|
||
|
Value = simple_strtol(pValueStr, 0, 10);
|
||
|
|
||
|
if (Value == BW_40)
|
||
|
{
|
||
|
pAd->CommonCfg.RegTransmitSetting.field.BW = BW_40;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
pAd->CommonCfg.RegTransmitSetting.field.BW = BW_20;
|
||
|
}
|
||
|
|
||
|
#ifdef MCAST_RATE_SPECIFIC
|
||
|
pAd->CommonCfg.MCastPhyMode.field.BW = pAd->CommonCfg.RegTransmitSetting.field.BW;
|
||
|
#endif // MCAST_RATE_SPECIFIC //
|
||
|
|
||
|
DBGPRINT(RT_DEBUG_TRACE, ("HT: Channel Width = %s\n", (Value==BW_40) ? "40 MHz" : "20 MHz" ));
|
||
|
}
|
||
|
|
||
|
if (RTMPGetKeyParameter("HT_EXTCHA", pValueStr, 25, pInput, TRUE))
|
||
|
{
|
||
|
Value = simple_strtol(pValueStr, 0, 10);
|
||
|
|
||
|
if (Value == 0)
|
||
|
{
|
||
|
|
||
|
pAd->CommonCfg.RegTransmitSetting.field.EXTCHA = EXTCHA_BELOW;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
pAd->CommonCfg.RegTransmitSetting.field.EXTCHA = EXTCHA_ABOVE;
|
||
|
}
|
||
|
|
||
|
DBGPRINT(RT_DEBUG_TRACE, ("HT: Ext Channel = %s\n", (Value==0) ? "BELOW" : "ABOVE" ));
|
||
|
}
|
||
|
|
||
|
// MSC
|
||
|
if (RTMPGetKeyParameter("HT_MCS", pValueStr, 50, pInput, TRUE))
|
||
|
{
|
||
|
|
||
|
#ifdef CONFIG_STA_SUPPORT
|
||
|
IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
|
||
|
{
|
||
|
Value = simple_strtol(pValueStr, 0, 10);
|
||
|
|
||
|
// if ((Value >= 0 && Value <= 15) || (Value == 32))
|
||
|
if ((Value >= 0 && Value <= 23) || (Value == 32)) // 3*3
|
||
|
{
|
||
|
pAd->StaCfg.DesiredTransmitSetting.field.MCS = Value;
|
||
|
pAd->StaCfg.bAutoTxRateSwitch = FALSE;
|
||
|
DBGPRINT(RT_DEBUG_TRACE, ("HT: MCS = %d\n", pAd->StaCfg.DesiredTransmitSetting.field.MCS));
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
pAd->StaCfg.DesiredTransmitSetting.field.MCS = MCS_AUTO;
|
||
|
pAd->StaCfg.bAutoTxRateSwitch = TRUE;
|
||
|
DBGPRINT(RT_DEBUG_TRACE, ("HT: MCS = AUTO\n"));
|
||
|
}
|
||
|
}
|
||
|
#endif // CONFIG_STA_SUPPORT //
|
||
|
}
|
||
|
|
||
|
// STBC
|
||
|
if (RTMPGetKeyParameter("HT_STBC", pValueStr, 25, pInput, TRUE))
|
||
|
{
|
||
|
Value = simple_strtol(pValueStr, 0, 10);
|
||
|
if (Value == STBC_USE)
|
||
|
{
|
||
|
pAd->CommonCfg.RegTransmitSetting.field.STBC = STBC_USE;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
pAd->CommonCfg.RegTransmitSetting.field.STBC = STBC_NONE;
|
||
|
}
|
||
|
DBGPRINT(RT_DEBUG_TRACE, ("HT: STBC = %d\n", pAd->CommonCfg.RegTransmitSetting.field.STBC));
|
||
|
}
|
||
|
|
||
|
// 40_Mhz_Intolerant
|
||
|
if (RTMPGetKeyParameter("HT_40MHZ_INTOLERANT", pValueStr, 25, pInput, TRUE))
|
||
|
{
|
||
|
Value = simple_strtol(pValueStr, 0, 10);
|
||
|
if (Value == 0)
|
||
|
{
|
||
|
pAd->CommonCfg.bForty_Mhz_Intolerant = FALSE;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
pAd->CommonCfg.bForty_Mhz_Intolerant = TRUE;
|
||
|
}
|
||
|
DBGPRINT(RT_DEBUG_TRACE, ("HT: 40MHZ INTOLERANT = %d\n", pAd->CommonCfg.bForty_Mhz_Intolerant));
|
||
|
}
|
||
|
//HT_TxStream
|
||
|
if(RTMPGetKeyParameter("HT_TxStream", pValueStr, 10, pInput, TRUE))
|
||
|
{
|
||
|
switch (simple_strtol(pValueStr, 0, 10))
|
||
|
{
|
||
|
case 1:
|
||
|
pAd->CommonCfg.TxStream = 1;
|
||
|
break;
|
||
|
case 2:
|
||
|
pAd->CommonCfg.TxStream = 2;
|
||
|
break;
|
||
|
case 3: // 3*3
|
||
|
default:
|
||
|
pAd->CommonCfg.TxStream = 3;
|
||
|
|
||
|
if (pAd->MACVersion < RALINK_2883_VERSION)
|
||
|
pAd->CommonCfg.TxStream = 2; // only 2 tx streams for RT2860 series
|
||
|
break;
|
||
|
}
|
||
|
DBGPRINT(RT_DEBUG_TRACE, ("HT: Tx Stream = %d\n", pAd->CommonCfg.TxStream));
|
||
|
}
|
||
|
//HT_RxStream
|
||
|
if(RTMPGetKeyParameter("HT_RxStream", pValueStr, 10, pInput, TRUE))
|
||
|
{
|
||
|
switch (simple_strtol(pValueStr, 0, 10))
|
||
|
{
|
||
|
case 1:
|
||
|
pAd->CommonCfg.RxStream = 1;
|
||
|
break;
|
||
|
case 2:
|
||
|
pAd->CommonCfg.RxStream = 2;
|
||
|
break;
|
||
|
case 3:
|
||
|
default:
|
||
|
pAd->CommonCfg.RxStream = 3;
|
||
|
|
||
|
if (pAd->MACVersion < RALINK_2883_VERSION)
|
||
|
pAd->CommonCfg.RxStream = 2; // only 2 rx streams for RT2860 series
|
||
|
break;
|
||
|
}
|
||
|
DBGPRINT(RT_DEBUG_TRACE, ("HT: Rx Stream = %d\n", pAd->CommonCfg.RxStream));
|
||
|
}
|
||
|
//2008/11/05: KH add to support Antenna power-saving of AP<--
|
||
|
//Green AP
|
||
|
if(RTMPGetKeyParameter("GreenAP", pValueStr, 10, pInput, TRUE))
|
||
|
{
|
||
|
Value = simple_strtol(pValueStr, 0, 10);
|
||
|
if (Value == 0)
|
||
|
{
|
||
|
pAd->CommonCfg.bGreenAPEnable = FALSE;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
pAd->CommonCfg.bGreenAPEnable = TRUE;
|
||
|
}
|
||
|
DBGPRINT(RT_DEBUG_TRACE, ("HT: Green AP= %d\n", pAd->CommonCfg.bGreenAPEnable));
|
||
|
}
|
||
|
|
||
|
// HT_DisallowTKIP
|
||
|
if (RTMPGetKeyParameter("HT_DisallowTKIP", pValueStr, 25, pInput, TRUE))
|
||
|
{
|
||
|
Value = simple_strtol(pValueStr, 0, 10);
|
||
|
|
||
|
if (Value == 1)
|
||
|
{
|
||
|
pAd->CommonCfg.HT_DisallowTKIP = TRUE;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
pAd->CommonCfg.HT_DisallowTKIP = FALSE;
|
||
|
}
|
||
|
|
||
|
DBGPRINT(RT_DEBUG_TRACE, ("HT: Disallow TKIP mode = %s\n", (pAd->CommonCfg.HT_DisallowTKIP == TRUE) ? "ON" : "OFF" ));
|
||
|
}
|
||
|
|
||
|
|
||
|
//2008/11/05:KH add to support Antenna power-saving of AP-->
|
||
|
}
|
||
|
#endif // DOT11_N_SUPPORT //
|
||
|
|
||
|
|
||
|
NDIS_STATUS RTMPSetProfileParameters(
|
||
|
IN RTMP_ADAPTER *pAd,
|
||
|
IN PSTRING pBuffer)
|
||
|
{
|
||
|
PSTRING tmpbuf;
|
||
|
ULONG RtsThresh;
|
||
|
ULONG FragThresh;
|
||
|
PSTRING macptr;
|
||
|
INT i = 0, retval;
|
||
|
tmpbuf = kmalloc(MAX_PARAM_BUFFER_SIZE, MEM_ALLOC_FLAG);
|
||
|
if(tmpbuf == NULL)
|
||
|
return NDIS_STATUS_FAILURE;
|
||
|
|
||
|
do
|
||
|
{
|
||
|
// set file parameter to portcfg
|
||
|
//CountryRegion
|
||
|
if(RTMPGetKeyParameter("CountryRegion", tmpbuf, 25, pBuffer, TRUE))
|
||
|
{
|
||
|
retval = RT_CfgSetCountryRegion(pAd, tmpbuf, BAND_24G);
|
||
|
DBGPRINT(RT_DEBUG_TRACE, ("CountryRegion=%d\n", pAd->CommonCfg.CountryRegion));
|
||
|
}
|
||
|
//CountryRegionABand
|
||
|
if(RTMPGetKeyParameter("CountryRegionABand", tmpbuf, 25, pBuffer, TRUE))
|
||
|
{
|
||
|
retval = RT_CfgSetCountryRegion(pAd, tmpbuf, BAND_5G);
|
||
|
DBGPRINT(RT_DEBUG_TRACE, ("CountryRegionABand=%d\n", pAd->CommonCfg.CountryRegionForABand));
|
||
|
}
|
||
|
#ifdef RTMP_EFUSE_SUPPORT
|
||
|
#ifdef RT30xx
|
||
|
//EfuseBufferMode
|
||
|
if(RTMPGetKeyParameter("EfuseBufferMode", tmpbuf, 25, pBuffer, TRUE))
|
||
|
{
|
||
|
pAd->bEEPROMFile = (UCHAR) simple_strtol(tmpbuf, 0, 10);
|
||
|
DBGPRINT(RT_DEBUG_TRACE, ("EfuseBufferMode=%d\n", pAd->bUseEfuse));
|
||
|
}
|
||
|
#endif // RT30xx //
|
||
|
#endif // RTMP_EFUSE_SUPPORT //
|
||
|
//CountryCode
|
||
|
if(RTMPGetKeyParameter("CountryCode", tmpbuf, 25, pBuffer, TRUE))
|
||
|
{
|
||
|
NdisMoveMemory(pAd->CommonCfg.CountryCode, tmpbuf , 2);
|
||
|
#ifdef CONFIG_STA_SUPPORT
|
||
|
#ifdef EXT_BUILD_CHANNEL_LIST
|
||
|
IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
|
||
|
NdisMoveMemory(pAd->StaCfg.StaOriCountryCode, tmpbuf , 2);
|
||
|
#endif // EXT_BUILD_CHANNEL_LIST //
|
||
|
#endif // CONFIG_STA_SUPPORT //
|
||
|
if (strlen((PSTRING) pAd->CommonCfg.CountryCode) != 0)
|
||
|
{
|
||
|
pAd->CommonCfg.bCountryFlag = TRUE;
|
||
|
}
|
||
|
DBGPRINT(RT_DEBUG_TRACE, ("CountryCode=%s\n", pAd->CommonCfg.CountryCode));
|
||
|
}
|
||
|
//ChannelGeography
|
||
|
if(RTMPGetKeyParameter("ChannelGeography", tmpbuf, 25, pBuffer, TRUE))
|
||
|
{
|
||
|
UCHAR Geography = (UCHAR) simple_strtol(tmpbuf, 0, 10);
|
||
|
if (Geography <= BOTH)
|
||
|
{
|
||
|
pAd->CommonCfg.Geography = Geography;
|
||
|
pAd->CommonCfg.CountryCode[2] =
|
||
|
(pAd->CommonCfg.Geography == BOTH) ? ' ' : ((pAd->CommonCfg.Geography == IDOR) ? 'I' : 'O');
|
||
|
#ifdef CONFIG_STA_SUPPORT
|
||
|
#ifdef EXT_BUILD_CHANNEL_LIST
|
||
|
IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
|
||
|
pAd->StaCfg.StaOriGeography = pAd->CommonCfg.Geography;
|
||
|
#endif // EXT_BUILD_CHANNEL_LIST //
|
||
|
#endif // CONFIG_STA_SUPPORT //
|
||
|
DBGPRINT(RT_DEBUG_TRACE, ("ChannelGeography=%d\n", pAd->CommonCfg.Geography));
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
pAd->CommonCfg.Geography = BOTH;
|
||
|
pAd->CommonCfg.CountryCode[2] = ' ';
|
||
|
}
|
||
|
|
||
|
|
||
|
#ifdef CONFIG_STA_SUPPORT
|
||
|
IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
|
||
|
{
|
||
|
//SSID
|
||
|
if (RTMPGetKeyParameter("SSID", tmpbuf, 256, pBuffer, FALSE))
|
||
|
{
|
||
|
if (strlen(tmpbuf) <= 32)
|
||
|
{
|
||
|
pAd->CommonCfg.SsidLen = (UCHAR) strlen(tmpbuf);
|
||
|
NdisZeroMemory(pAd->CommonCfg.Ssid, NDIS_802_11_LENGTH_SSID);
|
||
|
NdisMoveMemory(pAd->CommonCfg.Ssid, tmpbuf, pAd->CommonCfg.SsidLen);
|
||
|
pAd->MlmeAux.AutoReconnectSsidLen = pAd->CommonCfg.SsidLen;
|
||
|
NdisZeroMemory(pAd->MlmeAux.AutoReconnectSsid, NDIS_802_11_LENGTH_SSID);
|
||
|
NdisMoveMemory(pAd->MlmeAux.AutoReconnectSsid, tmpbuf, pAd->MlmeAux.AutoReconnectSsidLen);
|
||
|
pAd->MlmeAux.SsidLen = pAd->CommonCfg.SsidLen;
|
||
|
NdisZeroMemory(pAd->MlmeAux.Ssid, NDIS_802_11_LENGTH_SSID);
|
||
|
NdisMoveMemory(pAd->MlmeAux.Ssid, tmpbuf, pAd->MlmeAux.SsidLen);
|
||
|
DBGPRINT(RT_DEBUG_TRACE, ("%s::(SSID=%s)\n", __FUNCTION__, tmpbuf));
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
#endif // CONFIG_STA_SUPPORT //
|
||
|
|
||
|
#ifdef CONFIG_STA_SUPPORT
|
||
|
IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
|
||
|
{
|
||
|
//NetworkType
|
||
|
if (RTMPGetKeyParameter("NetworkType", tmpbuf, 25, pBuffer, TRUE))
|
||
|
{
|
||
|
pAd->bConfigChanged = TRUE;
|
||
|
if (strcmp(tmpbuf, "Adhoc") == 0)
|
||
|
pAd->StaCfg.BssType = BSS_ADHOC;
|
||
|
else //Default Infrastructure mode
|
||
|
pAd->StaCfg.BssType = BSS_INFRA;
|
||
|
// Reset Ralink supplicant to not use, it will be set to start when UI set PMK key
|
||
|
pAd->StaCfg.WpaState = SS_NOTUSE;
|
||
|
DBGPRINT(RT_DEBUG_TRACE, ("%s::(NetworkType=%d)\n", __FUNCTION__, pAd->StaCfg.BssType));
|
||
|
}
|
||
|
}
|
||
|
#ifdef RTMP_MAC_PCI
|
||
|
//NewPCIePS
|
||
|
if(RTMPGetKeyParameter("NewPCIePS", tmpbuf, 10, pBuffer, TRUE))
|
||
|
{
|
||
|
UCHAR temp_buffer = (UCHAR) simple_strtol(tmpbuf, 0, 10);
|
||
|
if(temp_buffer>0)
|
||
|
pAd->StaCfg.PSControl.field.EnableNewPS=TRUE;
|
||
|
else
|
||
|
pAd->StaCfg.PSControl.field.EnableNewPS=FALSE;
|
||
|
DBGPRINT(RT_DEBUG_TRACE, ("NewPCIePS=%d\n", pAd->StaCfg.PSControl.field.EnableNewPS));
|
||
|
}
|
||
|
#endif // RTMP_MAC_PCI //
|
||
|
#ifdef RT3090
|
||
|
//PCIePowerLevel
|
||
|
|
||
|
if(RTMPGetKeyParameter("PCIePowerLevel", tmpbuf, 10, pBuffer, TRUE))
|
||
|
{
|
||
|
pAd->StaCfg.PSControl.field.rt30xxPowerMode = (UCHAR) simple_strtol(tmpbuf, 0, 10);
|
||
|
DBGPRINT(RT_DEBUG_TRACE, ("PCIePowerLevel=%d\n", pAd->StaCfg.PSControl.field.rt30xxPowerMode));
|
||
|
}
|
||
|
//FollowHostASPM
|
||
|
if(RTMPGetKeyParameter("FollowHostASPM", tmpbuf, 10, pBuffer, TRUE))
|
||
|
{
|
||
|
UCHAR temp_buffer = (UCHAR) simple_strtol(tmpbuf, 0, 10);
|
||
|
|
||
|
if(temp_buffer>0)
|
||
|
pAd->StaCfg.PSControl.field.rt30xxFollowHostASPM=TRUE;
|
||
|
else
|
||
|
pAd->StaCfg.PSControl.field.rt30xxFollowHostASPM=FALSE;
|
||
|
DBGPRINT(RT_DEBUG_TRACE, ("rt30xxFollowHostASPM=%d\n", pAd->StaCfg.PSControl.field.rt30xxFollowHostASPM));
|
||
|
}
|
||
|
//ForceTestASPM
|
||
|
if(RTMPGetKeyParameter("ForceTestASPM", tmpbuf, 10, pBuffer, TRUE))
|
||
|
{
|
||
|
UCHAR temp_buffer = (UCHAR) simple_strtol(tmpbuf, 0, 10);
|
||
|
|
||
|
if(temp_buffer>0)
|
||
|
pAd->StaCfg.PSControl.field.rt30xxForceASPMTest=TRUE;
|
||
|
else
|
||
|
pAd->StaCfg.PSControl.field.rt30xxForceASPMTest=FALSE;
|
||
|
DBGPRINT(RT_DEBUG_TRACE, ("rt30xxForceASPM=%d\n", pAd->StaCfg.PSControl.field.rt30xxForceASPMTest));
|
||
|
}
|
||
|
#endif // RT3090 //
|
||
|
#endif // CONFIG_STA_SUPPORT //
|
||
|
//Channel
|
||
|
if(RTMPGetKeyParameter("Channel", tmpbuf, 10, pBuffer, TRUE))
|
||
|
{
|
||
|
pAd->CommonCfg.Channel = (UCHAR) simple_strtol(tmpbuf, 0, 10);
|
||
|
DBGPRINT(RT_DEBUG_TRACE, ("Channel=%d\n", pAd->CommonCfg.Channel));
|
||
|
}
|
||
|
//WirelessMode
|
||
|
if(RTMPGetKeyParameter("WirelessMode", tmpbuf, 10, pBuffer, TRUE))
|
||
|
{
|
||
|
RT_CfgSetWirelessMode(pAd, tmpbuf);
|
||
|
DBGPRINT(RT_DEBUG_TRACE, ("PhyMode=%d\n", pAd->CommonCfg.PhyMode));
|
||
|
}
|
||
|
//BasicRate
|
||
|
if(RTMPGetKeyParameter("BasicRate", tmpbuf, 10, pBuffer, TRUE))
|
||
|
{
|
||
|
pAd->CommonCfg.BasicRateBitmap = (ULONG) simple_strtol(tmpbuf, 0, 10);
|
||
|
DBGPRINT(RT_DEBUG_TRACE, ("BasicRate=%ld\n", pAd->CommonCfg.BasicRateBitmap));
|
||
|
}
|
||
|
//BeaconPeriod
|
||
|
if(RTMPGetKeyParameter("BeaconPeriod", tmpbuf, 10, pBuffer, TRUE))
|
||
|
{
|
||
|
pAd->CommonCfg.BeaconPeriod = (USHORT) simple_strtol(tmpbuf, 0, 10);
|
||
|
DBGPRINT(RT_DEBUG_TRACE, ("BeaconPeriod=%d\n", pAd->CommonCfg.BeaconPeriod));
|
||
|
}
|
||
|
//TxPower
|
||
|
if(RTMPGetKeyParameter("TxPower", tmpbuf, 10, pBuffer, TRUE))
|
||
|
{
|
||
|
pAd->CommonCfg.TxPowerPercentage = (ULONG) simple_strtol(tmpbuf, 0, 10);
|
||
|
#ifdef CONFIG_STA_SUPPORT
|
||
|
IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
|
||
|
pAd->CommonCfg.TxPowerDefault = pAd->CommonCfg.TxPowerPercentage;
|
||
|
#endif // CONFIG_STA_SUPPORT //
|
||
|
DBGPRINT(RT_DEBUG_TRACE, ("TxPower=%ld\n", pAd->CommonCfg.TxPowerPercentage));
|
||
|
}
|
||
|
//BGProtection
|
||
|
if(RTMPGetKeyParameter("BGProtection", tmpbuf, 10, pBuffer, TRUE))
|
||
|
{
|
||
|
//#if 0 //#ifndef WIFI_TEST
|
||
|
// pAd->CommonCfg.UseBGProtection = 2;// disable b/g protection for throughput test
|
||
|
//#else
|
||
|
switch (simple_strtol(tmpbuf, 0, 10))
|
||
|
{
|
||
|
case 1: //Always On
|
||
|
pAd->CommonCfg.UseBGProtection = 1;
|
||
|
break;
|
||
|
case 2: //Always OFF
|
||
|
pAd->CommonCfg.UseBGProtection = 2;
|
||
|
break;
|
||
|
case 0: //AUTO
|
||
|
default:
|
||
|
pAd->CommonCfg.UseBGProtection = 0;
|
||
|
break;
|
||
|
}
|
||
|
//#endif
|
||
|
DBGPRINT(RT_DEBUG_TRACE, ("BGProtection=%ld\n", pAd->CommonCfg.UseBGProtection));
|
||
|
}
|
||
|
//OLBCDetection
|
||
|
if(RTMPGetKeyParameter("DisableOLBC", tmpbuf, 10, pBuffer, TRUE))
|
||
|
{
|
||
|
switch (simple_strtol(tmpbuf, 0, 10))
|
||
|
{
|
||
|
case 1: //disable OLBC Detection
|
||
|
pAd->CommonCfg.DisableOLBCDetect = 1;
|
||
|
break;
|
||
|
case 0: //enable OLBC Detection
|
||
|
pAd->CommonCfg.DisableOLBCDetect = 0;
|
||
|
break;
|
||
|
default:
|
||
|
pAd->CommonCfg.DisableOLBCDetect= 0;
|
||
|
break;
|
||
|
}
|
||
|
DBGPRINT(RT_DEBUG_TRACE, ("OLBCDetection=%ld\n", pAd->CommonCfg.DisableOLBCDetect));
|
||
|
}
|
||
|
//TxPreamble
|
||
|
if(RTMPGetKeyParameter("TxPreamble", tmpbuf, 10, pBuffer, TRUE))
|
||
|
{
|
||
|
switch (simple_strtol(tmpbuf, 0, 10))
|
||
|
{
|
||
|
case Rt802_11PreambleShort:
|
||
|
pAd->CommonCfg.TxPreamble = Rt802_11PreambleShort;
|
||
|
break;
|
||
|
case Rt802_11PreambleLong:
|
||
|
default:
|
||
|
pAd->CommonCfg.TxPreamble = Rt802_11PreambleLong;
|
||
|
break;
|
||
|
}
|
||
|
DBGPRINT(RT_DEBUG_TRACE, ("TxPreamble=%ld\n", pAd->CommonCfg.TxPreamble));
|
||
|
}
|
||
|
//RTSThreshold
|
||
|
if(RTMPGetKeyParameter("RTSThreshold", tmpbuf, 10, pBuffer, TRUE))
|
||
|
{
|
||
|
RtsThresh = simple_strtol(tmpbuf, 0, 10);
|
||
|
if( (RtsThresh >= 1) && (RtsThresh <= MAX_RTS_THRESHOLD) )
|
||
|
pAd->CommonCfg.RtsThreshold = (USHORT)RtsThresh;
|
||
|
else
|
||
|
pAd->CommonCfg.RtsThreshold = MAX_RTS_THRESHOLD;
|
||
|
|
||
|
DBGPRINT(RT_DEBUG_TRACE, ("RTSThreshold=%d\n", pAd->CommonCfg.RtsThreshold));
|
||
|
}
|
||
|
//FragThreshold
|
||
|
if(RTMPGetKeyParameter("FragThreshold", tmpbuf, 10, pBuffer, TRUE))
|
||
|
{
|
||
|
FragThresh = simple_strtol(tmpbuf, 0, 10);
|
||
|
pAd->CommonCfg.bUseZeroToDisableFragment = FALSE;
|
||
|
|
||
|
if (FragThresh > MAX_FRAG_THRESHOLD || FragThresh < MIN_FRAG_THRESHOLD)
|
||
|
{ //illegal FragThresh so we set it to default
|
||
|
pAd->CommonCfg.FragmentThreshold = MAX_FRAG_THRESHOLD;
|
||
|
pAd->CommonCfg.bUseZeroToDisableFragment = TRUE;
|
||
|
}
|
||
|
else if (FragThresh % 2 == 1)
|
||
|
{
|
||
|
// The length of each fragment shall always be an even number of octets, except for the last fragment
|
||
|
// of an MSDU or MMPDU, which may be either an even or an odd number of octets.
|
||
|
pAd->CommonCfg.FragmentThreshold = (USHORT)(FragThresh - 1);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
pAd->CommonCfg.FragmentThreshold = (USHORT)FragThresh;
|
||
|
}
|
||
|
//pAd->CommonCfg.AllowFragSize = (pAd->CommonCfg.FragmentThreshold) - LENGTH_802_11 - LENGTH_CRC;
|
||
|
DBGPRINT(RT_DEBUG_TRACE, ("FragThreshold=%d\n", pAd->CommonCfg.FragmentThreshold));
|
||
|
}
|
||
|
//TxBurst
|
||
|
if(RTMPGetKeyParameter("TxBurst", tmpbuf, 10, pBuffer, TRUE))
|
||
|
{
|
||
|
//#ifdef WIFI_TEST
|
||
|
// pAd->CommonCfg.bEnableTxBurst = FALSE;
|
||
|
//#else
|
||
|
if(simple_strtol(tmpbuf, 0, 10) != 0) //Enable
|
||
|
pAd->CommonCfg.bEnableTxBurst = TRUE;
|
||
|
else //Disable
|
||
|
pAd->CommonCfg.bEnableTxBurst = FALSE;
|
||
|
//#endif
|
||
|
DBGPRINT(RT_DEBUG_TRACE, ("TxBurst=%d\n", pAd->CommonCfg.bEnableTxBurst));
|
||
|
}
|
||
|
|
||
|
#ifdef AGGREGATION_SUPPORT
|
||
|
//PktAggregate
|
||
|
if(RTMPGetKeyParameter("PktAggregate", tmpbuf, 10, pBuffer, TRUE))
|
||
|
{
|
||
|
if(simple_strtol(tmpbuf, 0, 10) != 0) //Enable
|
||
|
pAd->CommonCfg.bAggregationCapable = TRUE;
|
||
|
else //Disable
|
||
|
pAd->CommonCfg.bAggregationCapable = FALSE;
|
||
|
#ifdef PIGGYBACK_SUPPORT
|
||
|
pAd->CommonCfg.bPiggyBackCapable = pAd->CommonCfg.bAggregationCapable;
|
||
|
#endif // PIGGYBACK_SUPPORT //
|
||
|
DBGPRINT(RT_DEBUG_TRACE, ("PktAggregate=%d\n", pAd->CommonCfg.bAggregationCapable));
|
||
|
}
|
||
|
#else
|
||
|
pAd->CommonCfg.bAggregationCapable = FALSE;
|
||
|
pAd->CommonCfg.bPiggyBackCapable = FALSE;
|
||
|
#endif // AGGREGATION_SUPPORT //
|
||
|
|
||
|
// WmmCapable
|
||
|
|
||
|
#ifdef CONFIG_STA_SUPPORT
|
||
|
IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
|
||
|
rtmp_read_sta_wmm_parms_from_file(pAd, tmpbuf, pBuffer);
|
||
|
#endif // CONFIG_STA_SUPPORT //
|
||
|
|
||
|
//ShortSlot
|
||
|
if(RTMPGetKeyParameter("ShortSlot", tmpbuf, 10, pBuffer, TRUE))
|
||
|
{
|
||
|
RT_CfgSetShortSlot(pAd, tmpbuf);
|
||
|
DBGPRINT(RT_DEBUG_TRACE, ("ShortSlot=%d\n", pAd->CommonCfg.bUseShortSlotTime));
|
||
|
}
|
||
|
//IEEE80211H
|
||
|
if(RTMPGetKeyParameter("IEEE80211H", tmpbuf, 10, pBuffer, TRUE))
|
||
|
{
|
||
|
for (i = 0, macptr = rstrtok(tmpbuf,";"); macptr; macptr = rstrtok(NULL,";"), i++)
|
||
|
{
|
||
|
if(simple_strtol(macptr, 0, 10) != 0) //Enable
|
||
|
pAd->CommonCfg.bIEEE80211H = TRUE;
|
||
|
else //Disable
|
||
|
pAd->CommonCfg.bIEEE80211H = FALSE;
|
||
|
|
||
|
DBGPRINT(RT_DEBUG_TRACE, ("IEEE80211H=%d\n", pAd->CommonCfg.bIEEE80211H));
|
||
|
}
|
||
|
}
|
||
|
//CSPeriod
|
||
|
if(RTMPGetKeyParameter("CSPeriod", tmpbuf, 10, pBuffer, TRUE))
|
||
|
{
|
||
|
if(simple_strtol(tmpbuf, 0, 10) != 0)
|
||
|
pAd->CommonCfg.RadarDetect.CSPeriod = simple_strtol(tmpbuf, 0, 10);
|
||
|
else
|
||
|
pAd->CommonCfg.RadarDetect.CSPeriod = 0;
|
||
|
|
||
|
DBGPRINT(RT_DEBUG_TRACE, ("CSPeriod=%d\n", pAd->CommonCfg.RadarDetect.CSPeriod));
|
||
|
}
|
||
|
|
||
|
#ifdef MERGE_ARCH_TEAM
|
||
|
// DfsLowerLimit
|
||
|
if(RTMPGetKeyParameter("DfsLowerLimit", tmpbuf, 10, pBuffer, TRUE))
|
||
|
{
|
||
|
if(simple_strtol(tmpbuf, 0, 10) != 0)
|
||
|
pAd->CommonCfg.RadarDetect.DfsLowerLimit = simple_strtol(tmpbuf, 0, 10);
|
||
|
|
||
|
DBGPRINT(RT_DEBUG_TRACE, ("DfsLowerLimit=%ld\n", pAd->CommonCfg.RadarDetect.DfsLowerLimit));
|
||
|
}
|
||
|
|
||
|
// DfsUpperLimit
|
||
|
if(RTMPGetKeyParameter("DfsUpperLimit", tmpbuf, 10, pBuffer, TRUE))
|
||
|
{
|
||
|
if(simple_strtol(tmpbuf, 0, 10) != 0)
|
||
|
pAd->CommonCfg.RadarDetect.DfsUpperLimit = simple_strtol(tmpbuf, 0, 10);
|
||
|
|
||
|
DBGPRINT(RT_DEBUG_TRACE, ("DfsUpperLimit=%ld\n", pAd->CommonCfg.RadarDetect.DfsUpperLimit));
|
||
|
}
|
||
|
|
||
|
// FixDfsLimit
|
||
|
if(RTMPGetKeyParameter("FixDfsLimit", tmpbuf, 10, pBuffer, TRUE))
|
||
|
{
|
||
|
if(simple_strtol(tmpbuf, 0, 10) != 0)
|
||
|
pAd->CommonCfg.RadarDetect.FixDfsLimit = TRUE;
|
||
|
else
|
||
|
pAd->CommonCfg.RadarDetect.FixDfsLimit = FALSE;
|
||
|
|
||
|
DBGPRINT(RT_DEBUG_TRACE, ("FixDfsLimit=%d\n", pAd->CommonCfg.RadarDetect.FixDfsLimit));
|
||
|
}
|
||
|
|
||
|
// LongPulseRadarTh
|
||
|
if(RTMPGetKeyParameter("LongPulseRadarTh", tmpbuf, 10, pBuffer, TRUE))
|
||
|
{
|
||
|
if(simple_strtol(tmpbuf, 0, 10) != 0)
|
||
|
pAd->CommonCfg.RadarDetect.LongPulseRadarTh = simple_strtol(tmpbuf, 0, 10);
|
||
|
|
||
|
DBGPRINT(RT_DEBUG_TRACE, ("LongPulseRadarTh=%d\n", pAd->CommonCfg.RadarDetect.LongPulseRadarTh));
|
||
|
}
|
||
|
|
||
|
// AvgRssiReq
|
||
|
if(RTMPGetKeyParameter("AvgRssiReq", tmpbuf, 10, pBuffer, TRUE))
|
||
|
{
|
||
|
if(simple_strtol(tmpbuf, 0, 10) != 0)
|
||
|
pAd->CommonCfg.RadarDetect.AvgRssiReq = simple_strtol(tmpbuf, 0, 10);
|
||
|
|
||
|
DBGPRINT(RT_DEBUG_TRACE, ("AvgRssiReq=%d\n", pAd->CommonCfg.RadarDetect.AvgRssiReq));
|
||
|
}
|
||
|
|
||
|
#endif // MERGE_ARCH_TEAM //
|
||
|
|
||
|
//RDRegion
|
||
|
if(RTMPGetKeyParameter("RDRegion", tmpbuf, 128, pBuffer, TRUE))
|
||
|
{
|
||
|
RADAR_DETECT_STRUCT *pRadarDetect = &pAd->CommonCfg.RadarDetect;
|
||
|
if ((strncmp(tmpbuf, "JAP_W53", 7) == 0) || (strncmp(tmpbuf, "jap_w53", 7) == 0))
|
||
|
{
|
||
|
pRadarDetect->RDDurRegion = JAP_W53;
|
||
|
pRadarDetect->DfsSessionTime = 15;
|
||
|
}
|
||
|
else if ((strncmp(tmpbuf, "JAP_W56", 7) == 0) || (strncmp(tmpbuf, "jap_w56", 7) == 0))
|
||
|
{
|
||
|
pRadarDetect->RDDurRegion = JAP_W56;
|
||
|
pRadarDetect->DfsSessionTime = 13;
|
||
|
}
|
||
|
else if ((strncmp(tmpbuf, "JAP", 3) == 0) || (strncmp(tmpbuf, "jap", 3) == 0))
|
||
|
{
|
||
|
pRadarDetect->RDDurRegion = JAP;
|
||
|
pRadarDetect->DfsSessionTime = 5;
|
||
|
}
|
||
|
else if ((strncmp(tmpbuf, "FCC", 3) == 0) || (strncmp(tmpbuf, "fcc", 3) == 0))
|
||
|
{
|
||
|
pRadarDetect->RDDurRegion = FCC;
|
||
|
pRadarDetect->DfsSessionTime = 5;
|
||
|
#ifdef DFS_FCC_BW40_FIX
|
||
|
pRadarDetect->DfsSessionFccOff = 0;
|
||
|
#endif // DFS_FCC_BW40_FIX //
|
||
|
}
|
||
|
else if ((strncmp(tmpbuf, "CE", 2) == 0) || (strncmp(tmpbuf, "ce", 2) == 0))
|
||
|
{
|
||
|
pRadarDetect->RDDurRegion = CE;
|
||
|
pRadarDetect->DfsSessionTime = 13;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
pRadarDetect->RDDurRegion = CE;
|
||
|
pRadarDetect->DfsSessionTime = 13;
|
||
|
}
|
||
|
|
||
|
DBGPRINT(RT_DEBUG_TRACE, ("RDRegion=%d\n", pRadarDetect->RDDurRegion));
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
pAd->CommonCfg.RadarDetect.RDDurRegion = CE;
|
||
|
pAd->CommonCfg.RadarDetect.DfsSessionTime = 13;
|
||
|
}
|
||
|
|
||
|
//WirelessEvent
|
||
|
if(RTMPGetKeyParameter("WirelessEvent", tmpbuf, 10, pBuffer, TRUE))
|
||
|
{
|
||
|
#if WIRELESS_EXT >= 15
|
||
|
if(simple_strtol(tmpbuf, 0, 10) != 0)
|
||
|
pAd->CommonCfg.bWirelessEvent = simple_strtol(tmpbuf, 0, 10);
|
||
|
else
|
||
|
pAd->CommonCfg.bWirelessEvent = 0; // disable
|
||
|
#else
|
||
|
pAd->CommonCfg.bWirelessEvent = 0; // disable
|
||
|
#endif
|
||
|
DBGPRINT(RT_DEBUG_TRACE, ("WirelessEvent=%d\n", pAd->CommonCfg.bWirelessEvent));
|
||
|
}
|
||
|
if(RTMPGetKeyParameter("WiFiTest", tmpbuf, 10, pBuffer, TRUE))
|
||
|
{
|
||
|
if(simple_strtol(tmpbuf, 0, 10) != 0)
|
||
|
pAd->CommonCfg.bWiFiTest= simple_strtol(tmpbuf, 0, 10);
|
||
|
else
|
||
|
pAd->CommonCfg.bWiFiTest = 0; // disable
|
||
|
|
||
|
DBGPRINT(RT_DEBUG_TRACE, ("WiFiTest=%d\n", pAd->CommonCfg.bWiFiTest));
|
||
|
}
|
||
|
//AuthMode
|
||
|
if(RTMPGetKeyParameter("AuthMode", tmpbuf, 128, pBuffer, TRUE))
|
||
|
{
|
||
|
#ifdef CONFIG_STA_SUPPORT
|
||
|
IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
|
||
|
{
|
||
|
if ((strcmp(tmpbuf, "WEPAUTO") == 0) || (strcmp(tmpbuf, "wepauto") == 0))
|
||
|
pAd->StaCfg.AuthMode = Ndis802_11AuthModeAutoSwitch;
|
||
|
else if ((strcmp(tmpbuf, "SHARED") == 0) || (strcmp(tmpbuf, "shared") == 0))
|
||
|
pAd->StaCfg.AuthMode = Ndis802_11AuthModeShared;
|
||
|
else if ((strcmp(tmpbuf, "WPAPSK") == 0) || (strcmp(tmpbuf, "wpapsk") == 0))
|
||
|
pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPAPSK;
|
||
|
else if ((strcmp(tmpbuf, "WPANONE") == 0) || (strcmp(tmpbuf, "wpanone") == 0))
|
||
|
pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPANone;
|
||
|
else if ((strcmp(tmpbuf, "WPA2PSK") == 0) || (strcmp(tmpbuf, "wpa2psk") == 0))
|
||
|
pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPA2PSK;
|
||
|
#ifdef WPA_SUPPLICANT_SUPPORT
|
||
|
else if ((strcmp(tmpbuf, "WPA") == 0) || (strcmp(tmpbuf, "wpa") == 0))
|
||
|
pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPA;
|
||
|
else if ((strcmp(tmpbuf, "WPA2") == 0) || (strcmp(tmpbuf, "wpa2") == 0))
|
||
|
pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPA2;
|
||
|
#endif // WPA_SUPPLICANT_SUPPORT //
|
||
|
else
|
||
|
pAd->StaCfg.AuthMode = Ndis802_11AuthModeOpen;
|
||
|
|
||
|
pAd->StaCfg.PortSecured = WPA_802_1X_PORT_NOT_SECURED;
|
||
|
|
||
|
DBGPRINT(RT_DEBUG_TRACE, ("%s::(EncrypType=%d)\n", __FUNCTION__, pAd->StaCfg.WepStatus));
|
||
|
}
|
||
|
#endif // CONFIG_STA_SUPPORT //
|
||
|
}
|
||
|
//EncrypType
|
||
|
if(RTMPGetKeyParameter("EncrypType", tmpbuf, 128, pBuffer, TRUE))
|
||
|
{
|
||
|
|
||
|
#ifdef CONFIG_STA_SUPPORT
|
||
|
IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
|
||
|
{
|
||
|
if ((strcmp(tmpbuf, "WEP") == 0) || (strcmp(tmpbuf, "wep") == 0))
|
||
|
pAd->StaCfg.WepStatus = Ndis802_11WEPEnabled;
|
||
|
else if ((strcmp(tmpbuf, "TKIP") == 0) || (strcmp(tmpbuf, "tkip") == 0))
|
||
|
pAd->StaCfg.WepStatus = Ndis802_11Encryption2Enabled;
|
||
|
else if ((strcmp(tmpbuf, "AES") == 0) || (strcmp(tmpbuf, "aes") == 0))
|
||
|
pAd->StaCfg.WepStatus = Ndis802_11Encryption3Enabled;
|
||
|
else
|
||
|
pAd->StaCfg.WepStatus = Ndis802_11WEPDisabled;
|
||
|
|
||
|
// Update all wepstatus related
|
||
|
pAd->StaCfg.PairCipher = pAd->StaCfg.WepStatus;
|
||
|
pAd->StaCfg.GroupCipher = pAd->StaCfg.WepStatus;
|
||
|
pAd->StaCfg.OrigWepStatus = pAd->StaCfg.WepStatus;
|
||
|
pAd->StaCfg.bMixCipher = FALSE;
|
||
|
|
||
|
//RTMPMakeRSNIE(pAd, pAd->StaCfg.AuthMode, pAd->StaCfg.WepStatus, 0);
|
||
|
DBGPRINT(RT_DEBUG_TRACE, ("%s::(EncrypType=%d)\n", __FUNCTION__, pAd->StaCfg.WepStatus));
|
||
|
}
|
||
|
#endif // CONFIG_STA_SUPPORT //
|
||
|
}
|
||
|
|
||
|
|
||
|
#ifdef CONFIG_STA_SUPPORT
|
||
|
IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
|
||
|
{
|
||
|
if(RTMPGetKeyParameter("WPAPSK", tmpbuf, 512, pBuffer, FALSE))
|
||
|
{
|
||
|
int ret = TRUE;
|
||
|
|
||
|
tmpbuf[strlen(tmpbuf)] = '\0'; // make STA can process .$^& for WPAPSK input
|
||
|
|
||
|
if ((pAd->StaCfg.AuthMode != Ndis802_11AuthModeWPAPSK) &&
|
||
|
(pAd->StaCfg.AuthMode != Ndis802_11AuthModeWPA2PSK) &&
|
||
|
(pAd->StaCfg.AuthMode != Ndis802_11AuthModeWPANone)
|
||
|
)
|
||
|
{
|
||
|
ret = FALSE;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
ret = RT_CfgSetWPAPSKKey(pAd, tmpbuf, (PUCHAR)pAd->CommonCfg.Ssid, pAd->CommonCfg.SsidLen, pAd->StaCfg.PMK);
|
||
|
}
|
||
|
|
||
|
if (ret == TRUE)
|
||
|
{
|
||
|
RTMPZeroMemory(pAd->StaCfg.WpaPassPhrase, 64);
|
||
|
RTMPMoveMemory(pAd->StaCfg.WpaPassPhrase, tmpbuf, strlen(tmpbuf));
|
||
|
pAd->StaCfg.WpaPassPhraseLen= strlen(tmpbuf);
|
||
|
|
||
|
if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPAPSK) ||
|
||
|
(pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK))
|
||
|
{
|
||
|
// Start STA supplicant state machine
|
||
|
pAd->StaCfg.WpaState = SS_START;
|
||
|
}
|
||
|
else if (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPANone)
|
||
|
{
|
||
|
pAd->StaCfg.WpaState = SS_NOTUSE;
|
||
|
}
|
||
|
DBGPRINT(RT_DEBUG_TRACE, ("%s::(WPAPSK=%s)\n", __FUNCTION__, tmpbuf));
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
#endif // CONFIG_STA_SUPPORT //
|
||
|
|
||
|
//DefaultKeyID, KeyType, KeyStr
|
||
|
rtmp_read_key_parms_from_file(pAd, tmpbuf, pBuffer);
|
||
|
|
||
|
|
||
|
//HSCounter
|
||
|
/*if(RTMPGetKeyParameter("HSCounter", tmpbuf, 10, pBuffer, TRUE))
|
||
|
{
|
||
|
switch (simple_strtol(tmpbuf, 0, 10))
|
||
|
{
|
||
|
case 1: //Enable
|
||
|
pAd->CommonCfg.bEnableHSCounter = TRUE;
|
||
|
break;
|
||
|
case 0: //Disable
|
||
|
default:
|
||
|
pAd->CommonCfg.bEnableHSCounter = FALSE;
|
||
|
break;
|
||
|
}
|
||
|
DBGPRINT(RT_DEBUG_TRACE, "HSCounter=%d\n", pAd->CommonCfg.bEnableHSCounter);
|
||
|
}*/
|
||
|
|
||
|
#ifdef DOT11_N_SUPPORT
|
||
|
HTParametersHook(pAd, tmpbuf, pBuffer);
|
||
|
#endif // DOT11_N_SUPPORT //
|
||
|
|
||
|
|
||
|
#ifdef CARRIER_DETECTION_SUPPORT
|
||
|
//CarrierDetect
|
||
|
if(RTMPGetKeyParameter("CarrierDetect", tmpbuf, 128, pBuffer, TRUE))
|
||
|
{
|
||
|
if ((strncmp(tmpbuf, "0", 1) == 0))
|
||
|
pAd->CommonCfg.CarrierDetect.Enable = FALSE;
|
||
|
else if ((strncmp(tmpbuf, "1", 1) == 0))
|
||
|
pAd->CommonCfg.CarrierDetect.Enable = TRUE;
|
||
|
else
|
||
|
pAd->CommonCfg.CarrierDetect.Enable = FALSE;
|
||
|
|
||
|
DBGPRINT(RT_DEBUG_TRACE, ("CarrierDetect.Enable=%d\n", pAd->CommonCfg.CarrierDetect.Enable));
|
||
|
}
|
||
|
else
|
||
|
pAd->CommonCfg.CarrierDetect.Enable = FALSE;
|
||
|
#endif // CARRIER_DETECTION_SUPPORT //
|
||
|
|
||
|
#ifdef CONFIG_STA_SUPPORT
|
||
|
IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
|
||
|
{
|
||
|
//PSMode
|
||
|
if (RTMPGetKeyParameter("PSMode", tmpbuf, 10, pBuffer, TRUE))
|
||
|
{
|
||
|
if (pAd->StaCfg.BssType == BSS_INFRA)
|
||
|
{
|
||
|
if ((strcmp(tmpbuf, "MAX_PSP") == 0) || (strcmp(tmpbuf, "max_psp") == 0))
|
||
|
{
|
||
|
// do NOT turn on PSM bit here, wait until MlmeCheckForPsmChange()
|
||
|
// to exclude certain situations.
|
||
|
// MlmeSetPsm(pAd, PWR_SAVE);
|
||
|
OPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM);
|
||
|
if (pAd->StaCfg.bWindowsACCAMEnable == FALSE)
|
||
|
pAd->StaCfg.WindowsPowerMode = Ndis802_11PowerModeMAX_PSP;
|
||
|
pAd->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeMAX_PSP;
|
||
|
pAd->StaCfg.DefaultListenCount = 5;
|
||
|
}
|
||
|
else if ((strcmp(tmpbuf, "Fast_PSP") == 0) || (strcmp(tmpbuf, "fast_psp") == 0)
|
||
|
|| (strcmp(tmpbuf, "FAST_PSP") == 0))
|
||
|
{
|
||
|
// do NOT turn on PSM bit here, wait until MlmeCheckForPsmChange()
|
||
|
// to exclude certain situations.
|
||
|
// MlmeSetPsmBit(pAd, PWR_SAVE);
|
||
|
OPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM);
|
||
|
if (pAd->StaCfg.bWindowsACCAMEnable == FALSE)
|
||
|
pAd->StaCfg.WindowsPowerMode = Ndis802_11PowerModeFast_PSP;
|
||
|
pAd->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeFast_PSP;
|
||
|
pAd->StaCfg.DefaultListenCount = 3;
|
||
|
}
|
||
|
else if ((strcmp(tmpbuf, "Legacy_PSP") == 0) || (strcmp(tmpbuf, "legacy_psp") == 0)
|
||
|
|| (strcmp(tmpbuf, "LEGACY_PSP") == 0))
|
||
|
{
|
||
|
// do NOT turn on PSM bit here, wait until MlmeCheckForPsmChange()
|
||
|
// to exclude certain situations.
|
||
|
// MlmeSetPsmBit(pAd, PWR_SAVE);
|
||
|
OPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM);
|
||
|
if (pAd->StaCfg.bWindowsACCAMEnable == FALSE)
|
||
|
pAd->StaCfg.WindowsPowerMode = Ndis802_11PowerModeLegacy_PSP;
|
||
|
pAd->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeLegacy_PSP;
|
||
|
pAd->StaCfg.DefaultListenCount = 3;
|
||
|
}
|
||
|
else
|
||
|
{ //Default Ndis802_11PowerModeCAM
|
||
|
// clear PSM bit immediately
|
||
|
RTMP_SET_PSM_BIT(pAd, PWR_ACTIVE);
|
||
|
OPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM);
|
||
|
if (pAd->StaCfg.bWindowsACCAMEnable == FALSE)
|
||
|
pAd->StaCfg.WindowsPowerMode = Ndis802_11PowerModeCAM;
|
||
|
pAd->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeCAM;
|
||
|
}
|
||
|
DBGPRINT(RT_DEBUG_TRACE, ("PSMode=%ld\n", pAd->StaCfg.WindowsPowerMode));
|
||
|
}
|
||
|
}
|
||
|
// AutoRoaming by RSSI
|
||
|
if (RTMPGetKeyParameter("AutoRoaming", tmpbuf, 32, pBuffer, TRUE))
|
||
|
{
|
||
|
if (simple_strtol(tmpbuf, 0, 10) == 0)
|
||
|
pAd->StaCfg.bAutoRoaming = FALSE;
|
||
|
else
|
||
|
pAd->StaCfg.bAutoRoaming = TRUE;
|
||
|
|
||
|
DBGPRINT(RT_DEBUG_TRACE, ("AutoRoaming=%d\n", pAd->StaCfg.bAutoRoaming));
|
||
|
}
|
||
|
// RoamThreshold
|
||
|
if (RTMPGetKeyParameter("RoamThreshold", tmpbuf, 32, pBuffer, TRUE))
|
||
|
{
|
||
|
long lInfo = simple_strtol(tmpbuf, 0, 10);
|
||
|
|
||
|
if (lInfo > 90 || lInfo < 60)
|
||
|
pAd->StaCfg.dBmToRoam = -70;
|
||
|
else
|
||
|
pAd->StaCfg.dBmToRoam = (CHAR)(-1)*lInfo;
|
||
|
|
||
|
DBGPRINT(RT_DEBUG_TRACE, ("RoamThreshold=%d dBm\n", pAd->StaCfg.dBmToRoam));
|
||
|
}
|
||
|
|
||
|
if(RTMPGetKeyParameter("TGnWifiTest", tmpbuf, 10, pBuffer, TRUE))
|
||
|
{
|
||
|
if(simple_strtol(tmpbuf, 0, 10) == 0)
|
||
|
pAd->StaCfg.bTGnWifiTest = FALSE;
|
||
|
else
|
||
|
pAd->StaCfg.bTGnWifiTest = TRUE;
|
||
|
DBGPRINT(RT_DEBUG_TRACE, ("TGnWifiTest=%d\n", pAd->StaCfg.bTGnWifiTest));
|
||
|
}
|
||
|
|
||
|
// Beacon Lost Time
|
||
|
if (RTMPGetKeyParameter("BeaconLostTime", tmpbuf, 32, pBuffer, TRUE))
|
||
|
{
|
||
|
ULONG lInfo = (ULONG)simple_strtol(tmpbuf, 0, 10);
|
||
|
|
||
|
if ((lInfo != 0) && (lInfo <= 60))
|
||
|
pAd->StaCfg.BeaconLostTime = (lInfo * OS_HZ);
|
||
|
DBGPRINT(RT_DEBUG_TRACE, ("BeaconLostTime=%ld \n", pAd->StaCfg.BeaconLostTime));
|
||
|
}
|
||
|
|
||
|
|
||
|
}
|
||
|
#endif // CONFIG_STA_SUPPORT //
|
||
|
|
||
|
|
||
|
|
||
|
#ifdef RT30xx
|
||
|
#ifdef ANT_DIVERSITY_SUPPORT
|
||
|
IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
|
||
|
{
|
||
|
if(RTMPGetKeyParameter("AntDiversity", tmpbuf, 10, pBuffer, TRUE))
|
||
|
{
|
||
|
for (i = 0, macptr = rstrtok(tmpbuf,";"); macptr; macptr = rstrtok(NULL,";"), i++)
|
||
|
{
|
||
|
UCHAR Ant = simple_strtol(tmpbuf, 0, 10);
|
||
|
if(Ant < 3)
|
||
|
pAd->CommonCfg.bRxAntDiversity = Ant;
|
||
|
else
|
||
|
pAd->CommonCfg.bRxAntDiversity = ANT_DIVERSITY_DISABLE;
|
||
|
|
||
|
DBGPRINT(RT_DEBUG_ERROR, ("AntDiversity=%d\n", pAd->CommonCfg.bRxAntDiversity));
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
#endif // ANT_DIVERSITY_SUPPORT //
|
||
|
#endif // RT30xx //
|
||
|
|
||
|
}while(0);
|
||
|
|
||
|
|
||
|
kfree(tmpbuf);
|
||
|
|
||
|
return NDIS_STATUS_SUCCESS;
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
#ifdef MULTIPLE_CARD_SUPPORT
|
||
|
// record whether the card in the card list is used in the card file
|
||
|
UINT8 MC_CardUsed[MAX_NUM_OF_MULTIPLE_CARD];
|
||
|
// record used card mac address in the card list
|
||
|
static UINT8 MC_CardMac[MAX_NUM_OF_MULTIPLE_CARD][6];
|
||
|
|
||
|
/*
|
||
|
========================================================================
|
||
|
Routine Description:
|
||
|
Get card profile path.
|
||
|
|
||
|
Arguments:
|
||
|
pAd
|
||
|
|
||
|
Return Value:
|
||
|
TRUE - Find a card profile
|
||
|
FALSE - use default profile
|
||
|
|
||
|
Note:
|
||
|
========================================================================
|
||
|
*/
|
||
|
BOOLEAN RTMP_CardInfoRead(
|
||
|
IN PRTMP_ADAPTER pAd)
|
||
|
{
|
||
|
#define MC_SELECT_CARDID 0 /* use CARD ID (0 ~ 31) to identify different cards */
|
||
|
#define MC_SELECT_MAC 1 /* use CARD MAC to identify different cards */
|
||
|
#define MC_SELECT_CARDTYPE 2 /* use CARD type (abgn or bgn) to identify different cards */
|
||
|
|
||
|
#define LETTER_CASE_TRANSLATE(txt_p, card_id) \
|
||
|
{ UINT32 _len; char _char; \
|
||
|
for(_len=0; _len<strlen(card_id); _len++) { \
|
||
|
_char = *(txt_p + _len); \
|
||
|
if (('A' <= _char) && (_char <= 'Z')) \
|
||
|
*(txt_p+_len) = 'a'+(_char-'A'); \
|
||
|
} }
|
||
|
|
||
|
RTMP_OS_FD srcf;
|
||
|
INT retval;
|
||
|
PSTRING buffer, tmpbuf;
|
||
|
STRING card_id_buf[30], RFIC_word[30];
|
||
|
BOOLEAN flg_match_ok = FALSE;
|
||
|
INT32 card_select_method;
|
||
|
INT32 card_free_id, card_nouse_id, card_same_mac_id, card_match_id;
|
||
|
EEPROM_ANTENNA_STRUC antenna;
|
||
|
USHORT addr01, addr23, addr45;
|
||
|
UINT8 mac[6];
|
||
|
UINT32 data, card_index;
|
||
|
UCHAR *start_ptr;
|
||
|
RTMP_OS_FS_INFO osFSInfo;
|
||
|
|
||
|
// init
|
||
|
buffer = kmalloc(MAX_INI_BUFFER_SIZE, MEM_ALLOC_FLAG);
|
||
|
if (buffer == NULL)
|
||
|
return FALSE;
|
||
|
|
||
|
tmpbuf = kmalloc(MAX_PARAM_BUFFER_SIZE, MEM_ALLOC_FLAG);
|
||
|
if(tmpbuf == NULL)
|
||
|
{
|
||
|
kfree(buffer);
|
||
|
return NDIS_STATUS_FAILURE;
|
||
|
}
|
||
|
|
||
|
// get RF IC type
|
||
|
RTMP_IO_READ32(pAd, E2PROM_CSR, &data);
|
||
|
|
||
|
if ((data & 0x30) == 0)
|
||
|
pAd->EEPROMAddressNum = 6; // 93C46
|
||
|
else if ((data & 0x30) == 0x10)
|
||
|
pAd->EEPROMAddressNum = 8; // 93C66
|
||
|
else
|
||
|
pAd->EEPROMAddressNum = 8; // 93C86
|
||
|
|
||
|
RT28xx_EEPROM_READ16(pAd, EEPROM_NIC1_OFFSET, antenna.word);
|
||
|
|
||
|
if ((antenna.field.RfIcType == RFIC_2850) ||
|
||
|
(antenna.field.RfIcType == RFIC_2750))
|
||
|
{
|
||
|
/* ABGN card */
|
||
|
strcpy(RFIC_word, "abgn");
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
/* BGN card */
|
||
|
strcpy(RFIC_word, "bgn");
|
||
|
}
|
||
|
|
||
|
// get MAC address
|
||
|
RT28xx_EEPROM_READ16(pAd, 0x04, addr01);
|
||
|
RT28xx_EEPROM_READ16(pAd, 0x06, addr23);
|
||
|
RT28xx_EEPROM_READ16(pAd, 0x08, addr45);
|
||
|
|
||
|
mac[0] = (UCHAR)(addr01 & 0xff);
|
||
|
mac[1] = (UCHAR)(addr01 >> 8);
|
||
|
mac[2] = (UCHAR)(addr23 & 0xff);
|
||
|
mac[3] = (UCHAR)(addr23 >> 8);
|
||
|
mac[4] = (UCHAR)(addr45 & 0xff);
|
||
|
mac[5] = (UCHAR)(addr45 >> 8);
|
||
|
|
||
|
DBGPRINT(RT_DEBUG_TRACE, ("mac addr=%02x:%02x:%02x:%02x:%02x:%02x!\n", PRINT_MAC(mac)));
|
||
|
|
||
|
RtmpOSFSInfoChange(&osFSInfo, TRUE);
|
||
|
// open card information file
|
||
|
srcf = RtmpOSFileOpen(CARD_INFO_PATH, O_RDONLY, 0);
|
||
|
if (IS_FILE_OPEN_ERR(srcf))
|
||
|
{
|
||
|
/* card information file does not exist */
|
||
|
DBGPRINT(RT_DEBUG_TRACE,
|
||
|
("--> Error opening %s\n", CARD_INFO_PATH));
|
||
|
goto free_resource;
|
||
|
}
|
||
|
|
||
|
/* card information file exists so reading the card information */
|
||
|
memset(buffer, 0x00, MAX_INI_BUFFER_SIZE);
|
||
|
retval = RtmpOSFileRead(srcf, buffer, MAX_INI_BUFFER_SIZE);
|
||
|
if (retval < 0)
|
||
|
{
|
||
|
/* read fail */
|
||
|
DBGPRINT(RT_DEBUG_TRACE,
|
||
|
("--> Read %s error %d\n", CARD_INFO_PATH, -retval));
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
/* get card selection method */
|
||
|
memset(tmpbuf, 0x00, MAX_PARAM_BUFFER_SIZE);
|
||
|
card_select_method = MC_SELECT_CARDTYPE; // default
|
||
|
|
||
|
if (RTMPGetKeyParameter("SELECT", tmpbuf, 256, buffer, TRUE))
|
||
|
{
|
||
|
if (strcmp(tmpbuf, "CARDID") == 0)
|
||
|
card_select_method = MC_SELECT_CARDID;
|
||
|
else if (strcmp(tmpbuf, "MAC") == 0)
|
||
|
card_select_method = MC_SELECT_MAC;
|
||
|
else if (strcmp(tmpbuf, "CARDTYPE") == 0)
|
||
|
card_select_method = MC_SELECT_CARDTYPE;
|
||
|
}
|
||
|
|
||
|
DBGPRINT(RT_DEBUG_TRACE,
|
||
|
("MC> Card Selection = %d\n", card_select_method));
|
||
|
|
||
|
// init
|
||
|
card_free_id = -1;
|
||
|
card_nouse_id = -1;
|
||
|
card_same_mac_id = -1;
|
||
|
card_match_id = -1;
|
||
|
|
||
|
// search current card information records
|
||
|
for(card_index=0;
|
||
|
card_index<MAX_NUM_OF_MULTIPLE_CARD;
|
||
|
card_index++)
|
||
|
{
|
||
|
if ((*(UINT32 *)&MC_CardMac[card_index][0] == 0) &&
|
||
|
(*(UINT16 *)&MC_CardMac[card_index][4] == 0))
|
||
|
{
|
||
|
// MAC is all-0 so the entry is available
|
||
|
MC_CardUsed[card_index] = 0;
|
||
|
|
||
|
if (card_free_id < 0)
|
||
|
card_free_id = card_index; // 1st free entry
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if (memcmp(MC_CardMac[card_index], mac, 6) == 0)
|
||
|
{
|
||
|
// we find the entry with same MAC
|
||
|
if (card_same_mac_id < 0)
|
||
|
card_same_mac_id = card_index; // 1st same entry
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
// MAC is not all-0 but used flag == 0
|
||
|
if ((MC_CardUsed[card_index] == 0) &&
|
||
|
(card_nouse_id < 0))
|
||
|
{
|
||
|
card_nouse_id = card_index; // 1st available entry
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
DBGPRINT(RT_DEBUG_TRACE,
|
||
|
("MC> Free = %d, Same = %d, NOUSE = %d\n",
|
||
|
card_free_id, card_same_mac_id, card_nouse_id));
|
||
|
|
||
|
if ((card_same_mac_id >= 0) &&
|
||
|
((card_select_method == MC_SELECT_CARDID) ||
|
||
|
(card_select_method == MC_SELECT_CARDTYPE)))
|
||
|
{
|
||
|
// same MAC entry is found
|
||
|
card_match_id = card_same_mac_id;
|
||
|
|
||
|
if (card_select_method == MC_SELECT_CARDTYPE)
|
||
|
{
|
||
|
// for CARDTYPE
|
||
|
sprintf(card_id_buf, "%02dCARDTYPE%s",
|
||
|
card_match_id, RFIC_word);
|
||
|
|
||
|
if ((start_ptr = (PUCHAR)rtstrstruncasecmp(buffer, card_id_buf)) != NULL)
|
||
|
{
|
||
|
// we found the card ID
|
||
|
LETTER_CASE_TRANSLATE(start_ptr, card_id_buf);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
// the card is 1st plug-in, try to find the match card profile
|
||
|
switch(card_select_method)
|
||
|
{
|
||
|
case MC_SELECT_CARDID: // CARDID
|
||
|
default:
|
||
|
if (card_free_id >= 0)
|
||
|
card_match_id = card_free_id;
|
||
|
else
|
||
|
card_match_id = card_nouse_id;
|
||
|
break;
|
||
|
|
||
|
case MC_SELECT_MAC: // MAC
|
||
|
sprintf(card_id_buf, "MAC%02x:%02x:%02x:%02x:%02x:%02x",
|
||
|
mac[0], mac[1], mac[2],
|
||
|
mac[3], mac[4], mac[5]);
|
||
|
|
||
|
/* try to find the key word in the card file */
|
||
|
if ((start_ptr = (PUCHAR)rtstrstruncasecmp(buffer, card_id_buf)) != NULL)
|
||
|
{
|
||
|
LETTER_CASE_TRANSLATE(start_ptr, card_id_buf);
|
||
|
|
||
|
/* get the row ID (2 ASCII characters) */
|
||
|
start_ptr -= 2;
|
||
|
card_id_buf[0] = *(start_ptr);
|
||
|
card_id_buf[1] = *(start_ptr+1);
|
||
|
card_id_buf[2] = 0x00;
|
||
|
|
||
|
card_match_id = simple_strtol(card_id_buf, 0, 10);
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case MC_SELECT_CARDTYPE: // CARDTYPE
|
||
|
card_nouse_id = -1;
|
||
|
|
||
|
for(card_index=0;
|
||
|
card_index<MAX_NUM_OF_MULTIPLE_CARD;
|
||
|
card_index++)
|
||
|
{
|
||
|
sprintf(card_id_buf, "%02dCARDTYPE%s",
|
||
|
card_index, RFIC_word);
|
||
|
|
||
|
if ((start_ptr = (PUCHAR)rtstrstruncasecmp(buffer,
|
||
|
card_id_buf)) != NULL)
|
||
|
{
|
||
|
LETTER_CASE_TRANSLATE(start_ptr, card_id_buf);
|
||
|
|
||
|
if (MC_CardUsed[card_index] == 0)
|
||
|
{
|
||
|
/* current the card profile is not used */
|
||
|
if ((*(UINT32 *)&MC_CardMac[card_index][0] == 0) &&
|
||
|
(*(UINT16 *)&MC_CardMac[card_index][4] == 0))
|
||
|
{
|
||
|
// find it and no previous card use it
|
||
|
card_match_id = card_index;
|
||
|
break;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
// ever a card use it
|
||
|
if (card_nouse_id < 0)
|
||
|
card_nouse_id = card_index;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// if not find a free one, use the available one
|
||
|
if (card_match_id < 0)
|
||
|
card_match_id = card_nouse_id;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (card_match_id >= 0)
|
||
|
{
|
||
|
// make up search keyword
|
||
|
switch(card_select_method)
|
||
|
{
|
||
|
case MC_SELECT_CARDID: // CARDID
|
||
|
sprintf(card_id_buf, "%02dCARDID", card_match_id);
|
||
|
break;
|
||
|
|
||
|
case MC_SELECT_MAC: // MAC
|
||
|
sprintf(card_id_buf,
|
||
|
"%02dmac%02x:%02x:%02x:%02x:%02x:%02x",
|
||
|
card_match_id,
|
||
|
mac[0], mac[1], mac[2],
|
||
|
mac[3], mac[4], mac[5]);
|
||
|
break;
|
||
|
|
||
|
case MC_SELECT_CARDTYPE: // CARDTYPE
|
||
|
default:
|
||
|
sprintf(card_id_buf, "%02dcardtype%s",
|
||
|
card_match_id, RFIC_word);
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
DBGPRINT(RT_DEBUG_TRACE, ("Search Keyword = %s\n", card_id_buf));
|
||
|
|
||
|
// read card file path
|
||
|
if (RTMPGetKeyParameter(card_id_buf, tmpbuf, 256, buffer, TRUE))
|
||
|
{
|
||
|
if (strlen(tmpbuf) < sizeof(pAd->MC_FileName))
|
||
|
{
|
||
|
// backup card information
|
||
|
pAd->MC_RowID = card_match_id; /* base 0 */
|
||
|
MC_CardUsed[card_match_id] = 1;
|
||
|
memcpy(MC_CardMac[card_match_id], mac, sizeof(mac));
|
||
|
|
||
|
// backup card file path
|
||
|
NdisMoveMemory(pAd->MC_FileName, tmpbuf , strlen(tmpbuf));
|
||
|
pAd->MC_FileName[strlen(tmpbuf)] = '\0';
|
||
|
flg_match_ok = TRUE;
|
||
|
|
||
|
DBGPRINT(RT_DEBUG_TRACE,
|
||
|
("Card Profile Name = %s\n", pAd->MC_FileName));
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
DBGPRINT(RT_DEBUG_ERROR,
|
||
|
("Card Profile Name length too large!\n"));
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
DBGPRINT(RT_DEBUG_ERROR,
|
||
|
("Can not find search key word in card.dat!\n"));
|
||
|
}
|
||
|
|
||
|
if ((flg_match_ok != TRUE) &&
|
||
|
(card_match_id < MAX_NUM_OF_MULTIPLE_CARD))
|
||
|
{
|
||
|
MC_CardUsed[card_match_id] = 0;
|
||
|
memset(MC_CardMac[card_match_id], 0, sizeof(mac));
|
||
|
}
|
||
|
} // if (card_match_id >= 0)
|
||
|
}
|
||
|
|
||
|
|
||
|
// close file
|
||
|
retval = RtmpOSFileClose(srcf);
|
||
|
|
||
|
free_resource:
|
||
|
RtmpOSFSInfoChange(&osFSInfo, FALSE);
|
||
|
kfree(buffer);
|
||
|
kfree(tmpbuf);
|
||
|
|
||
|
return flg_match_ok;
|
||
|
}
|
||
|
#endif // MULTIPLE_CARD_SUPPORT //
|