kernel-ark/drivers/staging/rt3090/common/cmm_info.c
Bartlomiej Zolnierkiewicz 36c7928c3e Staging: add rt3090 wireless driver
This is the vendor driver for the Ralink RT3090 chipset.

It should be later cleaned and ported to use the existing rt2x00
infrastructure or just replaced by the proper version.

[ Unfortunately since it follows the same design/implementation like
  rt{286,287,307}0 drivers (already present in the staging tree)
  it is highly unlikely that it will see much love from the wireless
  development community.. ]

However since the development of the cleaner/proper version can take
significant time lets give distros (i.e. openSUSE seems to already
have the package with the original vendor driver) and users "something"
to use in the meantime.

I forward ported it to 2.6.31-rc1, ported to the Linux build system
and did some initial cleanups.  More fixes/cleanups to come later
(it seems that the driver can be made to share most of its code with
the other Ralink drivers already present in the staging tree).

Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
2009-09-15 12:01:31 -07:00

3718 lines
98 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_info.c
Abstract:
Revision History:
Who When What
--------- ---------- ----------------------------------------------
*/
#include "../rt_config.h"
INT Show_SSID_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf);
INT Show_WirelessMode_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf);
INT Show_TxBurst_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf);
INT Show_TxPreamble_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf);
INT Show_TxPower_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf);
INT Show_Channel_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf);
INT Show_BGProtection_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf);
INT Show_RTSThreshold_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf);
INT Show_FragThreshold_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf);
#ifdef DOT11_N_SUPPORT
INT Show_HtBw_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf);
INT Show_HtMcs_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf);
INT Show_HtGi_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf);
INT Show_HtOpMode_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf);
INT Show_HtExtcha_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf);
INT Show_HtMpduDensity_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf);
INT Show_HtBaWinSize_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf);
INT Show_HtRdg_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf);
INT Show_HtAmsdu_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf);
INT Show_HtAutoBa_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf);
#endif // DOT11_N_SUPPORT //
INT Show_CountryRegion_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf);
INT Show_CountryRegionABand_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf);
INT Show_CountryCode_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf);
#ifdef AGGREGATION_SUPPORT
INT Show_PktAggregate_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf);
#endif // AGGREGATION_SUPPORT //
#ifdef WMM_SUPPORT
INT Show_WmmCapable_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf);
#endif // WMM_SUPPORT //
INT Show_IEEE80211H_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf);
#ifdef CONFIG_STA_SUPPORT
INT Show_NetworkType_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf);
#endif // CONFIG_STA_SUPPORT //
INT Show_AuthMode_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf);
INT Show_EncrypType_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf);
INT Show_DefaultKeyID_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf);
INT Show_Key1_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf);
INT Show_Key2_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf);
INT Show_Key3_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf);
INT Show_Key4_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf);
INT Show_WPAPSK_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf);
static struct {
PSTRING name;
INT (*show_proc)(PRTMP_ADAPTER pAdapter, PSTRING arg);
} *PRTMP_PRIVATE_STA_SHOW_CFG_VALUE_PROC, RTMP_PRIVATE_STA_SHOW_CFG_VALUE_PROC[] = {
{"SSID", Show_SSID_Proc},
{"WirelessMode", Show_WirelessMode_Proc},
{"TxBurst", Show_TxBurst_Proc},
{"TxPreamble", Show_TxPreamble_Proc},
{"TxPower", Show_TxPower_Proc},
{"Channel", Show_Channel_Proc},
{"BGProtection", Show_BGProtection_Proc},
{"RTSThreshold", Show_RTSThreshold_Proc},
{"FragThreshold", Show_FragThreshold_Proc},
#ifdef DOT11_N_SUPPORT
{"HtBw", Show_HtBw_Proc},
{"HtMcs", Show_HtMcs_Proc},
{"HtGi", Show_HtGi_Proc},
{"HtOpMode", Show_HtOpMode_Proc},
{"HtExtcha", Show_HtExtcha_Proc},
{"HtMpduDensity", Show_HtMpduDensity_Proc},
{"HtBaWinSize", Show_HtBaWinSize_Proc},
{"HtRdg", Show_HtRdg_Proc},
{"HtAmsdu", Show_HtAmsdu_Proc},
{"HtAutoBa", Show_HtAutoBa_Proc},
#endif // DOT11_N_SUPPORT //
{"CountryRegion", Show_CountryRegion_Proc},
{"CountryRegionABand", Show_CountryRegionABand_Proc},
{"CountryCode", Show_CountryCode_Proc},
#ifdef AGGREGATION_SUPPORT
{"PktAggregate", Show_PktAggregate_Proc},
#endif
#ifdef WMM_SUPPORT
{"WmmCapable", Show_WmmCapable_Proc},
#endif
{"IEEE80211H", Show_IEEE80211H_Proc},
#ifdef CONFIG_STA_SUPPORT
{"NetworkType", Show_NetworkType_Proc},
#endif // CONFIG_STA_SUPPORT //
{"AuthMode", Show_AuthMode_Proc},
{"EncrypType", Show_EncrypType_Proc},
{"DefaultKeyID", Show_DefaultKeyID_Proc},
{"Key1", Show_Key1_Proc},
{"Key2", Show_Key2_Proc},
{"Key3", Show_Key3_Proc},
{"Key4", Show_Key4_Proc},
{"WPAPSK", Show_WPAPSK_Proc},
{NULL, NULL}
};
/*
==========================================================================
Description:
Get Driver version.
Return:
==========================================================================
*/
INT Set_DriverVersion_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg)
{
#ifdef CONFIG_STA_SUPPORT
IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
DBGPRINT(RT_DEBUG_TRACE, ("Driver version-%s\n", STA_DRIVER_VERSION));
#endif // CONFIG_STA_SUPPORT //
return TRUE;
}
/*
==========================================================================
Description:
Set Country Region.
This command will not work, if the field of CountryRegion in eeprom is programmed.
Return:
TRUE if all parameters are OK, FALSE otherwise
==========================================================================
*/
INT Set_CountryRegion_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg)
{
int retval;
#ifdef EXT_BUILD_CHANNEL_LIST
return -EOPNOTSUPP;
#endif // EXT_BUILD_CHANNEL_LIST //
retval = RT_CfgSetCountryRegion(pAd, arg, BAND_24G);
if (retval == FALSE)
return FALSE;
// if set country region, driver needs to be reset
BuildChannelList(pAd);
DBGPRINT(RT_DEBUG_TRACE, ("Set_CountryRegion_Proc::(CountryRegion=%d)\n", pAd->CommonCfg.CountryRegion));
return TRUE;
}
/*
==========================================================================
Description:
Set Country Region for A band.
This command will not work, if the field of CountryRegion in eeprom is programmed.
Return:
TRUE if all parameters are OK, FALSE otherwise
==========================================================================
*/
INT Set_CountryRegionABand_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg)
{
int retval;
#ifdef EXT_BUILD_CHANNEL_LIST
return -EOPNOTSUPP;
#endif // EXT_BUILD_CHANNEL_LIST //
retval = RT_CfgSetCountryRegion(pAd, arg, BAND_5G);
if (retval == FALSE)
return FALSE;
// if set country region, driver needs to be reset
BuildChannelList(pAd);
DBGPRINT(RT_DEBUG_TRACE, ("Set_CountryRegionABand_Proc::(CountryRegion=%d)\n", pAd->CommonCfg.CountryRegionForABand));
return TRUE;
}
/*
==========================================================================
Description:
Set Wireless Mode
Return:
TRUE if all parameters are OK, FALSE otherwise
==========================================================================
*/
INT Set_WirelessMode_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg)
{
INT success = TRUE;
success = RT_CfgSetWirelessMode(pAd, arg);
if (success)
{
#ifdef CONFIG_STA_SUPPORT
IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
{
LONG WirelessMode = pAd->CommonCfg.PhyMode;
RTMPSetPhyMode(pAd, WirelessMode);
#ifdef DOT11_N_SUPPORT
if (WirelessMode >= PHY_11ABGN_MIXED)
{
pAd->CommonCfg.BACapability.field.AutoBA = TRUE;
pAd->CommonCfg.REGBACapability.field.AutoBA = TRUE;
}
else
{
pAd->CommonCfg.BACapability.field.AutoBA = FALSE;
pAd->CommonCfg.REGBACapability.field.AutoBA = FALSE;
}
#endif // DOT11_N_SUPPORT //
// Set AdhocMode rates
if (pAd->StaCfg.BssType == BSS_ADHOC)
{
MlmeUpdateTxRates(pAd, FALSE, 0);
MakeIbssBeacon(pAd); // re-build BEACON frame
AsicEnableIbssSync(pAd); // copy to on-chip memory
}
}
#endif // CONFIG_STA_SUPPORT //
// it is needed to set SSID to take effect
#ifdef DOT11_N_SUPPORT
SetCommonHT(pAd);
#endif // DOT11_N_SUPPORT //
DBGPRINT(RT_DEBUG_TRACE, ("Set_WirelessMode_Proc::(=%d)\n", pAd->CommonCfg.PhyMode));
}
else
{
DBGPRINT(RT_DEBUG_ERROR, ("Set_WirelessMode_Proc::parameters out of range\n"));
}
return success;
}
/*
==========================================================================
Description:
Set Channel
Return:
TRUE if all parameters are OK, FALSE otherwise
==========================================================================
*/
INT Set_Channel_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg)
{
INT success = TRUE;
UCHAR Channel;
Channel = (UCHAR) simple_strtol(arg, 0, 10);
// check if this channel is valid
if (ChannelSanity(pAd, Channel) == TRUE)
{
#ifdef CONFIG_STA_SUPPORT
IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
{
pAd->CommonCfg.Channel = Channel;
if (MONITOR_ON(pAd))
{
#ifdef DOT11_N_SUPPORT
N_ChannelCheck(pAd);
if (pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED &&
pAd->CommonCfg.RegTransmitSetting.field.BW == BW_40)
{
N_SetCenCh(pAd);
AsicSwitchChannel(pAd, pAd->CommonCfg.CentralChannel, FALSE);
AsicLockChannel(pAd, pAd->CommonCfg.CentralChannel);
DBGPRINT(RT_DEBUG_TRACE, ("BW_40, control_channel(%d), CentralChannel(%d) \n",
pAd->CommonCfg.Channel, pAd->CommonCfg.CentralChannel));
}
else
#endif // DOT11_N_SUPPORT //
{
AsicSwitchChannel(pAd, pAd->CommonCfg.Channel, FALSE);
AsicLockChannel(pAd, pAd->CommonCfg.Channel);
DBGPRINT(RT_DEBUG_TRACE, ("BW_20, Channel(%d)\n", pAd->CommonCfg.Channel));
}
}
}
#endif // CONFIG_STA_SUPPORT //
success = TRUE;
}
else
{
#ifdef CONFIG_STA_SUPPORT
IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
success = FALSE;
#endif // CONFIG_STA_SUPPORT //
}
if (success == TRUE)
DBGPRINT(RT_DEBUG_TRACE, ("Set_Channel_Proc::(Channel=%d)\n", pAd->CommonCfg.Channel));
return success;
}
/*
==========================================================================
Description:
Set Short Slot Time Enable or Disable
Return:
TRUE if all parameters are OK, FALSE otherwise
==========================================================================
*/
INT Set_ShortSlot_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg)
{
int retval;
retval = RT_CfgSetShortSlot(pAd, arg);
if (retval == TRUE)
DBGPRINT(RT_DEBUG_TRACE, ("Set_ShortSlot_Proc::(ShortSlot=%d)\n", pAd->CommonCfg.bUseShortSlotTime));
return retval;
}
/*
==========================================================================
Description:
Set Tx power
Return:
TRUE if all parameters are OK, FALSE otherwise
==========================================================================
*/
INT Set_TxPower_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg)
{
LONG TxPower;
INT success = FALSE;
TxPower = simple_strtol(arg, 0, 10);
if (TxPower <= 100)
{
#ifdef CONFIG_STA_SUPPORT
IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
{
pAd->CommonCfg.TxPowerDefault = TxPower;
pAd->CommonCfg.TxPowerPercentage = pAd->CommonCfg.TxPowerDefault;
}
#endif // CONFIG_STA_SUPPORT //
success = TRUE;
}
else
success = FALSE;
DBGPRINT(RT_DEBUG_TRACE, ("Set_TxPower_Proc::(TxPowerPercentage=%ld)\n", pAd->CommonCfg.TxPowerPercentage));
return success;
}
/*
==========================================================================
Description:
Set 11B/11G Protection
Return:
TRUE if all parameters are OK, FALSE otherwise
==========================================================================
*/
INT Set_BGProtection_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg)
{
switch (simple_strtol(arg, 0, 10))
{
case 0: //AUTO
pAd->CommonCfg.UseBGProtection = 0;
break;
case 1: //Always On
pAd->CommonCfg.UseBGProtection = 1;
break;
case 2: //Always OFF
pAd->CommonCfg.UseBGProtection = 2;
break;
default: //Invalid argument
return FALSE;
}
DBGPRINT(RT_DEBUG_TRACE, ("Set_BGProtection_Proc::(BGProtection=%ld)\n", pAd->CommonCfg.UseBGProtection));
return TRUE;
}
/*
==========================================================================
Description:
Set TxPreamble
Return:
TRUE if all parameters are OK, FALSE otherwise
==========================================================================
*/
INT Set_TxPreamble_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg)
{
RT_802_11_PREAMBLE Preamble;
Preamble = simple_strtol(arg, 0, 10);
switch (Preamble)
{
case Rt802_11PreambleShort:
pAd->CommonCfg.TxPreamble = Preamble;
#ifdef CONFIG_STA_SUPPORT
IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
MlmeSetTxPreamble(pAd, Rt802_11PreambleShort);
#endif // CONFIG_STA_SUPPORT //
break;
case Rt802_11PreambleLong:
#ifdef CONFIG_STA_SUPPORT
case Rt802_11PreambleAuto:
// if user wants AUTO, initialize to LONG here, then change according to AP's
// capability upon association.
#endif // CONFIG_STA_SUPPORT //
pAd->CommonCfg.TxPreamble = Preamble;
#ifdef CONFIG_STA_SUPPORT
IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
MlmeSetTxPreamble(pAd, Rt802_11PreambleLong);
#endif // CONFIG_STA_SUPPORT //
break;
default: //Invalid argument
return FALSE;
}
DBGPRINT(RT_DEBUG_TRACE, ("Set_TxPreamble_Proc::(TxPreamble=%ld)\n", pAd->CommonCfg.TxPreamble));
return TRUE;
}
/*
==========================================================================
Description:
Set RTS Threshold
Return:
TRUE if all parameters are OK, FALSE otherwise
==========================================================================
*/
INT Set_RTSThreshold_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg)
{
NDIS_802_11_RTS_THRESHOLD RtsThresh;
RtsThresh = simple_strtol(arg, 0, 10);
if((RtsThresh > 0) && (RtsThresh <= MAX_RTS_THRESHOLD))
pAd->CommonCfg.RtsThreshold = (USHORT)RtsThresh;
#ifdef CONFIG_STA_SUPPORT
else if (RtsThresh == 0)
pAd->CommonCfg.RtsThreshold = MAX_RTS_THRESHOLD;
#endif // CONFIG_STA_SUPPORT //
else
return FALSE; //Invalid argument
DBGPRINT(RT_DEBUG_TRACE, ("Set_RTSThreshold_Proc::(RTSThreshold=%d)\n", pAd->CommonCfg.RtsThreshold));
return TRUE;
}
/*
==========================================================================
Description:
Set Fragment Threshold
Return:
TRUE if all parameters are OK, FALSE otherwise
==========================================================================
*/
INT Set_FragThreshold_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg)
{
NDIS_802_11_FRAGMENTATION_THRESHOLD FragThresh;
FragThresh = simple_strtol(arg, 0, 10);
if (FragThresh > MAX_FRAG_THRESHOLD || FragThresh < MIN_FRAG_THRESHOLD)
{
//Illegal FragThresh so we set it to default
pAd->CommonCfg.FragmentThreshold = MAX_FRAG_THRESHOLD;
}
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;
}
#ifdef CONFIG_STA_SUPPORT
IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
{
if (pAd->CommonCfg.FragmentThreshold == MAX_FRAG_THRESHOLD)
pAd->CommonCfg.bUseZeroToDisableFragment = TRUE;
else
pAd->CommonCfg.bUseZeroToDisableFragment = FALSE;
}
#endif // CONFIG_STA_SUPPORT //
DBGPRINT(RT_DEBUG_TRACE, ("Set_FragThreshold_Proc::(FragThreshold=%d)\n", pAd->CommonCfg.FragmentThreshold));
return TRUE;
}
/*
==========================================================================
Description:
Set TxBurst
Return:
TRUE if all parameters are OK, FALSE otherwise
==========================================================================
*/
INT Set_TxBurst_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg)
{
LONG TxBurst;
TxBurst = simple_strtol(arg, 0, 10);
if (TxBurst == 1)
pAd->CommonCfg.bEnableTxBurst = TRUE;
else if (TxBurst == 0)
pAd->CommonCfg.bEnableTxBurst = FALSE;
else
return FALSE; //Invalid argument
DBGPRINT(RT_DEBUG_TRACE, ("Set_TxBurst_Proc::(TxBurst=%d)\n", pAd->CommonCfg.bEnableTxBurst));
return TRUE;
}
#ifdef AGGREGATION_SUPPORT
/*
==========================================================================
Description:
Set TxBurst
Return:
TRUE if all parameters are OK, FALSE otherwise
==========================================================================
*/
INT Set_PktAggregate_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg)
{
LONG aggre;
aggre = simple_strtol(arg, 0, 10);
if (aggre == 1)
pAd->CommonCfg.bAggregationCapable = TRUE;
else if (aggre == 0)
pAd->CommonCfg.bAggregationCapable = FALSE;
else
return FALSE; //Invalid argument
DBGPRINT(RT_DEBUG_TRACE, ("Set_PktAggregate_Proc::(AGGRE=%d)\n", pAd->CommonCfg.bAggregationCapable));
return TRUE;
}
#endif
#ifdef INF_AMAZON_PPA
INT Set_INF_AMAZON_SE_PPA_Proc(
IN PRTMP_ADAPTER pAd,
IN PUCHAR arg)
{
ULONG aggre;
UINT status;
aggre = simple_strtol(arg, 0, 10);
if (aggre == 1)
{
if(pAd->PPAEnable==TRUE)
{
printk("INF_AMAZON_SE_PPA already enabled \n");
}
else
{
if (ppa_hook_directpath_register_dev_fn)
{
UINT32 g_if_id;
if (pAd->pDirectpathCb == NULL)
{
pAd->pDirectpathCb = (PPA_DIRECTPATH_CB *) kmalloc (sizeof(PPA_DIRECTPATH_CB), GFP_ATOMIC);
printk("Realloc memory for pDirectpathCb ??\n");
}
/* register callback */
pAd->pDirectpathCb->rx_fn = NULL;
pAd->pDirectpathCb->stop_tx_fn = NULL;
pAd->pDirectpathCb->start_tx_fn = NULL;
status = ppa_hook_directpath_register_dev_fn(&g_if_id, pAd->net_dev, pAd->pDirectpathCb, PPA_F_DIRECTPATH_ETH_IF);
if(status==1)
{
pAd->g_if_id=g_if_id;
printk("register INF_AMAZON_SE_PPA success :ret:%d id:%d:%d\n",status,pAd->g_if_id,g_if_id);
pAd->PPAEnable=TRUE;
}
else
{
printk("register INF_AMAZON_SE_PPA fail :ret:%d\n",status);
}
}
else
{
printk("INF_AMAZON_SE_PPA enable fail : there is no INF_AMAZON_SE_PPA module . \n");
}
}
}
else if (aggre == 0)
{
if(pAd->PPAEnable==FALSE)
{
printk("INF_AMAZON_SE_PPA already disable \n");
}
else
{
if (ppa_hook_directpath_register_dev_fn)
{
UINT32 g_if_id;
g_if_id=pAd->g_if_id;
printk("g_if_id=%d \n",pAd->g_if_id);
status=ppa_hook_directpath_register_dev_fn(&g_if_id, pAd->net_dev, NULL, PPA_F_DIRECTPATH_DEREGISTER);
if(status==1)
{
pAd->g_if_id=0;
printk("unregister INF_AMAZON_SE_PPA success :ret:%d\n",status);
pAd->PPAEnable=FALSE;
}
else
{
printk("unregister INF_AMAZON_SE_PPA fail :ret:%d\n",status);
}
}
else
{
printk("INF_AMAZON_SE_PPA enable fail : there is no INF_AMAZON_SE_PPA module . \n");
}
}
}
else
{
printk("Invalid argument %d \n",aggre);
return FALSE; //Invalid argument
}
return TRUE;
}
#endif // INF_AMAZON_PPA //
/*
==========================================================================
Description:
Set IEEE80211H.
This parameter is 1 when needs radar detection, otherwise 0
Return:
TRUE if all parameters are OK, FALSE otherwise
==========================================================================
*/
INT Set_IEEE80211H_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg)
{
LONG ieee80211h;
ieee80211h = simple_strtol(arg, 0, 10);
if (ieee80211h == 1)
pAd->CommonCfg.bIEEE80211H = TRUE;
else if (ieee80211h == 0)
pAd->CommonCfg.bIEEE80211H = FALSE;
else
return FALSE; //Invalid argument
DBGPRINT(RT_DEBUG_TRACE, ("Set_IEEE80211H_Proc::(IEEE80211H=%d)\n", pAd->CommonCfg.bIEEE80211H));
return TRUE;
}
#ifdef DBG
/*
==========================================================================
Description:
For Debug information
Return:
TRUE if all parameters are OK, FALSE otherwise
==========================================================================
*/
INT Set_Debug_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg)
{
DBGPRINT(RT_DEBUG_TRACE, ("==> Set_Debug_Proc *******************\n"));
if(simple_strtol(arg, 0, 10) <= RT_DEBUG_LOUD)
RTDebugLevel = simple_strtol(arg, 0, 10);
DBGPRINT(RT_DEBUG_TRACE, ("<== Set_Debug_Proc(RTDebugLevel = %ld)\n", RTDebugLevel));
return TRUE;
}
#endif
INT Show_DescInfo_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg)
{
#ifdef RTMP_MAC_PCI
INT i, QueIdx=0;
// ULONG RegValue;
PRT28XX_RXD_STRUC pRxD;
PTXD_STRUC pTxD;
PRTMP_TX_RING pTxRing = &pAd->TxRing[QueIdx];
PRTMP_MGMT_RING pMgmtRing = &pAd->MgmtRing;
PRTMP_RX_RING pRxRing = &pAd->RxRing;
for(i=0;i<TX_RING_SIZE;i++)
{
pTxD = (PTXD_STRUC) pTxRing->Cell[i].AllocVa;
DBGPRINT(RT_DEBUG_OFF, ("Desc #%d\n",i));
hex_dump("Tx Descriptor", (PUCHAR)pTxD, 16);
DBGPRINT(RT_DEBUG_OFF, ("pTxD->DMADONE = %x\n", pTxD->DMADONE));
}
DBGPRINT(RT_DEBUG_OFF, ("---------------------------------------------------\n"));
for(i=0;i<MGMT_RING_SIZE;i++)
{
pTxD = (PTXD_STRUC) pMgmtRing->Cell[i].AllocVa;
DBGPRINT(RT_DEBUG_OFF, ("Desc #%d\n",i));
hex_dump("Mgmt Descriptor", (PUCHAR)pTxD, 16);
DBGPRINT(RT_DEBUG_OFF, ("pMgmt->DMADONE = %x\n", pTxD->DMADONE));
}
DBGPRINT(RT_DEBUG_OFF, ("---------------------------------------------------\n"));
for(i=0;i<RX_RING_SIZE;i++)
{
pRxD = (PRT28XX_RXD_STRUC) pRxRing->Cell[i].AllocVa;
DBGPRINT(RT_DEBUG_OFF, ("Desc #%d\n",i));
hex_dump("Rx Descriptor", (PUCHAR)pRxD, 16);
DBGPRINT(RT_DEBUG_OFF, ("pRxD->DDONE = %x\n", pRxD->DDONE));
}
#endif // RTMP_MAC_PCI //
return TRUE;
}
/*
==========================================================================
Description:
Reset statistics counter
Arguments:
pAdapter Pointer to our adapter
arg
Return:
TRUE if all parameters are OK, FALSE otherwise
==========================================================================
*/
INT Set_ResetStatCounter_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg)
{
//UCHAR i;
//MAC_TABLE_ENTRY *pEntry;
DBGPRINT(RT_DEBUG_TRACE, ("==>Set_ResetStatCounter_Proc\n"));
// add the most up-to-date h/w raw counters into software counters
NICUpdateRawCounters(pAd);
NdisZeroMemory(&pAd->WlanCounters, sizeof(COUNTER_802_11));
NdisZeroMemory(&pAd->Counters8023, sizeof(COUNTER_802_3));
NdisZeroMemory(&pAd->RalinkCounters, sizeof(COUNTER_RALINK));
// Reset HotSpot counter
return TRUE;
}
/*
========================================================================
Routine Description:
Add WPA key process.
In Adhoc WPANONE, bPairwise = 0; KeyIdx = 0;
Arguments:
pAd Pointer to our adapter
pBuf Pointer to the where the key stored
Return Value:
NDIS_SUCCESS Add key successfully
IRQL = DISPATCH_LEVEL
Note:
========================================================================
*/
BOOLEAN RTMPCheckStrPrintAble(
IN CHAR *pInPutStr,
IN UCHAR strLen)
{
UCHAR i=0;
for (i=0; i<strLen; i++)
{
if ((pInPutStr[i] < 0x21) ||
(pInPutStr[i] > 0x7E))
return FALSE;
}
return TRUE;
}
/*
========================================================================
Routine Description:
Remove WPA Key process
Arguments:
pAd Pointer to our adapter
pBuf Pointer to the where the key stored
Return Value:
NDIS_SUCCESS Add key successfully
IRQL = DISPATCH_LEVEL
Note:
========================================================================
*/
#ifdef CONFIG_STA_SUPPORT
VOID RTMPSetDesiredRates(
IN PRTMP_ADAPTER pAdapter,
IN LONG Rates)
{
NDIS_802_11_RATES aryRates;
memset(&aryRates, 0x00, sizeof(NDIS_802_11_RATES));
switch (pAdapter->CommonCfg.PhyMode)
{
case PHY_11A: // A only
switch (Rates)
{
case 6000000: //6M
aryRates[0] = 0x0c; // 6M
pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_0;
break;
case 9000000: //9M
aryRates[0] = 0x12; // 9M
pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_1;
break;
case 12000000: //12M
aryRates[0] = 0x18; // 12M
pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_2;
break;
case 18000000: //18M
aryRates[0] = 0x24; // 18M
pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_3;
break;
case 24000000: //24M
aryRates[0] = 0x30; // 24M
pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_4;
break;
case 36000000: //36M
aryRates[0] = 0x48; // 36M
pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_5;
break;
case 48000000: //48M
aryRates[0] = 0x60; // 48M
pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_6;
break;
case 54000000: //54M
aryRates[0] = 0x6c; // 54M
pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_7;
break;
case -1: //Auto
default:
aryRates[0] = 0x6c; // 54Mbps
aryRates[1] = 0x60; // 48Mbps
aryRates[2] = 0x48; // 36Mbps
aryRates[3] = 0x30; // 24Mbps
aryRates[4] = 0x24; // 18M
aryRates[5] = 0x18; // 12M
aryRates[6] = 0x12; // 9M
aryRates[7] = 0x0c; // 6M
pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_AUTO;
break;
}
break;
case PHY_11BG_MIXED: // B/G Mixed
case PHY_11B: // B only
case PHY_11ABG_MIXED: // A/B/G Mixed
default:
switch (Rates)
{
case 1000000: //1M
aryRates[0] = 0x02;
pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_0;
break;
case 2000000: //2M
aryRates[0] = 0x04;
pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_1;
break;
case 5000000: //5.5M
aryRates[0] = 0x0b; // 5.5M
pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_2;
break;
case 11000000: //11M
aryRates[0] = 0x16; // 11M
pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_3;
break;
case 6000000: //6M
aryRates[0] = 0x0c; // 6M
pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_0;
break;
case 9000000: //9M
aryRates[0] = 0x12; // 9M
pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_1;
break;
case 12000000: //12M
aryRates[0] = 0x18; // 12M
pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_2;
break;
case 18000000: //18M
aryRates[0] = 0x24; // 18M
pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_3;
break;
case 24000000: //24M
aryRates[0] = 0x30; // 24M
pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_4;
break;
case 36000000: //36M
aryRates[0] = 0x48; // 36M
pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_5;
break;
case 48000000: //48M
aryRates[0] = 0x60; // 48M
pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_6;
break;
case 54000000: //54M
aryRates[0] = 0x6c; // 54M
pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_7;
break;
case -1: //Auto
default:
if (pAdapter->CommonCfg.PhyMode == PHY_11B)
{ //B Only
aryRates[0] = 0x16; // 11Mbps
aryRates[1] = 0x0b; // 5.5Mbps
aryRates[2] = 0x04; // 2Mbps
aryRates[3] = 0x02; // 1Mbps
}
else
{ //(B/G) Mixed or (A/B/G) Mixed
aryRates[0] = 0x6c; // 54Mbps
aryRates[1] = 0x60; // 48Mbps
aryRates[2] = 0x48; // 36Mbps
aryRates[3] = 0x30; // 24Mbps
aryRates[4] = 0x16; // 11Mbps
aryRates[5] = 0x0b; // 5.5Mbps
aryRates[6] = 0x04; // 2Mbps
aryRates[7] = 0x02; // 1Mbps
}
pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_AUTO;
break;
}
break;
}
NdisZeroMemory(pAdapter->CommonCfg.DesireRate, MAX_LEN_OF_SUPPORTED_RATES);
NdisMoveMemory(pAdapter->CommonCfg.DesireRate, &aryRates, sizeof(NDIS_802_11_RATES));
DBGPRINT(RT_DEBUG_TRACE, (" RTMPSetDesiredRates (%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x)\n",
pAdapter->CommonCfg.DesireRate[0],pAdapter->CommonCfg.DesireRate[1],
pAdapter->CommonCfg.DesireRate[2],pAdapter->CommonCfg.DesireRate[3],
pAdapter->CommonCfg.DesireRate[4],pAdapter->CommonCfg.DesireRate[5],
pAdapter->CommonCfg.DesireRate[6],pAdapter->CommonCfg.DesireRate[7] ));
// Changing DesiredRate may affect the MAX TX rate we used to TX frames out
MlmeUpdateTxRates(pAdapter, FALSE, 0);
}
NDIS_STATUS RTMPWPARemoveKeyProc(
IN PRTMP_ADAPTER pAd,
IN PVOID pBuf)
{
PNDIS_802_11_REMOVE_KEY pKey;
ULONG KeyIdx;
NDIS_STATUS Status = NDIS_STATUS_FAILURE;
BOOLEAN bTxKey; // Set the key as transmit key
BOOLEAN bPairwise; // Indicate the key is pairwise key
BOOLEAN bKeyRSC; // indicate the receive SC set by KeyRSC value.
// Otherwise, it will set by the NIC.
BOOLEAN bAuthenticator; // indicate key is set by authenticator.
INT i;
DBGPRINT(RT_DEBUG_TRACE,("---> RTMPWPARemoveKeyProc\n"));
pKey = (PNDIS_802_11_REMOVE_KEY) pBuf;
KeyIdx = pKey->KeyIndex & 0xff;
// Bit 31 of Add-key, Tx Key
bTxKey = (pKey->KeyIndex & 0x80000000) ? TRUE : FALSE;
// Bit 30 of Add-key PairwiseKey
bPairwise = (pKey->KeyIndex & 0x40000000) ? TRUE : FALSE;
// Bit 29 of Add-key KeyRSC
bKeyRSC = (pKey->KeyIndex & 0x20000000) ? TRUE : FALSE;
// Bit 28 of Add-key Authenticator
bAuthenticator = (pKey->KeyIndex & 0x10000000) ? TRUE : FALSE;
// 1. If bTx is TRUE, return failure information
if (bTxKey == TRUE)
return(NDIS_STATUS_INVALID_DATA);
// 2. Check Pairwise Key
if (bPairwise)
{
// a. If BSSID is broadcast, remove all pairwise keys.
// b. If not broadcast, remove the pairwise specified by BSSID
for (i = 0; i < SHARE_KEY_NUM; i++)
{
if (MAC_ADDR_EQUAL(pAd->SharedKey[BSS0][i].BssId, pKey->BSSID))
{
DBGPRINT(RT_DEBUG_TRACE,("RTMPWPARemoveKeyProc(KeyIdx=%d)\n", i));
pAd->SharedKey[BSS0][i].KeyLen = 0;
pAd->SharedKey[BSS0][i].CipherAlg = CIPHER_NONE;
AsicRemoveSharedKeyEntry(pAd, BSS0, (UCHAR)i);
Status = NDIS_STATUS_SUCCESS;
break;
}
}
}
// 3. Group Key
else
{
// a. If BSSID is broadcast, remove all group keys indexed
// b. If BSSID matched, delete the group key indexed.
DBGPRINT(RT_DEBUG_TRACE,("RTMPWPARemoveKeyProc(KeyIdx=%ld)\n", KeyIdx));
pAd->SharedKey[BSS0][KeyIdx].KeyLen = 0;
pAd->SharedKey[BSS0][KeyIdx].CipherAlg = CIPHER_NONE;
AsicRemoveSharedKeyEntry(pAd, BSS0, (UCHAR)KeyIdx);
Status = NDIS_STATUS_SUCCESS;
}
return (Status);
}
#endif // CONFIG_STA_SUPPORT //
#ifdef CONFIG_STA_SUPPORT
/*
========================================================================
Routine Description:
Remove All WPA Keys
Arguments:
pAd Pointer to our adapter
Return Value:
None
IRQL = DISPATCH_LEVEL
Note:
========================================================================
*/
VOID RTMPWPARemoveAllKeys(
IN PRTMP_ADAPTER pAd)
{
UCHAR i;
DBGPRINT(RT_DEBUG_TRACE,("RTMPWPARemoveAllKeys(AuthMode=%d, WepStatus=%d)\n", pAd->StaCfg.AuthMode, pAd->StaCfg.WepStatus));
RTMP_CLEAR_PSFLAG(pAd, fRTMP_PS_CAN_GO_SLEEP);
// For WEP/CKIP, there is no need to remove it, since WinXP won't set it again after
// Link up. And it will be replaced if user changed it.
if (pAd->StaCfg.AuthMode < Ndis802_11AuthModeWPA)
return;
// For WPA-None, there is no need to remove it, since WinXP won't set it again after
// Link up. And it will be replaced if user changed it.
if (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPANone)
return;
// set BSSID wcid entry of the Pair-wise Key table as no-security mode
AsicRemovePairwiseKeyEntry(pAd, BSS0, BSSID_WCID);
// set all shared key mode as no-security.
for (i = 0; i < SHARE_KEY_NUM; i++)
{
DBGPRINT(RT_DEBUG_TRACE,("remove %s key #%d\n", CipherName[pAd->SharedKey[BSS0][i].CipherAlg], i));
NdisZeroMemory(&pAd->SharedKey[BSS0][i], sizeof(CIPHER_KEY));
AsicRemoveSharedKeyEntry(pAd, BSS0, i);
}
RTMP_SET_PSFLAG(pAd, fRTMP_PS_CAN_GO_SLEEP);
}
#endif // CONFIG_STA_SUPPORT //
/*
========================================================================
Routine Description:
As STA's BSSID is a WC too, it uses shared key table.
This function write correct unicast TX key to ASIC WCID.
And we still make a copy in our MacTab.Content[BSSID_WCID].PairwiseKey.
Caller guarantee TKIP/AES always has keyidx = 0. (pairwise key)
Caller guarantee WEP calls this function when set Txkey, default key index=0~3.
Arguments:
pAd Pointer to our adapter
pKey Pointer to the where the key stored
Return Value:
NDIS_SUCCESS Add key successfully
IRQL = DISPATCH_LEVEL
Note:
========================================================================
*/
/*
========================================================================
Routine Description:
Change NIC PHY mode. Re-association may be necessary. possible settings
include - PHY_11B, PHY_11BG_MIXED, PHY_11A, and PHY_11ABG_MIXED
Arguments:
pAd - Pointer to our adapter
phymode -
IRQL = PASSIVE_LEVEL
IRQL = DISPATCH_LEVEL
========================================================================
*/
VOID RTMPSetPhyMode(
IN PRTMP_ADAPTER pAd,
IN ULONG phymode)
{
INT i;
// the selected phymode must be supported by the RF IC encoded in E2PROM
// if no change, do nothing
/* bug fix
if (pAd->CommonCfg.PhyMode == phymode)
return;
*/
pAd->CommonCfg.PhyMode = (UCHAR)phymode;
DBGPRINT(RT_DEBUG_TRACE,("RTMPSetPhyMode : PhyMode=%d, channel=%d \n", pAd->CommonCfg.PhyMode, pAd->CommonCfg.Channel));
#ifdef EXT_BUILD_CHANNEL_LIST
BuildChannelListEx(pAd);
#else
BuildChannelList(pAd);
#endif // EXT_BUILD_CHANNEL_LIST //
// sanity check user setting
for (i = 0; i < pAd->ChannelListNum; i++)
{
if (pAd->CommonCfg.Channel == pAd->ChannelList[i].Channel)
break;
}
if (i == pAd->ChannelListNum)
{
#ifdef CONFIG_STA_SUPPORT
IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
pAd->CommonCfg.Channel = FirstChannel(pAd);
#endif // CONFIG_STA_SUPPORT //
DBGPRINT(RT_DEBUG_ERROR, ("RTMPSetPhyMode: channel is out of range, use first channel=%d \n", pAd->CommonCfg.Channel));
}
NdisZeroMemory(pAd->CommonCfg.SupRate, MAX_LEN_OF_SUPPORTED_RATES);
NdisZeroMemory(pAd->CommonCfg.ExtRate, MAX_LEN_OF_SUPPORTED_RATES);
NdisZeroMemory(pAd->CommonCfg.DesireRate, MAX_LEN_OF_SUPPORTED_RATES);
switch (phymode) {
case PHY_11B:
pAd->CommonCfg.SupRate[0] = 0x82; // 1 mbps, in units of 0.5 Mbps, basic rate
pAd->CommonCfg.SupRate[1] = 0x84; // 2 mbps, in units of 0.5 Mbps, basic rate
pAd->CommonCfg.SupRate[2] = 0x8B; // 5.5 mbps, in units of 0.5 Mbps, basic rate
pAd->CommonCfg.SupRate[3] = 0x96; // 11 mbps, in units of 0.5 Mbps, basic rate
pAd->CommonCfg.SupRateLen = 4;
pAd->CommonCfg.ExtRateLen = 0;
pAd->CommonCfg.DesireRate[0] = 2; // 1 mbps, in units of 0.5 Mbps
pAd->CommonCfg.DesireRate[1] = 4; // 2 mbps, in units of 0.5 Mbps
pAd->CommonCfg.DesireRate[2] = 11; // 5.5 mbps, in units of 0.5 Mbps
pAd->CommonCfg.DesireRate[3] = 22; // 11 mbps, in units of 0.5 Mbps
//pAd->CommonCfg.HTPhyMode.field.MODE = MODE_CCK; // This MODE is only FYI. not use
break;
case PHY_11G:
case PHY_11BG_MIXED:
case PHY_11ABG_MIXED:
#ifdef DOT11_N_SUPPORT
case PHY_11N_2_4G:
case PHY_11ABGN_MIXED:
case PHY_11BGN_MIXED:
case PHY_11GN_MIXED:
#endif // DOT11_N_SUPPORT //
pAd->CommonCfg.SupRate[0] = 0x82; // 1 mbps, in units of 0.5 Mbps, basic rate
pAd->CommonCfg.SupRate[1] = 0x84; // 2 mbps, in units of 0.5 Mbps, basic rate
pAd->CommonCfg.SupRate[2] = 0x8B; // 5.5 mbps, in units of 0.5 Mbps, basic rate
pAd->CommonCfg.SupRate[3] = 0x96; // 11 mbps, in units of 0.5 Mbps, basic rate
pAd->CommonCfg.SupRate[4] = 0x12; // 9 mbps, in units of 0.5 Mbps
pAd->CommonCfg.SupRate[5] = 0x24; // 18 mbps, in units of 0.5 Mbps
pAd->CommonCfg.SupRate[6] = 0x48; // 36 mbps, in units of 0.5 Mbps
pAd->CommonCfg.SupRate[7] = 0x6c; // 54 mbps, in units of 0.5 Mbps
pAd->CommonCfg.SupRateLen = 8;
pAd->CommonCfg.ExtRate[0] = 0x0C; // 6 mbps, in units of 0.5 Mbps
pAd->CommonCfg.ExtRate[1] = 0x18; // 12 mbps, in units of 0.5 Mbps
pAd->CommonCfg.ExtRate[2] = 0x30; // 24 mbps, in units of 0.5 Mbps
pAd->CommonCfg.ExtRate[3] = 0x60; // 48 mbps, in units of 0.5 Mbps
pAd->CommonCfg.ExtRateLen = 4;
pAd->CommonCfg.DesireRate[0] = 2; // 1 mbps, in units of 0.5 Mbps
pAd->CommonCfg.DesireRate[1] = 4; // 2 mbps, in units of 0.5 Mbps
pAd->CommonCfg.DesireRate[2] = 11; // 5.5 mbps, in units of 0.5 Mbps
pAd->CommonCfg.DesireRate[3] = 22; // 11 mbps, in units of 0.5 Mbps
pAd->CommonCfg.DesireRate[4] = 12; // 6 mbps, in units of 0.5 Mbps
pAd->CommonCfg.DesireRate[5] = 18; // 9 mbps, in units of 0.5 Mbps
pAd->CommonCfg.DesireRate[6] = 24; // 12 mbps, in units of 0.5 Mbps
pAd->CommonCfg.DesireRate[7] = 36; // 18 mbps, in units of 0.5 Mbps
pAd->CommonCfg.DesireRate[8] = 48; // 24 mbps, in units of 0.5 Mbps
pAd->CommonCfg.DesireRate[9] = 72; // 36 mbps, in units of 0.5 Mbps
pAd->CommonCfg.DesireRate[10] = 96; // 48 mbps, in units of 0.5 Mbps
pAd->CommonCfg.DesireRate[11] = 108; // 54 mbps, in units of 0.5 Mbps
break;
case PHY_11A:
#ifdef DOT11_N_SUPPORT
case PHY_11AN_MIXED:
case PHY_11AGN_MIXED:
case PHY_11N_5G:
#endif // DOT11_N_SUPPORT //
pAd->CommonCfg.SupRate[0] = 0x8C; // 6 mbps, in units of 0.5 Mbps, basic rate
pAd->CommonCfg.SupRate[1] = 0x12; // 9 mbps, in units of 0.5 Mbps
pAd->CommonCfg.SupRate[2] = 0x98; // 12 mbps, in units of 0.5 Mbps, basic rate
pAd->CommonCfg.SupRate[3] = 0x24; // 18 mbps, in units of 0.5 Mbps
pAd->CommonCfg.SupRate[4] = 0xb0; // 24 mbps, in units of 0.5 Mbps, basic rate
pAd->CommonCfg.SupRate[5] = 0x48; // 36 mbps, in units of 0.5 Mbps
pAd->CommonCfg.SupRate[6] = 0x60; // 48 mbps, in units of 0.5 Mbps
pAd->CommonCfg.SupRate[7] = 0x6c; // 54 mbps, in units of 0.5 Mbps
pAd->CommonCfg.SupRateLen = 8;
pAd->CommonCfg.ExtRateLen = 0;
pAd->CommonCfg.DesireRate[0] = 12; // 6 mbps, in units of 0.5 Mbps
pAd->CommonCfg.DesireRate[1] = 18; // 9 mbps, in units of 0.5 Mbps
pAd->CommonCfg.DesireRate[2] = 24; // 12 mbps, in units of 0.5 Mbps
pAd->CommonCfg.DesireRate[3] = 36; // 18 mbps, in units of 0.5 Mbps
pAd->CommonCfg.DesireRate[4] = 48; // 24 mbps, in units of 0.5 Mbps
pAd->CommonCfg.DesireRate[5] = 72; // 36 mbps, in units of 0.5 Mbps
pAd->CommonCfg.DesireRate[6] = 96; // 48 mbps, in units of 0.5 Mbps
pAd->CommonCfg.DesireRate[7] = 108; // 54 mbps, in units of 0.5 Mbps
//pAd->CommonCfg.HTPhyMode.field.MODE = MODE_OFDM; // This MODE is only FYI. not use
break;
default:
break;
}
pAd->CommonCfg.BandState = UNKNOWN_BAND;
}
#ifdef DOT11_N_SUPPORT
/*
========================================================================
Routine Description:
Caller ensures we has 802.11n support.
Calls at setting HT from AP/STASetinformation
Arguments:
pAd - Pointer to our adapter
phymode -
========================================================================
*/
VOID RTMPSetHT(
IN PRTMP_ADAPTER pAd,
IN OID_SET_HT_PHYMODE *pHTPhyMode)
{
//ULONG *pmcs;
UINT32 Value = 0;
UCHAR BBPValue = 0;
UCHAR BBP3Value = 0;
UCHAR RxStream = pAd->CommonCfg.RxStream;
DBGPRINT(RT_DEBUG_TRACE, ("RTMPSetHT : HT_mode(%d), ExtOffset(%d), MCS(%d), BW(%d), STBC(%d), SHORTGI(%d)\n",
pHTPhyMode->HtMode, pHTPhyMode->ExtOffset,
pHTPhyMode->MCS, pHTPhyMode->BW,
pHTPhyMode->STBC, pHTPhyMode->SHORTGI));
// Don't zero supportedHyPhy structure.
RTMPZeroMemory(&pAd->CommonCfg.HtCapability, sizeof(pAd->CommonCfg.HtCapability));
RTMPZeroMemory(&pAd->CommonCfg.AddHTInfo, sizeof(pAd->CommonCfg.AddHTInfo));
RTMPZeroMemory(&pAd->CommonCfg.NewExtChanOffset, sizeof(pAd->CommonCfg.NewExtChanOffset));
RTMPZeroMemory(&pAd->CommonCfg.DesiredHtPhy, sizeof(pAd->CommonCfg.DesiredHtPhy));
if (pAd->CommonCfg.bRdg)
{
pAd->CommonCfg.HtCapability.ExtHtCapInfo.PlusHTC = 1;
pAd->CommonCfg.HtCapability.ExtHtCapInfo.RDGSupport = 1;
}
else
{
pAd->CommonCfg.HtCapability.ExtHtCapInfo.PlusHTC = 0;
pAd->CommonCfg.HtCapability.ExtHtCapInfo.RDGSupport = 0;
}
pAd->CommonCfg.HtCapability.HtCapParm.MaxRAmpduFactor = 3;
pAd->CommonCfg.DesiredHtPhy.MaxRAmpduFactor = 3;
DBGPRINT(RT_DEBUG_TRACE, ("RTMPSetHT : RxBAWinLimit = %d\n", pAd->CommonCfg.BACapability.field.RxBAWinLimit));
// Mimo power save, A-MSDU size,
pAd->CommonCfg.DesiredHtPhy.AmsduEnable = (USHORT)pAd->CommonCfg.BACapability.field.AmsduEnable;
pAd->CommonCfg.DesiredHtPhy.AmsduSize = (UCHAR)pAd->CommonCfg.BACapability.field.AmsduSize;
pAd->CommonCfg.DesiredHtPhy.MimoPs = (UCHAR)pAd->CommonCfg.BACapability.field.MMPSmode;
pAd->CommonCfg.DesiredHtPhy.MpduDensity = (UCHAR)pAd->CommonCfg.BACapability.field.MpduDensity;
pAd->CommonCfg.HtCapability.HtCapInfo.AMsduSize = (USHORT)pAd->CommonCfg.BACapability.field.AmsduSize;
pAd->CommonCfg.HtCapability.HtCapInfo.MimoPs = (USHORT)pAd->CommonCfg.BACapability.field.MMPSmode;
pAd->CommonCfg.HtCapability.HtCapParm.MpduDensity = (UCHAR)pAd->CommonCfg.BACapability.field.MpduDensity;
DBGPRINT(RT_DEBUG_TRACE, ("RTMPSetHT : AMsduSize = %d, MimoPs = %d, MpduDensity = %d, MaxRAmpduFactor = %d\n",
pAd->CommonCfg.DesiredHtPhy.AmsduSize,
pAd->CommonCfg.DesiredHtPhy.MimoPs,
pAd->CommonCfg.DesiredHtPhy.MpduDensity,
pAd->CommonCfg.DesiredHtPhy.MaxRAmpduFactor));
if(pHTPhyMode->HtMode == HTMODE_GF)
{
pAd->CommonCfg.HtCapability.HtCapInfo.GF = 1;
pAd->CommonCfg.DesiredHtPhy.GF = 1;
}
else
pAd->CommonCfg.DesiredHtPhy.GF = 0;
// Decide Rx MCSSet
switch (RxStream)
{
case 1:
pAd->CommonCfg.HtCapability.MCSSet[0] = 0xff;
pAd->CommonCfg.HtCapability.MCSSet[1] = 0x00;
break;
case 2:
pAd->CommonCfg.HtCapability.MCSSet[0] = 0xff;
pAd->CommonCfg.HtCapability.MCSSet[1] = 0xff;
break;
case 3: // 3*3
pAd->CommonCfg.HtCapability.MCSSet[0] = 0xff;
pAd->CommonCfg.HtCapability.MCSSet[1] = 0xff;
pAd->CommonCfg.HtCapability.MCSSet[2] = 0xff;
break;
}
if (pAd->CommonCfg.bForty_Mhz_Intolerant && (pAd->CommonCfg.Channel <= 14) && (pHTPhyMode->BW == BW_40) )
{
pHTPhyMode->BW = BW_20;
pAd->CommonCfg.HtCapability.HtCapInfo.Forty_Mhz_Intolerant = 1;
}
if(pHTPhyMode->BW == BW_40)
{
pAd->CommonCfg.HtCapability.MCSSet[4] = 0x1; // MCS 32
pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth = 1;
if (pAd->CommonCfg.Channel <= 14)
pAd->CommonCfg.HtCapability.HtCapInfo.CCKmodein40 = 1;
pAd->CommonCfg.DesiredHtPhy.ChannelWidth = 1;
pAd->CommonCfg.AddHTInfo.AddHtInfo.RecomWidth = 1;
pAd->CommonCfg.AddHTInfo.AddHtInfo.ExtChanOffset = (pHTPhyMode->ExtOffset == EXTCHA_BELOW)? (EXTCHA_BELOW): EXTCHA_ABOVE;
// Set Regsiter for extension channel position.
RTMP_IO_READ32(pAd, TX_BAND_CFG, &Value);
RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &BBP3Value);
if ((pHTPhyMode->ExtOffset == EXTCHA_BELOW))
{
Value |= 0x1;
BBP3Value |= (0x20);
RTMP_IO_WRITE32(pAd, TX_BAND_CFG, Value);
}
else if ((pHTPhyMode->ExtOffset == EXTCHA_ABOVE))
{
Value &= 0xfe;
BBP3Value &= (~0x20);
RTMP_IO_WRITE32(pAd, TX_BAND_CFG, Value);
}
// Turn on BBP 40MHz mode now only as AP .
// Sta can turn on BBP 40MHz after connection with 40MHz AP. Sta only broadcast 40MHz capability before connection.
if ((pAd->OpMode == OPMODE_AP) || INFRA_ON(pAd) || ADHOC_ON(pAd)
)
{
RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &BBPValue);
BBPValue &= (~0x18);
BBPValue |= 0x10;
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, BBPValue);
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, BBP3Value);
pAd->CommonCfg.BBPCurrentBW = BW_40;
}
}
else
{
pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth = 0;
pAd->CommonCfg.DesiredHtPhy.ChannelWidth = 0;
pAd->CommonCfg.AddHTInfo.AddHtInfo.RecomWidth = 0;
pAd->CommonCfg.AddHTInfo.AddHtInfo.ExtChanOffset = EXTCHA_NONE;
pAd->CommonCfg.CentralChannel = pAd->CommonCfg.Channel;
// Turn on BBP 20MHz mode by request here.
{
RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &BBPValue);
BBPValue &= (~0x18);
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, BBPValue);
pAd->CommonCfg.BBPCurrentBW = BW_20;
}
}
if(pHTPhyMode->STBC == STBC_USE)
{
pAd->CommonCfg.HtCapability.HtCapInfo.TxSTBC = 1;
pAd->CommonCfg.DesiredHtPhy.TxSTBC = 1;
pAd->CommonCfg.HtCapability.HtCapInfo.RxSTBC = 1;
pAd->CommonCfg.DesiredHtPhy.RxSTBC = 1;
}
else
{
pAd->CommonCfg.DesiredHtPhy.TxSTBC = 0;
pAd->CommonCfg.DesiredHtPhy.RxSTBC = 0;
}
if(pHTPhyMode->SHORTGI == GI_400)
{
pAd->CommonCfg.HtCapability.HtCapInfo.ShortGIfor20 = 1;
pAd->CommonCfg.HtCapability.HtCapInfo.ShortGIfor40 = 1;
pAd->CommonCfg.DesiredHtPhy.ShortGIfor20 = 1;
pAd->CommonCfg.DesiredHtPhy.ShortGIfor40 = 1;
}
else
{
pAd->CommonCfg.HtCapability.HtCapInfo.ShortGIfor20 = 0;
pAd->CommonCfg.HtCapability.HtCapInfo.ShortGIfor40 = 0;
pAd->CommonCfg.DesiredHtPhy.ShortGIfor20 = 0;
pAd->CommonCfg.DesiredHtPhy.ShortGIfor40 = 0;
}
// We support link adaptation for unsolicit MCS feedback, set to 2.
pAd->CommonCfg.HtCapability.ExtHtCapInfo.MCSFeedback = MCSFBK_NONE; //MCSFBK_UNSOLICIT;
pAd->CommonCfg.AddHTInfo.ControlChan = pAd->CommonCfg.Channel;
// 1, the extension channel above the control channel.
// EDCA parameters used for AP's own transmission
if (pAd->CommonCfg.APEdcaParm.bValid == FALSE)
{
pAd->CommonCfg.APEdcaParm.bValid = TRUE;
pAd->CommonCfg.APEdcaParm.Aifsn[0] = 3;
pAd->CommonCfg.APEdcaParm.Aifsn[1] = 7;
pAd->CommonCfg.APEdcaParm.Aifsn[2] = 1;
pAd->CommonCfg.APEdcaParm.Aifsn[3] = 1;
pAd->CommonCfg.APEdcaParm.Cwmin[0] = 4;
pAd->CommonCfg.APEdcaParm.Cwmin[1] = 4;
pAd->CommonCfg.APEdcaParm.Cwmin[2] = 3;
pAd->CommonCfg.APEdcaParm.Cwmin[3] = 2;
pAd->CommonCfg.APEdcaParm.Cwmax[0] = 6;
pAd->CommonCfg.APEdcaParm.Cwmax[1] = 10;
pAd->CommonCfg.APEdcaParm.Cwmax[2] = 4;
pAd->CommonCfg.APEdcaParm.Cwmax[3] = 3;
pAd->CommonCfg.APEdcaParm.Txop[0] = 0;
pAd->CommonCfg.APEdcaParm.Txop[1] = 0;
pAd->CommonCfg.APEdcaParm.Txop[2] = 94;
pAd->CommonCfg.APEdcaParm.Txop[3] = 47;
}
AsicSetEdcaParm(pAd, &pAd->CommonCfg.APEdcaParm);
#ifdef CONFIG_STA_SUPPORT
IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
{
RTMPSetIndividualHT(pAd, 0);
}
#endif // CONFIG_STA_SUPPORT //
}
/*
========================================================================
Routine Description:
Caller ensures we has 802.11n support.
Calls at setting HT from AP/STASetinformation
Arguments:
pAd - Pointer to our adapter
phymode -
========================================================================
*/
VOID RTMPSetIndividualHT(
IN PRTMP_ADAPTER pAd,
IN UCHAR apidx)
{
PRT_HT_PHY_INFO pDesired_ht_phy = NULL;
UCHAR TxStream = pAd->CommonCfg.TxStream;
UCHAR DesiredMcs = MCS_AUTO;
do
{
#ifdef CONFIG_STA_SUPPORT
IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
{
pDesired_ht_phy = &pAd->StaCfg.DesiredHtPhyInfo;
DesiredMcs = pAd->StaCfg.DesiredTransmitSetting.field.MCS;
//pAd->StaCfg.bAutoTxRateSwitch = (DesiredMcs == MCS_AUTO) ? TRUE : FALSE;
break;
}
#endif // CONFIG_STA_SUPPORT //
} while (FALSE);
if (pDesired_ht_phy == NULL)
{
DBGPRINT(RT_DEBUG_ERROR, ("RTMPSetIndividualHT: invalid apidx(%d)\n", apidx));
return;
}
RTMPZeroMemory(pDesired_ht_phy, sizeof(RT_HT_PHY_INFO));
DBGPRINT(RT_DEBUG_TRACE, ("RTMPSetIndividualHT : Desired MCS = %d\n", DesiredMcs));
// Check the validity of MCS
if ((TxStream == 1) && ((DesiredMcs >= MCS_8) && (DesiredMcs <= MCS_15)))
{
DBGPRINT(RT_DEBUG_WARN, ("RTMPSetIndividualHT: MCS(%d) is invalid in 1S, reset it as MCS_7\n", DesiredMcs));
DesiredMcs = MCS_7;
}
if ((pAd->CommonCfg.DesiredHtPhy.ChannelWidth == BW_20) && (DesiredMcs == MCS_32))
{
DBGPRINT(RT_DEBUG_WARN, ("RTMPSetIndividualHT: MCS_32 is only supported in 40-MHz, reset it as MCS_0\n"));
DesiredMcs = MCS_0;
}
pDesired_ht_phy->bHtEnable = TRUE;
// Decide desired Tx MCS
switch (TxStream)
{
case 1:
if (DesiredMcs == MCS_AUTO)
{
pDesired_ht_phy->MCSSet[0]= 0xff;
pDesired_ht_phy->MCSSet[1]= 0x00;
}
else if (DesiredMcs <= MCS_7)
{
pDesired_ht_phy->MCSSet[0]= 1<<DesiredMcs;
pDesired_ht_phy->MCSSet[1]= 0x00;
}
break;
case 2:
if (DesiredMcs == MCS_AUTO)
{
pDesired_ht_phy->MCSSet[0]= 0xff;
pDesired_ht_phy->MCSSet[1]= 0xff;
}
else if (DesiredMcs <= MCS_15)
{
ULONG mode;
mode = DesiredMcs / 8;
if (mode < 2)
pDesired_ht_phy->MCSSet[mode] = (1 << (DesiredMcs - mode * 8));
}
break;
case 3: // 3*3
if (DesiredMcs == MCS_AUTO)
{
/* MCS0 ~ MCS23, 3 bytes */
pDesired_ht_phy->MCSSet[0]= 0xff;
pDesired_ht_phy->MCSSet[1]= 0xff;
pDesired_ht_phy->MCSSet[2]= 0xff;
}
else if (DesiredMcs <= MCS_23)
{
ULONG mode;
mode = DesiredMcs / 8;
if (mode < 3)
pDesired_ht_phy->MCSSet[mode] = (1 << (DesiredMcs - mode * 8));
}
break;
}
if(pAd->CommonCfg.DesiredHtPhy.ChannelWidth == BW_40)
{
if (DesiredMcs == MCS_AUTO || DesiredMcs == MCS_32)
pDesired_ht_phy->MCSSet[4] = 0x1;
}
// update HT Rate setting
if (pAd->OpMode == OPMODE_STA)
MlmeUpdateHtTxRates(pAd, BSS0);
else
MlmeUpdateHtTxRates(pAd, apidx);
}
/*
========================================================================
Routine Description:
Update HT IE from our capability.
Arguments:
Send all HT IE in beacon/probe rsp/assoc rsp/action frame.
========================================================================
*/
VOID RTMPUpdateHTIE(
IN RT_HT_CAPABILITY *pRtHt,
IN UCHAR *pMcsSet,
OUT HT_CAPABILITY_IE *pHtCapability,
OUT ADD_HT_INFO_IE *pAddHtInfo)
{
RTMPZeroMemory(pHtCapability, sizeof(HT_CAPABILITY_IE));
RTMPZeroMemory(pAddHtInfo, sizeof(ADD_HT_INFO_IE));
pHtCapability->HtCapInfo.ChannelWidth = pRtHt->ChannelWidth;
pHtCapability->HtCapInfo.MimoPs = pRtHt->MimoPs;
pHtCapability->HtCapInfo.GF = pRtHt->GF;
pHtCapability->HtCapInfo.ShortGIfor20 = pRtHt->ShortGIfor20;
pHtCapability->HtCapInfo.ShortGIfor40 = pRtHt->ShortGIfor40;
pHtCapability->HtCapInfo.TxSTBC = pRtHt->TxSTBC;
pHtCapability->HtCapInfo.RxSTBC = pRtHt->RxSTBC;
pHtCapability->HtCapInfo.AMsduSize = pRtHt->AmsduSize;
pHtCapability->HtCapParm.MaxRAmpduFactor = pRtHt->MaxRAmpduFactor;
pHtCapability->HtCapParm.MpduDensity = pRtHt->MpduDensity;
pAddHtInfo->AddHtInfo.ExtChanOffset = pRtHt->ExtChanOffset ;
pAddHtInfo->AddHtInfo.RecomWidth = pRtHt->RecomWidth;
pAddHtInfo->AddHtInfo2.OperaionMode = pRtHt->OperaionMode;
pAddHtInfo->AddHtInfo2.NonGfPresent = pRtHt->NonGfPresent;
RTMPMoveMemory(pAddHtInfo->MCSSet, /*pRtHt->MCSSet*/pMcsSet, 4); // rt2860 only support MCS max=32, no need to copy all 16 uchar.
DBGPRINT(RT_DEBUG_TRACE,("RTMPUpdateHTIE <== \n"));
}
#endif // DOT11_N_SUPPORT //
/*
========================================================================
Description:
Add Client security information into ASIC WCID table and IVEIV table.
Return:
========================================================================
*/
VOID RTMPAddWcidAttributeEntry(
IN PRTMP_ADAPTER pAd,
IN UCHAR BssIdx,
IN UCHAR KeyIdx,
IN UCHAR CipherAlg,
IN MAC_TABLE_ENTRY *pEntry)
{
UINT32 WCIDAttri = 0;
USHORT offset;
UCHAR IVEIV = 0;
USHORT Wcid = 0;
{
#ifdef CONFIG_STA_SUPPORT
IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
{
if (BssIdx > BSS0)
{
DBGPRINT(RT_DEBUG_ERROR, ("RTMPAddWcidAttributeEntry: The BSS-index(%d) is out of range for Infra link. \n", BssIdx));
return;
}
// 1. In ADHOC mode, the AID is wcid number. And NO mesh link exists.
// 2. In Infra mode, the AID:1 MUST be wcid of infra STA.
// the AID:2~ assign to mesh link entry.
if (pEntry)
Wcid = pEntry->Aid;
else
Wcid = MCAST_WCID;
}
#endif // CONFIG_STA_SUPPORT //
}
// Update WCID attribute table
offset = MAC_WCID_ATTRIBUTE_BASE + (Wcid * HW_WCID_ATTRI_SIZE);
#ifdef CONFIG_STA_SUPPORT
IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
{
if (pEntry && pEntry->ValidAsMesh)
WCIDAttri = (CipherAlg<<1) | PAIRWISEKEYTABLE;
#ifdef QOS_DLS_SUPPORT
else if ((pEntry) && (pEntry->ValidAsDls) &&
((CipherAlg == CIPHER_TKIP) ||
(CipherAlg == CIPHER_TKIP_NO_MIC) ||
(CipherAlg == CIPHER_AES) ||
(CipherAlg == CIPHER_NONE)))
WCIDAttri = (CipherAlg<<1) | PAIRWISEKEYTABLE;
#endif // QOS_DLS_SUPPORT //
else
WCIDAttri = (CipherAlg<<1) | SHAREDKEYTABLE;
}
#endif // CONFIG_STA_SUPPORT //
RTMP_IO_WRITE32(pAd, offset, WCIDAttri);
// Update IV/EIV table
offset = MAC_IVEIV_TABLE_BASE + (Wcid * HW_IVEIV_ENTRY_SIZE);
// WPA mode
if ((CipherAlg == CIPHER_TKIP) || (CipherAlg == CIPHER_TKIP_NO_MIC) || (CipherAlg == CIPHER_AES))
{
// Eiv bit on. keyid always is 0 for pairwise key
IVEIV = (KeyIdx <<6) | 0x20;
}
else
{
// WEP KeyIdx is default tx key.
IVEIV = (KeyIdx << 6);
}
// For key index and ext IV bit, so only need to update the position(offset+3).
#ifdef RTMP_MAC_PCI
RTMP_IO_WRITE8(pAd, offset+3, IVEIV);
#endif // RTMP_MAC_PCI //
DBGPRINT(RT_DEBUG_TRACE,("RTMPAddWcidAttributeEntry: WCID #%d, KeyIndex #%d, Alg=%s\n",Wcid, KeyIdx, CipherName[CipherAlg]));
DBGPRINT(RT_DEBUG_TRACE,(" WCIDAttri = 0x%x \n", WCIDAttri));
}
/*
==========================================================================
Description:
Parse encryption type
Arguments:
pAdapter Pointer to our adapter
wrq Pointer to the ioctl argument
Return Value:
None
Note:
==========================================================================
*/
PSTRING GetEncryptType(CHAR enc)
{
if(enc == Ndis802_11WEPDisabled)
return "NONE";
if(enc == Ndis802_11WEPEnabled)
return "WEP";
if(enc == Ndis802_11Encryption2Enabled)
return "TKIP";
if(enc == Ndis802_11Encryption3Enabled)
return "AES";
if(enc == Ndis802_11Encryption4Enabled)
return "TKIPAES";
else
return "UNKNOW";
}
PSTRING GetAuthMode(CHAR auth)
{
if(auth == Ndis802_11AuthModeOpen)
return "OPEN";
if(auth == Ndis802_11AuthModeShared)
return "SHARED";
if(auth == Ndis802_11AuthModeAutoSwitch)
return "AUTOWEP";
if(auth == Ndis802_11AuthModeWPA)
return "WPA";
if(auth == Ndis802_11AuthModeWPAPSK)
return "WPAPSK";
if(auth == Ndis802_11AuthModeWPANone)
return "WPANONE";
if(auth == Ndis802_11AuthModeWPA2)
return "WPA2";
if(auth == Ndis802_11AuthModeWPA2PSK)
return "WPA2PSK";
if(auth == Ndis802_11AuthModeWPA1WPA2)
return "WPA1WPA2";
if(auth == Ndis802_11AuthModeWPA1PSKWPA2PSK)
return "WPA1PSKWPA2PSK";
return "UNKNOW";
}
/*
==========================================================================
Description:
Get site survey results
Arguments:
pAdapter Pointer to our adapter
wrq Pointer to the ioctl argument
Return Value:
None
Note:
Usage:
1.) UI needs to wait 4 seconds after issue a site survey command
2.) iwpriv ra0 get_site_survey
3.) UI needs to prepare at least 4096bytes to get the results
==========================================================================
*/
#define LINE_LEN (4+33+20+23+9+7+3) // Channel+SSID+Bssid+Security+Signal+WiressMode+NetworkType
#ifdef CONFIG_STA_SUPPORT
#endif // CONFIG_STA_SUPPORT //
VOID RTMPCommSiteSurveyData(
IN PSTRING msg,
IN PBSS_ENTRY pBss)
{
INT Rssi = 0;
UINT Rssi_Quality = 0;
NDIS_802_11_NETWORK_TYPE wireless_mode;
CHAR Ssid[MAX_LEN_OF_SSID +1];
STRING SecurityStr[32] = {0};
NDIS_802_11_ENCRYPTION_STATUS ap_cipher = Ndis802_11EncryptionDisabled;
NDIS_802_11_AUTHENTICATION_MODE ap_auth_mode = Ndis802_11AuthModeOpen;
memset(Ssid, 0 ,(MAX_LEN_OF_SSID +1));
//Channel
sprintf(msg+strlen(msg),"%-4d", pBss->Channel);
//SSID
memcpy(Ssid, pBss->Ssid, pBss->SsidLen);
Ssid[pBss->SsidLen] = '\0';
sprintf(msg+strlen(msg),"%-33s", Ssid);
//BSSID
sprintf(msg+strlen(msg),"%02x:%02x:%02x:%02x:%02x:%02x ",
pBss->Bssid[0],
pBss->Bssid[1],
pBss->Bssid[2],
pBss->Bssid[3],
pBss->Bssid[4],
pBss->Bssid[5]);
//Security
if ((Ndis802_11AuthModeWPA <= pBss->AuthMode) &&
(pBss->AuthMode <= Ndis802_11AuthModeWPA1PSKWPA2PSK))
{
if (pBss->AuthModeAux == Ndis802_11AuthModeWPANone)
{
ap_auth_mode = pBss->AuthMode;
if (pBss->WPA.PairCipherAux == Ndis802_11WEPDisabled)
ap_cipher = pBss->WPA.PairCipher;
else
ap_cipher = Ndis802_11Encryption4Enabled;
}
else if (pBss->AuthModeAux == Ndis802_11AuthModeOpen)
{
ap_auth_mode = pBss->AuthMode;
if ((ap_auth_mode == Ndis802_11AuthModeWPA) ||
(ap_auth_mode == Ndis802_11AuthModeWPAPSK))
{
if (pBss->WPA.PairCipherAux == Ndis802_11WEPDisabled)
ap_cipher = pBss->WPA.PairCipher;
else
ap_cipher = Ndis802_11Encryption4Enabled;
}
else if ((ap_auth_mode == Ndis802_11AuthModeWPA2) ||
(ap_auth_mode == Ndis802_11AuthModeWPA2PSK))
{
if (pBss->WPA2.PairCipherAux == Ndis802_11WEPDisabled)
ap_cipher = pBss->WPA2.PairCipher;
else
ap_cipher = Ndis802_11Encryption4Enabled;
}
}
else if ((pBss->AuthMode == Ndis802_11AuthModeWPAPSK) ||
(pBss->AuthMode == Ndis802_11AuthModeWPA2PSK))
{
if ((pBss->AuthModeAux == Ndis802_11AuthModeWPAPSK) ||
(pBss->AuthModeAux == Ndis802_11AuthModeWPA2PSK))
ap_auth_mode = Ndis802_11AuthModeWPA1PSKWPA2PSK;
else
ap_auth_mode = pBss->AuthMode;
if (pBss->WPA.PairCipher != pBss->WPA2.PairCipher)
ap_cipher = Ndis802_11Encryption4Enabled;
else if ((pBss->WPA.PairCipher == pBss->WPA2.PairCipher) &&
(pBss->WPA.PairCipherAux != pBss->WPA2.PairCipherAux))
ap_cipher = Ndis802_11Encryption4Enabled;
else if ((pBss->WPA.PairCipher == pBss->WPA2.PairCipher) &&
(pBss->WPA.PairCipherAux == pBss->WPA2.PairCipherAux) &&
(pBss->WPA.PairCipherAux != Ndis802_11WEPDisabled))
ap_cipher = Ndis802_11Encryption4Enabled;
else if ((pBss->WPA.PairCipher == pBss->WPA2.PairCipher) &&
(pBss->WPA.PairCipherAux == pBss->WPA2.PairCipherAux) &&
(pBss->WPA.PairCipherAux == Ndis802_11WEPDisabled))
ap_cipher = pBss->WPA.PairCipher;
}
else if ((pBss->AuthMode == Ndis802_11AuthModeWPA) ||
(pBss->AuthMode == Ndis802_11AuthModeWPA2))
{
if ((pBss->AuthModeAux == Ndis802_11AuthModeWPA) ||
(pBss->AuthMode == Ndis802_11AuthModeWPA2))
ap_auth_mode = Ndis802_11AuthModeWPA1WPA2;
else
ap_auth_mode = pBss->AuthMode;
if (pBss->WPA.PairCipher != pBss->WPA2.PairCipher)
ap_cipher = Ndis802_11Encryption4Enabled;
else if ((pBss->WPA.PairCipher == pBss->WPA2.PairCipher) &&
(pBss->WPA.PairCipherAux != pBss->WPA2.PairCipherAux))
ap_cipher = Ndis802_11Encryption4Enabled;
else if ((pBss->WPA.PairCipher == pBss->WPA2.PairCipher) &&
(pBss->WPA.PairCipherAux == pBss->WPA2.PairCipherAux) &&
(pBss->WPA.PairCipherAux != Ndis802_11WEPDisabled))
ap_cipher = Ndis802_11Encryption4Enabled;
else if ((pBss->WPA.PairCipher == pBss->WPA2.PairCipher) &&
(pBss->WPA.PairCipherAux == pBss->WPA2.PairCipherAux) &&
(pBss->WPA.PairCipherAux == Ndis802_11WEPDisabled))
ap_cipher = pBss->WPA.PairCipher;
}
sprintf(SecurityStr, "%s/%s", GetAuthMode((CHAR)ap_auth_mode), GetEncryptType((CHAR)ap_cipher));
}
else
{
ap_auth_mode = pBss->AuthMode;
ap_cipher = pBss->WepStatus;
if (ap_cipher == Ndis802_11WEPDisabled)
sprintf(SecurityStr, "NONE");
else if (ap_cipher == Ndis802_11WEPEnabled)
sprintf(SecurityStr, "WEP");
else
sprintf(SecurityStr, "%s/%s", GetAuthMode((CHAR)ap_auth_mode), GetEncryptType((CHAR)ap_cipher));
}
sprintf(msg+strlen(msg), "%-23s", SecurityStr);
// Rssi
Rssi = (INT)pBss->Rssi;
if (Rssi >= -50)
Rssi_Quality = 100;
else if (Rssi >= -80) // between -50 ~ -80dbm
Rssi_Quality = (UINT)(24 + ((Rssi + 80) * 26)/10);
else if (Rssi >= -90) // between -80 ~ -90dbm
Rssi_Quality = (UINT)(((Rssi + 90) * 26)/10);
else // < -84 dbm
Rssi_Quality = 0;
sprintf(msg+strlen(msg),"%-9d", Rssi_Quality);
// Wireless Mode
wireless_mode = NetworkTypeInUseSanity(pBss);
if (wireless_mode == Ndis802_11FH ||
wireless_mode == Ndis802_11DS)
sprintf(msg+strlen(msg),"%-7s", "11b");
else if (wireless_mode == Ndis802_11OFDM5)
sprintf(msg+strlen(msg),"%-7s", "11a");
else if (wireless_mode == Ndis802_11OFDM5_N)
sprintf(msg+strlen(msg),"%-7s", "11a/n");
else if (wireless_mode == Ndis802_11OFDM24)
sprintf(msg+strlen(msg),"%-7s", "11b/g");
else if (wireless_mode == Ndis802_11OFDM24_N)
sprintf(msg+strlen(msg),"%-7s", "11b/g/n");
else
sprintf(msg+strlen(msg),"%-7s", "unknow");
//Network Type
if (pBss->BssType == BSS_ADHOC)
sprintf(msg+strlen(msg),"%-3s", " Ad");
else
sprintf(msg+strlen(msg),"%-3s", " In");
sprintf(msg+strlen(msg),"\n");
return;
}
VOID RTMPIoctlGetSiteSurvey(
IN PRTMP_ADAPTER pAdapter,
IN struct iwreq *wrq)
{
PSTRING msg;
INT i=0;
INT WaitCnt;
INT Status=0;
INT max_len = LINE_LEN;
PBSS_ENTRY pBss;
#ifdef CONFIG_STA_SUPPORT
#endif // CONFIG_STA_SUPPORT //
os_alloc_mem(NULL, (PUCHAR *)&msg, sizeof(CHAR)*((MAX_LEN_OF_BSS_TABLE)*max_len));
if (msg == NULL)
{
DBGPRINT(RT_DEBUG_TRACE, ("RTMPIoctlGetSiteSurvey - msg memory alloc fail.\n"));
return;
}
memset(msg, 0 ,(MAX_LEN_OF_BSS_TABLE)*max_len );
sprintf(msg,"%s","\n");
sprintf(msg+strlen(msg),"%-4s%-33s%-20s%-23s%-9s%-7s%-3s\n",
"Ch", "SSID", "BSSID", "Security", "Siganl(%)", "W-Mode", " NT");
#ifdef CONFIG_STA_SUPPORT
#endif // CONFIG_STA_SUPPORT //
WaitCnt = 0;
#ifdef CONFIG_STA_SUPPORT
pAdapter->StaCfg.bScanReqIsFromWebUI = TRUE;
while ((ScanRunning(pAdapter) == TRUE) && (WaitCnt++ < 200))
OS_WAIT(500);
#endif // CONFIG_STA_SUPPORT //
for(i=0; i<pAdapter->ScanTab.BssNr ;i++)
{
pBss = &pAdapter->ScanTab.BssEntry[i];
if( pBss->Channel==0)
break;
if((strlen(msg)+max_len ) >= IW_SCAN_MAX_DATA)
break;
RTMPCommSiteSurveyData(msg, pBss);
#ifdef CONFIG_STA_SUPPORT
#endif // CONFIG_STA_SUPPORT //
}
#ifdef CONFIG_STA_SUPPORT
pAdapter->StaCfg.bScanReqIsFromWebUI = FALSE;
#endif // CONFIG_STA_SUPPORT //
wrq->u.data.length = strlen(msg);
Status = copy_to_user(wrq->u.data.pointer, msg, wrq->u.data.length);
DBGPRINT(RT_DEBUG_TRACE, ("RTMPIoctlGetSiteSurvey - wrq->u.data.length = %d\n", wrq->u.data.length));
os_free_mem(NULL, (PUCHAR)msg);
}
#define MAC_LINE_LEN (14+4+4+10+10+10+6+6) // Addr+aid+psm+datatime+rxbyte+txbyte+current tx rate+last tx rate
VOID RTMPIoctlGetMacTable(
IN PRTMP_ADAPTER pAd,
IN struct iwreq *wrq)
{
INT i;
RT_802_11_MAC_TABLE MacTab;
char *msg;
MacTab.Num = 0;
for (i=0; i<MAX_LEN_OF_MAC_TABLE; i++)
{
if (pAd->MacTab.Content[i].ValidAsCLI && (pAd->MacTab.Content[i].Sst == SST_ASSOC))
{
COPY_MAC_ADDR(MacTab.Entry[MacTab.Num].Addr, &pAd->MacTab.Content[i].Addr);
MacTab.Entry[MacTab.Num].Aid = (UCHAR)pAd->MacTab.Content[i].Aid;
MacTab.Entry[MacTab.Num].Psm = pAd->MacTab.Content[i].PsMode;
#ifdef DOT11_N_SUPPORT
MacTab.Entry[MacTab.Num].MimoPs = pAd->MacTab.Content[i].MmpsMode;
#endif // DOT11_N_SUPPORT //
// Fill in RSSI per entry
MacTab.Entry[MacTab.Num].AvgRssi0 = pAd->MacTab.Content[i].RssiSample.AvgRssi0;
MacTab.Entry[MacTab.Num].AvgRssi1 = pAd->MacTab.Content[i].RssiSample.AvgRssi1;
MacTab.Entry[MacTab.Num].AvgRssi2 = pAd->MacTab.Content[i].RssiSample.AvgRssi2;
// the connected time per entry
MacTab.Entry[MacTab.Num].ConnectedTime = pAd->MacTab.Content[i].StaConnectTime;
MacTab.Entry[MacTab.Num].TxRate.field.MCS = pAd->MacTab.Content[i].HTPhyMode.field.MCS;
MacTab.Entry[MacTab.Num].TxRate.field.BW = pAd->MacTab.Content[i].HTPhyMode.field.BW;
MacTab.Entry[MacTab.Num].TxRate.field.ShortGI = pAd->MacTab.Content[i].HTPhyMode.field.ShortGI;
MacTab.Entry[MacTab.Num].TxRate.field.STBC = pAd->MacTab.Content[i].HTPhyMode.field.STBC;
MacTab.Entry[MacTab.Num].TxRate.field.rsv = pAd->MacTab.Content[i].HTPhyMode.field.rsv;
MacTab.Entry[MacTab.Num].TxRate.field.MODE = pAd->MacTab.Content[i].HTPhyMode.field.MODE;
MacTab.Entry[MacTab.Num].TxRate.word = pAd->MacTab.Content[i].HTPhyMode.word;
MacTab.Num += 1;
}
}
wrq->u.data.length = sizeof(RT_802_11_MAC_TABLE);
if (copy_to_user(wrq->u.data.pointer, &MacTab, wrq->u.data.length))
{
DBGPRINT(RT_DEBUG_TRACE, ("%s: copy_to_user() fail\n", __FUNCTION__));
}
msg = kmalloc(sizeof(CHAR)*(MAX_LEN_OF_MAC_TABLE*MAC_LINE_LEN), MEM_ALLOC_FLAG);
if (msg == NULL)
{
DBGPRINT(RT_DEBUG_ERROR, ("%s():Alloc memory failed\n", __FUNCTION__));
return;
}
memset(msg, 0 ,MAX_LEN_OF_MAC_TABLE*MAC_LINE_LEN );
sprintf(msg,"%s","\n");
sprintf(msg+strlen(msg),"%-14s%-4s%-4s%-10s%-10s%-10s%-6s%-6s\n",
"MAC", "AID", "PSM", "LDT", "RxB", "TxB","CTxR", "LTxR");
for (i=0; i<MAX_LEN_OF_MAC_TABLE; i++)
{
PMAC_TABLE_ENTRY pEntry = &pAd->MacTab.Content[i];
if (pEntry->ValidAsCLI && (pEntry->Sst == SST_ASSOC))
{
if((strlen(msg)+MAC_LINE_LEN ) >= (MAX_LEN_OF_MAC_TABLE*MAC_LINE_LEN) )
break;
sprintf(msg+strlen(msg),"%02x%02x%02x%02x%02x%02x ",
pEntry->Addr[0], pEntry->Addr[1], pEntry->Addr[2],
pEntry->Addr[3], pEntry->Addr[4], pEntry->Addr[5]);
sprintf(msg+strlen(msg),"%-4d", (int)pEntry->Aid);
sprintf(msg+strlen(msg),"%-4d", (int)pEntry->PsMode);
sprintf(msg+strlen(msg),"%-10d",0/*pAd->MacTab.Content[i].HSCounter.LastDataPacketTime*/); // ToDo
sprintf(msg+strlen(msg),"%-10d",0/*pAd->MacTab.Content[i].HSCounter.TotalRxByteCount*/); // ToDo
sprintf(msg+strlen(msg),"%-10d",0/*pAd->MacTab.Content[i].HSCounter.TotalTxByteCount*/); // ToDo
sprintf(msg+strlen(msg),"%-6d",RateIdToMbps[pAd->MacTab.Content[i].CurrTxRate]);
sprintf(msg+strlen(msg),"%-6d\n",0/*RateIdToMbps[pAd->MacTab.Content[i].LastTxRate]*/); // ToDo
}
}
// for compatible with old API just do the printk to console
//wrq->u.data.length = strlen(msg);
//if (copy_to_user(wrq->u.data.pointer, msg, wrq->u.data.length))
{
DBGPRINT(RT_DEBUG_TRACE, ("%s", msg));
}
kfree(msg);
}
#ifdef DOT11_N_SUPPORT
INT Set_BASetup_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg)
{
UCHAR mac[6], tid;
PSTRING token;
STRING sepValue[] = ":", DASH = '-';
INT i;
MAC_TABLE_ENTRY *pEntry;
/*
The BASetup inupt string format should be xx:xx:xx:xx:xx:xx-d,
=>The six 2 digit hex-decimal number previous are the Mac address,
=>The seventh decimal number is the tid value.
*/
//DBGPRINT(RT_DEBUG_TRACE,("\n%s\n", arg));
if(strlen(arg) < 19) //Mac address acceptable format 01:02:03:04:05:06 length 17 plus the "-" and tid value in decimal format.
return FALSE;
token = strchr(arg, DASH);
if ((token != NULL) && (strlen(token)>1))
{
tid = (UCHAR) simple_strtol((token+1), 0, 10);
if (tid > 15)
return FALSE;
*token = '\0';
for (i = 0, token = rstrtok(arg, &sepValue[0]); token; token = rstrtok(NULL, &sepValue[0]), i++)
{
if((strlen(token) != 2) || (!isxdigit(*token)) || (!isxdigit(*(token+1))))
return FALSE;
AtoH(token, (&mac[i]), 1);
}
if(i != 6)
return FALSE;
DBGPRINT(RT_DEBUG_OFF, ("\n%02x:%02x:%02x:%02x:%02x:%02x-%02x\n",
mac[0], mac[1], mac[2], mac[3], mac[4], mac[5], tid));
pEntry = MacTableLookup(pAd, (PUCHAR) mac);
if (pEntry) {
DBGPRINT(RT_DEBUG_OFF, ("\nSetup BA Session: Tid = %d\n", tid));
BAOriSessionSetUp(pAd, pEntry, tid, 0, 100, TRUE);
}
return TRUE;
}
return FALSE;
}
INT Set_BADecline_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg)
{
ULONG bBADecline;
bBADecline = simple_strtol(arg, 0, 10);
if (bBADecline == 0)
{
pAd->CommonCfg.bBADecline = FALSE;
}
else if (bBADecline == 1)
{
pAd->CommonCfg.bBADecline = TRUE;
}
else
{
return FALSE; //Invalid argument
}
DBGPRINT(RT_DEBUG_TRACE, ("Set_BADecline_Proc::(BADecline=%d)\n", pAd->CommonCfg.bBADecline));
return TRUE;
}
INT Set_BAOriTearDown_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg)
{
UCHAR mac[6], tid;
PSTRING token;
STRING sepValue[] = ":", DASH = '-';
INT i;
MAC_TABLE_ENTRY *pEntry;
//DBGPRINT(RT_DEBUG_TRACE,("\n%s\n", arg));
/*
The BAOriTearDown inupt string format should be xx:xx:xx:xx:xx:xx-d,
=>The six 2 digit hex-decimal number previous are the Mac address,
=>The seventh decimal number is the tid value.
*/
if(strlen(arg) < 19) //Mac address acceptable format 01:02:03:04:05:06 length 17 plus the "-" and tid value in decimal format.
return FALSE;
token = strchr(arg, DASH);
if ((token != NULL) && (strlen(token)>1))
{
tid = simple_strtol((token+1), 0, 10);
if (tid > NUM_OF_TID)
return FALSE;
*token = '\0';
for (i = 0, token = rstrtok(arg, &sepValue[0]); token; token = rstrtok(NULL, &sepValue[0]), i++)
{
if((strlen(token) != 2) || (!isxdigit(*token)) || (!isxdigit(*(token+1))))
return FALSE;
AtoH(token, (&mac[i]), 1);
}
if(i != 6)
return FALSE;
DBGPRINT(RT_DEBUG_OFF, ("\n%02x:%02x:%02x:%02x:%02x:%02x-%02x",
mac[0], mac[1], mac[2], mac[3], mac[4], mac[5], tid));
pEntry = MacTableLookup(pAd, (PUCHAR) mac);
if (pEntry) {
DBGPRINT(RT_DEBUG_OFF, ("\nTear down Ori BA Session: Tid = %d\n", tid));
BAOriSessionTearDown(pAd, pEntry->Aid, tid, FALSE, TRUE);
}
return TRUE;
}
return FALSE;
}
INT Set_BARecTearDown_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg)
{
UCHAR mac[6], tid;
PSTRING token;
STRING sepValue[] = ":", DASH = '-';
INT i;
MAC_TABLE_ENTRY *pEntry;
//DBGPRINT(RT_DEBUG_TRACE,("\n%s\n", arg));
/*
The BARecTearDown inupt string format should be xx:xx:xx:xx:xx:xx-d,
=>The six 2 digit hex-decimal number previous are the Mac address,
=>The seventh decimal number is the tid value.
*/
if(strlen(arg) < 19) //Mac address acceptable format 01:02:03:04:05:06 length 17 plus the "-" and tid value in decimal format.
return FALSE;
token = strchr(arg, DASH);
if ((token != NULL) && (strlen(token)>1))
{
tid = simple_strtol((token+1), 0, 10);
if (tid > NUM_OF_TID)
return FALSE;
*token = '\0';
for (i = 0, token = rstrtok(arg, &sepValue[0]); token; token = rstrtok(NULL, &sepValue[0]), i++)
{
if((strlen(token) != 2) || (!isxdigit(*token)) || (!isxdigit(*(token+1))))
return FALSE;
AtoH(token, (&mac[i]), 1);
}
if(i != 6)
return FALSE;
DBGPRINT(RT_DEBUG_OFF, ("\n%02x:%02x:%02x:%02x:%02x:%02x-%02x",
mac[0], mac[1], mac[2], mac[3], mac[4], mac[5], tid));
pEntry = MacTableLookup(pAd, (PUCHAR) mac);
if (pEntry) {
DBGPRINT(RT_DEBUG_OFF, ("\nTear down Rec BA Session: Tid = %d\n", tid));
BARecSessionTearDown(pAd, pEntry->Aid, tid, FALSE);
}
return TRUE;
}
return FALSE;
}
INT Set_HtBw_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg)
{
ULONG HtBw;
HtBw = simple_strtol(arg, 0, 10);
if (HtBw == BW_40)
pAd->CommonCfg.RegTransmitSetting.field.BW = BW_40;
else if (HtBw == BW_20)
pAd->CommonCfg.RegTransmitSetting.field.BW = BW_20;
else
return FALSE; //Invalid argument
SetCommonHT(pAd);
DBGPRINT(RT_DEBUG_TRACE, ("Set_HtBw_Proc::(HtBw=%d)\n", pAd->CommonCfg.RegTransmitSetting.field.BW));
return TRUE;
}
INT Set_HtMcs_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg)
{
ULONG HtMcs, Mcs_tmp;
#ifdef CONFIG_STA_SUPPORT
BOOLEAN bAutoRate = FALSE;
#endif // CONFIG_STA_SUPPORT //
Mcs_tmp = simple_strtol(arg, 0, 10);
if (Mcs_tmp <= 15 || Mcs_tmp == 32)
HtMcs = Mcs_tmp;
else
HtMcs = MCS_AUTO;
#ifdef CONFIG_STA_SUPPORT
IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
{
pAd->StaCfg.DesiredTransmitSetting.field.MCS = HtMcs;
pAd->StaCfg.bAutoTxRateSwitch = (HtMcs == MCS_AUTO) ? TRUE:FALSE;
DBGPRINT(RT_DEBUG_TRACE, ("Set_HtMcs_Proc::(HtMcs=%d, bAutoTxRateSwitch = %d)\n",
pAd->StaCfg.DesiredTransmitSetting.field.MCS, pAd->StaCfg.bAutoTxRateSwitch));
if ((pAd->CommonCfg.PhyMode < PHY_11ABGN_MIXED) ||
(pAd->MacTab.Content[BSSID_WCID].HTPhyMode.field.MODE < MODE_HTMIX))
{
if ((pAd->StaCfg.DesiredTransmitSetting.field.MCS != MCS_AUTO) &&
(HtMcs >= 0 && HtMcs <= 3) &&
(pAd->StaCfg.DesiredTransmitSetting.field.FixedTxMode == FIXED_TXMODE_CCK))
{
RTMPSetDesiredRates(pAd, (LONG) (RateIdToMbps[HtMcs] * 1000000));
}
else if ((pAd->StaCfg.DesiredTransmitSetting.field.MCS != MCS_AUTO) &&
(HtMcs >= 0 && HtMcs <= 7) &&
(pAd->StaCfg.DesiredTransmitSetting.field.FixedTxMode == FIXED_TXMODE_OFDM))
{
RTMPSetDesiredRates(pAd, (LONG) (RateIdToMbps[HtMcs+4] * 1000000));
}
else
bAutoRate = TRUE;
if (bAutoRate)
{
pAd->StaCfg.DesiredTransmitSetting.field.MCS = MCS_AUTO;
RTMPSetDesiredRates(pAd, -1);
}
DBGPRINT(RT_DEBUG_TRACE, ("Set_HtMcs_Proc::(FixedTxMode=%d)\n",pAd->StaCfg.DesiredTransmitSetting.field.FixedTxMode));
}
if (ADHOC_ON(pAd))
return TRUE;
}
#endif // CONFIG_STA_SUPPORT //
SetCommonHT(pAd);
return TRUE;
}
INT Set_HtGi_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg)
{
ULONG HtGi;
HtGi = simple_strtol(arg, 0, 10);
if ( HtGi == GI_400)
pAd->CommonCfg.RegTransmitSetting.field.ShortGI = GI_400;
else if ( HtGi == GI_800 )
pAd->CommonCfg.RegTransmitSetting.field.ShortGI = GI_800;
else
return FALSE; //Invalid argument
SetCommonHT(pAd);
DBGPRINT(RT_DEBUG_TRACE, ("Set_HtGi_Proc::(ShortGI=%d)\n",pAd->CommonCfg.RegTransmitSetting.field.ShortGI));
return TRUE;
}
INT Set_HtTxBASize_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg)
{
UCHAR Size;
Size = simple_strtol(arg, 0, 10);
if (Size <=0 || Size >=64)
{
Size = 8;
}
pAd->CommonCfg.TxBASize = Size-1;
DBGPRINT(RT_DEBUG_ERROR, ("Set_HtTxBASize ::(TxBASize= %d)\n", Size));
return TRUE;
}
INT Set_HtDisallowTKIP_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg)
{
ULONG Value;
Value = simple_strtol(arg, 0, 10);
if (Value == 1)
{
pAd->CommonCfg.HT_DisallowTKIP = TRUE;
}
else
{
pAd->CommonCfg.HT_DisallowTKIP = FALSE;
}
DBGPRINT(RT_DEBUG_TRACE, ("Set_HtDisallowTKIP_Proc ::%s\n",
(pAd->CommonCfg.HT_DisallowTKIP == TRUE) ? "enabled" : "disabled"));
return TRUE;
}
INT Set_HtOpMode_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg)
{
ULONG Value;
Value = simple_strtol(arg, 0, 10);
if (Value == HTMODE_GF)
pAd->CommonCfg.RegTransmitSetting.field.HTMODE = HTMODE_GF;
else if ( Value == HTMODE_MM )
pAd->CommonCfg.RegTransmitSetting.field.HTMODE = HTMODE_MM;
else
return FALSE; //Invalid argument
SetCommonHT(pAd);
DBGPRINT(RT_DEBUG_TRACE, ("Set_HtOpMode_Proc::(HtOpMode=%d)\n",pAd->CommonCfg.RegTransmitSetting.field.HTMODE));
return TRUE;
}
INT Set_HtStbc_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg)
{
ULONG Value;
Value = simple_strtol(arg, 0, 10);
if (Value == STBC_USE)
pAd->CommonCfg.RegTransmitSetting.field.STBC = STBC_USE;
else if ( Value == STBC_NONE )
pAd->CommonCfg.RegTransmitSetting.field.STBC = STBC_NONE;
else
return FALSE; //Invalid argument
SetCommonHT(pAd);
DBGPRINT(RT_DEBUG_TRACE, ("Set_Stbc_Proc::(HtStbc=%d)\n",pAd->CommonCfg.RegTransmitSetting.field.STBC));
return TRUE;
}
INT Set_HtHtc_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg)
{
ULONG Value;
Value = simple_strtol(arg, 0, 10);
if (Value == 0)
pAd->HTCEnable = FALSE;
else if ( Value ==1 )
pAd->HTCEnable = TRUE;
else
return FALSE; //Invalid argument
DBGPRINT(RT_DEBUG_TRACE, ("Set_HtHtc_Proc::(HtHtc=%d)\n",pAd->HTCEnable));
return TRUE;
}
INT Set_HtExtcha_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg)
{
ULONG Value;
Value = simple_strtol(arg, 0, 10);
if (Value == 0)
pAd->CommonCfg.RegTransmitSetting.field.EXTCHA = EXTCHA_BELOW;
else if ( Value ==1 )
pAd->CommonCfg.RegTransmitSetting.field.EXTCHA = EXTCHA_ABOVE;
else
return FALSE; //Invalid argument
SetCommonHT(pAd);
DBGPRINT(RT_DEBUG_TRACE, ("Set_HtExtcha_Proc::(HtExtcha=%d)\n",pAd->CommonCfg.RegTransmitSetting.field.EXTCHA));
return TRUE;
}
INT Set_HtMpduDensity_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg)
{
ULONG Value;
Value = simple_strtol(arg, 0, 10);
if (Value <=7 && Value >= 0)
pAd->CommonCfg.BACapability.field.MpduDensity = Value;
else
pAd->CommonCfg.BACapability.field.MpduDensity = 4;
SetCommonHT(pAd);
DBGPRINT(RT_DEBUG_TRACE, ("Set_HtMpduDensity_Proc::(HtMpduDensity=%d)\n",pAd->CommonCfg.BACapability.field.MpduDensity));
return TRUE;
}
INT Set_HtBaWinSize_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg)
{
ULONG Value;
Value = simple_strtol(arg, 0, 10);
if (Value >=1 && Value <= 64)
{
pAd->CommonCfg.REGBACapability.field.RxBAWinLimit = Value;
pAd->CommonCfg.BACapability.field.RxBAWinLimit = Value;
}
else
{
pAd->CommonCfg.REGBACapability.field.RxBAWinLimit = 64;
pAd->CommonCfg.BACapability.field.RxBAWinLimit = 64;
}
SetCommonHT(pAd);
DBGPRINT(RT_DEBUG_TRACE, ("Set_HtBaWinSize_Proc::(HtBaWinSize=%d)\n",pAd->CommonCfg.BACapability.field.RxBAWinLimit));
return TRUE;
}
INT Set_HtRdg_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg)
{
ULONG Value;
Value = simple_strtol(arg, 0, 10);
if (Value == 0)
pAd->CommonCfg.bRdg = FALSE;
else if ( Value ==1 )
{
pAd->HTCEnable = TRUE;
pAd->CommonCfg.bRdg = TRUE;
}
else
return FALSE; //Invalid argument
SetCommonHT(pAd);
DBGPRINT(RT_DEBUG_TRACE, ("Set_HtRdg_Proc::(HtRdg=%d)\n",pAd->CommonCfg.bRdg));
return TRUE;
}
INT Set_HtLinkAdapt_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg)
{
ULONG Value;
Value = simple_strtol(arg, 0, 10);
if (Value == 0)
pAd->bLinkAdapt = FALSE;
else if ( Value ==1 )
{
pAd->HTCEnable = TRUE;
pAd->bLinkAdapt = TRUE;
}
else
return FALSE; //Invalid argument
DBGPRINT(RT_DEBUG_TRACE, ("Set_HtLinkAdapt_Proc::(HtLinkAdapt=%d)\n",pAd->bLinkAdapt));
return TRUE;
}
INT Set_HtAmsdu_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg)
{
ULONG Value;
Value = simple_strtol(arg, 0, 10);
if (Value == 0)
pAd->CommonCfg.BACapability.field.AmsduEnable = FALSE;
else if ( Value == 1 )
pAd->CommonCfg.BACapability.field.AmsduEnable = TRUE;
else
return FALSE; //Invalid argument
SetCommonHT(pAd);
DBGPRINT(RT_DEBUG_TRACE, ("Set_HtAmsdu_Proc::(HtAmsdu=%d)\n",pAd->CommonCfg.BACapability.field.AmsduEnable));
return TRUE;
}
INT Set_HtAutoBa_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg)
{
ULONG Value;
Value = simple_strtol(arg, 0, 10);
if (Value == 0)
{
pAd->CommonCfg.BACapability.field.AutoBA = FALSE;
pAd->CommonCfg.BACapability.field.Policy = BA_NOTUSE;
}
else if (Value == 1)
{
pAd->CommonCfg.BACapability.field.AutoBA = TRUE;
pAd->CommonCfg.BACapability.field.Policy = IMMED_BA;
}
else
return FALSE; //Invalid argument
pAd->CommonCfg.REGBACapability.field.AutoBA = pAd->CommonCfg.BACapability.field.AutoBA;
pAd->CommonCfg.REGBACapability.field.Policy = pAd->CommonCfg.BACapability.field.Policy;
SetCommonHT(pAd);
DBGPRINT(RT_DEBUG_TRACE, ("Set_HtAutoBa_Proc::(HtAutoBa=%d)\n",pAd->CommonCfg.BACapability.field.AutoBA));
return TRUE;
}
INT Set_HtProtect_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg)
{
ULONG Value;
Value = simple_strtol(arg, 0, 10);
if (Value == 0)
pAd->CommonCfg.bHTProtect = FALSE;
else if (Value == 1)
pAd->CommonCfg.bHTProtect = TRUE;
else
return FALSE; //Invalid argument
DBGPRINT(RT_DEBUG_TRACE, ("Set_HtProtect_Proc::(HtProtect=%d)\n",pAd->CommonCfg.bHTProtect));
return TRUE;
}
INT Set_SendPSMPAction_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg)
{
UCHAR mac[6], mode;
PSTRING token;
STRING sepValue[] = ":", DASH = '-';
INT i;
MAC_TABLE_ENTRY *pEntry;
//DBGPRINT(RT_DEBUG_TRACE,("\n%s\n", arg));
/*
The BARecTearDown inupt string format should be xx:xx:xx:xx:xx:xx-d,
=>The six 2 digit hex-decimal number previous are the Mac address,
=>The seventh decimal number is the mode value.
*/
if(strlen(arg) < 19) //Mac address acceptable format 01:02:03:04:05:06 length 17 plus the "-" and mode value in decimal format.
return FALSE;
token = strchr(arg, DASH);
if ((token != NULL) && (strlen(token)>1))
{
mode = simple_strtol((token+1), 0, 10);
if (mode > MMPS_ENABLE)
return FALSE;
*token = '\0';
for (i = 0, token = rstrtok(arg, &sepValue[0]); token; token = rstrtok(NULL, &sepValue[0]), i++)
{
if((strlen(token) != 2) || (!isxdigit(*token)) || (!isxdigit(*(token+1))))
return FALSE;
AtoH(token, (&mac[i]), 1);
}
if(i != 6)
return FALSE;
DBGPRINT(RT_DEBUG_OFF, ("\n%02x:%02x:%02x:%02x:%02x:%02x-%02x",
mac[0], mac[1], mac[2], mac[3], mac[4], mac[5], mode));
pEntry = MacTableLookup(pAd, mac);
if (pEntry) {
DBGPRINT(RT_DEBUG_OFF, ("\nSendPSMPAction MIPS mode = %d\n", mode));
SendPSMPAction(pAd, pEntry->Aid, mode);
}
return TRUE;
}
return FALSE;
}
INT Set_HtMIMOPSmode_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg)
{
ULONG Value;
Value = simple_strtol(arg, 0, 10);
if (Value <=3 && Value >= 0)
pAd->CommonCfg.BACapability.field.MMPSmode = Value;
else
pAd->CommonCfg.BACapability.field.MMPSmode = 3;
SetCommonHT(pAd);
DBGPRINT(RT_DEBUG_TRACE, ("Set_HtMIMOPSmode_Proc::(MIMOPS mode=%d)\n",pAd->CommonCfg.BACapability.field.MMPSmode));
return TRUE;
}
INT Set_ForceShortGI_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg)
{
ULONG Value;
Value = simple_strtol(arg, 0, 10);
if (Value == 0)
pAd->WIFItestbed.bShortGI = FALSE;
else if (Value == 1)
pAd->WIFItestbed.bShortGI = TRUE;
else
return FALSE; //Invalid argument
SetCommonHT(pAd);
DBGPRINT(RT_DEBUG_TRACE, ("Set_ForceShortGI_Proc::(ForceShortGI=%d)\n", pAd->WIFItestbed.bShortGI));
return TRUE;
}
INT Set_ForceGF_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg)
{
ULONG Value;
Value = simple_strtol(arg, 0, 10);
if (Value == 0)
pAd->WIFItestbed.bGreenField = FALSE;
else if (Value == 1)
pAd->WIFItestbed.bGreenField = TRUE;
else
return FALSE; //Invalid argument
SetCommonHT(pAd);
DBGPRINT(RT_DEBUG_TRACE, ("Set_ForceGF_Proc::(ForceGF=%d)\n", pAd->WIFItestbed.bGreenField));
return TRUE;
}
INT Set_HtMimoPs_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg)
{
ULONG Value;
Value = simple_strtol(arg, 0, 10);
if (Value == 0)
pAd->CommonCfg.bMIMOPSEnable = FALSE;
else if (Value == 1)
pAd->CommonCfg.bMIMOPSEnable = TRUE;
else
return FALSE; //Invalid argument
DBGPRINT(RT_DEBUG_TRACE, ("Set_HtMimoPs_Proc::(HtMimoPs=%d)\n",pAd->CommonCfg.bMIMOPSEnable));
return TRUE;
}
#endif // DOT11_N_SUPPORT //
#ifdef DOT11_N_SUPPORT
INT SetCommonHT(
IN PRTMP_ADAPTER pAd)
{
OID_SET_HT_PHYMODE SetHT;
if (pAd->CommonCfg.PhyMode < PHY_11ABGN_MIXED)
return FALSE;
SetHT.PhyMode = pAd->CommonCfg.PhyMode;
SetHT.TransmitNo = ((UCHAR)pAd->Antenna.field.TxPath);
SetHT.HtMode = (UCHAR)pAd->CommonCfg.RegTransmitSetting.field.HTMODE;
SetHT.ExtOffset = (UCHAR)pAd->CommonCfg.RegTransmitSetting.field.EXTCHA;
SetHT.MCS = MCS_AUTO;
SetHT.BW = (UCHAR)pAd->CommonCfg.RegTransmitSetting.field.BW;
SetHT.STBC = (UCHAR)pAd->CommonCfg.RegTransmitSetting.field.STBC;
SetHT.SHORTGI = (UCHAR)pAd->CommonCfg.RegTransmitSetting.field.ShortGI;
RTMPSetHT(pAd, &SetHT);
return TRUE;
}
#endif // DOT11_N_SUPPORT //
INT Set_FixedTxMode_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg)
{
UCHAR fix_tx_mode = FIXED_TXMODE_HT;
if (strcmp(arg, "OFDM") == 0 || strcmp(arg, "ofdm") == 0)
{
fix_tx_mode = FIXED_TXMODE_OFDM;
}
else if (strcmp(arg, "CCK") == 0 || strcmp(arg, "cck") == 0)
{
fix_tx_mode = FIXED_TXMODE_CCK;
}
#ifdef CONFIG_STA_SUPPORT
IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
pAd->StaCfg.DesiredTransmitSetting.field.FixedTxMode = fix_tx_mode;
#endif // CONFIG_STA_SUPPORT //
DBGPRINT(RT_DEBUG_TRACE, ("Set_FixedTxMode_Proc::(FixedTxMode=%d)\n", fix_tx_mode));
return TRUE;
}
#ifdef CONFIG_APSTA_MIXED_SUPPORT
INT Set_OpMode_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg)
{
ULONG Value;
Value = simple_strtol(arg, 0, 10);
#ifdef RTMP_MAC_PCI
if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE))
#endif // RTMP_MAC_PCI //
{
DBGPRINT(RT_DEBUG_ERROR, ("Can not switch operate mode on interface up !! \n"));
return FALSE;
}
if (Value == 0)
pAd->OpMode = OPMODE_STA;
else if (Value == 1)
pAd->OpMode = OPMODE_AP;
else
return FALSE; //Invalid argument
DBGPRINT(RT_DEBUG_TRACE, ("Set_OpMode_Proc::(OpMode=%s)\n", pAd->OpMode == 1 ? "AP Mode" : "STA Mode"));
return TRUE;
}
#endif // CONFIG_APSTA_MIXED_SUPPORT //
INT Set_LongRetryLimit_Proc(
IN PRTMP_ADAPTER pAdapter,
IN PSTRING arg)
{
TX_RTY_CFG_STRUC tx_rty_cfg;
UCHAR LongRetryLimit = (UCHAR)simple_strtol(arg, 0, 10);
RTMP_IO_READ32(pAdapter, TX_RTY_CFG, &tx_rty_cfg.word);
tx_rty_cfg.field.LongRtyLimit = LongRetryLimit;
RTMP_IO_WRITE32(pAdapter, TX_RTY_CFG, tx_rty_cfg.word);
DBGPRINT(RT_DEBUG_TRACE, ("IF Set_LongRetryLimit_Proc::(tx_rty_cfg=0x%x)\n", tx_rty_cfg.word));
return TRUE;
}
INT Set_ShortRetryLimit_Proc(
IN PRTMP_ADAPTER pAdapter,
IN PSTRING arg)
{
TX_RTY_CFG_STRUC tx_rty_cfg;
UCHAR ShortRetryLimit = (UCHAR)simple_strtol(arg, 0, 10);
RTMP_IO_READ32(pAdapter, TX_RTY_CFG, &tx_rty_cfg.word);
tx_rty_cfg.field.ShortRtyLimit = ShortRetryLimit;
RTMP_IO_WRITE32(pAdapter, TX_RTY_CFG, tx_rty_cfg.word);
DBGPRINT(RT_DEBUG_TRACE, ("IF Set_ShortRetryLimit_Proc::(tx_rty_cfg=0x%x)\n", tx_rty_cfg.word));
return TRUE;
}
/////////////////////////////////////////////////////////////////////////
PSTRING RTMPGetRalinkAuthModeStr(
IN NDIS_802_11_AUTHENTICATION_MODE authMode)
{
switch(authMode)
{
case Ndis802_11AuthModeOpen:
return "OPEN";
case Ndis802_11AuthModeWPAPSK:
return "WPAPSK";
case Ndis802_11AuthModeShared:
return "SHARED";
case Ndis802_11AuthModeWPA:
return "WPA";
case Ndis802_11AuthModeWPA2:
return "WPA2";
case Ndis802_11AuthModeWPA2PSK:
return "WPA2PSK";
case Ndis802_11AuthModeWPA1PSKWPA2PSK:
return "WPAPSKWPA2PSK";
case Ndis802_11AuthModeWPA1WPA2:
return "WPA1WPA2";
case Ndis802_11AuthModeWPANone:
return "WPANONE";
default:
return "UNKNOW";
}
}
PSTRING RTMPGetRalinkEncryModeStr(
IN USHORT encryMode)
{
switch(encryMode)
{
case Ndis802_11WEPDisabled:
return "NONE";
case Ndis802_11WEPEnabled:
return "WEP";
case Ndis802_11Encryption2Enabled:
return "TKIP";
case Ndis802_11Encryption3Enabled:
return "AES";
case Ndis802_11Encryption4Enabled:
return "TKIPAES";
default:
return "UNKNOW";
}
}
INT RTMPShowCfgValue(
IN PRTMP_ADAPTER pAd,
IN PSTRING pName,
IN PSTRING pBuf)
{
INT Status = 0;
for (PRTMP_PRIVATE_STA_SHOW_CFG_VALUE_PROC = RTMP_PRIVATE_STA_SHOW_CFG_VALUE_PROC; PRTMP_PRIVATE_STA_SHOW_CFG_VALUE_PROC->name; PRTMP_PRIVATE_STA_SHOW_CFG_VALUE_PROC++)
{
if (!strcmp(pName, PRTMP_PRIVATE_STA_SHOW_CFG_VALUE_PROC->name))
{
if(PRTMP_PRIVATE_STA_SHOW_CFG_VALUE_PROC->show_proc(pAd, pBuf))
Status = -EINVAL;
break; //Exit for loop.
}
}
if(PRTMP_PRIVATE_STA_SHOW_CFG_VALUE_PROC->name == NULL)
{
sprintf(pBuf, "\n");
for (PRTMP_PRIVATE_STA_SHOW_CFG_VALUE_PROC = RTMP_PRIVATE_STA_SHOW_CFG_VALUE_PROC; PRTMP_PRIVATE_STA_SHOW_CFG_VALUE_PROC->name; PRTMP_PRIVATE_STA_SHOW_CFG_VALUE_PROC++)
sprintf(pBuf, "%s%s\n", pBuf, PRTMP_PRIVATE_STA_SHOW_CFG_VALUE_PROC->name);
}
return Status;
}
INT Show_SSID_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf)
{
#ifdef CONFIG_STA_SUPPORT
IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
sprintf(pBuf, "\t%s", pAd->CommonCfg.Ssid);
#endif // CONFIG_STA_SUPPORT //
return 0;
}
INT Show_WirelessMode_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf)
{
switch(pAd->CommonCfg.PhyMode)
{
case PHY_11BG_MIXED:
sprintf(pBuf, "\t11B/G");
break;
case PHY_11B:
sprintf(pBuf, "\t11B");
break;
case PHY_11A:
sprintf(pBuf, "\t11A");
break;
case PHY_11ABG_MIXED:
sprintf(pBuf, "\t11A/B/G");
break;
case PHY_11G:
sprintf(pBuf, "\t11G");
break;
#ifdef DOT11_N_SUPPORT
case PHY_11ABGN_MIXED:
sprintf(pBuf, "\t11A/B/G/N");
break;
case PHY_11N_2_4G:
sprintf(pBuf, "\t11N only with 2.4G");
break;
case PHY_11GN_MIXED:
sprintf(pBuf, "\t11G/N");
break;
case PHY_11AN_MIXED:
sprintf(pBuf, "\t11A/N");
break;
case PHY_11BGN_MIXED:
sprintf(pBuf, "\t11B/G/N");
break;
case PHY_11AGN_MIXED:
sprintf(pBuf, "\t11A/G/N");
break;
case PHY_11N_5G:
sprintf(pBuf, "\t11N only with 5G");
break;
#endif // DOT11_N_SUPPORT //
default:
sprintf(pBuf, "\tUnknow Value(%d)", pAd->CommonCfg.PhyMode);
break;
}
return 0;
}
INT Show_TxBurst_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf)
{
sprintf(pBuf, "\t%s", pAd->CommonCfg.bEnableTxBurst ? "TRUE":"FALSE");
return 0;
}
INT Show_TxPreamble_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf)
{
switch(pAd->CommonCfg.TxPreamble)
{
case Rt802_11PreambleShort:
sprintf(pBuf, "\tShort");
break;
case Rt802_11PreambleLong:
sprintf(pBuf, "\tLong");
break;
case Rt802_11PreambleAuto:
sprintf(pBuf, "\tAuto");
break;
default:
sprintf(pBuf, "\tUnknow Value(%lu)", pAd->CommonCfg.TxPreamble);
break;
}
return 0;
}
INT Show_TxPower_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf)
{
sprintf(pBuf, "\t%lu", pAd->CommonCfg.TxPowerPercentage);
return 0;
}
INT Show_Channel_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf)
{
sprintf(pBuf, "\t%d", pAd->CommonCfg.Channel);
return 0;
}
INT Show_BGProtection_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf)
{
switch(pAd->CommonCfg.UseBGProtection)
{
case 1: //Always On
sprintf(pBuf, "\tON");
break;
case 2: //Always OFF
sprintf(pBuf, "\tOFF");
break;
case 0: //AUTO
sprintf(pBuf, "\tAuto");
break;
default:
sprintf(pBuf, "\tUnknow Value(%lu)", pAd->CommonCfg.UseBGProtection);
break;
}
return 0;
}
INT Show_RTSThreshold_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf)
{
sprintf(pBuf, "\t%u", pAd->CommonCfg.RtsThreshold);
return 0;
}
INT Show_FragThreshold_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf)
{
sprintf(pBuf, "\t%u", pAd->CommonCfg.FragmentThreshold);
return 0;
}
#ifdef DOT11_N_SUPPORT
INT Show_HtBw_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf)
{
if (pAd->CommonCfg.RegTransmitSetting.field.BW == BW_40)
{
sprintf(pBuf, "\t40 MHz");
}
else
{
sprintf(pBuf, "\t20 MHz");
}
return 0;
}
INT Show_HtMcs_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf)
{
#ifdef CONFIG_STA_SUPPORT
IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
sprintf(pBuf, "\t%u", pAd->StaCfg.DesiredTransmitSetting.field.MCS);
#endif // CONFIG_STA_SUPPORT //
return 0;
}
INT Show_HtGi_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf)
{
switch(pAd->CommonCfg.RegTransmitSetting.field.ShortGI)
{
case GI_400:
sprintf(pBuf, "\tGI_400");
break;
case GI_800:
sprintf(pBuf, "\tGI_800");
break;
default:
sprintf(pBuf, "\tUnknow Value(%u)", pAd->CommonCfg.RegTransmitSetting.field.ShortGI);
break;
}
return 0;
}
INT Show_HtOpMode_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf)
{
switch(pAd->CommonCfg.RegTransmitSetting.field.HTMODE)
{
case HTMODE_GF:
sprintf(pBuf, "\tGF");
break;
case HTMODE_MM:
sprintf(pBuf, "\tMM");
break;
default:
sprintf(pBuf, "\tUnknow Value(%u)", pAd->CommonCfg.RegTransmitSetting.field.HTMODE);
break;
}
return 0;
}
INT Show_HtExtcha_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf)
{
switch(pAd->CommonCfg.RegTransmitSetting.field.EXTCHA)
{
case EXTCHA_BELOW:
sprintf(pBuf, "\tBelow");
break;
case EXTCHA_ABOVE:
sprintf(pBuf, "\tAbove");
break;
default:
sprintf(pBuf, "\tUnknow Value(%u)", pAd->CommonCfg.RegTransmitSetting.field.EXTCHA);
break;
}
return 0;
}
INT Show_HtMpduDensity_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf)
{
sprintf(pBuf, "\t%u", pAd->CommonCfg.BACapability.field.MpduDensity);
return 0;
}
INT Show_HtBaWinSize_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf)
{
sprintf(pBuf, "\t%u", pAd->CommonCfg.BACapability.field.RxBAWinLimit);
return 0;
}
INT Show_HtRdg_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf)
{
sprintf(pBuf, "\t%s", pAd->CommonCfg.bRdg ? "TRUE":"FALSE");
return 0;
}
INT Show_HtAmsdu_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf)
{
sprintf(pBuf, "\t%s", pAd->CommonCfg.BACapability.field.AmsduEnable ? "TRUE":"FALSE");
return 0;
}
INT Show_HtAutoBa_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf)
{
sprintf(pBuf, "\t%s", pAd->CommonCfg.BACapability.field.AutoBA ? "TRUE":"FALSE");
return 0;
}
#endif // DOT11_N_SUPPORT //
INT Show_CountryRegion_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf)
{
sprintf(pBuf, "\t%d", pAd->CommonCfg.CountryRegion);
return 0;
}
INT Show_CountryRegionABand_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf)
{
sprintf(pBuf, "\t%d", pAd->CommonCfg.CountryRegionForABand);
return 0;
}
INT Show_CountryCode_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf)
{
sprintf(pBuf, "\t%s", pAd->CommonCfg.CountryCode);
return 0;
}
#ifdef AGGREGATION_SUPPORT
INT Show_PktAggregate_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf)
{
sprintf(pBuf, "\t%s", pAd->CommonCfg.bAggregationCapable ? "TRUE":"FALSE");
return 0;
}
#endif // AGGREGATION_SUPPORT //
#ifdef WMM_SUPPORT
INT Show_WmmCapable_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf)
{
#ifdef CONFIG_STA_SUPPORT
IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
sprintf(pBuf, "\t%s", pAd->CommonCfg.bWmmCapable ? "TRUE":"FALSE");
#endif // CONFIG_STA_SUPPORT //
return 0;
}
#endif // WMM_SUPPORT //
INT Show_IEEE80211H_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf)
{
sprintf(pBuf, "\t%s", pAd->CommonCfg.bIEEE80211H ? "TRUE":"FALSE");
return 0;
}
#ifdef CONFIG_STA_SUPPORT
INT Show_NetworkType_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf)
{
switch(pAd->StaCfg.BssType)
{
case BSS_ADHOC:
sprintf(pBuf, "\tAdhoc");
break;
case BSS_INFRA:
sprintf(pBuf, "\tInfra");
break;
case BSS_ANY:
sprintf(pBuf, "\tAny");
break;
case BSS_MONITOR:
sprintf(pBuf, "\tMonitor");
break;
default:
sprintf(pBuf, "\tUnknow Value(%d)", pAd->StaCfg.BssType);
break;
}
return 0;
}
#endif // CONFIG_STA_SUPPORT //
INT Show_AuthMode_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf)
{
NDIS_802_11_AUTHENTICATION_MODE AuthMode = Ndis802_11AuthModeOpen;
#ifdef CONFIG_STA_SUPPORT
IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
AuthMode = pAd->StaCfg.AuthMode;
#endif // CONFIG_STA_SUPPORT //
if ((AuthMode >= Ndis802_11AuthModeOpen) &&
(AuthMode <= Ndis802_11AuthModeWPA1PSKWPA2PSK))
sprintf(pBuf, "\t%s", RTMPGetRalinkAuthModeStr(AuthMode));
else
sprintf(pBuf, "\tUnknow Value(%d)", AuthMode);
return 0;
}
INT Show_EncrypType_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf)
{
NDIS_802_11_WEP_STATUS WepStatus = Ndis802_11WEPDisabled;
#ifdef CONFIG_STA_SUPPORT
IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
WepStatus = pAd->StaCfg.WepStatus;
#endif // CONFIG_STA_SUPPORT //
if ((WepStatus >= Ndis802_11WEPEnabled) &&
(WepStatus <= Ndis802_11Encryption4KeyAbsent))
sprintf(pBuf, "\t%s", RTMPGetRalinkEncryModeStr(WepStatus));
else
sprintf(pBuf, "\tUnknow Value(%d)", WepStatus);
return 0;
}
INT Show_DefaultKeyID_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf)
{
UCHAR DefaultKeyId = 0;
#ifdef CONFIG_STA_SUPPORT
IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
DefaultKeyId = pAd->StaCfg.DefaultKeyId;
#endif // CONFIG_STA_SUPPORT //
sprintf(pBuf, "\t%d", DefaultKeyId);
return 0;
}
INT Show_WepKey_Proc(
IN PRTMP_ADAPTER pAd,
IN INT KeyIdx,
OUT PSTRING pBuf)
{
UCHAR Key[16] = {0}, KeyLength = 0;
INT index = BSS0;
KeyLength = pAd->SharedKey[index][KeyIdx].KeyLen;
NdisMoveMemory(Key, pAd->SharedKey[index][KeyIdx].Key, KeyLength);
//check key string is ASCII or not
if (RTMPCheckStrPrintAble((PCHAR)Key, KeyLength))
sprintf(pBuf, "\t%s", Key);
else
{
int idx;
sprintf(pBuf, "\t");
for (idx = 0; idx < KeyLength; idx++)
sprintf(pBuf+strlen(pBuf), "%02X", Key[idx]);
}
return 0;
}
INT Show_Key1_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf)
{
Show_WepKey_Proc(pAd, 0, pBuf);
return 0;
}
INT Show_Key2_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf)
{
Show_WepKey_Proc(pAd, 1, pBuf);
return 0;
}
INT Show_Key3_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf)
{
Show_WepKey_Proc(pAd, 2, pBuf);
return 0;
}
INT Show_Key4_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf)
{
Show_WepKey_Proc(pAd, 3, pBuf);
return 0;
}
INT Show_WPAPSK_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf)
{
INT idx;
UCHAR PMK[32] = {0};
#ifdef CONFIG_STA_SUPPORT
IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
NdisMoveMemory(PMK, pAd->StaCfg.PMK, 32);
#endif // CONFIG_STA_SUPPORT //
sprintf(pBuf, "\tPMK = ");
for (idx = 0; idx < 32; idx++)
sprintf(pBuf+strlen(pBuf), "%02X", PMK[idx]);
return 0;
}