/* ** */ /*! \file "nic_rate.c" \brief This file contains the transmission rate handling routines. This file contains the transmission rate handling routines for setting up ACK/CTS Rate, Highest Tx Rate, Lowest Tx Rate, Initial Tx Rate and do conversion between Rate Set and Data Rates. */ /* ** Log: rate.c ** ** 07 12 2013 terry.wu ** [BORA00002207] [MT6630 Wi-Fi] TXM & MQM Implementation ** 1. Update VHT IE composing function ** 2. disable bow ** 3. Exchange bss/sta rec update sequence for temp solution ** ** 11 06 2012 eason.tsai ** [BORA00002255] [MT6630 Wi-Fi][Driver] develop ** . ** ** 09 17 2012 cm.chang ** [BORA00002149] [MT6630 Wi-Fi] Initial software development ** Duplicate source from MT6620 v2.3 driver branch ** (Davinci label: MT6620_WIFI_Driver_V2_3_120913_1942_As_MT6630_Base) * * 07 08 2010 cp.wu * * [WPD00003833] [MT6620 and MT5931] Driver migration - move to new repository. * * 06 08 2010 cp.wu * [WPD00003833][MT6620 and MT5931] Driver migration * add rate.c. * * 03 16 2010 kevin.huang * [BORA00000663][WIFISYS][New Feature] AdHoc Mode Support * Add AdHoc Mode * * 12 18 2009 cm.chang * [BORA00000018]Integrate WIFI part into BORA for the 1st time * . * * Nov 23 2009 mtk01461 * [BORA00000018] Integrate WIFI part into BORA for the 1st time * Update comments * * Nov 16 2009 mtk01461 * [BORA00000018] Integrate WIFI part into BORA for the 1st time * Fix DBGLOG * * Nov 5 2009 mtk01461 * [BORA00000018] Integrate WIFI part into BORA for the 1st time * ** \main\maintrunk.MT5921\12 2008-12-19 17:19:32 GMT mtk01461 ** Fix the problem that do not ASSERT the length of Supported Rate IE == 8 ** \main\maintrunk.MT5921\11 2008-12-01 18:17:42 GMT mtk01088 ** fixed the lint "possible using null pointer" warning ** \main\maintrunk.MT5921\10 2008-08-20 00:16:36 GMT mtk01461 ** Update for Driver Review ** \main\maintrunk.MT5921\9 2008-04-13 21:17:13 GMT mtk01461 ** Revise GEN Link Speed OID ** \main\maintrunk.MT5921\8 2008-03-28 10:40:13 GMT mtk01461 ** Add rateGetRateSetFromDataRates() for set desired rate OID ** \main\maintrunk.MT5921\7 2008-03-26 09:16:20 GMT mtk01461 ** Add adopt operational rate as ACK rate if BasicRateSet was not found ** Add comments ** \main\maintrunk.MT5921\6 2008-02-21 15:01:39 GMT mtk01461 ** Add initial rate according rx signal quality support ** \main\maintrunk.MT5921\5 2008-01-07 15:06:44 GMT mtk01461 ** Fix typo of rate adaptation of CtrlResp Frame ** \main\maintrunk.MT5921\4 2007-10-25 18:05:12 GMT mtk01461 ** Add VOIP SCAN Support & Refine Roaming */ /******************************************************************************* * C O M P I L E R F L A G S ******************************************************************************** */ /******************************************************************************* * E X T E R N A L R E F E R E N C E S ******************************************************************************** */ #include "precomp.h" /******************************************************************************* * C O N S T A N T S ******************************************************************************** */ const UINT_16 au2RateCCKLong[CCK_RATE_NUM] = { RATE_CCK_1M_LONG, /* RATE_1M_INDEX = 0 */ RATE_CCK_2M_LONG, /* RATE_2M_INDEX */ RATE_CCK_5_5M_LONG, /* RATE_5_5M_INDEX */ RATE_CCK_11M_LONG /* RATE_11M_INDEX */ }; const UINT_16 au2RateCCKShort[CCK_RATE_NUM] = { RATE_CCK_1M_LONG, /* RATE_1M_INDEX = 0 */ RATE_CCK_2M_SHORT, /* RATE_2M_INDEX */ RATE_CCK_5_5M_SHORT, /* RATE_5_5M_INDEX */ RATE_CCK_11M_SHORT /* RATE_11M_INDEX */ }; const UINT_16 au2RateOFDM[OFDM_RATE_NUM] = { RATE_OFDM_6M, /* RATE_6M_INDEX */ RATE_OFDM_9M, /* RATE_9M_INDEX */ RATE_OFDM_12M, /* RATE_12M_INDEX */ RATE_OFDM_18M, /* RATE_18M_INDEX */ RATE_OFDM_24M, /* RATE_24M_INDEX */ RATE_OFDM_36M, /* RATE_36M_INDEX */ RATE_OFDM_48M, /* RATE_48M_INDEX */ RATE_OFDM_54M /* RATE_54M_INDEX */ }; const UINT_16 au2RateHTMixed[HT_RATE_NUM] = { RATE_MM_MCS_32, /* RATE_MCS32_INDEX, */ RATE_MM_MCS_0, /* RATE_MCS0_INDEX, */ RATE_MM_MCS_1, /* RATE_MCS1_INDEX, */ RATE_MM_MCS_2, /* RATE_MCS2_INDEX, */ RATE_MM_MCS_3, /* RATE_MCS3_INDEX, */ RATE_MM_MCS_4, /* RATE_MCS4_INDEX, */ RATE_MM_MCS_5, /* RATE_MCS5_INDEX, */ RATE_MM_MCS_6, /* RATE_MCS6_INDEX, */ RATE_MM_MCS_7 /* RATE_MCS7_INDEX, */ }; const UINT_16 au2RateHTGreenField[HT_RATE_NUM] = { RATE_GF_MCS_32, /* RATE_MCS32_INDEX, */ RATE_GF_MCS_0, /* RATE_MCS0_INDEX, */ RATE_GF_MCS_1, /* RATE_MCS1_INDEX, */ RATE_GF_MCS_2, /* RATE_MCS2_INDEX, */ RATE_GF_MCS_3, /* RATE_MCS3_INDEX, */ RATE_GF_MCS_4, /* RATE_MCS4_INDEX, */ RATE_GF_MCS_5, /* RATE_MCS5_INDEX, */ RATE_GF_MCS_6, /* RATE_MCS6_INDEX, */ RATE_GF_MCS_7, /* RATE_MCS7_INDEX, */ }; const UINT_16 au2RateVHT[VHT_RATE_NUM] = { RATE_VHT_MCS_0, /* RATE_MCS0_INDEX, */ RATE_VHT_MCS_1, /* RATE_MCS1_INDEX, */ RATE_VHT_MCS_2, /* RATE_MCS2_INDEX, */ RATE_VHT_MCS_3, /* RATE_MCS3_INDEX, */ RATE_VHT_MCS_4, /* RATE_MCS4_INDEX, */ RATE_VHT_MCS_5, /* RATE_MCS5_INDEX, */ RATE_VHT_MCS_6, /* RATE_MCS6_INDEX, */ RATE_VHT_MCS_7, /* RATE_MCS7_INDEX, */ RATE_VHT_MCS_8, /* RATE_MCS8_INDEX, */ RATE_VHT_MCS_9 /* RATE_MCS9_INDEX, */ }; /******************************************************************************* * D A T A T Y P E S ******************************************************************************** */ /******************************************************************************* * P U B L I C D A T A ******************************************************************************** */ /******************************************************************************* * P R I V A T E D A T A ******************************************************************************** */ /******************************************************************************* * M A C R O S ******************************************************************************** */ /******************************************************************************* * F U N C T I O N D E C L A R A T I O N S ******************************************************************************** */ /******************************************************************************* * F U N C T I O N S ******************************************************************************** */ WLAN_STATUS nicRateIndex2RateCode(IN UINT_8 ucPreambleOption, IN UINT_8 ucRateIndex, OUT PUINT_16 pu2RateCode) { switch (ucPreambleOption) { case PREAMBLE_DEFAULT_LONG_NONE: if (ucRateIndex >= CCK_RATE_NUM) return WLAN_STATUS_INVALID_DATA; *pu2RateCode = au2RateCCKLong[ucRateIndex]; break; case PREAMBLE_OPTION_SHORT: if (ucRateIndex >= CCK_RATE_NUM) return WLAN_STATUS_INVALID_DATA; *pu2RateCode = au2RateCCKShort[ucRateIndex]; break; case PREAMBLE_OFDM_MODE: if (ucRateIndex >= OFDM_RATE_NUM) return WLAN_STATUS_INVALID_DATA; *pu2RateCode = au2RateOFDM[ucRateIndex]; break; case PREAMBLE_HT_MIXED_MODE: if (ucRateIndex >= HT_RATE_NUM) return WLAN_STATUS_INVALID_DATA; *pu2RateCode = au2RateHTMixed[ucRateIndex]; break; case PREAMBLE_HT_GREEN_FIELD: if (ucRateIndex >= HT_RATE_NUM) return WLAN_STATUS_INVALID_DATA; *pu2RateCode = au2RateHTGreenField[ucRateIndex]; break; case PREAMBLE_VHT_FIELD: if (ucRateIndex >= VHT_RATE_NUM) return WLAN_STATUS_INVALID_DATA; *pu2RateCode = au2RateVHT[ucRateIndex]; break; default: return WLAN_STATUS_INVALID_DATA; } return WLAN_STATUS_SUCCESS; }