import PULS_20160108
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / drivers / misc / mediatek / connectivity / combo / drv_wlan / mt6630 / wlan / nic / nic_rate.c
CommitLineData
6fa3eb70
S
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
97const 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
104const 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
111const 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
123const 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
136const 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
149const 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
192WLAN_STATUS
193nicRateIndex2RateCode(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}