rate.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518
  1. /*
  2. ** Id: //Department/DaVinci/BRANCHES/MT6620_WIFI_DRIVER_V2_3/mgmt/rate.c#1
  3. */
  4. /*! \file "rate.c"
  5. \brief This file contains the transmission rate handling routines.
  6. This file contains the transmission rate handling routines for setting up
  7. ACK/CTS Rate, Highest Tx Rate, Lowest Tx Rate, Initial Tx Rate and do
  8. conversion between Rate Set and Data Rates.
  9. */
  10. /*
  11. ** Log: rate.c
  12. **
  13. ** 08 05 2013 terry.wu
  14. ** [BORA00002207] [MT6630 Wi-Fi] TXM & MQM Implementation
  15. ** 1. Add SW rate definition
  16. ** 2. Add HW default rate selection logic from FW
  17. **
  18. ** 07 12 2013 terry.wu
  19. ** [BORA00002207] [MT6630 Wi-Fi] TXM & MQM Implementation
  20. ** 1. Update VHT IE composing function
  21. ** 2. disable bow
  22. ** 3. Exchange bss/sta rec update sequence for temp solution
  23. **
  24. ** 11 06 2012 eason.tsai
  25. ** [BORA00002255] [MT6630 Wi-Fi][Driver] develop
  26. ** .
  27. **
  28. ** 09 17 2012 cm.chang
  29. ** [BORA00002149] [MT6630 Wi-Fi] Initial software development
  30. ** Duplicate source from MT6620 v2.3 driver branch
  31. ** (Davinci label: MT6620_WIFI_Driver_V2_3_120913_1942_As_MT6630_Base)
  32. *
  33. * 07 08 2010 cp.wu
  34. *
  35. * [WPD00003833] [MT6620 and MT5931] Driver migration - move to new repository.
  36. *
  37. * 06 08 2010 cp.wu
  38. * [WPD00003833][MT6620 and MT5931] Driver migration
  39. * add rate.c.
  40. *
  41. * 03 16 2010 kevin.huang
  42. * [BORA00000663][WIFISYS][New Feature] AdHoc Mode Support
  43. * Add AdHoc Mode
  44. *
  45. * 12 18 2009 cm.chang
  46. * [BORA00000018]Integrate WIFI part into BORA for the 1st time
  47. * .
  48. *
  49. * Nov 23 2009 mtk01461
  50. * [BORA00000018] Integrate WIFI part into BORA for the 1st time
  51. * Update comments
  52. *
  53. * Nov 16 2009 mtk01461
  54. * [BORA00000018] Integrate WIFI part into BORA for the 1st time
  55. * Fix DBGLOG
  56. *
  57. * Nov 5 2009 mtk01461
  58. * [BORA00000018] Integrate WIFI part into BORA for the 1st time
  59. *
  60. ** \main\maintrunk.MT5921\12 2008-12-19 17:19:32 GMT mtk01461
  61. ** Fix the problem that do not ASSERT the length of Supported Rate IE == 8
  62. ** \main\maintrunk.MT5921\11 2008-12-01 18:17:42 GMT mtk01088
  63. ** fixed the lint "possible using null pointer" warning
  64. ** \main\maintrunk.MT5921\10 2008-08-20 00:16:36 GMT mtk01461
  65. ** Update for Driver Review
  66. ** \main\maintrunk.MT5921\9 2008-04-13 21:17:13 GMT mtk01461
  67. ** Revise GEN Link Speed OID
  68. ** \main\maintrunk.MT5921\8 2008-03-28 10:40:13 GMT mtk01461
  69. ** Add rateGetRateSetFromDataRates() for set desired rate OID
  70. ** \main\maintrunk.MT5921\7 2008-03-26 09:16:20 GMT mtk01461
  71. ** Add adopt operational rate as ACK rate if BasicRateSet was not found
  72. ** Add comments
  73. ** \main\maintrunk.MT5921\6 2008-02-21 15:01:39 GMT mtk01461
  74. ** Add initial rate according rx signal quality support
  75. ** \main\maintrunk.MT5921\5 2008-01-07 15:06:44 GMT mtk01461
  76. ** Fix typo of rate adaptation of CtrlResp Frame
  77. ** \main\maintrunk.MT5921\4 2007-10-25 18:05:12 GMT mtk01461
  78. ** Add VOIP SCAN Support & Refine Roaming
  79. */
  80. /*******************************************************************************
  81. * C O M P I L E R F L A G S
  82. ********************************************************************************
  83. */
  84. /*******************************************************************************
  85. * E X T E R N A L R E F E R E N C E S
  86. ********************************************************************************
  87. */
  88. #include "precomp.h"
  89. /*******************************************************************************
  90. * C O N S T A N T S
  91. ********************************************************************************
  92. */
  93. /* The list of valid data rates. */
  94. const UINT_8 aucDataRate[] = {
  95. RATE_1M, /* RATE_1M_INDEX = 0 */
  96. RATE_2M, /* RATE_2M_INDEX */
  97. RATE_5_5M, /* RATE_5_5M_INDEX */
  98. RATE_11M, /* RATE_11M_INDEX */
  99. RATE_22M, /* RATE_22M_INDEX */
  100. RATE_33M, /* RATE_33M_INDEX */
  101. RATE_6M, /* RATE_6M_INDEX */
  102. RATE_9M, /* RATE_9M_INDEX */
  103. RATE_12M, /* RATE_12M_INDEX */
  104. RATE_18M, /* RATE_18M_INDEX */
  105. RATE_24M, /* RATE_24M_INDEX */
  106. RATE_36M, /* RATE_36M_INDEX */
  107. RATE_48M, /* RATE_48M_INDEX */
  108. RATE_54M, /* RATE_54M_INDEX */
  109. RATE_VHT_PHY, /* RATE_VHT_PHY_INDEX */
  110. RATE_HT_PHY /* RATE_HT_PHY_INDEX */
  111. };
  112. static const UINT_8 aucDefaultAckCtsRateIndex[RATE_NUM_SW] = {
  113. RATE_1M_SW_INDEX, /* RATE_1M_SW_INDEX = 0 */
  114. RATE_2M_SW_INDEX, /* RATE_2M_SW_INDEX */
  115. RATE_5_5M_SW_INDEX, /* RATE_5_5M_SW_INDEX */
  116. RATE_11M_SW_INDEX, /* RATE_11M_SW_INDEX */
  117. RATE_1M_SW_INDEX, /* RATE_22M_SW_INDEX - Not supported */
  118. RATE_1M_SW_INDEX, /* RATE_33M_SW_INDEX - Not supported */
  119. RATE_6M_SW_INDEX, /* RATE_6M_SW_INDEX */
  120. RATE_6M_SW_INDEX, /* RATE_9M_SW_INDEX */
  121. RATE_12M_SW_INDEX, /* RATE_12M_SW_INDEX */
  122. RATE_12M_SW_INDEX, /* RATE_18M_SW_INDEX */
  123. RATE_24M_SW_INDEX, /* RATE_24M_SW_INDEX */
  124. RATE_24M_SW_INDEX, /* RATE_36M_SW_INDEX */
  125. RATE_24M_SW_INDEX, /* RATE_48M_SW_INDEX */
  126. RATE_24M_SW_INDEX /* RATE_54M_SW_INDEX */
  127. };
  128. const BOOLEAN afgIsOFDMRate[RATE_NUM_SW] = {
  129. FALSE, /* RATE_1M_INDEX = 0 */
  130. FALSE, /* RATE_2M_INDEX */
  131. FALSE, /* RATE_5_5M_INDEX */
  132. FALSE, /* RATE_11M_INDEX */
  133. FALSE, /* RATE_22M_INDEX - Not supported */
  134. FALSE, /* RATE_33M_INDEX - Not supported */
  135. TRUE, /* RATE_6M_INDEX */
  136. TRUE, /* RATE_9M_INDEX */
  137. TRUE, /* RATE_12M_INDEX */
  138. TRUE, /* RATE_18M_INDEX */
  139. TRUE, /* RATE_24M_INDEX */
  140. TRUE, /* RATE_36M_INDEX */
  141. TRUE, /* RATE_48M_INDEX */
  142. TRUE /* RATE_54M_INDEX */
  143. };
  144. /*******************************************************************************
  145. * D A T A T Y P E S
  146. ********************************************************************************
  147. */
  148. /*******************************************************************************
  149. * P U B L I C D A T A
  150. ********************************************************************************
  151. */
  152. /*******************************************************************************
  153. * P R I V A T E D A T A
  154. ********************************************************************************
  155. */
  156. /*******************************************************************************
  157. * M A C R O S
  158. ********************************************************************************
  159. */
  160. /*******************************************************************************
  161. * F U N C T I O N D E C L A R A T I O N S
  162. ********************************************************************************
  163. */
  164. /*******************************************************************************
  165. * F U N C T I O N S
  166. ********************************************************************************
  167. */
  168. /*----------------------------------------------------------------------------*/
  169. /*!
  170. * @brief Convert the given Supported Rate & Extended Supported Rate IE to the
  171. * Operational Rate Set and Basic Rate Set, and also check if any Basic
  172. * Rate Code is unknown by driver.
  173. *
  174. * @param[in] prIeSupportedRate Pointer to the Supported Rate IE
  175. * @param[in] prIeExtSupportedRate Pointer to the Ext Supported Rate IE
  176. * @param[out] pu2OperationalRateSet Pointer to the Operational Rate Set
  177. * @param[out] pu2BSSBasicRateSet Pointer to the Basic Rate Set
  178. * @param[out] pfgIsUnknownBSSBasicRate Pointer to a Flag to indicate that Basic
  179. * Rate Set has unknown Rate Code
  180. *
  181. * \return (none)
  182. */
  183. /*----------------------------------------------------------------------------*/
  184. VOID
  185. rateGetRateSetFromIEs(IN P_IE_SUPPORTED_RATE_T prIeSupportedRate,
  186. IN P_IE_EXT_SUPPORTED_RATE_T prIeExtSupportedRate,
  187. OUT PUINT_16 pu2OperationalRateSet,
  188. OUT PUINT_16 pu2BSSBasicRateSet, OUT PBOOLEAN pfgIsUnknownBSSBasicRate)
  189. {
  190. UINT_16 u2OperationalRateSet = 0;
  191. UINT_16 u2BSSBasicRateSet = 0;
  192. BOOLEAN fgIsUnknownBSSBasicRate = FALSE;
  193. UINT_8 ucRate;
  194. UINT_32 i, j;
  195. ASSERT(pu2OperationalRateSet);
  196. ASSERT(pu2BSSBasicRateSet);
  197. ASSERT(pfgIsUnknownBSSBasicRate);
  198. if (prIeSupportedRate) {
  199. /* NOTE(Kevin): Buffalo WHR-G54S's supported rate set IE exceed 8.
  200. * IE_LEN(pucIE) == 12, "1(B), 2(B), 5.5(B), 6(B), 9(B), 11(B),
  201. * 12(B), 18(B), 24(B), 36(B), 48(B), 54(B)"
  202. */
  203. /* ASSERT(prIeSupportedRate->ucLength <= ELEM_MAX_LEN_SUP_RATES); */
  204. ASSERT(prIeSupportedRate->ucLength <= RATE_NUM_SW);
  205. for (i = 0; i < prIeSupportedRate->ucLength; i++) {
  206. ucRate = prIeSupportedRate->aucSupportedRates[i] & RATE_MASK;
  207. /* Search all valid data rates */
  208. for (j = 0; j < sizeof(aucDataRate) / sizeof(UINT_8); j++) {
  209. if (ucRate == aucDataRate[j]) {
  210. u2OperationalRateSet |= BIT(j);
  211. if (prIeSupportedRate->aucSupportedRates[i] & RATE_BASIC_BIT)
  212. u2BSSBasicRateSet |= BIT(j);
  213. break;
  214. }
  215. }
  216. if ((j == sizeof(aucDataRate) / sizeof(UINT_8)) &&
  217. (prIeSupportedRate->aucSupportedRates[i] & RATE_BASIC_BIT)) {
  218. fgIsUnknownBSSBasicRate = TRUE; /* A data rate not list in the aucDataRate[] */
  219. }
  220. }
  221. }
  222. if (prIeExtSupportedRate) {
  223. /* ASSERT(prIeExtSupportedRate->ucLength <= ELEM_MAX_LEN_EXTENDED_SUP_RATES); */
  224. for (i = 0; i < prIeExtSupportedRate->ucLength; i++) {
  225. ucRate = prIeExtSupportedRate->aucExtSupportedRates[i] & RATE_MASK;
  226. /* Search all valid data rates */
  227. for (j = 0; j < sizeof(aucDataRate) / sizeof(UINT_8); j++) {
  228. if (ucRate == aucDataRate[j]) {
  229. u2OperationalRateSet |= BIT(j);
  230. if (prIeExtSupportedRate->aucExtSupportedRates[i] & RATE_BASIC_BIT)
  231. u2BSSBasicRateSet |= BIT(j);
  232. break;
  233. }
  234. }
  235. if ((j == sizeof(aucDataRate) / sizeof(UINT_8)) &&
  236. (prIeExtSupportedRate->aucExtSupportedRates[i] & RATE_BASIC_BIT)) {
  237. fgIsUnknownBSSBasicRate = TRUE; /* A data rate not list in the aucDataRate[] */
  238. }
  239. }
  240. }
  241. *pu2OperationalRateSet = u2OperationalRateSet;
  242. *pu2BSSBasicRateSet = u2BSSBasicRateSet;
  243. *pfgIsUnknownBSSBasicRate = fgIsUnknownBSSBasicRate;
  244. return;
  245. } /* end of rateGetRateSetFromIEs() */
  246. /*----------------------------------------------------------------------------*/
  247. /*!
  248. * @brief Convert the given Operational Rate Set & Basic Rate Set to the Rate Code
  249. * Format for used in (Ext)Supportec Rate IE.
  250. *
  251. * @param[in] u2OperationalRateSet Operational Rate Set
  252. * @param[in] u2BSSBasicRateSet Basic Rate Set
  253. * @param[out] pucDataRates Pointer to the Data Rate Buffer
  254. * @param[out] pucDataRatesLen Pointer to the Data Rate Buffer Length
  255. *
  256. * @return (none)
  257. */
  258. /*----------------------------------------------------------------------------*/
  259. VOID
  260. rateGetDataRatesFromRateSet(IN UINT_16 u2OperationalRateSet,
  261. IN UINT_16 u2BSSBasicRateSet, OUT PUINT_8 pucDataRates, OUT PUINT_8 pucDataRatesLen)
  262. {
  263. UINT_32 i, j;
  264. ASSERT(pucDataRates);
  265. ASSERT(pucDataRatesLen);
  266. ASSERT(u2BSSBasicRateSet == (u2OperationalRateSet & u2BSSBasicRateSet));
  267. for (i = RATE_1M_SW_INDEX, j = 0; i < RATE_NUM_SW; i++) {
  268. if (u2OperationalRateSet & BIT(i)) {
  269. *(pucDataRates + j) = aucDataRate[i];
  270. if (u2BSSBasicRateSet & BIT(i))
  271. *(pucDataRates + j) |= RATE_BASIC_BIT;
  272. j++;
  273. }
  274. }
  275. *pucDataRatesLen = (UINT_8) j;
  276. return;
  277. } /* end of rateGetDataRatesFromRateSet() */
  278. /*----------------------------------------------------------------------------*/
  279. /*!
  280. * \brief Get the highest rate from given Rate Set.
  281. *
  282. * \param[in] u2RateSet Rate Set
  283. * \param[out] pucHighestRateIndex Pointer to buffer of the Highest Rate Index
  284. *
  285. * \retval TRUE Highest Rate Index was found
  286. * \retval FALSE Highest Rate Index was not found
  287. */
  288. /*----------------------------------------------------------------------------*/
  289. BOOLEAN rateGetHighestRateIndexFromRateSet(IN UINT_16 u2RateSet, OUT PUINT_8 pucHighestRateIndex)
  290. {
  291. INT_32 i;
  292. ASSERT(pucHighestRateIndex);
  293. for (i = RATE_54M_SW_INDEX; i >= RATE_1M_SW_INDEX; i--) {
  294. if (u2RateSet & BIT(i)) {
  295. *pucHighestRateIndex = (UINT_8) i;
  296. return TRUE;
  297. }
  298. }
  299. return FALSE;
  300. } /* end of rateGetHighestRateIndexFromRateSet() */
  301. /*----------------------------------------------------------------------------*/
  302. /*!
  303. * \brief Get the lowest rate from given Rate Set.
  304. *
  305. * \param[in] u2RateSet Rate Set
  306. * \param[out] pucLowestRateIndex Pointer to buffer of the Lowest Rate Index
  307. *
  308. * \retval TRUE Lowest Rate Index was found
  309. * \retval FALSE Lowest Rate Index was not found
  310. */
  311. /*----------------------------------------------------------------------------*/
  312. BOOLEAN rateGetLowestRateIndexFromRateSet(IN UINT_16 u2RateSet, OUT PUINT_8 pucLowestRateIndex)
  313. {
  314. UINT_32 i;
  315. ASSERT(pucLowestRateIndex);
  316. for (i = RATE_1M_SW_INDEX; i <= RATE_54M_SW_INDEX; i++) {
  317. if (u2RateSet & BIT(i)) {
  318. *pucLowestRateIndex = (UINT_8) i;
  319. return TRUE;
  320. }
  321. }
  322. return FALSE;
  323. } /* end of rateGetLowestRateIndexFromRateSet() */
  324. #if 0 /* NOTE(Kevin): For reference */
  325. /*----------------------------------------------------------------------------*/
  326. /*!
  327. * \brief Convert the given Data Rates to the Rate Set.
  328. *
  329. * \param[in] pucDataRates Pointer to the Data Rates
  330. * \param[in] ucDataRatesLen Length of given Data Rates
  331. * \param[out] pu2RateSet Pointer to the Rate Set
  332. *
  333. * \return (none)
  334. */
  335. /*----------------------------------------------------------------------------*/
  336. VOID rateGetRateSetFromDataRates(IN PUINT_8 pucDataRates, IN UINT_8 ucDataRatesLen, OUT PUINT_16 pu2RateSet)
  337. {
  338. UINT_16 u2RateSet = 0;
  339. UINT_8 ucRate;
  340. UINT_32 i, j;
  341. ASSERT(pucDataRates);
  342. ASSERT(pu2RateSet);
  343. if (pucDataRates) {
  344. for (i = 0; i < ucDataRatesLen; i++) {
  345. ucRate = pucDataRates[i] & RATE_MASK;
  346. /* Search all valid data rates */
  347. for (j = 0; j < sizeof(aucDataRate) / sizeof(UINT_8); j++) {
  348. if (ucRate == aucDataRate[j]) {
  349. u2RateSet |= BIT(j);
  350. break;
  351. }
  352. }
  353. }
  354. }
  355. *pu2RateSet = u2RateSet;
  356. return;
  357. } /* end of rateGetRateSetFromDataRates() */
  358. /*----------------------------------------------------------------------------*/
  359. /*!
  360. * \brief Parse the Operational Rate Set and Basic Rate Set to get the corresponding
  361. * ACK/CTS(Respnose) TX Rates.
  362. *
  363. * \param[in] u2OperationalRateSet Operational Rate Set
  364. * \param[in] u2BSSBasicRateSet Basic Rate Set
  365. * \param[out] aucAckCtsRateIndex Pointer to the Ack/Cts Data Rate Buffer
  366. *
  367. * \return (none)
  368. */
  369. /*----------------------------------------------------------------------------*/
  370. VOID
  371. rateSetAckCtsDataRatesFromRateSet(IN UINT_16 u2OperationalRateSet,
  372. IN UINT_16 u2BSSBasicRateSet, IN OUT UINT_8 aucAckCtsRateIndex[])
  373. {
  374. INT_32 i, j;
  375. ASSERT(aucAckCtsRateIndex);
  376. ASSERT(u2BSSBasicRateSet == (u2OperationalRateSet & u2BSSBasicRateSet));
  377. /* Setup default ACK/CTS response rate */
  378. kalMemCopy(aucAckCtsRateIndex, (PVOID) aucDefaultAckCtsRateIndex, sizeof(aucDefaultAckCtsRateIndex));
  379. for (i = RATE_54M_INDEX; i >= RATE_1M_INDEX; i--) {
  380. if (u2OperationalRateSet & BIT(i)) {
  381. for (j = i; j >= RATE_1M_INDEX; j--) {
  382. if (u2BSSBasicRateSet & BIT(j)) {
  383. /* Reply ACK Frame at the same Modulation Scheme. */
  384. if ((afgIsOFDMRate[i] && afgIsOFDMRate[j]) ||
  385. (!afgIsOFDMRate[i] && !afgIsOFDMRate[j]))
  386. aucAckCtsRateIndex[i] = (UINT_8) j;
  387. break;
  388. }
  389. }
  390. /* NOTE(Kevin 2008/03/25): Following code is used for those AP which has
  391. * NULL BasicRateSet.
  392. * e.g. If input Operational Rate Set = [18M 12M 9M], Basic Rate Set = NULL.
  393. * Originally we'll get Ack Rate for [18M 12M 9M] is [12M 12M "6M"].
  394. * Now we'll get Ack Rate for [18M 12M 9M] is [12M 12M 9M],
  395. * The Ack Rate for Tx Rates which are not list in Operational Rate Set is still
  396. * use highest mandatory rate as default.
  397. */
  398. if (j < RATE_1M_INDEX) { /* The ACK/CTS rate was not found in BasicRateSet */
  399. if (!(BIT(aucAckCtsRateIndex[i]) & u2OperationalRateSet))
  400. aucAckCtsRateIndex[i] = (UINT_8) i;
  401. }
  402. }
  403. }
  404. return;
  405. } /* end of rateSetAckCtsDataRatesFromRateSet() */
  406. /*----------------------------------------------------------------------------*/
  407. /*!
  408. * \brief Get the proper initial rate from Rate Set according to given RCPI value
  409. *
  410. * \param[in] u2RateSet Rate Set
  411. * \param[in] rRcpi RCPI value from AP or Peer STA
  412. * \param[out] pucInitialRateIndex Pointer to buffer of the initial Rate Index
  413. *
  414. * \retval TRUE Initial Rate Index was found
  415. * \retval FALSE Initial Rate Index was not found
  416. */
  417. /*----------------------------------------------------------------------------*/
  418. BOOLEAN rateGetBestInitialRateIndex(IN UINT_16 u2RateSet, IN RCPI rRcpi, OUT PUINT_8 pucInitialRateIndex)
  419. {
  420. UINT_16 u2InitRateSet;
  421. INT_32 i;
  422. ASSERT(pucInitialRateIndex);
  423. DBGLOG(MGT, TRACE, "rRcpi = %d\n", rRcpi);
  424. if (rRcpi >= RCPI_100) { /* Best Signal */
  425. u2InitRateSet = INITIAL_RATE_SET(RCPI_100);
  426. } else if (rRcpi >= RCPI_80) { /* Better Signal */
  427. u2InitRateSet = INITIAL_RATE_SET(RCPI_80);
  428. } else if (rRcpi >= RCPI_60) { /* Good Signal */
  429. u2InitRateSet = INITIAL_RATE_SET(RCPI_60);
  430. } else { /* Worse Signal */
  431. /* NOTE(Kevin): If return FALSE, we should assign the BSS Basic Rate Index
  432. * (prBssInfo->ucBasicRateIndex) to the initial rate. It was determined in
  433. * function - bssUpdateTxRateForControlFrame().
  434. */
  435. return FALSE;
  436. }
  437. u2RateSet &= u2InitRateSet;
  438. for (i = RATE_54M_INDEX; i >= RATE_1M_INDEX; i--) {
  439. if (u2RateSet & BIT(i)) {
  440. *pucInitialRateIndex = (UINT_8) i;
  441. return TRUE;
  442. }
  443. }
  444. return FALSE;
  445. } /* end of rateGetBestInitialRateIndex() */
  446. #endif