提交 4c96e893 编写于 作者: B Bartlomiej Zolnierkiewicz 提交者: Greg Kroah-Hartman

Staging: rt28x0: remove private WEXT handlers

Signed-off-by: NBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
上级 725fef14
......@@ -28,3378 +28,930 @@
#include <linux/sched.h>
#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);
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);
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);
INT Show_NetworkType_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf);
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},
{"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},
{"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},
{"NetworkType", Show_NetworkType_Proc},
{"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)
{
DBGPRINT(RT_DEBUG_TRACE, ("Driver version-%s\n", STA_DRIVER_VERSION));
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;
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;
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)
{
{
LONG WirelessMode = pAd->CommonCfg.PhyMode;
RTMPSetPhyMode(pAd, WirelessMode);
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;
}
// 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
}
}
// it is needed to set SSID to take effect
SetCommonHT(pAd);
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)
{
{
pAd->CommonCfg.Channel = Channel;
if (MONITOR_ON(pAd))
{
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
{
AsicSwitchChannel(pAd, pAd->CommonCfg.Channel, FALSE);
AsicLockChannel(pAd, pAd->CommonCfg.Channel);
DBGPRINT(RT_DEBUG_TRACE, ("BW_20, Channel(%d)\n", pAd->CommonCfg.Channel));
}
}
}
success = TRUE;
}
else
{
success = FALSE;
}
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)
{
{
pAd->CommonCfg.TxPowerDefault = TxPower;
pAd->CommonCfg.TxPowerPercentage = pAd->CommonCfg.TxPowerDefault;
}
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;
MlmeSetTxPreamble(pAd, Rt802_11PreambleShort);
break;
case Rt802_11PreambleLong:
case Rt802_11PreambleAuto:
// if user wants AUTO, initialize to LONG here, then change according to AP's
// capability upon association.
pAd->CommonCfg.TxPreamble = Preamble;
MlmeSetTxPreamble(pAd, Rt802_11PreambleLong);
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;
else if (RtsThresh == 0)
pAd->CommonCfg.RtsThreshold = MAX_RTS_THRESHOLD;
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;
}
{
if (pAd->CommonCfg.FragmentThreshold == MAX_FRAG_THRESHOLD)
pAd->CommonCfg.bUseZeroToDisableFragment = TRUE;
else
pAd->CommonCfg.bUseZeroToDisableFragment = FALSE;
}
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
/*
==========================================================================
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:
========================================================================
*/
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);
}
/*
========================================================================
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);
}
/*
========================================================================
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));
BuildChannelList(pAd);
// sanity check user setting
for (i = 0; i < pAd->ChannelListNum; i++)
{
if (pAd->CommonCfg.Channel == pAd->ChannelList[i].Channel)
break;
}
if (i == pAd->ChannelListNum)
{
pAd->CommonCfg.Channel = FirstChannel(pAd);
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:
case PHY_11N_2_4G:
case PHY_11ABGN_MIXED:
case PHY_11BGN_MIXED:
case PHY_11GN_MIXED:
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:
case PHY_11AN_MIXED:
case PHY_11AGN_MIXED:
case PHY_11N_5G:
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;
}
/*
========================================================================
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);
{
RTMPSetIndividualHT(pAd, 0);
}
}
/*
========================================================================
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
{
{
pDesired_ht_phy = &pAd->StaCfg.DesiredHtPhyInfo;
DesiredMcs = pAd->StaCfg.DesiredTransmitSetting.field.MCS;
//pAd->StaCfg.bAutoTxRateSwitch = (DesiredMcs == MCS_AUTO) ? TRUE : FALSE;
break;
}
} 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"));
}
/*
========================================================================
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;
{
{
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;
}
}
// Update WCID attribute table
offset = MAC_WCID_ATTRIBUTE_BASE + (Wcid * HW_WCID_ATTRI_SIZE);
{
if (pEntry && pEntry->ValidAsMesh)
WCIDAttri = (CipherAlg<<1) | PAIRWISEKEYTABLE;
else
WCIDAttri = (CipherAlg<<1) | SHAREDKEYTABLE;
}
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 //
#ifdef RTMP_MAC_USB
RTUSBMultiWrite_OneByte(pAd, offset+3, &IVEIV);
#endif // RTMP_MAC_USB //
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+7+3) // Channel+SSID+Bssid+Security+Signal+WiressMode+ExtCh+NetworkType
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");
// Ext Channel
if (pBss->AddHtInfoLen > 0)
{
if (pBss->AddHtInfo.AddHtInfo.ExtChanOffset == EXTCHA_ABOVE)
sprintf(msg+strlen(msg),"%-7s", " ABOVE");
else if (pBss->AddHtInfo.AddHtInfo.ExtChanOffset == EXTCHA_BELOW)
sprintf(msg+strlen(msg),"%-7s", " BELOW");
else
sprintf(msg+strlen(msg),"%-7s", " NONE");
}
else
{
sprintf(msg+strlen(msg),"%-7s", " NONE");
}
//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;
}
#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;
MacTab.Entry[MacTab.Num].MimoPs = pAd->MacTab.Content[i].MmpsMode;
// 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", __func__));
}
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", __func__));
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);
}
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;
BOOLEAN bAutoRate = FALSE;
Mcs_tmp = simple_strtol(arg, 0, 10);
if (Mcs_tmp <= 15 || Mcs_tmp == 32)
HtMcs = Mcs_tmp;
else
HtMcs = MCS_AUTO;
{
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;
}
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;
Routine Description:
Remove WPA Key process
SetCommonHT(pAd);
Arguments:
pAd Pointer to our adapter
pBuf Pointer to the where the key stored
DBGPRINT(RT_DEBUG_TRACE, ("Set_HtAutoBa_Proc::(HtAutoBa=%d)\n",pAd->CommonCfg.BACapability.field.AutoBA));
Return Value:
NDIS_SUCCESS Add key successfully
return TRUE;
IRQL = DISPATCH_LEVEL
}
Note:
INT Set_HtProtect_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg)
========================================================================
*/
VOID RTMPSetDesiredRates(
IN PRTMP_ADAPTER pAdapter,
IN LONG Rates)
{
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
NDIS_802_11_RATES aryRates;
DBGPRINT(RT_DEBUG_TRACE, ("Set_HtProtect_Proc::(HtProtect=%d)\n",pAd->CommonCfg.bHTProtect));
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;
}
return TRUE;
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);
}
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;
Routine Description:
Remove All WPA Keys
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));
Arguments:
pAd Pointer to our adapter
pEntry = MacTableLookup(pAd, mac);
Return Value:
None
if (pEntry) {
DBGPRINT(RT_DEBUG_OFF, ("\nSendPSMPAction MIPS mode = %d\n", mode));
SendPSMPAction(pAd, pEntry->Aid, mode);
}
IRQL = DISPATCH_LEVEL
return TRUE;
}
Note:
return FALSE;
========================================================================
*/
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;
INT Set_HtMIMOPSmode_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg)
{
ULONG Value;
// 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;
Value = simple_strtol(arg, 0, 10);
// set BSSID wcid entry of the Pair-wise Key table as no-security mode
AsicRemovePairwiseKeyEntry(pAd, BSS0, BSSID_WCID);
if (Value <=3 && Value >= 0)
pAd->CommonCfg.BACapability.field.MMPSmode = Value;
else
pAd->CommonCfg.BACapability.field.MMPSmode = 3;
// 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));
SetCommonHT(pAd);
AsicRemoveSharedKeyEntry(pAd, BSS0, i);
}
RTMP_SET_PSFLAG(pAd, fRTMP_PS_CAN_GO_SLEEP);
}
DBGPRINT(RT_DEBUG_TRACE, ("Set_HtMIMOPSmode_Proc::(MIMOPS mode=%d)\n",pAd->CommonCfg.BACapability.field.MMPSmode));
return TRUE;
}
/*
========================================================================
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.
INT Set_ForceShortGI_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg)
{
ULONG Value;
Arguments:
pAd Pointer to our adapter
pKey Pointer to the where the key stored
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
Return Value:
NDIS_SUCCESS Add key successfully
SetCommonHT(pAd);
IRQL = DISPATCH_LEVEL
DBGPRINT(RT_DEBUG_TRACE, ("Set_ForceShortGI_Proc::(ForceShortGI=%d)\n", pAd->WIFItestbed.bShortGI));
Note:
return TRUE;
}
========================================================================
*/
/*
========================================================================
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
INT Set_ForceGF_Proc(
========================================================================
*/
VOID RTMPSetPhyMode(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg)
IN ULONG phymode)
{
ULONG Value;
INT i;
// the selected phymode must be supported by the RF IC encoded in E2PROM
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
// if no change, do nothing
/* bug fix
if (pAd->CommonCfg.PhyMode == phymode)
return;
*/
pAd->CommonCfg.PhyMode = (UCHAR)phymode;
SetCommonHT(pAd);
DBGPRINT(RT_DEBUG_TRACE,("RTMPSetPhyMode : PhyMode=%d, channel=%d \n", pAd->CommonCfg.PhyMode, pAd->CommonCfg.Channel));
DBGPRINT(RT_DEBUG_TRACE, ("Set_ForceGF_Proc::(ForceGF=%d)\n", pAd->WIFItestbed.bGreenField));
BuildChannelList(pAd);
return TRUE;
}
// sanity check user setting
for (i = 0; i < pAd->ChannelListNum; i++)
{
if (pAd->CommonCfg.Channel == pAd->ChannelList[i].Channel)
break;
}
INT Set_HtMimoPs_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg)
{
ULONG Value;
if (i == pAd->ChannelListNum)
{
pAd->CommonCfg.Channel = FirstChannel(pAd);
DBGPRINT(RT_DEBUG_ERROR, ("RTMPSetPhyMode: channel is out of range, use first channel=%d \n", pAd->CommonCfg.Channel));
}
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
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;
DBGPRINT(RT_DEBUG_TRACE, ("Set_HtMimoPs_Proc::(HtMimoPs=%d)\n",pAd->CommonCfg.bMIMOPSEnable));
case PHY_11G:
case PHY_11BG_MIXED:
case PHY_11ABG_MIXED:
case PHY_11N_2_4G:
case PHY_11ABGN_MIXED:
case PHY_11BGN_MIXED:
case PHY_11GN_MIXED:
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;
return TRUE;
}
case PHY_11A:
case PHY_11AN_MIXED:
case PHY_11AGN_MIXED:
case PHY_11N_5G:
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;
INT SetCommonHT(
IN PRTMP_ADAPTER pAd)
{
OID_SET_HT_PHYMODE SetHT;
default:
break;
}
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;
pAd->CommonCfg.BandState = UNKNOWN_BAND;
}
RTMPSetHT(pAd, &SetHT);
/*
========================================================================
Routine Description:
Caller ensures we has 802.11n support.
Calls at setting HT from AP/STASetinformation
return TRUE;
}
Arguments:
pAd - Pointer to our adapter
phymode -
INT Set_FixedTxMode_Proc(
========================================================================
*/
VOID RTMPSetHT(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg)
IN OID_SET_HT_PHYMODE *pHTPhyMode)
{
UCHAR fix_tx_mode = FIXED_TXMODE_HT;
//ULONG *pmcs;
UINT32 Value = 0;
UCHAR BBPValue = 0;
UCHAR BBP3Value = 0;
UCHAR RxStream = pAd->CommonCfg.RxStream;
if (strcmp(arg, "OFDM") == 0 || strcmp(arg, "ofdm") == 0)
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)
{
fix_tx_mode = FIXED_TXMODE_OFDM;
pAd->CommonCfg.HtCapability.ExtHtCapInfo.PlusHTC = 1;
pAd->CommonCfg.HtCapability.ExtHtCapInfo.RDGSupport = 1;
}
else if (strcmp(arg, "CCK") == 0 || strcmp(arg, "cck") == 0)
else
{
fix_tx_mode = FIXED_TXMODE_CCK;
pAd->CommonCfg.HtCapability.ExtHtCapInfo.PlusHTC = 0;
pAd->CommonCfg.HtCapability.ExtHtCapInfo.RDGSupport = 0;
}
pAd->StaCfg.DesiredTransmitSetting.field.FixedTxMode = fix_tx_mode;
pAd->CommonCfg.HtCapability.HtCapParm.MaxRAmpduFactor = 3;
pAd->CommonCfg.DesiredHtPhy.MaxRAmpduFactor = 3;
DBGPRINT(RT_DEBUG_TRACE, ("Set_FixedTxMode_Proc::(FixedTxMode=%d)\n", fix_tx_mode));
DBGPRINT(RT_DEBUG_TRACE, ("RTMPSetHT : RxBAWinLimit = %d\n", pAd->CommonCfg.BACapability.field.RxBAWinLimit));
return TRUE;
}
// 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;
#if defined(RT305x)||defined(RT3070)
INT Set_HiPower_Proc(
IN PRTMP_ADAPTER pAdapter,
IN PSTRING arg)
{
pAdapter->CommonCfg.HighPowerPatchDisabled = !(simple_strtol(arg, 0, 10));
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;
if (pAdapter->CommonCfg.HighPowerPatchDisabled != 0)
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)
{
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAdapter, BBP_R82, 0x62);
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAdapter, BBP_R67, 0x20);
#ifdef RT3070
if ((IS_RT3070(pAdapter) && ((pAdapter->MACVersion & 0xffff) < 0x0201)))
#endif // RT3070 //
RT30xxWriteRFRegister(pAdapter, RF_R27, 0x23);
pAd->CommonCfg.HtCapability.HtCapInfo.GF = 1;
pAd->CommonCfg.DesiredHtPhy.GF = 1;
}
return TRUE;
}
#endif
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;
}
else
pAd->CommonCfg.DesiredHtPhy.GF = 0;
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);
// Decide Rx MCSSet
switch (RxStream)
{
case 1:
pAd->CommonCfg.HtCapability.MCSSet[0] = 0xff;
pAd->CommonCfg.HtCapability.MCSSet[1] = 0x00;
break;
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;
}
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;
}
/////////////////////////////////////////////////////////////////////////
PSTRING RTMPGetRalinkAuthModeStr(
IN NDIS_802_11_AUTHENTICATION_MODE authMode)
{
switch(authMode)
if (pAd->CommonCfg.bForty_Mhz_Intolerant && (pAd->CommonCfg.Channel <= 14) && (pHTPhyMode->BW == BW_40) )
{
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";
pHTPhyMode->BW = BW_20;
pAd->CommonCfg.HtCapability.HtCapInfo.Forty_Mhz_Intolerant = 1;
}
}
PSTRING RTMPGetRalinkEncryModeStr(
IN USHORT encryMode)
{
switch(encryMode)
if(pHTPhyMode->BW == BW_40)
{
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";
}
}
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);
}
INT RTMPShowCfgValue(
IN PRTMP_ADAPTER pAd,
IN PSTRING pName,
IN PSTRING pBuf)
{
INT Status = 0;
// 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);
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++)
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, BBP3Value);
pAd->CommonCfg.BBPCurrentBW = BW_40;
}
}
else
{
if (!strcmp(pName, PRTMP_PRIVATE_STA_SHOW_CFG_VALUE_PROC->name))
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.
{
if(PRTMP_PRIVATE_STA_SHOW_CFG_VALUE_PROC->show_proc(pAd, pBuf))
Status = -EINVAL;
break; //Exit for loop.
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(PRTMP_PRIVATE_STA_SHOW_CFG_VALUE_PROC->name == NULL)
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
{
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 + strlen(pBuf), "%s\n", PRTMP_PRIVATE_STA_SHOW_CFG_VALUE_PROC->name);
pAd->CommonCfg.DesiredHtPhy.TxSTBC = 0;
pAd->CommonCfg.DesiredHtPhy.RxSTBC = 0;
}
return Status;
}
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;
}
INT Show_SSID_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf)
{
sprintf(pBuf, "\t%s", pAd->CommonCfg.Ssid);
return 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.
INT Show_WirelessMode_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf)
{
switch(pAd->CommonCfg.PhyMode)
// EDCA parameters used for AP's own transmission
if (pAd->CommonCfg.APEdcaParm.bValid == FALSE)
{
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;
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;
default:
sprintf(pBuf, "\tUnknow Value(%d)", pAd->CommonCfg.PhyMode);
break;
}
return 0;
}
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;
INT Show_TxBurst_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf)
{
sprintf(pBuf, "\t%s", pAd->CommonCfg.bEnableTxBurst ? "TRUE":"FALSE");
return 0;
}
pAd->CommonCfg.APEdcaParm.Cwmax[0] = 6;
pAd->CommonCfg.APEdcaParm.Cwmax[1] = 10;
pAd->CommonCfg.APEdcaParm.Cwmax[2] = 4;
pAd->CommonCfg.APEdcaParm.Cwmax[3] = 3;
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;
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);
return 0;
}
INT Show_TxPower_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf)
{
sprintf(pBuf, "\t%lu", pAd->CommonCfg.TxPowerPercentage);
return 0;
}
{
RTMPSetIndividualHT(pAd, 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;
}
/*
========================================================================
Routine Description:
Caller ensures we has 802.11n support.
Calls at setting HT from AP/STASetinformation
INT Show_RTSThreshold_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf)
{
sprintf(pBuf, "\t%u", pAd->CommonCfg.RtsThreshold);
return 0;
}
Arguments:
pAd - Pointer to our adapter
phymode -
INT Show_FragThreshold_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf)
========================================================================
*/
VOID RTMPSetIndividualHT(
IN PRTMP_ADAPTER pAd,
IN UCHAR apidx)
{
sprintf(pBuf, "\t%u", pAd->CommonCfg.FragmentThreshold);
return 0;
}
PRT_HT_PHY_INFO pDesired_ht_phy = NULL;
UCHAR TxStream = pAd->CommonCfg.TxStream;
UCHAR DesiredMcs = MCS_AUTO;
INT Show_HtBw_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf)
{
if (pAd->CommonCfg.RegTransmitSetting.field.BW == BW_40)
do
{
sprintf(pBuf, "\t40 MHz");
}
else
{
pDesired_ht_phy = &pAd->StaCfg.DesiredHtPhyInfo;
DesiredMcs = pAd->StaCfg.DesiredTransmitSetting.field.MCS;
//pAd->StaCfg.bAutoTxRateSwitch = (DesiredMcs == MCS_AUTO) ? TRUE : FALSE;
break;
}
} while (FALSE);
if (pDesired_ht_phy == NULL)
{
sprintf(pBuf, "\t20 MHz");
DBGPRINT(RT_DEBUG_ERROR, ("RTMPSetIndividualHT: invalid apidx(%d)\n", apidx));
return;
}
return 0;
}
INT Show_HtMcs_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf)
{
sprintf(pBuf, "\t%u", pAd->StaCfg.DesiredTransmitSetting.field.MCS);
return 0;
}
RTMPZeroMemory(pDesired_ht_phy, sizeof(RT_HT_PHY_INFO));
INT Show_HtGi_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf)
{
switch(pAd->CommonCfg.RegTransmitSetting.field.ShortGI)
DBGPRINT(RT_DEBUG_TRACE, ("RTMPSetIndividualHT : Desired MCS = %d\n", DesiredMcs));
// Check the validity of MCS
if ((TxStream == 1) && ((DesiredMcs >= MCS_8) && (DesiredMcs <= MCS_15)))
{
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;
DBGPRINT(RT_DEBUG_WARN, ("RTMPSetIndividualHT: MCS(%d) is invalid in 1S, reset it as MCS_7\n", DesiredMcs));
DesiredMcs = MCS_7;
}
return 0;
}
INT Show_HtOpMode_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf)
{
switch(pAd->CommonCfg.RegTransmitSetting.field.HTMODE)
if ((pAd->CommonCfg.DesiredHtPhy.ChannelWidth == BW_20) && (DesiredMcs == MCS_32))
{
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;
DBGPRINT(RT_DEBUG_WARN, ("RTMPSetIndividualHT: MCS_32 is only supported in 40-MHz, reset it as MCS_0\n"));
DesiredMcs = MCS_0;
}
return 0;
}
INT Show_HtExtcha_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf)
{
switch(pAd->CommonCfg.RegTransmitSetting.field.EXTCHA)
pDesired_ht_phy->bHtEnable = TRUE;
// Decide desired Tx MCS
switch (TxStream)
{
case EXTCHA_BELOW:
sprintf(pBuf, "\tBelow");
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 EXTCHA_ABOVE:
sprintf(pBuf, "\tAbove");
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;
default:
sprintf(pBuf, "\tUnknow Value(%u)", pAd->CommonCfg.RegTransmitSetting.field.EXTCHA);
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;
}
return 0;
}
if(pAd->CommonCfg.DesiredHtPhy.ChannelWidth == BW_40)
{
if (DesiredMcs == MCS_AUTO || DesiredMcs == MCS_32)
pDesired_ht_phy->MCSSet[4] = 0x1;
}
INT Show_HtMpduDensity_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf)
{
sprintf(pBuf, "\t%u", pAd->CommonCfg.BACapability.field.MpduDensity);
return 0;
// update HT Rate setting
if (pAd->OpMode == OPMODE_STA)
MlmeUpdateHtTxRates(pAd, BSS0);
else
MlmeUpdateHtTxRates(pAd, apidx);
}
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;
}
/*
========================================================================
Routine Description:
Update HT IE from our capability.
INT Show_HtAmsdu_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf)
{
sprintf(pBuf, "\t%s", pAd->CommonCfg.BACapability.field.AmsduEnable ? "TRUE":"FALSE");
return 0;
}
Arguments:
Send all HT IE in beacon/probe rsp/assoc rsp/action frame.
INT Show_HtAutoBa_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf)
{
sprintf(pBuf, "\t%s", pAd->CommonCfg.BACapability.field.AutoBA ? "TRUE":"FALSE");
return 0;
}
INT Show_CountryRegion_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf)
========================================================================
*/
VOID RTMPUpdateHTIE(
IN RT_HT_CAPABILITY *pRtHt,
IN UCHAR *pMcsSet,
OUT HT_CAPABILITY_IE *pHtCapability,
OUT ADD_HT_INFO_IE *pAddHtInfo)
{
sprintf(pBuf, "\t%d", pAd->CommonCfg.CountryRegion);
return 0;
}
RTMPZeroMemory(pHtCapability, sizeof(HT_CAPABILITY_IE));
RTMPZeroMemory(pAddHtInfo, sizeof(ADD_HT_INFO_IE));
INT Show_CountryRegionABand_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf)
{
sprintf(pBuf, "\t%d", pAd->CommonCfg.CountryRegionForABand);
return 0;
}
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;
INT Show_CountryCode_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf)
{
sprintf(pBuf, "\t%s", pAd->CommonCfg.CountryCode);
return 0;
}
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.
#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;
DBGPRINT(RT_DEBUG_TRACE,("RTMPUpdateHTIE <== \n"));
}
#endif // AGGREGATION_SUPPORT //
#ifdef WMM_SUPPORT
INT Show_WmmCapable_Proc(
/*
========================================================================
Description:
Add Client security information into ASIC WCID table and IVEIV table.
Return:
========================================================================
*/
VOID RTMPAddWcidAttributeEntry(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf)
IN UCHAR BssIdx,
IN UCHAR KeyIdx,
IN UCHAR CipherAlg,
IN MAC_TABLE_ENTRY *pEntry)
{
sprintf(pBuf, "\t%s", pAd->CommonCfg.bWmmCapable ? "TRUE":"FALSE");
UINT32 WCIDAttri = 0;
USHORT offset;
UCHAR IVEIV = 0;
USHORT Wcid = 0;
return 0;
}
#endif // WMM_SUPPORT //
{
{
if (BssIdx > BSS0)
{
DBGPRINT(RT_DEBUG_ERROR, ("RTMPAddWcidAttributeEntry: The BSS-index(%d) is out of range for Infra link. \n", BssIdx));
return;
}
INT Show_IEEE80211H_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf)
{
sprintf(pBuf, "\t%s", pAd->CommonCfg.bIEEE80211H ? "TRUE":"FALSE");
return 0;
}
// 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;
}
}
// Update WCID attribute table
offset = MAC_WCID_ATTRIBUTE_BASE + (Wcid * HW_WCID_ATTRI_SIZE);
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;
if (pEntry && pEntry->ValidAsMesh)
WCIDAttri = (CipherAlg<<1) | PAIRWISEKEYTABLE;
else
WCIDAttri = (CipherAlg<<1) | SHAREDKEYTABLE;
}
return 0;
}
RTMP_IO_WRITE32(pAd, offset, WCIDAttri);
INT Show_AuthMode_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf)
{
NDIS_802_11_AUTHENTICATION_MODE AuthMode = Ndis802_11AuthModeOpen;
AuthMode = pAd->StaCfg.AuthMode;
// Update IV/EIV table
offset = MAC_IVEIV_TABLE_BASE + (Wcid * HW_IVEIV_ENTRY_SIZE);
if ((AuthMode >= Ndis802_11AuthModeOpen) &&
(AuthMode <= Ndis802_11AuthModeWPA1PSKWPA2PSK))
sprintf(pBuf, "\t%s", RTMPGetRalinkAuthModeStr(AuthMode));
// 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
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;
{
// WEP KeyIdx is default tx key.
IVEIV = (KeyIdx << 6);
}
WepStatus = pAd->StaCfg.WepStatus;
// 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 //
#ifdef RTMP_MAC_USB
RTUSBMultiWrite_OneByte(pAd, offset+3, &IVEIV);
#endif // RTMP_MAC_USB //
if ((WepStatus >= Ndis802_11WEPEnabled) &&
(WepStatus <= Ndis802_11Encryption4KeyAbsent))
sprintf(pBuf, "\t%s", RTMPGetRalinkEncryModeStr(WepStatus));
else
sprintf(pBuf, "\tUnknow Value(%d)", WepStatus);
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));
return 0;
}
INT Show_DefaultKeyID_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf)
{
UCHAR DefaultKeyId = 0;
DefaultKeyId = pAd->StaCfg.DefaultKeyId;
sprintf(pBuf, "\t%d", DefaultKeyId);
/*
==========================================================================
Description:
Parse encryption type
Arguments:
pAdapter Pointer to our adapter
wrq Pointer to the ioctl argument
return 0;
}
Return Value:
None
INT Show_WepKey_Proc(
IN PRTMP_ADAPTER pAd,
IN INT KeyIdx,
OUT PSTRING pBuf)
Note:
==========================================================================
*/
PSTRING GetEncryptType(CHAR enc)
{
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);
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
{
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;
return "UNKNOW";
}
INT Show_Key2_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf)
PSTRING GetAuthMode(CHAR auth)
{
Show_WepKey_Proc(pAd, 1, pBuf);
return 0;
}
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";
INT Show_Key3_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf)
{
Show_WepKey_Proc(pAd, 2, pBuf);
return 0;
return "UNKNOW";
}
INT Show_Key4_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf)
INT SetCommonHT(
IN PRTMP_ADAPTER pAd)
{
Show_WepKey_Proc(pAd, 3, pBuf);
return 0;
}
OID_SET_HT_PHYMODE SetHT;
INT Show_WPAPSK_Proc(
IN PRTMP_ADAPTER pAd,
OUT PSTRING pBuf)
{
INT idx;
UCHAR PMK[32] = {0};
if (pAd->CommonCfg.PhyMode < PHY_11ABGN_MIXED)
return FALSE;
NdisMoveMemory(PMK, pAd->StaCfg.PMK, 32);
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;
sprintf(pBuf, "\tPMK = ");
for (idx = 0; idx < 32; idx++)
sprintf(pBuf+strlen(pBuf), "%02X", PMK[idx]);
RTMPSetHT(pAd, &SetHT);
return 0;
return TRUE;
}
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";
}
}
......@@ -4237,17 +4237,9 @@ INT RT_CfgSetWPAPSKKey(
//
// Prototypes of function definition in cmm_info.c
//
NDIS_STATUS RTMPWPARemoveKeyProc(
IN PRTMP_ADAPTER pAd,
IN PVOID pBuf);
VOID RTMPWPARemoveAllKeys(
IN PRTMP_ADAPTER pAd);
BOOLEAN RTMPCheckStrPrintAble(
IN CHAR *pInPutStr,
IN UCHAR strLen);
VOID RTMPSetPhyMode(
IN PRTMP_ADAPTER pAd,
IN ULONG phymode);
......@@ -4683,183 +4675,9 @@ int rtinet_aton(
unsigned int *addr);
////////// common ioctl functions //////////
INT Set_DriverVersion_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
INT Set_CountryRegion_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
INT Set_CountryRegionABand_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
INT Set_WirelessMode_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
INT Set_Channel_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
INT Set_ShortSlot_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
INT Set_TxPower_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
INT Set_BGProtection_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
INT Set_TxPreamble_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
INT Set_RTSThreshold_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
INT Set_FragThreshold_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
INT Set_TxBurst_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
#ifdef AGGREGATION_SUPPORT
INT Set_PktAggregate_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
#endif // AGGREGATION_SUPPORT //
INT Set_IEEE80211H_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
#ifdef DBG
INT Set_Debug_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
#endif
INT Show_DescInfo_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
INT Set_ResetStatCounter_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
INT Set_BASetup_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
INT Set_BADecline_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
INT Set_BAOriTearDown_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
INT Set_BARecTearDown_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
INT Set_HtBw_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
INT Set_HtMcs_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
INT Set_HtGi_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
INT Set_HtOpMode_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
INT Set_HtStbc_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
INT Set_HtHtc_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
INT Set_HtExtcha_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
INT Set_HtMpduDensity_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
INT Set_HtBaWinSize_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
INT Set_HtRdg_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
INT Set_HtLinkAdapt_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
INT Set_HtAmsdu_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
INT Set_HtAutoBa_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
INT Set_HtProtect_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
INT Set_HtMimoPs_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
INT Set_ForceShortGI_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
INT Set_ForceGF_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
INT SetCommonHT(
IN PRTMP_ADAPTER pAd);
INT Set_SendPSMPAction_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
INT Set_HtMIMOPSmode_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
INT Set_HtTxBASize_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
INT Set_HtDisallowTKIP_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
INT WpaCheckEapCode(
IN PRTMP_ADAPTER pAd,
IN PUCHAR pFrame,
......@@ -5103,15 +4921,6 @@ INT Set_FixedTxMode_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
INT Set_LongRetryLimit_Proc(
IN PRTMP_ADAPTER pAdapter,
IN PSTRING arg);
INT Set_ShortRetryLimit_Proc(
IN PRTMP_ADAPTER pAdapter,
IN PSTRING arg);
BOOLEAN RT28XXChipsetCheck(
IN void *_dev_p);
......@@ -5661,19 +5470,6 @@ void RtmpTimerQInit(
IN RTMP_ADAPTER *pAd);
#endif // RTMP_TIMER_TASK_SUPPORT //
///////////////////////////////////////
INT RTMPShowCfgValue(
IN PRTMP_ADAPTER pAd,
IN PSTRING pName,
IN PSTRING pBuf);
PSTRING RTMPGetRalinkAuthModeStr(
IN NDIS_802_11_AUTHENTICATION_MODE authMode);
PSTRING RTMPGetRalinkEncryModeStr(
IN USHORT encryMode);
//////////////////////////////////////
VOID AsicStaBbpTuning(
IN PRTMP_ADAPTER pAd);
......
......@@ -61,42 +61,6 @@ typedef struct PACKED _RT_VERSION_INFO{
UINT DriverBuildDay;
} RT_VERSION_INFO, *PRT_VERSION_INFO;
struct iw_priv_args privtab[] = {
{ RTPRIV_IOCTL_SET,
IW_PRIV_TYPE_CHAR | 1024, 0,
"set"},
{ RTPRIV_IOCTL_SHOW, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK,
""},
/* --- sub-ioctls definitions --- */
{ SHOW_CONN_STATUS,
IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "connStatus" },
{ SHOW_DRVIER_VERION,
IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "driverVer" },
{ SHOW_BA_INFO,
IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "bainfo" },
{ SHOW_DESC_INFO,
IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "descinfo" },
{ RAIO_OFF,
IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "radio_off" },
{ RAIO_ON,
IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "radio_on" },
{ SHOW_CFG_VALUE,
IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "show" },
{ SHOW_ADHOC_ENTRY_INFO,
IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "adhocEntry" },
/* --- sub-ioctls relations --- */
{ RTPRIV_IOCTL_STATISTICS,
0, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK,
"stat"},
{ RTPRIV_IOCTL_GSITESURVEY,
0, IW_PRIV_TYPE_CHAR | 1024,
"get_site_survey"},
};
static __s32 ralinkrate[] =
{2, 4, 11, 22, // CCK
12, 18, 24, 36, 48, 72, 96, 108, // OFDM
......@@ -113,190 +77,10 @@ INT Set_SSID_Proc(
IN PRTMP_ADAPTER pAdapter,
IN PSTRING arg);
#ifdef WMM_SUPPORT
INT Set_WmmCapable_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
#endif
INT Set_NetworkType_Proc(
IN PRTMP_ADAPTER pAdapter,
IN PSTRING arg);
INT Set_AuthMode_Proc(
IN PRTMP_ADAPTER pAdapter,
IN PSTRING arg);
INT Set_EncrypType_Proc(
IN PRTMP_ADAPTER pAdapter,
IN PSTRING arg);
INT Set_DefaultKeyID_Proc(
IN PRTMP_ADAPTER pAdapter,
IN PSTRING arg);
INT Set_Key1_Proc(
IN PRTMP_ADAPTER pAdapter,
IN PSTRING arg);
INT Set_Key2_Proc(
IN PRTMP_ADAPTER pAdapter,
IN PSTRING arg);
INT Set_Key3_Proc(
IN PRTMP_ADAPTER pAdapter,
IN PSTRING arg);
INT Set_Key4_Proc(
IN PRTMP_ADAPTER pAdapter,
IN PSTRING arg);
INT Set_WPAPSK_Proc(
IN PRTMP_ADAPTER pAdapter,
IN PSTRING arg);
INT Set_PSMode_Proc(
IN PRTMP_ADAPTER pAdapter,
IN PSTRING arg);
#ifdef RT3090
INT Set_PCIePSLevel_Proc(
IN PRTMP_ADAPTER pAdapter,
IN PUCHAR arg);
#endif // RT3090 //
INT Set_Wpa_Support(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
NDIS_STATUS RTMPWPANoneAddKeyProc(
IN PRTMP_ADAPTER pAd,
IN PVOID pBuf);
INT Set_FragTest_Proc(
IN PRTMP_ADAPTER pAdapter,
IN PSTRING arg);
INT Set_TGnWifiTest_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
INT Set_LongRetryLimit_Proc(
IN PRTMP_ADAPTER pAdapter,
IN PSTRING arg);
INT Set_ShortRetryLimit_Proc(
IN PRTMP_ADAPTER pAdapter,
IN PSTRING arg);
INT Show_Adhoc_MacTable_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING extra);
INT Set_BeaconLostTime_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
INT Set_AutoRoaming_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
INT Set_SiteSurvey_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
INT Set_ForceTxBurst_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg);
static struct {
PSTRING name;
INT (*set_proc)(PRTMP_ADAPTER pAdapter, PSTRING arg);
} *PRTMP_PRIVATE_SET_PROC, RTMP_PRIVATE_SUPPORT_PROC[] = {
{"DriverVersion", Set_DriverVersion_Proc},
{"CountryRegion", Set_CountryRegion_Proc},
{"CountryRegionABand", Set_CountryRegionABand_Proc},
{"SSID", Set_SSID_Proc},
{"WirelessMode", Set_WirelessMode_Proc},
{"TxBurst", Set_TxBurst_Proc},
{"TxPreamble", Set_TxPreamble_Proc},
{"TxPower", Set_TxPower_Proc},
{"Channel", Set_Channel_Proc},
{"BGProtection", Set_BGProtection_Proc},
{"RTSThreshold", Set_RTSThreshold_Proc},
{"FragThreshold", Set_FragThreshold_Proc},
{"HtBw", Set_HtBw_Proc},
{"HtMcs", Set_HtMcs_Proc},
{"HtGi", Set_HtGi_Proc},
{"HtOpMode", Set_HtOpMode_Proc},
{"HtExtcha", Set_HtExtcha_Proc},
{"HtMpduDensity", Set_HtMpduDensity_Proc},
{"HtBaWinSize", Set_HtBaWinSize_Proc},
{"HtRdg", Set_HtRdg_Proc},
{"HtAmsdu", Set_HtAmsdu_Proc},
{"HtAutoBa", Set_HtAutoBa_Proc},
{"HtBaDecline", Set_BADecline_Proc},
{"HtProtect", Set_HtProtect_Proc},
{"HtMimoPs", Set_HtMimoPs_Proc},
{"HtDisallowTKIP", Set_HtDisallowTKIP_Proc},
#ifdef AGGREGATION_SUPPORT
{"PktAggregate", Set_PktAggregate_Proc},
#endif // AGGREGATION_SUPPORT //
#ifdef WMM_SUPPORT
{"WmmCapable", Set_WmmCapable_Proc},
#endif
{"IEEE80211H", Set_IEEE80211H_Proc},
{"NetworkType", Set_NetworkType_Proc},
{"AuthMode", Set_AuthMode_Proc},
{"EncrypType", Set_EncrypType_Proc},
{"DefaultKeyID", Set_DefaultKeyID_Proc},
{"Key1", Set_Key1_Proc},
{"Key2", Set_Key2_Proc},
{"Key3", Set_Key3_Proc},
{"Key4", Set_Key4_Proc},
{"WPAPSK", Set_WPAPSK_Proc},
{"ResetCounter", Set_ResetStatCounter_Proc},
{"PSMode", Set_PSMode_Proc},
#ifdef DBG
{"Debug", Set_Debug_Proc},
#endif // DBG //
{"WpaSupport", Set_Wpa_Support},
{"FixedTxMode", Set_FixedTxMode_Proc},
{"TGnWifiTest", Set_TGnWifiTest_Proc},
{"ForceGF", Set_ForceGF_Proc},
{"LongRetry", Set_LongRetryLimit_Proc},
{"ShortRetry", Set_ShortRetryLimit_Proc},
//2008/09/11:KH add to support efuse<--
#ifdef RT30xx
#ifdef RTMP_EFUSE_SUPPORT
{"efuseFreeNumber", set_eFuseGetFreeBlockCount_Proc},
{"efuseDump", set_eFusedump_Proc},
{"efuseLoadFromBin", set_eFuseLoadFromBin_Proc},
{"efuseBufferModeWriteBack", set_eFuseBufferModeWriteBack_Proc},
#endif // RTMP_EFUSE_SUPPORT //
#endif // RT30xx //
//2008/09/11:KH add to support efuse-->
{"BeaconLostTime", Set_BeaconLostTime_Proc},
{"AutoRoaming", Set_AutoRoaming_Proc},
{"SiteSurvey", Set_SiteSurvey_Proc},
{"ForceTxBurst", Set_ForceTxBurst_Proc},
{NULL,}
};
VOID RTMPAddKey(
IN PRTMP_ADAPTER pAd,
IN PNDIS_802_11_KEY pKey)
......@@ -1656,117 +1440,6 @@ rt_ioctl_giwencode(struct net_device *dev,
}
static int
rt_ioctl_setparam(struct net_device *dev, struct iw_request_info *info,
void *w, char *extra)
{
PRTMP_ADAPTER pAdapter;
POS_COOKIE pObj;
PSTRING this_char = extra;
PSTRING value;
int Status=0;
GET_PAD_FROM_NET_DEV(pAdapter, dev);
pObj = (POS_COOKIE) pAdapter->OS_Cookie;
{
pObj->ioctl_if_type = INT_MAIN;
pObj->ioctl_if = MAIN_MBSSID;
}
//check if the interface is down
if(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_INTERRUPT_IN_USE))
{
DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n"));
return -ENETDOWN;
}
if (!*this_char)
return -EINVAL;
if ((value = rtstrchr(this_char, '=')) != NULL)
*value++ = 0;
if (!value && (strcmp(this_char, "SiteSurvey") != 0))
return -EINVAL;
else
goto SET_PROC;
// reject setting nothing besides ANY ssid(ssidLen=0)
if (!*value && (strcmp(this_char, "SSID") != 0))
return -EINVAL;
SET_PROC:
for (PRTMP_PRIVATE_SET_PROC = RTMP_PRIVATE_SUPPORT_PROC; PRTMP_PRIVATE_SET_PROC->name; PRTMP_PRIVATE_SET_PROC++)
{
if (strcmp(this_char, PRTMP_PRIVATE_SET_PROC->name) == 0)
{
if(!PRTMP_PRIVATE_SET_PROC->set_proc(pAdapter, value))
{ //FALSE:Set private failed then return Invalid argument
Status = -EINVAL;
}
break; //Exit for loop.
}
}
if(PRTMP_PRIVATE_SET_PROC->name == NULL)
{ //Not found argument
Status = -EINVAL;
DBGPRINT(RT_DEBUG_TRACE, ("===>rt_ioctl_setparam:: (iwpriv) Not Support Set Command [%s=%s]\n", this_char, value));
}
return Status;
}
static int
rt_private_get_statistics(struct net_device *dev, struct iw_request_info *info,
struct iw_point *wrq, char *extra)
{
INT Status = 0;
PRTMP_ADAPTER pAd = NULL;
GET_PAD_FROM_NET_DEV(pAd, dev);
if (extra == NULL)
{
wrq->length = 0;
return -EIO;
}
memset(extra, 0x00, IW_PRIV_SIZE_MASK);
sprintf(extra, "\n\n");
{
sprintf(extra+strlen(extra), "Tx success = %ld\n", (ULONG)pAd->WlanCounters.TransmittedFragmentCount.QuadPart);
sprintf(extra+strlen(extra), "Tx success without retry = %ld\n", (ULONG)pAd->WlanCounters.TransmittedFragmentCount.QuadPart - (ULONG)pAd->WlanCounters.RetryCount.QuadPart);
}
sprintf(extra+strlen(extra), "Tx success after retry = %ld\n", (ULONG)pAd->WlanCounters.RetryCount.QuadPart);
sprintf(extra+strlen(extra), "Tx fail to Rcv ACK after retry = %ld\n", (ULONG)pAd->WlanCounters.FailedCount.QuadPart);
sprintf(extra+strlen(extra), "RTS Success Rcv CTS = %ld\n", (ULONG)pAd->WlanCounters.RTSSuccessCount.QuadPart);
sprintf(extra+strlen(extra), "RTS Fail Rcv CTS = %ld\n", (ULONG)pAd->WlanCounters.RTSFailureCount.QuadPart);
sprintf(extra+strlen(extra), "Rx success = %ld\n", (ULONG)pAd->WlanCounters.ReceivedFragmentCount.QuadPart);
sprintf(extra+strlen(extra), "Rx with CRC = %ld\n", (ULONG)pAd->WlanCounters.FCSErrorCount.QuadPart);
sprintf(extra+strlen(extra), "Rx drop due to out of resource = %ld\n", (ULONG)pAd->Counters8023.RxNoBuffer);
sprintf(extra+strlen(extra), "Rx duplicate frame = %ld\n", (ULONG)pAd->WlanCounters.FrameDuplicateCount.QuadPart);
sprintf(extra+strlen(extra), "False CCA (one second) = %ld\n", (ULONG)pAd->RalinkCounters.OneSecFalseCCACnt);
{
sprintf(extra+strlen(extra), "RSSI-A = %ld\n", (LONG)(pAd->StaCfg.RssiSample.LastRssi0 - pAd->BbpRssiToDbmDelta));
sprintf(extra+strlen(extra), "RSSI-B (if available) = %ld\n", (LONG)(pAd->StaCfg.RssiSample.LastRssi1 - pAd->BbpRssiToDbmDelta));
sprintf(extra+strlen(extra), "RSSI-C (if available) = %ld\n\n", (LONG)(pAd->StaCfg.RssiSample.LastRssi2 - pAd->BbpRssiToDbmDelta));
}
sprintf(extra+strlen(extra), "WpaSupplicantUP = %d\n\n", pAd->StaCfg.WpaSupplicantUP);
wrq->length = strlen(extra) + 1; // 1: size of '\0'
DBGPRINT(RT_DEBUG_TRACE, ("<== rt_private_get_statistics, wrq->length = %d\n", wrq->length));
return Status;
}
void getBaInfo(
IN PRTMP_ADAPTER pAd,
IN PSTRING pOutBuf)
......@@ -1814,143 +1487,6 @@ void getBaInfo(
return;
}
static int
rt_private_show(struct net_device *dev, struct iw_request_info *info,
struct iw_point *wrq, PSTRING extra)
{
INT Status = 0;
PRTMP_ADAPTER pAd;
POS_COOKIE pObj;
u32 subcmd = wrq->flags;
GET_PAD_FROM_NET_DEV(pAd, dev);
pObj = (POS_COOKIE) pAd->OS_Cookie;
if (extra == NULL)
{
wrq->length = 0;
return -EIO;
}
memset(extra, 0x00, IW_PRIV_SIZE_MASK);
{
pObj->ioctl_if_type = INT_MAIN;
pObj->ioctl_if = MAIN_MBSSID;
}
switch(subcmd)
{
case SHOW_CONN_STATUS:
if (MONITOR_ON(pAd))
{
if (pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED &&
pAd->CommonCfg.RegTransmitSetting.field.BW)
sprintf(extra, "Monitor Mode(CentralChannel %d)\n", pAd->CommonCfg.CentralChannel);
else
sprintf(extra, "Monitor Mode(Channel %d)\n", pAd->CommonCfg.Channel);
}
else
{
if (pAd->IndicateMediaState == NdisMediaStateConnected)
{
if (INFRA_ON(pAd))
{
sprintf(extra, "Connected(AP: %s[%02X:%02X:%02X:%02X:%02X:%02X])\n",
pAd->CommonCfg.Ssid,
pAd->CommonCfg.Bssid[0],
pAd->CommonCfg.Bssid[1],
pAd->CommonCfg.Bssid[2],
pAd->CommonCfg.Bssid[3],
pAd->CommonCfg.Bssid[4],
pAd->CommonCfg.Bssid[5]);
DBGPRINT(RT_DEBUG_TRACE ,("Ssid=%s ,Ssidlen = %d\n",pAd->CommonCfg.Ssid, pAd->CommonCfg.SsidLen));
}
else if (ADHOC_ON(pAd))
sprintf(extra, "Connected\n");
}
else
{
sprintf(extra, "Disconnected\n");
DBGPRINT(RT_DEBUG_TRACE ,("ConnStatus is not connected\n"));
}
}
wrq->length = strlen(extra) + 1; // 1: size of '\0'
break;
case SHOW_DRVIER_VERION:
sprintf(extra, "Driver version-%s, %s %s\n", STA_DRIVER_VERSION, __DATE__, __TIME__ );
wrq->length = strlen(extra) + 1; // 1: size of '\0'
break;
case SHOW_BA_INFO:
getBaInfo(pAd, extra);
wrq->length = strlen(extra) + 1; // 1: size of '\0'
break;
case SHOW_DESC_INFO:
{
Show_DescInfo_Proc(pAd, NULL);
wrq->length = 0; // 1: size of '\0'
}
break;
case RAIO_OFF:
if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS))
{
if (pAd->Mlme.CntlMachine.CurrState != CNTL_IDLE)
{
RTMP_MLME_RESET_STATE_MACHINE(pAd);
DBGPRINT(RT_DEBUG_TRACE, ("!!! MLME busy, reset MLME state machine !!!\n"));
}
}
pAd->StaCfg.bSwRadio = FALSE;
if (pAd->StaCfg.bRadio != (pAd->StaCfg.bHwRadio && pAd->StaCfg.bSwRadio))
{
pAd->StaCfg.bRadio = (pAd->StaCfg.bHwRadio && pAd->StaCfg.bSwRadio);
if (pAd->StaCfg.bRadio == FALSE)
{
MlmeRadioOff(pAd);
// Update extra information
pAd->ExtraInfo = SW_RADIO_OFF;
}
}
sprintf(extra, "Radio Off\n");
wrq->length = strlen(extra) + 1; // 1: size of '\0'
break;
case RAIO_ON:
pAd->StaCfg.bSwRadio = TRUE;
//if (pAd->StaCfg.bRadio != (pAd->StaCfg.bHwRadio && pAd->StaCfg.bSwRadio))
{
pAd->StaCfg.bRadio = (pAd->StaCfg.bHwRadio && pAd->StaCfg.bSwRadio);
if (pAd->StaCfg.bRadio == TRUE)
{
MlmeRadioOn(pAd);
// Update extra information
pAd->ExtraInfo = EXTRA_INFO_CLEAR;
}
}
sprintf(extra, "Radio On\n");
wrq->length = strlen(extra) + 1; // 1: size of '\0'
break;
case SHOW_CFG_VALUE:
{
Status = RTMPShowCfgValue(pAd, (PSTRING) wrq->pointer, extra);
if (Status == 0)
wrq->length = strlen(extra) + 1; // 1: size of '\0'
}
break;
case SHOW_ADHOC_ENTRY_INFO:
Show_Adhoc_MacTable_Proc(pAd, extra);
wrq->length = strlen(extra) + 1; // 1: size of '\0'
break;
default:
DBGPRINT(RT_DEBUG_TRACE, ("%s - unknow subcmd = %d\n", __func__, subcmd));
break;
}
return Status;
}
int rt_ioctl_siwmlme(struct net_device *dev,
struct iw_request_info *info,
union iwreq_data *wrqu,
......@@ -2774,43 +2310,10 @@ static const iw_handler rt_handler[] =
(iw_handler) rt_ioctl_siwpmksa, /* SIOCSIWPMKSA */
};
static const iw_handler rt_priv_handlers[] = {
(iw_handler) NULL, /* + 0x00 */
(iw_handler) NULL, /* + 0x01 */
(iw_handler) rt_ioctl_setparam, /* + 0x02 */
(iw_handler) NULL, /* + 0x03 */
(iw_handler) NULL, /* + 0x04 */
(iw_handler) NULL, /* + 0x05 */
(iw_handler) NULL, /* + 0x06 */
(iw_handler) NULL, /* + 0x07 */
(iw_handler) NULL, /* + 0x08 */
(iw_handler) rt_private_get_statistics, /* + 0x09 */
(iw_handler) NULL, /* + 0x0A */
(iw_handler) NULL, /* + 0x0B */
(iw_handler) NULL, /* + 0x0C */
(iw_handler) NULL, /* + 0x0D */
(iw_handler) NULL, /* + 0x0E */
(iw_handler) NULL, /* + 0x0F */
(iw_handler) NULL, /* + 0x10 */
(iw_handler) rt_private_show, /* + 0x11 */
(iw_handler) NULL, /* + 0x12 */
(iw_handler) NULL, /* + 0x13 */
(iw_handler) NULL, /* + 0x14 */
(iw_handler) NULL, /* + 0x15 */
(iw_handler) NULL, /* + 0x16 */
(iw_handler) NULL, /* + 0x17 */
(iw_handler) NULL, /* + 0x18 */
};
const struct iw_handler_def rt28xx_iw_handler_def =
{
#define N(a) (sizeof (a) / sizeof (a[0]))
.standard = (iw_handler *) rt_handler,
.num_standard = sizeof(rt_handler) / sizeof(iw_handler),
.private = (iw_handler *) rt_priv_handlers,
.num_private = N(rt_priv_handlers),
.private_args = (struct iw_priv_args *) privtab,
.num_private_args = N(privtab),
#if IW_HANDLER_VERSION >= 7
.get_wireless_stats = rt28xx_get_wireless_stats,
#endif
......@@ -2980,17 +2483,8 @@ INT rt28xx_sta_ioctl(
case RT_PRIV_IOCTL_EXT:
case RTPRIV_IOCTL_SET:
case RTPRIV_IOCTL_GSITESURVEY:
Status = -EOPNOTSUPP;
break;
case SIOCGIWPRIV:
if (wrq->u.data.pointer)
{
if ( access_ok(VERIFY_WRITE, wrq->u.data.pointer, sizeof(privtab)) != TRUE)
break;
wrq->u.data.length = sizeof(privtab) / sizeof(privtab[0]);
if (copy_to_user(wrq->u.data.pointer, privtab, sizeof(privtab)))
Status = -EFAULT;
}
Status = -EOPNOTSUPP;
break;
case SIOCETHTOOL:
break;
......@@ -3087,41 +2581,6 @@ INT Set_SSID_Proc(
return success;
}
#ifdef WMM_SUPPORT
/*
==========================================================================
Description:
Set WmmCapable Enable or Disable
Return:
TRUE if all parameters are OK, FALSE otherwise
==========================================================================
*/
INT Set_WmmCapable_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg)
{
BOOLEAN bWmmCapable;
bWmmCapable = simple_strtol(arg, 0, 10);
if ((bWmmCapable == 1)
#ifdef RTMP_MAC_USB
&& (pAd->NumberOfPipes >= 5)
#endif // RTMP_MAC_USB //
)
pAd->CommonCfg.bWmmCapable = TRUE;
else if (bWmmCapable == 0)
pAd->CommonCfg.bWmmCapable = FALSE;
else
return FALSE; //Invalid argument
DBGPRINT(RT_DEBUG_TRACE, ("Set_WmmCapable_Proc::(bWmmCapable=%d)\n",
pAd->CommonCfg.bWmmCapable));
return TRUE;
}
#endif // WMM_SUPPORT //
/*
==========================================================================
Description:
......@@ -3306,765 +2765,3 @@ INT Set_NetworkType_Proc(
return TRUE;
}
/*
==========================================================================
Description:
Set Authentication mode
Return:
TRUE if all parameters are OK, FALSE otherwise
==========================================================================
*/
INT Set_AuthMode_Proc(
IN PRTMP_ADAPTER pAdapter,
IN PSTRING arg)
{
if ((strcmp(arg, "WEPAUTO") == 0) || (strcmp(arg, "wepauto") == 0))
pAdapter->StaCfg.AuthMode = Ndis802_11AuthModeAutoSwitch;
else if ((strcmp(arg, "OPEN") == 0) || (strcmp(arg, "open") == 0))
pAdapter->StaCfg.AuthMode = Ndis802_11AuthModeOpen;
else if ((strcmp(arg, "SHARED") == 0) || (strcmp(arg, "shared") == 0))
pAdapter->StaCfg.AuthMode = Ndis802_11AuthModeShared;
else if ((strcmp(arg, "WPAPSK") == 0) || (strcmp(arg, "wpapsk") == 0))
pAdapter->StaCfg.AuthMode = Ndis802_11AuthModeWPAPSK;
else if ((strcmp(arg, "WPANONE") == 0) || (strcmp(arg, "wpanone") == 0))
pAdapter->StaCfg.AuthMode = Ndis802_11AuthModeWPANone;
else if ((strcmp(arg, "WPA2PSK") == 0) || (strcmp(arg, "wpa2psk") == 0))
pAdapter->StaCfg.AuthMode = Ndis802_11AuthModeWPA2PSK;
else if ((strcmp(arg, "WPA") == 0) || (strcmp(arg, "wpa") == 0))
pAdapter->StaCfg.AuthMode = Ndis802_11AuthModeWPA;
else if ((strcmp(arg, "WPA2") == 0) || (strcmp(arg, "wpa2") == 0))
pAdapter->StaCfg.AuthMode = Ndis802_11AuthModeWPA2;
else
return FALSE;
pAdapter->StaCfg.PortSecured = WPA_802_1X_PORT_NOT_SECURED;
DBGPRINT(RT_DEBUG_TRACE, ("Set_AuthMode_Proc::(AuthMode=%d)\n", pAdapter->StaCfg.AuthMode));
return TRUE;
}
/*
==========================================================================
Description:
Set Encryption Type
Return:
TRUE if all parameters are OK, FALSE otherwise
==========================================================================
*/
INT Set_EncrypType_Proc(
IN PRTMP_ADAPTER pAdapter,
IN PSTRING arg)
{
if ((strcmp(arg, "NONE") == 0) || (strcmp(arg, "none") == 0))
{
if (pAdapter->StaCfg.AuthMode >= Ndis802_11AuthModeWPA)
return TRUE; // do nothing
pAdapter->StaCfg.WepStatus = Ndis802_11WEPDisabled;
pAdapter->StaCfg.PairCipher = Ndis802_11WEPDisabled;
pAdapter->StaCfg.GroupCipher = Ndis802_11WEPDisabled;
}
else if ((strcmp(arg, "WEP") == 0) || (strcmp(arg, "wep") == 0))
{
if (pAdapter->StaCfg.AuthMode >= Ndis802_11AuthModeWPA)
return TRUE; // do nothing
pAdapter->StaCfg.WepStatus = Ndis802_11WEPEnabled;
pAdapter->StaCfg.PairCipher = Ndis802_11WEPEnabled;
pAdapter->StaCfg.GroupCipher = Ndis802_11WEPEnabled;
}
else if ((strcmp(arg, "TKIP") == 0) || (strcmp(arg, "tkip") == 0))
{
if (pAdapter->StaCfg.AuthMode < Ndis802_11AuthModeWPA)
return TRUE; // do nothing
pAdapter->StaCfg.WepStatus = Ndis802_11Encryption2Enabled;
pAdapter->StaCfg.PairCipher = Ndis802_11Encryption2Enabled;
pAdapter->StaCfg.GroupCipher = Ndis802_11Encryption2Enabled;
}
else if ((strcmp(arg, "AES") == 0) || (strcmp(arg, "aes") == 0))
{
if (pAdapter->StaCfg.AuthMode < Ndis802_11AuthModeWPA)
return TRUE; // do nothing
pAdapter->StaCfg.WepStatus = Ndis802_11Encryption3Enabled;
pAdapter->StaCfg.PairCipher = Ndis802_11Encryption3Enabled;
pAdapter->StaCfg.GroupCipher = Ndis802_11Encryption3Enabled;
}
else
return FALSE;
pAdapter->StaCfg.OrigWepStatus = pAdapter->StaCfg.WepStatus;
DBGPRINT(RT_DEBUG_TRACE, ("Set_EncrypType_Proc::(EncrypType=%d)\n", pAdapter->StaCfg.WepStatus));
return TRUE;
}
/*
==========================================================================
Description:
Set Default Key ID
Return:
TRUE if all parameters are OK, FALSE otherwise
==========================================================================
*/
INT Set_DefaultKeyID_Proc(
IN PRTMP_ADAPTER pAdapter,
IN PSTRING arg)
{
ULONG KeyIdx;
KeyIdx = simple_strtol(arg, 0, 10);
if((KeyIdx >= 1 ) && (KeyIdx <= 4))
pAdapter->StaCfg.DefaultKeyId = (UCHAR) (KeyIdx - 1 );
else
return FALSE; //Invalid argument
DBGPRINT(RT_DEBUG_TRACE, ("Set_DefaultKeyID_Proc::(DefaultKeyID=%d)\n", pAdapter->StaCfg.DefaultKeyId));
return TRUE;
}
/*
==========================================================================
Description:
Set WEP KEY1
Return:
TRUE if all parameters are OK, FALSE otherwise
==========================================================================
*/
INT Set_Key1_Proc(
IN PRTMP_ADAPTER pAdapter,
IN PSTRING arg)
{
int KeyLen;
int i;
UCHAR CipherAlg=CIPHER_WEP64;
if (pAdapter->StaCfg.AuthMode >= Ndis802_11AuthModeWPA)
return TRUE; // do nothing
KeyLen = strlen(arg);
switch (KeyLen)
{
case 5: //wep 40 Ascii type
pAdapter->SharedKey[BSS0][0].KeyLen = KeyLen;
memcpy(pAdapter->SharedKey[BSS0][0].Key, arg, KeyLen);
CipherAlg = CIPHER_WEP64;
DBGPRINT(RT_DEBUG_TRACE, ("Set_Key1_Proc::(Key1=%s and type=%s)\n", arg, "Ascii"));
break;
case 10: //wep 40 Hex type
for(i=0; i < KeyLen; i++)
{
if( !isxdigit(*(arg+i)) )
return FALSE; //Not Hex value;
}
pAdapter->SharedKey[BSS0][0].KeyLen = KeyLen / 2 ;
AtoH(arg, pAdapter->SharedKey[BSS0][0].Key, KeyLen / 2);
CipherAlg = CIPHER_WEP64;
DBGPRINT(RT_DEBUG_TRACE, ("Set_Key1_Proc::(Key1=%s and type=%s)\n", arg, "Hex"));
break;
case 13: //wep 104 Ascii type
pAdapter->SharedKey[BSS0][0].KeyLen = KeyLen;
memcpy(pAdapter->SharedKey[BSS0][0].Key, arg, KeyLen);
CipherAlg = CIPHER_WEP128;
DBGPRINT(RT_DEBUG_TRACE, ("Set_Key1_Proc::(Key1=%s and type=%s)\n", arg, "Ascii"));
break;
case 26: //wep 104 Hex type
for(i=0; i < KeyLen; i++)
{
if( !isxdigit(*(arg+i)) )
return FALSE; //Not Hex value;
}
pAdapter->SharedKey[BSS0][0].KeyLen = KeyLen / 2 ;
AtoH(arg, pAdapter->SharedKey[BSS0][0].Key, KeyLen / 2);
CipherAlg = CIPHER_WEP128;
DBGPRINT(RT_DEBUG_TRACE, ("Set_Key1_Proc::(Key1=%s and type=%s)\n", arg, "Hex"));
break;
default: //Invalid argument
DBGPRINT(RT_DEBUG_TRACE, ("Set_Key1_Proc::Invalid argument (=%s)\n", arg));
return FALSE;
}
pAdapter->SharedKey[BSS0][0].CipherAlg = CipherAlg;
// Set keys (into ASIC)
if (pAdapter->StaCfg.AuthMode >= Ndis802_11AuthModeWPA)
; // not support
else // Old WEP stuff
{
AsicAddSharedKeyEntry(pAdapter,
0,
0,
pAdapter->SharedKey[BSS0][0].CipherAlg,
pAdapter->SharedKey[BSS0][0].Key,
NULL,
NULL);
}
return TRUE;
}
/*
==========================================================================
Description:
Set WEP KEY2
Return:
TRUE if all parameters are OK, FALSE otherwise
==========================================================================
*/
INT Set_Key2_Proc(
IN PRTMP_ADAPTER pAdapter,
IN PSTRING arg)
{
int KeyLen;
int i;
UCHAR CipherAlg=CIPHER_WEP64;
if (pAdapter->StaCfg.AuthMode >= Ndis802_11AuthModeWPA)
return TRUE; // do nothing
KeyLen = strlen(arg);
switch (KeyLen)
{
case 5: //wep 40 Ascii type
pAdapter->SharedKey[BSS0][1].KeyLen = KeyLen;
memcpy(pAdapter->SharedKey[BSS0][1].Key, arg, KeyLen);
CipherAlg = CIPHER_WEP64;
DBGPRINT(RT_DEBUG_TRACE, ("Set_Key2_Proc::(Key2=%s and type=%s)\n", arg, "Ascii"));
break;
case 10: //wep 40 Hex type
for(i=0; i < KeyLen; i++)
{
if( !isxdigit(*(arg+i)) )
return FALSE; //Not Hex value;
}
pAdapter->SharedKey[BSS0][1].KeyLen = KeyLen / 2 ;
AtoH(arg, pAdapter->SharedKey[BSS0][1].Key, KeyLen / 2);
CipherAlg = CIPHER_WEP64;
DBGPRINT(RT_DEBUG_TRACE, ("Set_Key2_Proc::(Key2=%s and type=%s)\n", arg, "Hex"));
break;
case 13: //wep 104 Ascii type
pAdapter->SharedKey[BSS0][1].KeyLen = KeyLen;
memcpy(pAdapter->SharedKey[BSS0][1].Key, arg, KeyLen);
CipherAlg = CIPHER_WEP128;
DBGPRINT(RT_DEBUG_TRACE, ("Set_Key2_Proc::(Key2=%s and type=%s)\n", arg, "Ascii"));
break;
case 26: //wep 104 Hex type
for(i=0; i < KeyLen; i++)
{
if( !isxdigit(*(arg+i)) )
return FALSE; //Not Hex value;
}
pAdapter->SharedKey[BSS0][1].KeyLen = KeyLen / 2 ;
AtoH(arg, pAdapter->SharedKey[BSS0][1].Key, KeyLen / 2);
CipherAlg = CIPHER_WEP128;
DBGPRINT(RT_DEBUG_TRACE, ("Set_Key2_Proc::(Key2=%s and type=%s)\n", arg, "Hex"));
break;
default: //Invalid argument
DBGPRINT(RT_DEBUG_TRACE, ("Set_Key2_Proc::Invalid argument (=%s)\n", arg));
return FALSE;
}
pAdapter->SharedKey[BSS0][1].CipherAlg = CipherAlg;
// Set keys (into ASIC)
if (pAdapter->StaCfg.AuthMode >= Ndis802_11AuthModeWPA)
; // not support
else // Old WEP stuff
{
AsicAddSharedKeyEntry(pAdapter,
0,
1,
pAdapter->SharedKey[BSS0][1].CipherAlg,
pAdapter->SharedKey[BSS0][1].Key,
NULL,
NULL);
}
return TRUE;
}
/*
==========================================================================
Description:
Set WEP KEY3
Return:
TRUE if all parameters are OK, FALSE otherwise
==========================================================================
*/
INT Set_Key3_Proc(
IN PRTMP_ADAPTER pAdapter,
IN PSTRING arg)
{
int KeyLen;
int i;
UCHAR CipherAlg=CIPHER_WEP64;
if (pAdapter->StaCfg.AuthMode >= Ndis802_11AuthModeWPA)
return TRUE; // do nothing
KeyLen = strlen(arg);
switch (KeyLen)
{
case 5: //wep 40 Ascii type
pAdapter->SharedKey[BSS0][2].KeyLen = KeyLen;
memcpy(pAdapter->SharedKey[BSS0][2].Key, arg, KeyLen);
CipherAlg = CIPHER_WEP64;
DBGPRINT(RT_DEBUG_TRACE, ("Set_Key3_Proc::(Key3=%s and type=Ascii)\n", arg));
break;
case 10: //wep 40 Hex type
for(i=0; i < KeyLen; i++)
{
if( !isxdigit(*(arg+i)) )
return FALSE; //Not Hex value;
}
pAdapter->SharedKey[BSS0][2].KeyLen = KeyLen / 2 ;
AtoH(arg, pAdapter->SharedKey[BSS0][2].Key, KeyLen / 2);
CipherAlg = CIPHER_WEP64;
DBGPRINT(RT_DEBUG_TRACE, ("Set_Key3_Proc::(Key3=%s and type=Hex)\n", arg));
break;
case 13: //wep 104 Ascii type
pAdapter->SharedKey[BSS0][2].KeyLen = KeyLen;
memcpy(pAdapter->SharedKey[BSS0][2].Key, arg, KeyLen);
CipherAlg = CIPHER_WEP128;
DBGPRINT(RT_DEBUG_TRACE, ("Set_Key3_Proc::(Key3=%s and type=Ascii)\n", arg));
break;
case 26: //wep 104 Hex type
for(i=0; i < KeyLen; i++)
{
if( !isxdigit(*(arg+i)) )
return FALSE; //Not Hex value;
}
pAdapter->SharedKey[BSS0][2].KeyLen = KeyLen / 2 ;
AtoH(arg, pAdapter->SharedKey[BSS0][2].Key, KeyLen / 2);
CipherAlg = CIPHER_WEP128;
DBGPRINT(RT_DEBUG_TRACE, ("Set_Key3_Proc::(Key3=%s and type=Hex)\n", arg));
break;
default: //Invalid argument
DBGPRINT(RT_DEBUG_TRACE, ("Set_Key3_Proc::Invalid argument (=%s)\n", arg));
return FALSE;
}
pAdapter->SharedKey[BSS0][2].CipherAlg = CipherAlg;
// Set keys (into ASIC)
if (pAdapter->StaCfg.AuthMode >= Ndis802_11AuthModeWPA)
; // not support
else // Old WEP stuff
{
AsicAddSharedKeyEntry(pAdapter,
0,
2,
pAdapter->SharedKey[BSS0][2].CipherAlg,
pAdapter->SharedKey[BSS0][2].Key,
NULL,
NULL);
}
return TRUE;
}
/*
==========================================================================
Description:
Set WEP KEY4
Return:
TRUE if all parameters are OK, FALSE otherwise
==========================================================================
*/
INT Set_Key4_Proc(
IN PRTMP_ADAPTER pAdapter,
IN PSTRING arg)
{
int KeyLen;
int i;
UCHAR CipherAlg=CIPHER_WEP64;
if (pAdapter->StaCfg.AuthMode >= Ndis802_11AuthModeWPA)
return TRUE; // do nothing
KeyLen = strlen(arg);
switch (KeyLen)
{
case 5: //wep 40 Ascii type
pAdapter->SharedKey[BSS0][3].KeyLen = KeyLen;
memcpy(pAdapter->SharedKey[BSS0][3].Key, arg, KeyLen);
CipherAlg = CIPHER_WEP64;
DBGPRINT(RT_DEBUG_TRACE, ("Set_Key4_Proc::(Key4=%s and type=%s)\n", arg, "Ascii"));
break;
case 10: //wep 40 Hex type
for(i=0; i < KeyLen; i++)
{
if( !isxdigit(*(arg+i)) )
return FALSE; //Not Hex value;
}
pAdapter->SharedKey[BSS0][3].KeyLen = KeyLen / 2 ;
AtoH(arg, pAdapter->SharedKey[BSS0][3].Key, KeyLen / 2);
CipherAlg = CIPHER_WEP64;
DBGPRINT(RT_DEBUG_TRACE, ("Set_Key4_Proc::(Key4=%s and type=%s)\n", arg, "Hex"));
break;
case 13: //wep 104 Ascii type
pAdapter->SharedKey[BSS0][3].KeyLen = KeyLen;
memcpy(pAdapter->SharedKey[BSS0][3].Key, arg, KeyLen);
CipherAlg = CIPHER_WEP128;
DBGPRINT(RT_DEBUG_TRACE, ("Set_Key4_Proc::(Key4=%s and type=%s)\n", arg, "Ascii"));
break;
case 26: //wep 104 Hex type
for(i=0; i < KeyLen; i++)
{
if( !isxdigit(*(arg+i)) )
return FALSE; //Not Hex value;
}
pAdapter->SharedKey[BSS0][3].KeyLen = KeyLen / 2 ;
AtoH(arg, pAdapter->SharedKey[BSS0][3].Key, KeyLen / 2);
CipherAlg = CIPHER_WEP128;
DBGPRINT(RT_DEBUG_TRACE, ("Set_Key4_Proc::(Key4=%s and type=%s)\n", arg, "Hex"));
break;
default: //Invalid argument
DBGPRINT(RT_DEBUG_TRACE, ("Set_Key4_Proc::Invalid argument (=%s)\n", arg));
return FALSE;
}
pAdapter->SharedKey[BSS0][3].CipherAlg = CipherAlg;
// Set keys (into ASIC)
if (pAdapter->StaCfg.AuthMode >= Ndis802_11AuthModeWPA)
; // not support
else // Old WEP stuff
{
AsicAddSharedKeyEntry(pAdapter,
0,
3,
pAdapter->SharedKey[BSS0][3].CipherAlg,
pAdapter->SharedKey[BSS0][3].Key,
NULL,
NULL);
}
return TRUE;
}
/*
==========================================================================
Description:
Set WPA PSK key
Return:
TRUE if all parameters are OK, FALSE otherwise
==========================================================================
*/
INT Set_WPAPSK_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg)
{
int status;
if ((pAd->StaCfg.AuthMode != Ndis802_11AuthModeWPAPSK) &&
(pAd->StaCfg.AuthMode != Ndis802_11AuthModeWPA2PSK) &&
(pAd->StaCfg.AuthMode != Ndis802_11AuthModeWPANone)
)
return TRUE; // do nothing
DBGPRINT(RT_DEBUG_TRACE, ("Set_WPAPSK_Proc::(WPAPSK=%s)\n", arg));
status = RT_CfgSetWPAPSKKey(pAd, arg, pAd->MlmeAux.Ssid, pAd->MlmeAux.SsidLen, pAd->StaCfg.PMK);
if (status == FALSE)
{
DBGPRINT(RT_DEBUG_TRACE, ("Set_WPAPSK_Proc(): Set key failed!\n"));
return FALSE;
}
NdisZeroMemory(pAd->StaCfg.WpaPassPhrase, 64);
NdisMoveMemory(pAd->StaCfg.WpaPassPhrase, arg, strlen(arg));
pAd->StaCfg.WpaPassPhraseLen = (UINT)strlen(arg);
if(pAd->StaCfg.BssType == BSS_ADHOC &&
pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPANone)
{
pAd->StaCfg.WpaState = SS_NOTUSE;
}
else
{
// Start STA supplicant state machine
pAd->StaCfg.WpaState = SS_START;
}
return TRUE;
}
/*
==========================================================================
Description:
Set Power Saving mode
Return:
TRUE if all parameters are OK, FALSE otherwise
==========================================================================
*/
INT Set_PSMode_Proc(
IN PRTMP_ADAPTER pAdapter,
IN PSTRING arg)
{
if (pAdapter->StaCfg.BssType == BSS_INFRA)
{
if ((strcmp(arg, "Max_PSP") == 0) ||
(strcmp(arg, "max_psp") == 0) ||
(strcmp(arg, "MAX_PSP") == 0))
{
// do NOT turn on PSM bit here, wait until MlmeCheckPsmChange()
// to exclude certain situations.
if (pAdapter->StaCfg.bWindowsACCAMEnable == FALSE)
pAdapter->StaCfg.WindowsPowerMode = Ndis802_11PowerModeMAX_PSP;
pAdapter->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeMAX_PSP;
OPSTATUS_SET_FLAG(pAdapter, fOP_STATUS_RECEIVE_DTIM);
pAdapter->StaCfg.DefaultListenCount = 5;
}
else if ((strcmp(arg, "Fast_PSP") == 0) ||
(strcmp(arg, "fast_psp") == 0) ||
(strcmp(arg, "FAST_PSP") == 0))
{
// do NOT turn on PSM bit here, wait until MlmeCheckPsmChange()
// to exclude certain situations.
OPSTATUS_SET_FLAG(pAdapter, fOP_STATUS_RECEIVE_DTIM);
if (pAdapter->StaCfg.bWindowsACCAMEnable == FALSE)
pAdapter->StaCfg.WindowsPowerMode = Ndis802_11PowerModeFast_PSP;
pAdapter->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeFast_PSP;
pAdapter->StaCfg.DefaultListenCount = 3;
}
else if ((strcmp(arg, "Legacy_PSP") == 0) ||
(strcmp(arg, "legacy_psp") == 0) ||
(strcmp(arg, "LEGACY_PSP") == 0))
{
// do NOT turn on PSM bit here, wait until MlmeCheckPsmChange()
// to exclude certain situations.
OPSTATUS_SET_FLAG(pAdapter, fOP_STATUS_RECEIVE_DTIM);
if (pAdapter->StaCfg.bWindowsACCAMEnable == FALSE)
pAdapter->StaCfg.WindowsPowerMode = Ndis802_11PowerModeLegacy_PSP;
pAdapter->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeLegacy_PSP;
pAdapter->StaCfg.DefaultListenCount = 3;
}
else
{
//Default Ndis802_11PowerModeCAM
// clear PSM bit immediately
RTMP_SET_PSM_BIT(pAdapter, PWR_ACTIVE);
OPSTATUS_SET_FLAG(pAdapter, fOP_STATUS_RECEIVE_DTIM);
if (pAdapter->StaCfg.bWindowsACCAMEnable == FALSE)
pAdapter->StaCfg.WindowsPowerMode = Ndis802_11PowerModeCAM;
pAdapter->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeCAM;
}
DBGPRINT(RT_DEBUG_TRACE, ("Set_PSMode_Proc::(PSMode=%ld)\n", pAdapter->StaCfg.WindowsPowerMode));
}
else
return FALSE;
return TRUE;
}
/*
==========================================================================
Description:
Set WpaSupport flag.
Value:
0: Driver ignore wpa_supplicant.
1: wpa_supplicant initiates scanning and AP selection.
2: driver takes care of scanning, AP selection, and IEEE 802.11 association parameters.
Return:
TRUE if all parameters are OK, FALSE otherwise
==========================================================================
*/
INT Set_Wpa_Support(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg)
{
if ( simple_strtol(arg, 0, 10) == 0)
pAd->StaCfg.WpaSupplicantUP = WPA_SUPPLICANT_DISABLE;
else if ( simple_strtol(arg, 0, 10) == 1)
pAd->StaCfg.WpaSupplicantUP = WPA_SUPPLICANT_ENABLE;
else if ( simple_strtol(arg, 0, 10) == 2)
pAd->StaCfg.WpaSupplicantUP = WPA_SUPPLICANT_ENABLE_WITH_WEB_UI;
else
pAd->StaCfg.WpaSupplicantUP = WPA_SUPPLICANT_DISABLE;
DBGPRINT(RT_DEBUG_TRACE, ("Set_Wpa_Support::(WpaSupplicantUP=%d)\n", pAd->StaCfg.WpaSupplicantUP));
return TRUE;
}
INT Set_TGnWifiTest_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg)
{
if (simple_strtol(arg, 0, 10) == 0)
pAd->StaCfg.bTGnWifiTest = FALSE;
else
pAd->StaCfg.bTGnWifiTest = TRUE;
DBGPRINT(RT_DEBUG_TRACE, ("IF Set_TGnWifiTest_Proc::(bTGnWifiTest=%d)\n", pAd->StaCfg.bTGnWifiTest));
return TRUE;
}
INT Show_Adhoc_MacTable_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING extra)
{
INT i;
sprintf(extra, "\n");
sprintf(extra + strlen(extra), "HT Operating Mode : %d\n", pAd->CommonCfg.AddHTInfo.AddHtInfo2.OperaionMode);
sprintf(extra + strlen(extra), "\n%-19s%-4s%-4s%-7s%-7s%-7s%-10s%-6s%-6s%-6s%-6s\n",
"MAC", "AID", "BSS", "RSSI0", "RSSI1", "RSSI2", "PhMd", "BW", "MCS", "SGI", "STBC");
for (i=1; i<MAX_LEN_OF_MAC_TABLE; i++)
{
PMAC_TABLE_ENTRY pEntry = &pAd->MacTab.Content[i];
if (strlen(extra) > (IW_PRIV_SIZE_MASK - 30))
break;
if ((pEntry->ValidAsCLI || pEntry->ValidAsApCli) && (pEntry->Sst == SST_ASSOC))
{
sprintf(extra + strlen(extra), "%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(extra + strlen(extra), "%-4d", (int)pEntry->Aid);
sprintf(extra + strlen(extra), "%-4d", (int)pEntry->apidx);
sprintf(extra + strlen(extra), "%-7d", pEntry->RssiSample.AvgRssi0);
sprintf(extra + strlen(extra), "%-7d", pEntry->RssiSample.AvgRssi1);
sprintf(extra + strlen(extra), "%-7d", pEntry->RssiSample.AvgRssi2);
sprintf(extra + strlen(extra), "%-10s", GetPhyMode(pEntry->HTPhyMode.field.MODE));
sprintf(extra + strlen(extra), "%-6s", GetBW(pEntry->HTPhyMode.field.BW));
sprintf(extra + strlen(extra), "%-6d", pEntry->HTPhyMode.field.MCS);
sprintf(extra + strlen(extra), "%-6d", pEntry->HTPhyMode.field.ShortGI);
sprintf(extra + strlen(extra), "%-6d", pEntry->HTPhyMode.field.STBC);
sprintf(extra + strlen(extra), "%-10d, %d, %d%%\n", pEntry->DebugFIFOCount, pEntry->DebugTxCount,
(pEntry->DebugTxCount) ? ((pEntry->DebugTxCount-pEntry->DebugFIFOCount)*100/pEntry->DebugTxCount) : 0);
sprintf(extra, "%s\n", extra);
}
}
return TRUE;
}
INT Set_BeaconLostTime_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg)
{
ULONG ltmp = (ULONG)simple_strtol(arg, 0, 10);
if ((ltmp != 0) && (ltmp <= 60))
pAd->StaCfg.BeaconLostTime = (ltmp * OS_HZ);
DBGPRINT(RT_DEBUG_TRACE, ("IF Set_BeaconLostTime_Proc::(BeaconLostTime=%ld)\n", pAd->StaCfg.BeaconLostTime));
return TRUE;
}
INT Set_AutoRoaming_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg)
{
if (simple_strtol(arg, 0, 10) == 0)
pAd->StaCfg.bAutoRoaming = FALSE;
else
pAd->StaCfg.bAutoRoaming = TRUE;
DBGPRINT(RT_DEBUG_TRACE, ("IF Set_AutoRoaming_Proc::(bAutoRoaming=%d)\n", pAd->StaCfg.bAutoRoaming));
return TRUE;
}
/*
==========================================================================
Description:
Issue a site survey command to driver
Arguments:
pAdapter Pointer to our adapter
wrq Pointer to the ioctl argument
Return Value:
None
Note:
Usage:
1.) iwpriv ra0 set site_survey
==========================================================================
*/
INT Set_SiteSurvey_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg)
{
NDIS_802_11_SSID Ssid;
//check if the interface is down
if (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE))
{
DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n"));
return -ENETDOWN;
}
if (MONITOR_ON(pAd))
{
DBGPRINT(RT_DEBUG_TRACE, ("!!! Driver is in Monitor Mode now !!!\n"));
return -EINVAL;
}
RTMPZeroMemory(&Ssid, sizeof(NDIS_802_11_SSID));
Ssid.SsidLength = 0;
if ((arg != NULL) &&
(strlen(arg) <= MAX_LEN_OF_SSID))
{
RTMPMoveMemory(Ssid.Ssid, arg, strlen(arg));
Ssid.SsidLength = strlen(arg);
}
pAd->StaCfg.bScanReqIsFromWebUI = TRUE;
if (pAd->Mlme.CntlMachine.CurrState != CNTL_IDLE)
{
RTMP_MLME_RESET_STATE_MACHINE(pAd);
DBGPRINT(RT_DEBUG_TRACE, ("!!! MLME busy, reset MLME state machine !!!\n"));
}
// tell CNTL state machine to call NdisMSetInformationComplete() after completing
// this request, because this request is initiated by NDIS.
pAd->MlmeAux.CurrReqIsFromNdis = FALSE;
// Reset allowed scan retries
pAd->StaCfg.ScanCnt = 0;
NdisGetSystemUpTime(&pAd->StaCfg.LastScanTime);
MlmeEnqueue(pAd,
MLME_CNTL_STATE_MACHINE,
OID_802_11_BSSID_LIST_SCAN,
Ssid.SsidLength,
Ssid.Ssid);
RTMP_MLME_HANDLER(pAd);
DBGPRINT(RT_DEBUG_TRACE, ("Set_SiteSurvey_Proc\n"));
return TRUE;
}
INT Set_ForceTxBurst_Proc(
IN PRTMP_ADAPTER pAd,
IN PSTRING arg)
{
if (simple_strtol(arg, 0, 10) == 0)
pAd->StaCfg.bForceTxBurst = FALSE;
else
pAd->StaCfg.bForceTxBurst = TRUE;
DBGPRINT(RT_DEBUG_TRACE, ("IF Set_ForceTxBurst_Proc::(bForceTxBurst=%d)\n", pAd->StaCfg.bForceTxBurst));
return TRUE;
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册