1 /*
2 *************************************************************************
3 * Ralink Tech Inc.
4 * 5F., No.36, Taiyuan St., Jhubei City,
5 * Hsinchu County 302,
6 * Taiwan, R.O.C.
7 *
8 * (c) Copyright 2002-2007, Ralink Technology, Inc.
9 *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 * This program is distributed in the hope that it will be useful, *
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
18 * GNU General Public License for more details. *
19 * *
20 * You should have received a copy of the GNU General Public License *
21 * along with this program; if not, write to the *
22 * Free Software Foundation, Inc., *
23 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
24 * *
25 *************************************************************************
26 */
27
28 #include <linux/sched.h>
29 #include "../rt_config.h"
30
31 /*
32 ========================================================================
33
34 Routine Description:
35 Remove WPA Key process
36
37 Arguments:
38 pAd Pointer to our adapter
39 pBuf Pointer to the where the key stored
40
41 Return Value:
42 NDIS_SUCCESS Add key successfully
43
44 IRQL = DISPATCH_LEVEL
45
46 Note:
47
48 ========================================================================
49 */
RTMPSetDesiredRates(struct rt_rtmp_adapter * pAdapter,long Rates)50 void RTMPSetDesiredRates(struct rt_rtmp_adapter *pAdapter, long Rates)
51 {
52 NDIS_802_11_RATES aryRates;
53
54 memset(&aryRates, 0x00, sizeof(NDIS_802_11_RATES));
55 switch (pAdapter->CommonCfg.PhyMode) {
56 case PHY_11A: /* A only */
57 switch (Rates) {
58 case 6000000: /*6M */
59 aryRates[0] = 0x0c; /* 6M */
60 pAdapter->StaCfg.DesiredTransmitSetting.field.MCS =
61 MCS_0;
62 break;
63 case 9000000: /*9M */
64 aryRates[0] = 0x12; /* 9M */
65 pAdapter->StaCfg.DesiredTransmitSetting.field.MCS =
66 MCS_1;
67 break;
68 case 12000000: /*12M */
69 aryRates[0] = 0x18; /* 12M */
70 pAdapter->StaCfg.DesiredTransmitSetting.field.MCS =
71 MCS_2;
72 break;
73 case 18000000: /*18M */
74 aryRates[0] = 0x24; /* 18M */
75 pAdapter->StaCfg.DesiredTransmitSetting.field.MCS =
76 MCS_3;
77 break;
78 case 24000000: /*24M */
79 aryRates[0] = 0x30; /* 24M */
80 pAdapter->StaCfg.DesiredTransmitSetting.field.MCS =
81 MCS_4;
82 break;
83 case 36000000: /*36M */
84 aryRates[0] = 0x48; /* 36M */
85 pAdapter->StaCfg.DesiredTransmitSetting.field.MCS =
86 MCS_5;
87 break;
88 case 48000000: /*48M */
89 aryRates[0] = 0x60; /* 48M */
90 pAdapter->StaCfg.DesiredTransmitSetting.field.MCS =
91 MCS_6;
92 break;
93 case 54000000: /*54M */
94 aryRates[0] = 0x6c; /* 54M */
95 pAdapter->StaCfg.DesiredTransmitSetting.field.MCS =
96 MCS_7;
97 break;
98 case -1: /*Auto */
99 default:
100 aryRates[0] = 0x6c; /* 54Mbps */
101 aryRates[1] = 0x60; /* 48Mbps */
102 aryRates[2] = 0x48; /* 36Mbps */
103 aryRates[3] = 0x30; /* 24Mbps */
104 aryRates[4] = 0x24; /* 18M */
105 aryRates[5] = 0x18; /* 12M */
106 aryRates[6] = 0x12; /* 9M */
107 aryRates[7] = 0x0c; /* 6M */
108 pAdapter->StaCfg.DesiredTransmitSetting.field.MCS =
109 MCS_AUTO;
110 break;
111 }
112 break;
113 case PHY_11BG_MIXED: /* B/G Mixed */
114 case PHY_11B: /* B only */
115 case PHY_11ABG_MIXED: /* A/B/G Mixed */
116 default:
117 switch (Rates) {
118 case 1000000: /*1M */
119 aryRates[0] = 0x02;
120 pAdapter->StaCfg.DesiredTransmitSetting.field.MCS =
121 MCS_0;
122 break;
123 case 2000000: /*2M */
124 aryRates[0] = 0x04;
125 pAdapter->StaCfg.DesiredTransmitSetting.field.MCS =
126 MCS_1;
127 break;
128 case 5000000: /*5.5M */
129 aryRates[0] = 0x0b; /* 5.5M */
130 pAdapter->StaCfg.DesiredTransmitSetting.field.MCS =
131 MCS_2;
132 break;
133 case 11000000: /*11M */
134 aryRates[0] = 0x16; /* 11M */
135 pAdapter->StaCfg.DesiredTransmitSetting.field.MCS =
136 MCS_3;
137 break;
138 case 6000000: /*6M */
139 aryRates[0] = 0x0c; /* 6M */
140 pAdapter->StaCfg.DesiredTransmitSetting.field.MCS =
141 MCS_0;
142 break;
143 case 9000000: /*9M */
144 aryRates[0] = 0x12; /* 9M */
145 pAdapter->StaCfg.DesiredTransmitSetting.field.MCS =
146 MCS_1;
147 break;
148 case 12000000: /*12M */
149 aryRates[0] = 0x18; /* 12M */
150 pAdapter->StaCfg.DesiredTransmitSetting.field.MCS =
151 MCS_2;
152 break;
153 case 18000000: /*18M */
154 aryRates[0] = 0x24; /* 18M */
155 pAdapter->StaCfg.DesiredTransmitSetting.field.MCS =
156 MCS_3;
157 break;
158 case 24000000: /*24M */
159 aryRates[0] = 0x30; /* 24M */
160 pAdapter->StaCfg.DesiredTransmitSetting.field.MCS =
161 MCS_4;
162 break;
163 case 36000000: /*36M */
164 aryRates[0] = 0x48; /* 36M */
165 pAdapter->StaCfg.DesiredTransmitSetting.field.MCS =
166 MCS_5;
167 break;
168 case 48000000: /*48M */
169 aryRates[0] = 0x60; /* 48M */
170 pAdapter->StaCfg.DesiredTransmitSetting.field.MCS =
171 MCS_6;
172 break;
173 case 54000000: /*54M */
174 aryRates[0] = 0x6c; /* 54M */
175 pAdapter->StaCfg.DesiredTransmitSetting.field.MCS =
176 MCS_7;
177 break;
178 case -1: /*Auto */
179 default:
180 if (pAdapter->CommonCfg.PhyMode == PHY_11B) { /*B Only */
181 aryRates[0] = 0x16; /* 11Mbps */
182 aryRates[1] = 0x0b; /* 5.5Mbps */
183 aryRates[2] = 0x04; /* 2Mbps */
184 aryRates[3] = 0x02; /* 1Mbps */
185 } else { /*(B/G) Mixed or (A/B/G) Mixed */
186 aryRates[0] = 0x6c; /* 54Mbps */
187 aryRates[1] = 0x60; /* 48Mbps */
188 aryRates[2] = 0x48; /* 36Mbps */
189 aryRates[3] = 0x30; /* 24Mbps */
190 aryRates[4] = 0x16; /* 11Mbps */
191 aryRates[5] = 0x0b; /* 5.5Mbps */
192 aryRates[6] = 0x04; /* 2Mbps */
193 aryRates[7] = 0x02; /* 1Mbps */
194 }
195 pAdapter->StaCfg.DesiredTransmitSetting.field.MCS =
196 MCS_AUTO;
197 break;
198 }
199 break;
200 }
201
202 NdisZeroMemory(pAdapter->CommonCfg.DesireRate,
203 MAX_LEN_OF_SUPPORTED_RATES);
204 NdisMoveMemory(pAdapter->CommonCfg.DesireRate, &aryRates,
205 sizeof(NDIS_802_11_RATES));
206 DBGPRINT(RT_DEBUG_TRACE,
207 (" RTMPSetDesiredRates (%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x)\n",
208 pAdapter->CommonCfg.DesireRate[0],
209 pAdapter->CommonCfg.DesireRate[1],
210 pAdapter->CommonCfg.DesireRate[2],
211 pAdapter->CommonCfg.DesireRate[3],
212 pAdapter->CommonCfg.DesireRate[4],
213 pAdapter->CommonCfg.DesireRate[5],
214 pAdapter->CommonCfg.DesireRate[6],
215 pAdapter->CommonCfg.DesireRate[7]));
216 /* Changing DesiredRate may affect the MAX TX rate we used to TX frames out */
217 MlmeUpdateTxRates(pAdapter, FALSE, 0);
218 }
219
220 /*
221 ========================================================================
222
223 Routine Description:
224 Remove All WPA Keys
225
226 Arguments:
227 pAd Pointer to our adapter
228
229 Return Value:
230 None
231
232 IRQL = DISPATCH_LEVEL
233
234 Note:
235
236 ========================================================================
237 */
RTMPWPARemoveAllKeys(struct rt_rtmp_adapter * pAd)238 void RTMPWPARemoveAllKeys(struct rt_rtmp_adapter *pAd)
239 {
240
241 u8 i;
242
243 DBGPRINT(RT_DEBUG_TRACE,
244 ("RTMPWPARemoveAllKeys(AuthMode=%d, WepStatus=%d)\n",
245 pAd->StaCfg.AuthMode, pAd->StaCfg.WepStatus));
246 RTMP_CLEAR_PSFLAG(pAd, fRTMP_PS_CAN_GO_SLEEP);
247 /* For WEP/CKIP, there is no need to remove it, since WinXP won't set it again after */
248 /* Link up. And it will be replaced if user changed it. */
249 if (pAd->StaCfg.AuthMode < Ndis802_11AuthModeWPA)
250 return;
251
252 /* For WPA-None, there is no need to remove it, since WinXP won't set it again after */
253 /* Link up. And it will be replaced if user changed it. */
254 if (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPANone)
255 return;
256
257 /* set BSSID wcid entry of the Pair-wise Key table as no-security mode */
258 AsicRemovePairwiseKeyEntry(pAd, BSS0, BSSID_WCID);
259
260 /* set all shared key mode as no-security. */
261 for (i = 0; i < SHARE_KEY_NUM; i++) {
262 DBGPRINT(RT_DEBUG_TRACE,
263 ("remove %s key #%d\n",
264 CipherName[pAd->SharedKey[BSS0][i].CipherAlg], i));
265 NdisZeroMemory(&pAd->SharedKey[BSS0][i], sizeof(struct rt_cipher_key));
266
267 AsicRemoveSharedKeyEntry(pAd, BSS0, i);
268 }
269 RTMP_SET_PSFLAG(pAd, fRTMP_PS_CAN_GO_SLEEP);
270 }
271
272 /*
273 ========================================================================
274
275 Routine Description:
276 As STA's BSSID is a WC too, it uses shared key table.
277 This function write correct unicast TX key to ASIC WCID.
278 And we still make a copy in our MacTab.Content[BSSID_WCID].PairwiseKey.
279 Caller guarantee TKIP/AES always has keyidx = 0. (pairwise key)
280 Caller guarantee WEP calls this function when set Txkey, default key index=0~3.
281
282 Arguments:
283 pAd Pointer to our adapter
284 pKey Pointer to the where the key stored
285
286 Return Value:
287 NDIS_SUCCESS Add key successfully
288
289 IRQL = DISPATCH_LEVEL
290
291 Note:
292
293 ========================================================================
294 */
295 /*
296 ========================================================================
297 Routine Description:
298 Change NIC PHY mode. Re-association may be necessary. possible settings
299 include - PHY_11B, PHY_11BG_MIXED, PHY_11A, and PHY_11ABG_MIXED
300
301 Arguments:
302 pAd - Pointer to our adapter
303 phymode -
304
305 IRQL = PASSIVE_LEVEL
306 IRQL = DISPATCH_LEVEL
307
308 ========================================================================
309 */
RTMPSetPhyMode(struct rt_rtmp_adapter * pAd,unsigned long phymode)310 void RTMPSetPhyMode(struct rt_rtmp_adapter *pAd, unsigned long phymode)
311 {
312 int i;
313 /* the selected phymode must be supported by the RF IC encoded in E2PROM */
314
315 /* if no change, do nothing */
316 /* bug fix
317 if (pAd->CommonCfg.PhyMode == phymode)
318 return;
319 */
320 pAd->CommonCfg.PhyMode = (u8)phymode;
321
322 DBGPRINT(RT_DEBUG_TRACE,
323 ("RTMPSetPhyMode : PhyMode=%d, channel=%d \n",
324 pAd->CommonCfg.PhyMode, pAd->CommonCfg.Channel));
325
326 BuildChannelList(pAd);
327
328 /* sanity check user setting */
329 for (i = 0; i < pAd->ChannelListNum; i++) {
330 if (pAd->CommonCfg.Channel == pAd->ChannelList[i].Channel)
331 break;
332 }
333
334 if (i == pAd->ChannelListNum) {
335 pAd->CommonCfg.Channel = FirstChannel(pAd);
336 DBGPRINT(RT_DEBUG_ERROR,
337 ("RTMPSetPhyMode: channel is out of range, use first channel=%d \n",
338 pAd->CommonCfg.Channel));
339 }
340
341 NdisZeroMemory(pAd->CommonCfg.SupRate, MAX_LEN_OF_SUPPORTED_RATES);
342 NdisZeroMemory(pAd->CommonCfg.ExtRate, MAX_LEN_OF_SUPPORTED_RATES);
343 NdisZeroMemory(pAd->CommonCfg.DesireRate, MAX_LEN_OF_SUPPORTED_RATES);
344 switch (phymode) {
345 case PHY_11B:
346 pAd->CommonCfg.SupRate[0] = 0x82; /* 1 mbps, in units of 0.5 Mbps, basic rate */
347 pAd->CommonCfg.SupRate[1] = 0x84; /* 2 mbps, in units of 0.5 Mbps, basic rate */
348 pAd->CommonCfg.SupRate[2] = 0x8B; /* 5.5 mbps, in units of 0.5 Mbps, basic rate */
349 pAd->CommonCfg.SupRate[3] = 0x96; /* 11 mbps, in units of 0.5 Mbps, basic rate */
350 pAd->CommonCfg.SupRateLen = 4;
351 pAd->CommonCfg.ExtRateLen = 0;
352 pAd->CommonCfg.DesireRate[0] = 2; /* 1 mbps, in units of 0.5 Mbps */
353 pAd->CommonCfg.DesireRate[1] = 4; /* 2 mbps, in units of 0.5 Mbps */
354 pAd->CommonCfg.DesireRate[2] = 11; /* 5.5 mbps, in units of 0.5 Mbps */
355 pAd->CommonCfg.DesireRate[3] = 22; /* 11 mbps, in units of 0.5 Mbps */
356 /*pAd->CommonCfg.HTPhyMode.field.MODE = MODE_CCK; // This MODE is only FYI. not use */
357 break;
358
359 case PHY_11G:
360 case PHY_11BG_MIXED:
361 case PHY_11ABG_MIXED:
362 case PHY_11N_2_4G:
363 case PHY_11ABGN_MIXED:
364 case PHY_11BGN_MIXED:
365 case PHY_11GN_MIXED:
366 pAd->CommonCfg.SupRate[0] = 0x82; /* 1 mbps, in units of 0.5 Mbps, basic rate */
367 pAd->CommonCfg.SupRate[1] = 0x84; /* 2 mbps, in units of 0.5 Mbps, basic rate */
368 pAd->CommonCfg.SupRate[2] = 0x8B; /* 5.5 mbps, in units of 0.5 Mbps, basic rate */
369 pAd->CommonCfg.SupRate[3] = 0x96; /* 11 mbps, in units of 0.5 Mbps, basic rate */
370 pAd->CommonCfg.SupRate[4] = 0x12; /* 9 mbps, in units of 0.5 Mbps */
371 pAd->CommonCfg.SupRate[5] = 0x24; /* 18 mbps, in units of 0.5 Mbps */
372 pAd->CommonCfg.SupRate[6] = 0x48; /* 36 mbps, in units of 0.5 Mbps */
373 pAd->CommonCfg.SupRate[7] = 0x6c; /* 54 mbps, in units of 0.5 Mbps */
374 pAd->CommonCfg.SupRateLen = 8;
375 pAd->CommonCfg.ExtRate[0] = 0x0C; /* 6 mbps, in units of 0.5 Mbps */
376 pAd->CommonCfg.ExtRate[1] = 0x18; /* 12 mbps, in units of 0.5 Mbps */
377 pAd->CommonCfg.ExtRate[2] = 0x30; /* 24 mbps, in units of 0.5 Mbps */
378 pAd->CommonCfg.ExtRate[3] = 0x60; /* 48 mbps, in units of 0.5 Mbps */
379 pAd->CommonCfg.ExtRateLen = 4;
380 pAd->CommonCfg.DesireRate[0] = 2; /* 1 mbps, in units of 0.5 Mbps */
381 pAd->CommonCfg.DesireRate[1] = 4; /* 2 mbps, in units of 0.5 Mbps */
382 pAd->CommonCfg.DesireRate[2] = 11; /* 5.5 mbps, in units of 0.5 Mbps */
383 pAd->CommonCfg.DesireRate[3] = 22; /* 11 mbps, in units of 0.5 Mbps */
384 pAd->CommonCfg.DesireRate[4] = 12; /* 6 mbps, in units of 0.5 Mbps */
385 pAd->CommonCfg.DesireRate[5] = 18; /* 9 mbps, in units of 0.5 Mbps */
386 pAd->CommonCfg.DesireRate[6] = 24; /* 12 mbps, in units of 0.5 Mbps */
387 pAd->CommonCfg.DesireRate[7] = 36; /* 18 mbps, in units of 0.5 Mbps */
388 pAd->CommonCfg.DesireRate[8] = 48; /* 24 mbps, in units of 0.5 Mbps */
389 pAd->CommonCfg.DesireRate[9] = 72; /* 36 mbps, in units of 0.5 Mbps */
390 pAd->CommonCfg.DesireRate[10] = 96; /* 48 mbps, in units of 0.5 Mbps */
391 pAd->CommonCfg.DesireRate[11] = 108; /* 54 mbps, in units of 0.5 Mbps */
392 break;
393
394 case PHY_11A:
395 case PHY_11AN_MIXED:
396 case PHY_11AGN_MIXED:
397 case PHY_11N_5G:
398 pAd->CommonCfg.SupRate[0] = 0x8C; /* 6 mbps, in units of 0.5 Mbps, basic rate */
399 pAd->CommonCfg.SupRate[1] = 0x12; /* 9 mbps, in units of 0.5 Mbps */
400 pAd->CommonCfg.SupRate[2] = 0x98; /* 12 mbps, in units of 0.5 Mbps, basic rate */
401 pAd->CommonCfg.SupRate[3] = 0x24; /* 18 mbps, in units of 0.5 Mbps */
402 pAd->CommonCfg.SupRate[4] = 0xb0; /* 24 mbps, in units of 0.5 Mbps, basic rate */
403 pAd->CommonCfg.SupRate[5] = 0x48; /* 36 mbps, in units of 0.5 Mbps */
404 pAd->CommonCfg.SupRate[6] = 0x60; /* 48 mbps, in units of 0.5 Mbps */
405 pAd->CommonCfg.SupRate[7] = 0x6c; /* 54 mbps, in units of 0.5 Mbps */
406 pAd->CommonCfg.SupRateLen = 8;
407 pAd->CommonCfg.ExtRateLen = 0;
408 pAd->CommonCfg.DesireRate[0] = 12; /* 6 mbps, in units of 0.5 Mbps */
409 pAd->CommonCfg.DesireRate[1] = 18; /* 9 mbps, in units of 0.5 Mbps */
410 pAd->CommonCfg.DesireRate[2] = 24; /* 12 mbps, in units of 0.5 Mbps */
411 pAd->CommonCfg.DesireRate[3] = 36; /* 18 mbps, in units of 0.5 Mbps */
412 pAd->CommonCfg.DesireRate[4] = 48; /* 24 mbps, in units of 0.5 Mbps */
413 pAd->CommonCfg.DesireRate[5] = 72; /* 36 mbps, in units of 0.5 Mbps */
414 pAd->CommonCfg.DesireRate[6] = 96; /* 48 mbps, in units of 0.5 Mbps */
415 pAd->CommonCfg.DesireRate[7] = 108; /* 54 mbps, in units of 0.5 Mbps */
416 /*pAd->CommonCfg.HTPhyMode.field.MODE = MODE_OFDM; // This MODE is only FYI. not use */
417 break;
418
419 default:
420 break;
421 }
422
423 pAd->CommonCfg.BandState = UNKNOWN_BAND;
424 }
425
426 /*
427 ========================================================================
428 Routine Description:
429 Caller ensures we has 802.11n support.
430 Calls at setting HT from AP/STASetinformation
431
432 Arguments:
433 pAd - Pointer to our adapter
434 phymode -
435
436 ========================================================================
437 */
RTMPSetHT(struct rt_rtmp_adapter * pAd,struct rt_oid_set_ht_phymode * pHTPhyMode)438 void RTMPSetHT(struct rt_rtmp_adapter *pAd, struct rt_oid_set_ht_phymode *pHTPhyMode)
439 {
440 /*unsigned long *pmcs; */
441 u32 Value = 0;
442 u8 BBPValue = 0;
443 u8 BBP3Value = 0;
444 u8 RxStream = pAd->CommonCfg.RxStream;
445
446 DBGPRINT(RT_DEBUG_TRACE,
447 ("RTMPSetHT : HT_mode(%d), ExtOffset(%d), MCS(%d), BW(%d), STBC(%d), SHORTGI(%d)\n",
448 pHTPhyMode->HtMode, pHTPhyMode->ExtOffset, pHTPhyMode->MCS,
449 pHTPhyMode->BW, pHTPhyMode->STBC, pHTPhyMode->SHORTGI));
450
451 /* Don't zero supportedHyPhy structure. */
452 RTMPZeroMemory(&pAd->CommonCfg.HtCapability,
453 sizeof(pAd->CommonCfg.HtCapability));
454 RTMPZeroMemory(&pAd->CommonCfg.AddHTInfo,
455 sizeof(pAd->CommonCfg.AddHTInfo));
456 RTMPZeroMemory(&pAd->CommonCfg.NewExtChanOffset,
457 sizeof(pAd->CommonCfg.NewExtChanOffset));
458 RTMPZeroMemory(&pAd->CommonCfg.DesiredHtPhy,
459 sizeof(pAd->CommonCfg.DesiredHtPhy));
460
461 if (pAd->CommonCfg.bRdg) {
462 pAd->CommonCfg.HtCapability.ExtHtCapInfo.PlusHTC = 1;
463 pAd->CommonCfg.HtCapability.ExtHtCapInfo.RDGSupport = 1;
464 } else {
465 pAd->CommonCfg.HtCapability.ExtHtCapInfo.PlusHTC = 0;
466 pAd->CommonCfg.HtCapability.ExtHtCapInfo.RDGSupport = 0;
467 }
468
469 pAd->CommonCfg.HtCapability.HtCapParm.MaxRAmpduFactor = 3;
470 pAd->CommonCfg.DesiredHtPhy.MaxRAmpduFactor = 3;
471
472 DBGPRINT(RT_DEBUG_TRACE,
473 ("RTMPSetHT : RxBAWinLimit = %d\n",
474 pAd->CommonCfg.BACapability.field.RxBAWinLimit));
475
476 /* Mimo power save, A-MSDU size, */
477 pAd->CommonCfg.DesiredHtPhy.AmsduEnable =
478 (u16)pAd->CommonCfg.BACapability.field.AmsduEnable;
479 pAd->CommonCfg.DesiredHtPhy.AmsduSize =
480 (u8)pAd->CommonCfg.BACapability.field.AmsduSize;
481 pAd->CommonCfg.DesiredHtPhy.MimoPs =
482 (u8)pAd->CommonCfg.BACapability.field.MMPSmode;
483 pAd->CommonCfg.DesiredHtPhy.MpduDensity =
484 (u8)pAd->CommonCfg.BACapability.field.MpduDensity;
485
486 pAd->CommonCfg.HtCapability.HtCapInfo.AMsduSize =
487 (u16)pAd->CommonCfg.BACapability.field.AmsduSize;
488 pAd->CommonCfg.HtCapability.HtCapInfo.MimoPs =
489 (u16)pAd->CommonCfg.BACapability.field.MMPSmode;
490 pAd->CommonCfg.HtCapability.HtCapParm.MpduDensity =
491 (u8)pAd->CommonCfg.BACapability.field.MpduDensity;
492
493 DBGPRINT(RT_DEBUG_TRACE,
494 ("RTMPSetHT : AMsduSize = %d, MimoPs = %d, MpduDensity = %d, MaxRAmpduFactor = %d\n",
495 pAd->CommonCfg.DesiredHtPhy.AmsduSize,
496 pAd->CommonCfg.DesiredHtPhy.MimoPs,
497 pAd->CommonCfg.DesiredHtPhy.MpduDensity,
498 pAd->CommonCfg.DesiredHtPhy.MaxRAmpduFactor));
499
500 if (pHTPhyMode->HtMode == HTMODE_GF) {
501 pAd->CommonCfg.HtCapability.HtCapInfo.GF = 1;
502 pAd->CommonCfg.DesiredHtPhy.GF = 1;
503 } else
504 pAd->CommonCfg.DesiredHtPhy.GF = 0;
505
506 /* Decide Rx MCSSet */
507 switch (RxStream) {
508 case 1:
509 pAd->CommonCfg.HtCapability.MCSSet[0] = 0xff;
510 pAd->CommonCfg.HtCapability.MCSSet[1] = 0x00;
511 break;
512
513 case 2:
514 pAd->CommonCfg.HtCapability.MCSSet[0] = 0xff;
515 pAd->CommonCfg.HtCapability.MCSSet[1] = 0xff;
516 break;
517
518 case 3: /* 3*3 */
519 pAd->CommonCfg.HtCapability.MCSSet[0] = 0xff;
520 pAd->CommonCfg.HtCapability.MCSSet[1] = 0xff;
521 pAd->CommonCfg.HtCapability.MCSSet[2] = 0xff;
522 break;
523 }
524
525 if (pAd->CommonCfg.bForty_Mhz_Intolerant
526 && (pAd->CommonCfg.Channel <= 14) && (pHTPhyMode->BW == BW_40)) {
527 pHTPhyMode->BW = BW_20;
528 pAd->CommonCfg.HtCapability.HtCapInfo.Forty_Mhz_Intolerant = 1;
529 }
530
531 if (pHTPhyMode->BW == BW_40) {
532 pAd->CommonCfg.HtCapability.MCSSet[4] = 0x1; /* MCS 32 */
533 pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth = 1;
534 if (pAd->CommonCfg.Channel <= 14)
535 pAd->CommonCfg.HtCapability.HtCapInfo.CCKmodein40 = 1;
536
537 pAd->CommonCfg.DesiredHtPhy.ChannelWidth = 1;
538 pAd->CommonCfg.AddHTInfo.AddHtInfo.RecomWidth = 1;
539 pAd->CommonCfg.AddHTInfo.AddHtInfo.ExtChanOffset =
540 (pHTPhyMode->ExtOffset ==
541 EXTCHA_BELOW) ? (EXTCHA_BELOW) : EXTCHA_ABOVE;
542 /* Set Regsiter for extension channel position. */
543 RTMP_IO_READ32(pAd, TX_BAND_CFG, &Value);
544 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &BBP3Value);
545 if ((pHTPhyMode->ExtOffset == EXTCHA_BELOW)) {
546 Value |= 0x1;
547 BBP3Value |= (0x20);
548 RTMP_IO_WRITE32(pAd, TX_BAND_CFG, Value);
549 } else if ((pHTPhyMode->ExtOffset == EXTCHA_ABOVE)) {
550 Value &= 0xfe;
551 BBP3Value &= (~0x20);
552 RTMP_IO_WRITE32(pAd, TX_BAND_CFG, Value);
553 }
554 /* Turn on BBP 40MHz mode now only as AP . */
555 /* Sta can turn on BBP 40MHz after connection with 40MHz AP. Sta only broadcast 40MHz capability before connection. */
556 if ((pAd->OpMode == OPMODE_AP) || INFRA_ON(pAd) || ADHOC_ON(pAd)
557 ) {
558 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &BBPValue);
559 BBPValue &= (~0x18);
560 BBPValue |= 0x10;
561 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, BBPValue);
562
563 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, BBP3Value);
564 pAd->CommonCfg.BBPCurrentBW = BW_40;
565 }
566 } else {
567 pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth = 0;
568 pAd->CommonCfg.DesiredHtPhy.ChannelWidth = 0;
569 pAd->CommonCfg.AddHTInfo.AddHtInfo.RecomWidth = 0;
570 pAd->CommonCfg.AddHTInfo.AddHtInfo.ExtChanOffset = EXTCHA_NONE;
571 pAd->CommonCfg.CentralChannel = pAd->CommonCfg.Channel;
572 /* Turn on BBP 20MHz mode by request here. */
573 {
574 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &BBPValue);
575 BBPValue &= (~0x18);
576 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, BBPValue);
577 pAd->CommonCfg.BBPCurrentBW = BW_20;
578 }
579 }
580
581 if (pHTPhyMode->STBC == STBC_USE) {
582 pAd->CommonCfg.HtCapability.HtCapInfo.TxSTBC = 1;
583 pAd->CommonCfg.DesiredHtPhy.TxSTBC = 1;
584 pAd->CommonCfg.HtCapability.HtCapInfo.RxSTBC = 1;
585 pAd->CommonCfg.DesiredHtPhy.RxSTBC = 1;
586 } else {
587 pAd->CommonCfg.DesiredHtPhy.TxSTBC = 0;
588 pAd->CommonCfg.DesiredHtPhy.RxSTBC = 0;
589 }
590
591 if (pHTPhyMode->SHORTGI == GI_400) {
592 pAd->CommonCfg.HtCapability.HtCapInfo.ShortGIfor20 = 1;
593 pAd->CommonCfg.HtCapability.HtCapInfo.ShortGIfor40 = 1;
594 pAd->CommonCfg.DesiredHtPhy.ShortGIfor20 = 1;
595 pAd->CommonCfg.DesiredHtPhy.ShortGIfor40 = 1;
596 } else {
597 pAd->CommonCfg.HtCapability.HtCapInfo.ShortGIfor20 = 0;
598 pAd->CommonCfg.HtCapability.HtCapInfo.ShortGIfor40 = 0;
599 pAd->CommonCfg.DesiredHtPhy.ShortGIfor20 = 0;
600 pAd->CommonCfg.DesiredHtPhy.ShortGIfor40 = 0;
601 }
602
603 /* We support link adaptation for unsolicit MCS feedback, set to 2. */
604 pAd->CommonCfg.HtCapability.ExtHtCapInfo.MCSFeedback = MCSFBK_NONE; /*MCSFBK_UNSOLICIT; */
605 pAd->CommonCfg.AddHTInfo.ControlChan = pAd->CommonCfg.Channel;
606 /* 1, the extension channel above the control channel. */
607
608 /* EDCA parameters used for AP's own transmission */
609 if (pAd->CommonCfg.APEdcaParm.bValid == FALSE) {
610 pAd->CommonCfg.APEdcaParm.bValid = TRUE;
611 pAd->CommonCfg.APEdcaParm.Aifsn[0] = 3;
612 pAd->CommonCfg.APEdcaParm.Aifsn[1] = 7;
613 pAd->CommonCfg.APEdcaParm.Aifsn[2] = 1;
614 pAd->CommonCfg.APEdcaParm.Aifsn[3] = 1;
615
616 pAd->CommonCfg.APEdcaParm.Cwmin[0] = 4;
617 pAd->CommonCfg.APEdcaParm.Cwmin[1] = 4;
618 pAd->CommonCfg.APEdcaParm.Cwmin[2] = 3;
619 pAd->CommonCfg.APEdcaParm.Cwmin[3] = 2;
620
621 pAd->CommonCfg.APEdcaParm.Cwmax[0] = 6;
622 pAd->CommonCfg.APEdcaParm.Cwmax[1] = 10;
623 pAd->CommonCfg.APEdcaParm.Cwmax[2] = 4;
624 pAd->CommonCfg.APEdcaParm.Cwmax[3] = 3;
625
626 pAd->CommonCfg.APEdcaParm.Txop[0] = 0;
627 pAd->CommonCfg.APEdcaParm.Txop[1] = 0;
628 pAd->CommonCfg.APEdcaParm.Txop[2] = 94;
629 pAd->CommonCfg.APEdcaParm.Txop[3] = 47;
630 }
631 AsicSetEdcaParm(pAd, &pAd->CommonCfg.APEdcaParm);
632
633 {
634 RTMPSetIndividualHT(pAd, 0);
635 }
636
637 }
638
639 /*
640 ========================================================================
641 Routine Description:
642 Caller ensures we has 802.11n support.
643 Calls at setting HT from AP/STASetinformation
644
645 Arguments:
646 pAd - Pointer to our adapter
647 phymode -
648
649 ========================================================================
650 */
RTMPSetIndividualHT(struct rt_rtmp_adapter * pAd,u8 apidx)651 void RTMPSetIndividualHT(struct rt_rtmp_adapter *pAd, u8 apidx)
652 {
653 struct rt_ht_phy_info *pDesired_ht_phy = NULL;
654 u8 TxStream = pAd->CommonCfg.TxStream;
655 u8 DesiredMcs = MCS_AUTO;
656
657 do {
658 {
659 pDesired_ht_phy = &pAd->StaCfg.DesiredHtPhyInfo;
660 DesiredMcs =
661 pAd->StaCfg.DesiredTransmitSetting.field.MCS;
662 /*pAd->StaCfg.bAutoTxRateSwitch = (DesiredMcs == MCS_AUTO) ? TRUE : FALSE; */
663 break;
664 }
665 } while (FALSE);
666
667 if (pDesired_ht_phy == NULL) {
668 DBGPRINT(RT_DEBUG_ERROR,
669 ("RTMPSetIndividualHT: invalid apidx(%d)\n", apidx));
670 return;
671 }
672 RTMPZeroMemory(pDesired_ht_phy, sizeof(struct rt_ht_phy_info));
673
674 DBGPRINT(RT_DEBUG_TRACE,
675 ("RTMPSetIndividualHT : Desired MCS = %d\n", DesiredMcs));
676 /* Check the validity of MCS */
677 if ((TxStream == 1)
678 && ((DesiredMcs >= MCS_8) && (DesiredMcs <= MCS_15))) {
679 DBGPRINT(RT_DEBUG_WARN,
680 ("RTMPSetIndividualHT: MCS(%d) is invalid in 1S, reset it as MCS_7\n",
681 DesiredMcs));
682 DesiredMcs = MCS_7;
683 }
684
685 if ((pAd->CommonCfg.DesiredHtPhy.ChannelWidth == BW_20)
686 && (DesiredMcs == MCS_32)) {
687 DBGPRINT(RT_DEBUG_WARN,
688 ("RTMPSetIndividualHT: MCS_32 is only supported in 40-MHz, reset it as MCS_0\n"));
689 DesiredMcs = MCS_0;
690 }
691
692 pDesired_ht_phy->bHtEnable = TRUE;
693
694 /* Decide desired Tx MCS */
695 switch (TxStream) {
696 case 1:
697 if (DesiredMcs == MCS_AUTO) {
698 pDesired_ht_phy->MCSSet[0] = 0xff;
699 pDesired_ht_phy->MCSSet[1] = 0x00;
700 } else if (DesiredMcs <= MCS_7) {
701 pDesired_ht_phy->MCSSet[0] = 1 << DesiredMcs;
702 pDesired_ht_phy->MCSSet[1] = 0x00;
703 }
704 break;
705
706 case 2:
707 if (DesiredMcs == MCS_AUTO) {
708 pDesired_ht_phy->MCSSet[0] = 0xff;
709 pDesired_ht_phy->MCSSet[1] = 0xff;
710 } else if (DesiredMcs <= MCS_15) {
711 unsigned long mode;
712
713 mode = DesiredMcs / 8;
714 if (mode < 2)
715 pDesired_ht_phy->MCSSet[mode] =
716 (1 << (DesiredMcs - mode * 8));
717 }
718 break;
719
720 case 3: /* 3*3 */
721 if (DesiredMcs == MCS_AUTO) {
722 /* MCS0 ~ MCS23, 3 bytes */
723 pDesired_ht_phy->MCSSet[0] = 0xff;
724 pDesired_ht_phy->MCSSet[1] = 0xff;
725 pDesired_ht_phy->MCSSet[2] = 0xff;
726 } else if (DesiredMcs <= MCS_23) {
727 unsigned long mode;
728
729 mode = DesiredMcs / 8;
730 if (mode < 3)
731 pDesired_ht_phy->MCSSet[mode] =
732 (1 << (DesiredMcs - mode * 8));
733 }
734 break;
735 }
736
737 if (pAd->CommonCfg.DesiredHtPhy.ChannelWidth == BW_40) {
738 if (DesiredMcs == MCS_AUTO || DesiredMcs == MCS_32)
739 pDesired_ht_phy->MCSSet[4] = 0x1;
740 }
741 /* update HT Rate setting */
742 if (pAd->OpMode == OPMODE_STA)
743 MlmeUpdateHtTxRates(pAd, BSS0);
744 else
745 MlmeUpdateHtTxRates(pAd, apidx);
746 }
747
748 /*
749 ========================================================================
750 Routine Description:
751 Update HT IE from our capability.
752
753 Arguments:
754 Send all HT IE in beacon/probe rsp/assoc rsp/action frame.
755
756 ========================================================================
757 */
RTMPUpdateHTIE(struct rt_ht_capability * pRtHt,u8 * pMcsSet,struct rt_ht_capability_ie * pHtCapability,struct rt_add_ht_info_ie * pAddHtInfo)758 void RTMPUpdateHTIE(struct rt_ht_capability *pRtHt,
759 u8 * pMcsSet,
760 struct rt_ht_capability_ie * pHtCapability,
761 struct rt_add_ht_info_ie * pAddHtInfo)
762 {
763 RTMPZeroMemory(pHtCapability, sizeof(struct rt_ht_capability_ie));
764 RTMPZeroMemory(pAddHtInfo, sizeof(struct rt_add_ht_info_ie));
765
766 pHtCapability->HtCapInfo.ChannelWidth = pRtHt->ChannelWidth;
767 pHtCapability->HtCapInfo.MimoPs = pRtHt->MimoPs;
768 pHtCapability->HtCapInfo.GF = pRtHt->GF;
769 pHtCapability->HtCapInfo.ShortGIfor20 = pRtHt->ShortGIfor20;
770 pHtCapability->HtCapInfo.ShortGIfor40 = pRtHt->ShortGIfor40;
771 pHtCapability->HtCapInfo.TxSTBC = pRtHt->TxSTBC;
772 pHtCapability->HtCapInfo.RxSTBC = pRtHt->RxSTBC;
773 pHtCapability->HtCapInfo.AMsduSize = pRtHt->AmsduSize;
774 pHtCapability->HtCapParm.MaxRAmpduFactor = pRtHt->MaxRAmpduFactor;
775 pHtCapability->HtCapParm.MpduDensity = pRtHt->MpduDensity;
776
777 pAddHtInfo->AddHtInfo.ExtChanOffset = pRtHt->ExtChanOffset;
778 pAddHtInfo->AddHtInfo.RecomWidth = pRtHt->RecomWidth;
779 pAddHtInfo->AddHtInfo2.OperaionMode = pRtHt->OperaionMode;
780 pAddHtInfo->AddHtInfo2.NonGfPresent = pRtHt->NonGfPresent;
781 RTMPMoveMemory(pAddHtInfo->MCSSet, /*pRtHt->MCSSet */ pMcsSet, 4); /* rt2860 only support MCS max=32, no need to copy all 16 uchar. */
782
783 DBGPRINT(RT_DEBUG_TRACE, ("RTMPUpdateHTIE <== \n"));
784 }
785
786 /*
787 ========================================================================
788 Description:
789 Add Client security information into ASIC WCID table and IVEIV table.
790 Return:
791 ========================================================================
792 */
RTMPAddWcidAttributeEntry(struct rt_rtmp_adapter * pAd,u8 BssIdx,u8 KeyIdx,u8 CipherAlg,struct rt_mac_table_entry * pEntry)793 void RTMPAddWcidAttributeEntry(struct rt_rtmp_adapter *pAd,
794 u8 BssIdx,
795 u8 KeyIdx,
796 u8 CipherAlg, struct rt_mac_table_entry *pEntry)
797 {
798 u32 WCIDAttri = 0;
799 u16 offset;
800 u8 IVEIV = 0;
801 u16 Wcid = 0;
802
803 {
804 {
805 if (BssIdx > BSS0) {
806 DBGPRINT(RT_DEBUG_ERROR,
807 ("RTMPAddWcidAttributeEntry: The BSS-index(%d) is out of range for Infra link. \n",
808 BssIdx));
809 return;
810 }
811 /* 1. In ADHOC mode, the AID is wcid number. And NO mesh link exists. */
812 /* 2. In Infra mode, the AID:1 MUST be wcid of infra STA. */
813 /* the AID:2~ assign to mesh link entry. */
814 if (pEntry)
815 Wcid = pEntry->Aid;
816 else
817 Wcid = MCAST_WCID;
818 }
819 }
820
821 /* Update WCID attribute table */
822 offset = MAC_WCID_ATTRIBUTE_BASE + (Wcid * HW_WCID_ATTRI_SIZE);
823
824 {
825 if (pEntry && pEntry->ValidAsMesh)
826 WCIDAttri = (CipherAlg << 1) | PAIRWISEKEYTABLE;
827 else
828 WCIDAttri = (CipherAlg << 1) | SHAREDKEYTABLE;
829 }
830
831 RTMP_IO_WRITE32(pAd, offset, WCIDAttri);
832
833 /* Update IV/EIV table */
834 offset = MAC_IVEIV_TABLE_BASE + (Wcid * HW_IVEIV_ENTRY_SIZE);
835
836 /* WPA mode */
837 if ((CipherAlg == CIPHER_TKIP) || (CipherAlg == CIPHER_TKIP_NO_MIC)
838 || (CipherAlg == CIPHER_AES)) {
839 /* Eiv bit on. keyid always is 0 for pairwise key */
840 IVEIV = (KeyIdx << 6) | 0x20;
841 } else {
842 /* WEP KeyIdx is default tx key. */
843 IVEIV = (KeyIdx << 6);
844 }
845
846 /* For key index and ext IV bit, so only need to update the position(offset+3). */
847 #ifdef RTMP_MAC_PCI
848 RTMP_IO_WRITE8(pAd, offset + 3, IVEIV);
849 #endif /* RTMP_MAC_PCI // */
850 #ifdef RTMP_MAC_USB
851 RTUSBMultiWrite_OneByte(pAd, offset + 3, &IVEIV);
852 #endif /* RTMP_MAC_USB // */
853
854 DBGPRINT(RT_DEBUG_TRACE,
855 ("RTMPAddWcidAttributeEntry: WCID #%d, KeyIndex #%d, Alg=%s\n",
856 Wcid, KeyIdx, CipherName[CipherAlg]));
857 DBGPRINT(RT_DEBUG_TRACE, (" WCIDAttri = 0x%x \n", WCIDAttri));
858
859 }
860
861 /*
862 ==========================================================================
863 Description:
864 Parse encryption type
865 Arguments:
866 pAdapter Pointer to our adapter
867 wrq Pointer to the ioctl argument
868
869 Return Value:
870 None
871
872 Note:
873 ==========================================================================
874 */
GetEncryptType(char enc)875 char *GetEncryptType(char enc)
876 {
877 if (enc == Ndis802_11WEPDisabled)
878 return "NONE";
879 if (enc == Ndis802_11WEPEnabled)
880 return "WEP";
881 if (enc == Ndis802_11Encryption2Enabled)
882 return "TKIP";
883 if (enc == Ndis802_11Encryption3Enabled)
884 return "AES";
885 if (enc == Ndis802_11Encryption4Enabled)
886 return "TKIPAES";
887 else
888 return "UNKNOW";
889 }
890
GetAuthMode(char auth)891 char *GetAuthMode(char auth)
892 {
893 if (auth == Ndis802_11AuthModeOpen)
894 return "OPEN";
895 if (auth == Ndis802_11AuthModeShared)
896 return "SHARED";
897 if (auth == Ndis802_11AuthModeAutoSwitch)
898 return "AUTOWEP";
899 if (auth == Ndis802_11AuthModeWPA)
900 return "WPA";
901 if (auth == Ndis802_11AuthModeWPAPSK)
902 return "WPAPSK";
903 if (auth == Ndis802_11AuthModeWPANone)
904 return "WPANONE";
905 if (auth == Ndis802_11AuthModeWPA2)
906 return "WPA2";
907 if (auth == Ndis802_11AuthModeWPA2PSK)
908 return "WPA2PSK";
909 if (auth == Ndis802_11AuthModeWPA1WPA2)
910 return "WPA1WPA2";
911 if (auth == Ndis802_11AuthModeWPA1PSKWPA2PSK)
912 return "WPA1PSKWPA2PSK";
913
914 return "UNKNOW";
915 }
916
SetCommonHT(struct rt_rtmp_adapter * pAd)917 int SetCommonHT(struct rt_rtmp_adapter *pAd)
918 {
919 struct rt_oid_set_ht_phymode SetHT;
920
921 if (pAd->CommonCfg.PhyMode < PHY_11ABGN_MIXED)
922 return FALSE;
923
924 SetHT.PhyMode = pAd->CommonCfg.PhyMode;
925 SetHT.TransmitNo = ((u8)pAd->Antenna.field.TxPath);
926 SetHT.HtMode = (u8)pAd->CommonCfg.RegTransmitSetting.field.HTMODE;
927 SetHT.ExtOffset =
928 (u8)pAd->CommonCfg.RegTransmitSetting.field.EXTCHA;
929 SetHT.MCS = MCS_AUTO;
930 SetHT.BW = (u8)pAd->CommonCfg.RegTransmitSetting.field.BW;
931 SetHT.STBC = (u8)pAd->CommonCfg.RegTransmitSetting.field.STBC;
932 SetHT.SHORTGI = (u8)pAd->CommonCfg.RegTransmitSetting.field.ShortGI;
933
934 RTMPSetHT(pAd, &SetHT);
935
936 return TRUE;
937 }
938
RTMPGetRalinkEncryModeStr(u16 encryMode)939 char *RTMPGetRalinkEncryModeStr(u16 encryMode)
940 {
941 switch (encryMode) {
942 case Ndis802_11WEPDisabled:
943 return "NONE";
944 case Ndis802_11WEPEnabled:
945 return "WEP";
946 case Ndis802_11Encryption2Enabled:
947 return "TKIP";
948 case Ndis802_11Encryption3Enabled:
949 return "AES";
950 case Ndis802_11Encryption4Enabled:
951 return "TKIPAES";
952 default:
953 return "UNKNOW";
954 }
955 }
956