|
@@ -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";
|
|
|
+ }
|
|
|
+}
|