be4a7d55a9cb1d929e0851c9d62d745d250cf321
[firefly-linux-kernel-4.4.55.git] / drivers / net / wireless / rockchip_wlan / mt5931_kk / drv_wlan / mgmt / rate.c
1 /*
2 ** $Id: //Department/DaVinci/BRANCHES/MT662X_593X_WIFI_DRIVER_V2_3/mgmt/rate.c#1 $
3 */
4
5 /*! \file   "rate.c"
6     \brief  This file contains the transmission rate handling routines.
7
8     This file contains the transmission rate handling routines for setting up
9     ACK/CTS Rate, Highest Tx Rate, Lowest Tx Rate, Initial Tx Rate and do
10     conversion between Rate Set and Data Rates.
11 */
12
13 /*******************************************************************************
14 * Copyright (c) 2007 MediaTek Inc.
15 *
16 * All rights reserved. Copying, compilation, modification, distribution
17 * or any other use whatsoever of this material is strictly prohibited
18 * except in accordance with a Software License Agreement with
19 * MediaTek Inc.
20 ********************************************************************************
21 */
22
23 /*******************************************************************************
24 * LEGAL DISCLAIMER
25 *
26 * BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND
27 * AGREES THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK
28 * SOFTWARE") RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE
29 * PROVIDED TO BUYER ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY
30 * DISCLAIMS ANY AND ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT
31 * LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
32 * PARTICULAR PURPOSE OR NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE
33 * ANY WARRANTY WHATSOEVER WITH RESPECT TO THE SOFTWARE OF ANY THIRD PARTY
34 * WHICH MAY BE USED BY, INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK
35 * SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY
36 * WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE
37 * FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S SPECIFICATION OR TO
38 * CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
39 *
40 * BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
41 * LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL
42 * BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT
43 * ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY
44 * BUYER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
45 *
46 * THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
47 * WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT
48 * OF LAWS PRINCIPLES.  ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING
49 * THEREOF AND RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN
50 * FRANCISCO, CA, UNDER THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE
51 * (ICC).
52 ********************************************************************************
53 */
54
55 /*
56 ** $Log: rate.c $
57  *
58  * 07 08 2010 cp.wu
59  * 
60  * [WPD00003833] [MT6620 and MT5931] Driver migration - move to new repository.
61  *
62  * 06 08 2010 cp.wu
63  * [WPD00003833][MT6620 and MT5931] Driver migration 
64  * add rate.c.
65  *
66  * 03 16 2010 kevin.huang
67  * [BORA00000663][WIFISYS][New Feature] AdHoc Mode Support 
68  * Add AdHoc Mode
69  *
70  * 12 18 2009 cm.chang
71  * [BORA00000018]Integrate WIFI part into BORA for the 1st time 
72  * .
73  *
74  * Nov 23 2009 mtk01461
75  * [BORA00000018] Integrate WIFI part into BORA for the 1st time
76  * Update comments
77  *
78  * Nov 16 2009 mtk01461
79  * [BORA00000018] Integrate WIFI part into BORA for the 1st time
80  * Fix DBGLOG
81  *
82  * Nov 5 2009 mtk01461
83  * [BORA00000018] Integrate WIFI part into BORA for the 1st time
84  *
85 **  \main\maintrunk.MT5921\12 2008-12-19 17:19:32 GMT mtk01461
86 **  Fix the problem that do not ASSERT the length of Supported Rate IE == 8
87 **  \main\maintrunk.MT5921\11 2008-12-01 18:17:42 GMT mtk01088
88 **  fixed the lint "possible using null pointer" warning
89 **  \main\maintrunk.MT5921\10 2008-08-20 00:16:36 GMT mtk01461
90 **  Update for Driver Review
91 **  \main\maintrunk.MT5921\9 2008-04-13 21:17:13 GMT mtk01461
92 **  Revise GEN Link Speed OID
93 **  \main\maintrunk.MT5921\8 2008-03-28 10:40:13 GMT mtk01461
94 **  Add rateGetRateSetFromDataRates() for set desired rate OID
95 **  \main\maintrunk.MT5921\7 2008-03-26 09:16:20 GMT mtk01461
96 **  Add adopt operational rate as ACK rate if BasicRateSet was not found
97 **  Add comments
98 **  \main\maintrunk.MT5921\6 2008-02-21 15:01:39 GMT mtk01461
99 **  Add initial rate according rx signal quality support
100 **  \main\maintrunk.MT5921\5 2008-01-07 15:06:44 GMT mtk01461
101 **  Fix typo of rate adaptation of CtrlResp Frame
102 **  \main\maintrunk.MT5921\4 2007-10-25 18:05:12 GMT mtk01461
103 **  Add VOIP SCAN Support  & Refine Roaming
104 */
105
106 /*******************************************************************************
107 *                         C O M P I L E R   F L A G S
108 ********************************************************************************
109 */
110
111 /*******************************************************************************
112 *                    E X T E R N A L   R E F E R E N C E S
113 ********************************************************************************
114 */
115 #include "precomp.h"
116
117 /*******************************************************************************
118 *                              C O N S T A N T S
119 ********************************************************************************
120 */
121 /* The list of valid data rates. */
122 const UINT_8 aucDataRate[] = {
123     RATE_1M,            /* RATE_1M_INDEX = 0 */
124     RATE_2M,            /* RATE_2M_INDEX */
125     RATE_5_5M,          /* RATE_5_5M_INDEX */
126     RATE_11M,           /* RATE_11M_INDEX */
127     RATE_22M,           /* RATE_22M_INDEX */
128     RATE_33M,           /* RATE_33M_INDEX */
129     RATE_6M,            /* RATE_6M_INDEX */
130     RATE_9M,            /* RATE_9M_INDEX */
131     RATE_12M,           /* RATE_12M_INDEX */
132     RATE_18M,           /* RATE_18M_INDEX */
133     RATE_24M,           /* RATE_24M_INDEX */
134     RATE_36M,           /* RATE_36M_INDEX */
135     RATE_48M,           /* RATE_48M_INDEX */
136     RATE_54M,           /* RATE_54M_INDEX */
137     RATE_HT_PHY         /* RATE_HT_PHY_INDEX */
138 };
139
140 static const UINT_8 aucDefaultAckCtsRateIndex[RATE_NUM] = {
141     RATE_1M_INDEX,      /* RATE_1M_INDEX = 0 */
142     RATE_2M_INDEX,      /* RATE_2M_INDEX */
143     RATE_5_5M_INDEX,    /* RATE_5_5M_INDEX */
144     RATE_11M_INDEX,     /* RATE_11M_INDEX */
145     RATE_1M_INDEX,      /* RATE_22M_INDEX - Not supported */
146     RATE_1M_INDEX,      /* RATE_33M_INDEX - Not supported */
147     RATE_6M_INDEX,      /* RATE_6M_INDEX */
148     RATE_6M_INDEX,      /* RATE_9M_INDEX */
149     RATE_12M_INDEX,     /* RATE_12M_INDEX */
150     RATE_12M_INDEX,     /* RATE_18M_INDEX */
151     RATE_24M_INDEX,     /* RATE_24M_INDEX */
152     RATE_24M_INDEX,     /* RATE_36M_INDEX */
153     RATE_24M_INDEX,     /* RATE_48M_INDEX */
154     RATE_24M_INDEX      /* RATE_54M_INDEX */
155 };
156
157 const BOOLEAN afgIsOFDMRate[RATE_NUM] = {
158     FALSE,              /* RATE_1M_INDEX = 0 */
159     FALSE,              /* RATE_2M_INDEX */
160     FALSE,              /* RATE_5_5M_INDEX */
161     FALSE,              /* RATE_11M_INDEX */
162     FALSE,              /* RATE_22M_INDEX - Not supported */
163     FALSE,              /* RATE_33M_INDEX - Not supported */
164     TRUE,               /* RATE_6M_INDEX */
165     TRUE,               /* RATE_9M_INDEX */
166     TRUE,               /* RATE_12M_INDEX */
167     TRUE,               /* RATE_18M_INDEX */
168     TRUE,               /* RATE_24M_INDEX */
169     TRUE,               /* RATE_36M_INDEX */
170     TRUE,               /* RATE_48M_INDEX */
171     TRUE                /* RATE_54M_INDEX */
172 };
173
174 /*******************************************************************************
175 *                             D A T A   T Y P E S
176 ********************************************************************************
177 */
178
179 /*******************************************************************************
180 *                            P U B L I C   D A T A
181 ********************************************************************************
182 */
183
184 /*******************************************************************************
185 *                           P R I V A T E   D A T A
186 ********************************************************************************
187 */
188
189 /*******************************************************************************
190 *                                 M A C R O S
191 ********************************************************************************
192 */
193
194 /*******************************************************************************
195 *                   F U N C T I O N   D E C L A R A T I O N S
196 ********************************************************************************
197 */
198
199 /*******************************************************************************
200 *                              F U N C T I O N S
201 ********************************************************************************
202 */
203 /*----------------------------------------------------------------------------*/
204 /*!
205 * @brief Convert the given Supported Rate & Extended Supported Rate IE to the
206 *        Operational Rate Set and Basic Rate Set, and also check if any Basic
207 *        Rate Code is unknown by driver.
208 *
209 * @param[in] prIeSupportedRate          Pointer to the Supported Rate IE
210 * @param[in] prIeExtSupportedRate       Pointer to the Ext Supported Rate IE
211 * @param[out] pu2OperationalRateSet     Pointer to the Operational Rate Set
212 * @param[out] pu2BSSBasicRateSet        Pointer to the Basic Rate Set
213 * @param[out] pfgIsUnknownBSSBasicRate  Pointer to a Flag to indicate that Basic
214 *                                       Rate Set has unknown Rate Code
215 *
216 * \return (none)
217 */
218 /*----------------------------------------------------------------------------*/
219 VOID
220 rateGetRateSetFromIEs (
221     IN P_IE_SUPPORTED_RATE_T prIeSupportedRate,
222     IN P_IE_EXT_SUPPORTED_RATE_T prIeExtSupportedRate,
223     OUT PUINT_16 pu2OperationalRateSet,
224     OUT PUINT_16 pu2BSSBasicRateSet,
225     OUT PBOOLEAN pfgIsUnknownBSSBasicRate
226     )
227 {
228     UINT_16 u2OperationalRateSet = 0;
229     UINT_16 u2BSSBasicRateSet = 0;
230     BOOLEAN fgIsUnknownBSSBasicRate = FALSE;
231     UINT_8 ucRate;
232     UINT_32 i, j;
233
234
235     ASSERT(pu2OperationalRateSet);
236     ASSERT(pu2BSSBasicRateSet);
237     ASSERT(pfgIsUnknownBSSBasicRate);
238
239     if (prIeSupportedRate) {
240         /* NOTE(Kevin): Buffalo WHR-G54S's supported rate set IE exceed 8.
241          * IE_LEN(pucIE) == 12, "1(B), 2(B), 5.5(B), 6(B), 9(B), 11(B),
242          * 12(B), 18(B), 24(B), 36(B), 48(B), 54(B)"
243          */
244         //ASSERT(prIeSupportedRate->ucLength <= ELEM_MAX_LEN_SUP_RATES);
245         ASSERT(prIeSupportedRate->ucLength <= RATE_NUM);
246
247         for (i = 0; i < prIeSupportedRate->ucLength; i++) {
248             ucRate = prIeSupportedRate->aucSupportedRates[i] & RATE_MASK;
249
250             /* Search all valid data rates */
251             for (j = 0; j < sizeof(aucDataRate)/sizeof(UINT_8); j++) {
252                 if (ucRate == aucDataRate[j]) {
253                     u2OperationalRateSet |= BIT(j);
254
255                     if (prIeSupportedRate->aucSupportedRates[i] & RATE_BASIC_BIT) {
256                         u2BSSBasicRateSet |= BIT(j);
257                     }
258
259                     break;
260                 }
261             }
262
263             if ((j == sizeof(aucDataRate)/sizeof(UINT_8)) &&
264                 (prIeSupportedRate->aucSupportedRates[i] & RATE_BASIC_BIT)) {
265                 fgIsUnknownBSSBasicRate = TRUE; /* A data rate not list in the aucDataRate[] */
266             }
267         }
268     }
269
270
271     if (prIeExtSupportedRate) {
272         //ASSERT(prIeExtSupportedRate->ucLength <= ELEM_MAX_LEN_EXTENDED_SUP_RATES);
273
274         for (i = 0; i < prIeExtSupportedRate->ucLength; i++) {
275             ucRate = prIeExtSupportedRate->aucExtSupportedRates[i] & RATE_MASK;
276
277             /* Search all valid data rates */
278             for (j = 0; j < sizeof(aucDataRate)/sizeof(UINT_8); j++) {
279                 if (ucRate == aucDataRate[j]) {
280                     u2OperationalRateSet |= BIT(j);
281
282                     if (prIeExtSupportedRate->aucExtSupportedRates[i] & RATE_BASIC_BIT) {
283                         u2BSSBasicRateSet |= BIT(j);
284                     }
285
286                     break;
287                 }
288             }
289
290             if ((j == sizeof(aucDataRate)/sizeof(UINT_8)) &&
291                 (prIeExtSupportedRate->aucExtSupportedRates[i] & RATE_BASIC_BIT)) {
292                 fgIsUnknownBSSBasicRate = TRUE; /* A data rate not list in the aucDataRate[] */
293             }
294         }
295     }
296
297     *pu2OperationalRateSet = u2OperationalRateSet;
298     *pu2BSSBasicRateSet = u2BSSBasicRateSet;
299     *pfgIsUnknownBSSBasicRate = fgIsUnknownBSSBasicRate;
300
301     return;
302
303 } /* end of rateGetRateSetFromIEs() */
304
305
306 /*----------------------------------------------------------------------------*/
307 /*!
308 * @brief Convert the given Operational Rate Set & Basic Rate Set to the Rate Code
309 *        Format for used in (Ext)Supportec Rate IE.
310 *
311 * @param[in] u2OperationalRateSet   Operational Rate Set
312 * @param[in] u2BSSBasicRateSet      Basic Rate Set
313 * @param[out] pucDataRates          Pointer to the Data Rate Buffer
314 * @param[out] pucDataRatesLen       Pointer to the Data Rate Buffer Length
315 *
316 * @return (none)
317 */
318 /*----------------------------------------------------------------------------*/
319 VOID
320 rateGetDataRatesFromRateSet (
321     IN UINT_16 u2OperationalRateSet,
322     IN UINT_16 u2BSSBasicRateSet,
323     OUT PUINT_8 pucDataRates,
324     OUT PUINT_8 pucDataRatesLen
325     )
326 {
327     UINT_32 i, j;
328
329
330     ASSERT(pucDataRates);
331     ASSERT(pucDataRatesLen);
332
333     ASSERT(u2BSSBasicRateSet == (u2OperationalRateSet & u2BSSBasicRateSet));
334
335     for (i = RATE_1M_INDEX, j = 0; i < RATE_NUM; i++) {
336         if (u2OperationalRateSet & BIT(i)) {
337
338             *(pucDataRates + j) = aucDataRate[i];
339
340             if (u2BSSBasicRateSet & BIT(i)) {
341                 *(pucDataRates + j) |= RATE_BASIC_BIT;
342             }
343
344             j++;
345         }
346     }
347
348     *pucDataRatesLen = (UINT_8)j;
349
350     return;
351
352 } /* end of rateGetDataRatesFromRateSet() */
353
354
355 /*----------------------------------------------------------------------------*/
356 /*!
357 * \brief Get the highest rate from given Rate Set.
358 *
359 * \param[in] u2RateSet              Rate Set
360 * \param[out] pucHighestRateIndex   Pointer to buffer of the Highest Rate Index
361 *
362 * \retval TRUE  Highest Rate Index was found
363 * \retval FALSE Highest Rate Index was not found
364 */
365 /*----------------------------------------------------------------------------*/
366 BOOLEAN
367 rateGetHighestRateIndexFromRateSet (
368     IN UINT_16 u2RateSet,
369     OUT PUINT_8 pucHighestRateIndex
370     )
371 {
372     INT_32 i;
373
374
375     ASSERT(pucHighestRateIndex);
376
377     for (i = RATE_54M_INDEX; i >= RATE_1M_INDEX; i--) {
378         if (u2RateSet & BIT(i)) {
379             *pucHighestRateIndex = (UINT_8)i;
380             return TRUE;
381         }
382     }
383
384     return FALSE;
385
386 } /* end of rateGetHighestRateIndexFromRateSet() */
387
388
389 /*----------------------------------------------------------------------------*/
390 /*!
391 * \brief Get the lowest rate from given Rate Set.
392 *
393 * \param[in] u2RateSet              Rate Set
394 * \param[out] pucLowestRateIndex    Pointer to buffer of the Lowest Rate Index
395 *
396 * \retval TRUE  Lowest Rate Index was found
397 * \retval FALSE Lowest Rate Index was not found
398 */
399 /*----------------------------------------------------------------------------*/
400 BOOLEAN
401 rateGetLowestRateIndexFromRateSet (
402     IN UINT_16 u2RateSet,
403     OUT PUINT_8 pucLowestRateIndex
404     )
405 {
406     UINT_32 i;
407
408     ASSERT(pucLowestRateIndex);
409
410     for (i = RATE_1M_INDEX; i <= RATE_54M_INDEX; i++) {
411         if (u2RateSet & BIT(i)) {
412             *pucLowestRateIndex = (UINT_8)i;
413             return TRUE;
414         }
415     }
416
417     return FALSE;
418
419 } /* end of rateGetLowestRateIndexFromRateSet() */
420
421
422 #if 0 // NOTE(Kevin): For reference
423 /*----------------------------------------------------------------------------*/
424 /*!
425 * \brief Convert the given Data Rates to the Rate Set.
426 *
427 * \param[in] pucDataRates       Pointer to the Data Rates
428 * \param[in] ucDataRatesLen     Length of given Data Rates
429 * \param[out] pu2RateSet        Pointer to the Rate Set
430 *
431 * \return (none)
432 */
433 /*----------------------------------------------------------------------------*/
434 VOID
435 rateGetRateSetFromDataRates (
436     IN PUINT_8 pucDataRates,
437     IN UINT_8 ucDataRatesLen,
438     OUT PUINT_16 pu2RateSet
439     )
440 {
441     UINT_16 u2RateSet = 0;
442     UINT_8 ucRate;
443     UINT_32 i, j;
444
445
446     ASSERT(pucDataRates);
447     ASSERT(pu2RateSet);
448
449     if (pucDataRates) {
450         for (i = 0; i < ucDataRatesLen; i++) {
451             ucRate = pucDataRates[i] & RATE_MASK;
452
453             /* Search all valid data rates */
454             for (j = 0; j < sizeof(aucDataRate)/sizeof(UINT_8); j++) {
455                 if (ucRate == aucDataRate[j]) {
456                     u2RateSet |= BIT(j);
457                     break;
458                 }
459             }
460         }
461     }
462
463     *pu2RateSet = u2RateSet;
464
465     return;
466
467 } /* end of rateGetRateSetFromDataRates() */
468
469
470 /*----------------------------------------------------------------------------*/
471 /*!
472 * \brief Parse the Operational Rate Set and Basic Rate Set to get the corresponding
473 *        ACK/CTS(Respnose) TX Rates.
474 *
475 * \param[in] u2OperationalRateSet   Operational Rate Set
476 * \param[in] u2BSSBasicRateSet      Basic Rate Set
477 * \param[out] aucAckCtsRateIndex    Pointer to the Ack/Cts Data Rate Buffer
478 *
479 * \return (none)
480 */
481 /*----------------------------------------------------------------------------*/
482 VOID
483 rateSetAckCtsDataRatesFromRateSet (
484     IN UINT_16 u2OperationalRateSet,
485     IN UINT_16 u2BSSBasicRateSet,
486     IN OUT UINT_8 aucAckCtsRateIndex[]
487     )
488 {
489     INT_32 i,j;
490
491
492     ASSERT(aucAckCtsRateIndex);
493     ASSERT(u2BSSBasicRateSet == (u2OperationalRateSet & u2BSSBasicRateSet));
494
495     /* Setup default ACK/CTS response rate */
496     kalMemCopy(aucAckCtsRateIndex, (PVOID)aucDefaultAckCtsRateIndex, sizeof(aucDefaultAckCtsRateIndex));
497
498
499     for (i = RATE_54M_INDEX; i >= RATE_1M_INDEX; i--) {
500         if (u2OperationalRateSet & BIT(i)) {
501             for (j = i; j >= RATE_1M_INDEX; j--) {
502                 if (u2BSSBasicRateSet & BIT(j)) {
503                     if ((afgIsOFDMRate[i] && afgIsOFDMRate[j]) || (!afgIsOFDMRate[i] && !afgIsOFDMRate[j])) // Reply ACK Frame at the same Modulation Scheme.
504                         aucAckCtsRateIndex[i] = (UINT_8)j;
505                     break;
506                 }
507             }
508
509             /* NOTE(Kevin 2008/03/25): Following code is used for those AP which has
510              * NULL BasicRateSet.
511              * e.g. If input Operational Rate Set = [18M 12M 9M], Basic Rate Set = NULL.
512              * Originally we'll get Ack Rate for [18M 12M 9M] is [12M 12M "6M"].
513              * Now we'll get Ack Rate for [18M 12M 9M] is [12M 12M 9M],
514              * The Ack Rate for Tx Rates which are not list in Operational Rate Set is still
515              * use highest mandatory rate as default.
516              */
517             if (j < RATE_1M_INDEX) { /* The ACK/CTS rate was not found in BasicRateSet */
518                 if (!(BIT(aucAckCtsRateIndex[i]) & u2OperationalRateSet)) {
519                     aucAckCtsRateIndex[i] = (UINT_8)i;
520                 }
521             }
522         }
523     }
524
525     return;
526
527 } /* end of rateSetAckCtsDataRatesFromRateSet() */
528
529
530 /*----------------------------------------------------------------------------*/
531 /*!
532 * \brief Get the proper initial rate from Rate Set according to given RCPI value
533 *
534 * \param[in] u2RateSet              Rate Set
535 * \param[in] rRcpi                  RCPI value from AP or Peer STA
536 * \param[out] pucInitialRateIndex   Pointer to buffer of the initial Rate Index
537 *
538 * \retval TRUE  Initial Rate Index was found
539 * \retval FALSE Initial Rate Index was not found
540 */
541 /*----------------------------------------------------------------------------*/
542 BOOLEAN
543 rateGetBestInitialRateIndex (
544     IN UINT_16 u2RateSet,
545     IN RCPI rRcpi,
546     OUT PUINT_8 pucInitialRateIndex
547     )
548 {
549     UINT_16 u2InitRateSet;
550     INT_32 i;
551
552
553     ASSERT(pucInitialRateIndex);
554
555     DBGLOG(MGT, TRACE, ("rRcpi = %d\n", rRcpi));
556
557     if (rRcpi >= RCPI_100) { /* Best Signal */
558         u2InitRateSet = INITIAL_RATE_SET(RCPI_100);
559     }
560     else if (rRcpi >= RCPI_80) { /* Better Signal */
561         u2InitRateSet = INITIAL_RATE_SET(RCPI_80);
562     }
563     else if (rRcpi >= RCPI_60) { /* Good Signal */
564         u2InitRateSet = INITIAL_RATE_SET(RCPI_60);
565     }
566     else { /* Worse Signal */
567         /* NOTE(Kevin): If return FALSE, we should assign the BSS Basic Rate Index
568          * (prBssInfo->ucBasicRateIndex) to the initial rate. It was determined in
569          * function - bssUpdateTxRateForControlFrame().
570          */
571         return FALSE;
572     }
573
574     u2RateSet &= u2InitRateSet;
575
576     for (i = RATE_54M_INDEX; i >= RATE_1M_INDEX; i--) {
577         if (u2RateSet & BIT(i)) {
578             *pucInitialRateIndex = (UINT_8)i;
579             return TRUE;
580         }
581     }
582
583     return FALSE;
584
585 } /* end of rateGetBestInitialRateIndex() */
586 #endif
587