import PULS_20160108
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / drivers / misc / mediatek / connectivity / combo / drv_wlan / mt6630 / wlan / nic / nic_rate.c
1 /*
2 **
3 */
4
5 /*! \file "nic_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
15 /*
16 ** $Log: rate.c $
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 /*******************************************************************************
82 * C O M P I L E R F L A G S
83 ********************************************************************************
84 */
85
86 /*******************************************************************************
87 * E X T E R N A L R E F E R E N C E S
88 ********************************************************************************
89 */
90 #include "precomp.h"
91
92 /*******************************************************************************
93 * C O N S T A N T S
94 ********************************************************************************
95 */
96
97 const UINT_16 au2RateCCKLong[CCK_RATE_NUM] = {
98 RATE_CCK_1M_LONG, /* RATE_1M_INDEX = 0 */
99 RATE_CCK_2M_LONG, /* RATE_2M_INDEX */
100 RATE_CCK_5_5M_LONG, /* RATE_5_5M_INDEX */
101 RATE_CCK_11M_LONG /* RATE_11M_INDEX */
102 };
103
104 const UINT_16 au2RateCCKShort[CCK_RATE_NUM] = {
105 RATE_CCK_1M_LONG, /* RATE_1M_INDEX = 0 */
106 RATE_CCK_2M_SHORT, /* RATE_2M_INDEX */
107 RATE_CCK_5_5M_SHORT, /* RATE_5_5M_INDEX */
108 RATE_CCK_11M_SHORT /* RATE_11M_INDEX */
109 };
110
111 const UINT_16 au2RateOFDM[OFDM_RATE_NUM] = {
112 RATE_OFDM_6M, /* RATE_6M_INDEX */
113 RATE_OFDM_9M, /* RATE_9M_INDEX */
114 RATE_OFDM_12M, /* RATE_12M_INDEX */
115 RATE_OFDM_18M, /* RATE_18M_INDEX */
116 RATE_OFDM_24M, /* RATE_24M_INDEX */
117 RATE_OFDM_36M, /* RATE_36M_INDEX */
118 RATE_OFDM_48M, /* RATE_48M_INDEX */
119 RATE_OFDM_54M /* RATE_54M_INDEX */
120 };
121
122
123 const UINT_16 au2RateHTMixed[HT_RATE_NUM] = {
124 RATE_MM_MCS_32, /* RATE_MCS32_INDEX, */
125 RATE_MM_MCS_0, /* RATE_MCS0_INDEX, */
126 RATE_MM_MCS_1, /* RATE_MCS1_INDEX, */
127 RATE_MM_MCS_2, /* RATE_MCS2_INDEX, */
128 RATE_MM_MCS_3, /* RATE_MCS3_INDEX, */
129 RATE_MM_MCS_4, /* RATE_MCS4_INDEX, */
130 RATE_MM_MCS_5, /* RATE_MCS5_INDEX, */
131 RATE_MM_MCS_6, /* RATE_MCS6_INDEX, */
132 RATE_MM_MCS_7 /* RATE_MCS7_INDEX, */
133 };
134
135
136 const UINT_16 au2RateHTGreenField[HT_RATE_NUM] = {
137 RATE_GF_MCS_32, /* RATE_MCS32_INDEX, */
138 RATE_GF_MCS_0, /* RATE_MCS0_INDEX, */
139 RATE_GF_MCS_1, /* RATE_MCS1_INDEX, */
140 RATE_GF_MCS_2, /* RATE_MCS2_INDEX, */
141 RATE_GF_MCS_3, /* RATE_MCS3_INDEX, */
142 RATE_GF_MCS_4, /* RATE_MCS4_INDEX, */
143 RATE_GF_MCS_5, /* RATE_MCS5_INDEX, */
144 RATE_GF_MCS_6, /* RATE_MCS6_INDEX, */
145 RATE_GF_MCS_7, /* RATE_MCS7_INDEX, */
146 };
147
148
149 const UINT_16 au2RateVHT[VHT_RATE_NUM] = {
150 RATE_VHT_MCS_0, /* RATE_MCS0_INDEX, */
151 RATE_VHT_MCS_1, /* RATE_MCS1_INDEX, */
152 RATE_VHT_MCS_2, /* RATE_MCS2_INDEX, */
153 RATE_VHT_MCS_3, /* RATE_MCS3_INDEX, */
154 RATE_VHT_MCS_4, /* RATE_MCS4_INDEX, */
155 RATE_VHT_MCS_5, /* RATE_MCS5_INDEX, */
156 RATE_VHT_MCS_6, /* RATE_MCS6_INDEX, */
157 RATE_VHT_MCS_7, /* RATE_MCS7_INDEX, */
158 RATE_VHT_MCS_8, /* RATE_MCS8_INDEX, */
159 RATE_VHT_MCS_9 /* RATE_MCS9_INDEX, */
160 };
161
162 /*******************************************************************************
163 * D A T A T Y P E S
164 ********************************************************************************
165 */
166
167 /*******************************************************************************
168 * P U B L I C D A T A
169 ********************************************************************************
170 */
171
172 /*******************************************************************************
173 * P R I V A T E D A T A
174 ********************************************************************************
175 */
176
177 /*******************************************************************************
178 * M A C R O S
179 ********************************************************************************
180 */
181
182 /*******************************************************************************
183 * F U N C T I O N D E C L A R A T I O N S
184 ********************************************************************************
185 */
186
187 /*******************************************************************************
188 * F U N C T I O N S
189 ********************************************************************************
190 */
191
192 WLAN_STATUS
193 nicRateIndex2RateCode(IN UINT_8 ucPreambleOption, IN UINT_8 ucRateIndex, OUT PUINT_16 pu2RateCode)
194 {
195 switch (ucPreambleOption) {
196 case PREAMBLE_DEFAULT_LONG_NONE:
197 if (ucRateIndex >= CCK_RATE_NUM) {
198 return WLAN_STATUS_INVALID_DATA;
199 }
200 *pu2RateCode = au2RateCCKLong[ucRateIndex];
201 break;
202
203 case PREAMBLE_OPTION_SHORT:
204 if (ucRateIndex >= CCK_RATE_NUM) {
205 return WLAN_STATUS_INVALID_DATA;
206 }
207 *pu2RateCode = au2RateCCKShort[ucRateIndex];
208 break;
209
210 case PREAMBLE_OFDM_MODE:
211 if (ucRateIndex >= OFDM_RATE_NUM) {
212 return WLAN_STATUS_INVALID_DATA;
213 }
214 *pu2RateCode = au2RateOFDM[ucRateIndex];
215 break;
216
217 case PREAMBLE_HT_MIXED_MODE:
218 if (ucRateIndex >= HT_RATE_NUM) {
219 return WLAN_STATUS_INVALID_DATA;
220 }
221 *pu2RateCode = au2RateHTMixed[ucRateIndex];
222 break;
223
224 case PREAMBLE_HT_GREEN_FIELD:
225 if (ucRateIndex >= HT_RATE_NUM) {
226 return WLAN_STATUS_INVALID_DATA;
227 }
228 *pu2RateCode = au2RateHTGreenField[ucRateIndex];
229 break;
230
231 case PREAMBLE_VHT_FIELD:
232 if (ucRateIndex >= VHT_RATE_NUM) {
233 return WLAN_STATUS_INVALID_DATA;
234 }
235 *pu2RateCode = au2RateVHT[ucRateIndex];
236 break;
237
238 default:
239 return WLAN_STATUS_INVALID_DATA;
240 }
241
242 return WLAN_STATUS_SUCCESS;
243 }