2
*************************************************************************
4
* 5F., No.36, Taiyuan St., Jhubei City,
8
* (c) Copyright 2002-2007, Ralink Technology, Inc.
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. *
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. *
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. *
25
*************************************************************************
28
#include <linux/sched.h>
29
#include "../rt_config.h"
32
========================================================================
35
Remove WPA Key process
38
pAd Pointer to our adapter
39
pBuf Pointer to the where the key stored
42
NDIS_SUCCESS Add key successfully
48
========================================================================
50
void RTMPSetDesiredRates(struct rt_rtmp_adapter *pAdapter, long Rates)
52
NDIS_802_11_RATES aryRates;
54
memset(&aryRates, 0x00, sizeof(NDIS_802_11_RATES));
55
switch (pAdapter->CommonCfg.PhyMode) {
56
case PHY_11A: /* A only */
59
aryRates[0] = 0x0c; /* 6M */
60
pAdapter->StaCfg.DesiredTransmitSetting.field.MCS =
64
aryRates[0] = 0x12; /* 9M */
65
pAdapter->StaCfg.DesiredTransmitSetting.field.MCS =
68
case 12000000: /*12M */
69
aryRates[0] = 0x18; /* 12M */
70
pAdapter->StaCfg.DesiredTransmitSetting.field.MCS =
73
case 18000000: /*18M */
74
aryRates[0] = 0x24; /* 18M */
75
pAdapter->StaCfg.DesiredTransmitSetting.field.MCS =
78
case 24000000: /*24M */
79
aryRates[0] = 0x30; /* 24M */
80
pAdapter->StaCfg.DesiredTransmitSetting.field.MCS =
83
case 36000000: /*36M */
84
aryRates[0] = 0x48; /* 36M */
85
pAdapter->StaCfg.DesiredTransmitSetting.field.MCS =
88
case 48000000: /*48M */
89
aryRates[0] = 0x60; /* 48M */
90
pAdapter->StaCfg.DesiredTransmitSetting.field.MCS =
93
case 54000000: /*54M */
94
aryRates[0] = 0x6c; /* 54M */
95
pAdapter->StaCfg.DesiredTransmitSetting.field.MCS =
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 =
113
case PHY_11BG_MIXED: /* B/G Mixed */
114
case PHY_11B: /* B only */
115
case PHY_11ABG_MIXED: /* A/B/G Mixed */
118
case 1000000: /*1M */
120
pAdapter->StaCfg.DesiredTransmitSetting.field.MCS =
123
case 2000000: /*2M */
125
pAdapter->StaCfg.DesiredTransmitSetting.field.MCS =
128
case 5000000: /*5.5M */
129
aryRates[0] = 0x0b; /* 5.5M */
130
pAdapter->StaCfg.DesiredTransmitSetting.field.MCS =
133
case 11000000: /*11M */
134
aryRates[0] = 0x16; /* 11M */
135
pAdapter->StaCfg.DesiredTransmitSetting.field.MCS =
138
case 6000000: /*6M */
139
aryRates[0] = 0x0c; /* 6M */
140
pAdapter->StaCfg.DesiredTransmitSetting.field.MCS =
143
case 9000000: /*9M */
144
aryRates[0] = 0x12; /* 9M */
145
pAdapter->StaCfg.DesiredTransmitSetting.field.MCS =
148
case 12000000: /*12M */
149
aryRates[0] = 0x18; /* 12M */
150
pAdapter->StaCfg.DesiredTransmitSetting.field.MCS =
153
case 18000000: /*18M */
154
aryRates[0] = 0x24; /* 18M */
155
pAdapter->StaCfg.DesiredTransmitSetting.field.MCS =
158
case 24000000: /*24M */
159
aryRates[0] = 0x30; /* 24M */
160
pAdapter->StaCfg.DesiredTransmitSetting.field.MCS =
163
case 36000000: /*36M */
164
aryRates[0] = 0x48; /* 36M */
165
pAdapter->StaCfg.DesiredTransmitSetting.field.MCS =
168
case 48000000: /*48M */
169
aryRates[0] = 0x60; /* 48M */
170
pAdapter->StaCfg.DesiredTransmitSetting.field.MCS =
173
case 54000000: /*54M */
174
aryRates[0] = 0x6c; /* 54M */
175
pAdapter->StaCfg.DesiredTransmitSetting.field.MCS =
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 */
195
pAdapter->StaCfg.DesiredTransmitSetting.field.MCS =
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);
221
========================================================================
227
pAd Pointer to our adapter
232
IRQL = DISPATCH_LEVEL
236
========================================================================
238
void RTMPWPARemoveAllKeys(struct rt_rtmp_adapter *pAd)
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)
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)
257
/* set BSSID wcid entry of the Pair-wise Key table as no-security mode */
258
AsicRemovePairwiseKeyEntry(pAd, BSS0, BSSID_WCID);
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));
267
AsicRemoveSharedKeyEntry(pAd, BSS0, i);
269
RTMP_SET_PSFLAG(pAd, fRTMP_PS_CAN_GO_SLEEP);
273
========================================================================
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.
283
pAd Pointer to our adapter
284
pKey Pointer to the where the key stored
287
NDIS_SUCCESS Add key successfully
289
IRQL = DISPATCH_LEVEL
293
========================================================================
296
========================================================================
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
302
pAd - Pointer to our adapter
306
IRQL = DISPATCH_LEVEL
308
========================================================================
310
void RTMPSetPhyMode(struct rt_rtmp_adapter *pAd, unsigned long phymode)
313
/* the selected phymode must be supported by the RF IC encoded in E2PROM */
315
/* if no change, do nothing */
317
if (pAd->CommonCfg.PhyMode == phymode)
320
pAd->CommonCfg.PhyMode = (u8)phymode;
322
DBGPRINT(RT_DEBUG_TRACE,
323
("RTMPSetPhyMode : PhyMode=%d, channel=%d \n",
324
pAd->CommonCfg.PhyMode, pAd->CommonCfg.Channel));
326
BuildChannelList(pAd);
328
/* sanity check user setting */
329
for (i = 0; i < pAd->ChannelListNum; i++) {
330
if (pAd->CommonCfg.Channel == pAd->ChannelList[i].Channel)
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));
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);
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 */
361
case PHY_11ABG_MIXED:
363
case PHY_11ABGN_MIXED:
364
case PHY_11BGN_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 */
396
case PHY_11AGN_MIXED:
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 */
423
pAd->CommonCfg.BandState = UNKNOWN_BAND;
427
========================================================================
429
Caller ensures we has 802.11n support.
430
Calls at setting HT from AP/STASetinformation
433
pAd - Pointer to our adapter
436
========================================================================
438
void RTMPSetHT(struct rt_rtmp_adapter *pAd, struct rt_oid_set_ht_phymode *pHTPhyMode)
440
/*unsigned long *pmcs; */
444
u8 RxStream = pAd->CommonCfg.RxStream;
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));
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));
461
if (pAd->CommonCfg.bRdg) {
462
pAd->CommonCfg.HtCapability.ExtHtCapInfo.PlusHTC = 1;
463
pAd->CommonCfg.HtCapability.ExtHtCapInfo.RDGSupport = 1;
465
pAd->CommonCfg.HtCapability.ExtHtCapInfo.PlusHTC = 0;
466
pAd->CommonCfg.HtCapability.ExtHtCapInfo.RDGSupport = 0;
469
pAd->CommonCfg.HtCapability.HtCapParm.MaxRAmpduFactor = 3;
470
pAd->CommonCfg.DesiredHtPhy.MaxRAmpduFactor = 3;
472
DBGPRINT(RT_DEBUG_TRACE,
473
("RTMPSetHT : RxBAWinLimit = %d\n",
474
pAd->CommonCfg.BACapability.field.RxBAWinLimit));
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;
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;
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));
500
if (pHTPhyMode->HtMode == HTMODE_GF) {
501
pAd->CommonCfg.HtCapability.HtCapInfo.GF = 1;
502
pAd->CommonCfg.DesiredHtPhy.GF = 1;
504
pAd->CommonCfg.DesiredHtPhy.GF = 0;
506
/* Decide Rx MCSSet */
509
pAd->CommonCfg.HtCapability.MCSSet[0] = 0xff;
510
pAd->CommonCfg.HtCapability.MCSSet[1] = 0x00;
514
pAd->CommonCfg.HtCapability.MCSSet[0] = 0xff;
515
pAd->CommonCfg.HtCapability.MCSSet[1] = 0xff;
519
pAd->CommonCfg.HtCapability.MCSSet[0] = 0xff;
520
pAd->CommonCfg.HtCapability.MCSSet[1] = 0xff;
521
pAd->CommonCfg.HtCapability.MCSSet[2] = 0xff;
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;
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;
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)) {
548
RTMP_IO_WRITE32(pAd, TX_BAND_CFG, Value);
549
} else if ((pHTPhyMode->ExtOffset == EXTCHA_ABOVE)) {
551
BBP3Value &= (~0x20);
552
RTMP_IO_WRITE32(pAd, TX_BAND_CFG, Value);
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)
558
RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &BBPValue);
561
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, BBPValue);
563
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, BBP3Value);
564
pAd->CommonCfg.BBPCurrentBW = BW_40;
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. */
574
RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &BBPValue);
576
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, BBPValue);
577
pAd->CommonCfg.BBPCurrentBW = BW_20;
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;
587
pAd->CommonCfg.DesiredHtPhy.TxSTBC = 0;
588
pAd->CommonCfg.DesiredHtPhy.RxSTBC = 0;
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;
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;
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. */
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;
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;
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;
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;
631
AsicSetEdcaParm(pAd, &pAd->CommonCfg.APEdcaParm);
634
RTMPSetIndividualHT(pAd, 0);
640
========================================================================
642
Caller ensures we has 802.11n support.
643
Calls at setting HT from AP/STASetinformation
646
pAd - Pointer to our adapter
649
========================================================================
651
void RTMPSetIndividualHT(struct rt_rtmp_adapter *pAd, u8 apidx)
653
struct rt_ht_phy_info *pDesired_ht_phy = NULL;
654
u8 TxStream = pAd->CommonCfg.TxStream;
655
u8 DesiredMcs = MCS_AUTO;
659
pDesired_ht_phy = &pAd->StaCfg.DesiredHtPhyInfo;
661
pAd->StaCfg.DesiredTransmitSetting.field.MCS;
662
/*pAd->StaCfg.bAutoTxRateSwitch = (DesiredMcs == MCS_AUTO) ? TRUE : FALSE; */
667
if (pDesired_ht_phy == NULL) {
668
DBGPRINT(RT_DEBUG_ERROR,
669
("RTMPSetIndividualHT: invalid apidx(%d)\n", apidx));
672
RTMPZeroMemory(pDesired_ht_phy, sizeof(struct rt_ht_phy_info));
674
DBGPRINT(RT_DEBUG_TRACE,
675
("RTMPSetIndividualHT : Desired MCS = %d\n", DesiredMcs));
676
/* Check the validity of MCS */
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",
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"));
692
pDesired_ht_phy->bHtEnable = TRUE;
694
/* Decide desired Tx MCS */
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;
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) {
713
mode = DesiredMcs / 8;
715
pDesired_ht_phy->MCSSet[mode] =
716
(1 << (DesiredMcs - mode * 8));
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) {
729
mode = DesiredMcs / 8;
731
pDesired_ht_phy->MCSSet[mode] =
732
(1 << (DesiredMcs - mode * 8));
737
if (pAd->CommonCfg.DesiredHtPhy.ChannelWidth == BW_40) {
738
if (DesiredMcs == MCS_AUTO || DesiredMcs == MCS_32)
739
pDesired_ht_phy->MCSSet[4] = 0x1;
741
/* update HT Rate setting */
742
if (pAd->OpMode == OPMODE_STA)
743
MlmeUpdateHtTxRates(pAd, BSS0);
745
MlmeUpdateHtTxRates(pAd, apidx);
749
========================================================================
751
Update HT IE from our capability.
754
Send all HT IE in beacon/probe rsp/assoc rsp/action frame.
756
========================================================================
758
void RTMPUpdateHTIE(struct rt_ht_capability *pRtHt,
760
struct rt_ht_capability_ie * pHtCapability,
761
struct rt_add_ht_info_ie * pAddHtInfo)
763
RTMPZeroMemory(pHtCapability, sizeof(struct rt_ht_capability_ie));
764
RTMPZeroMemory(pAddHtInfo, sizeof(struct rt_add_ht_info_ie));
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;
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. */
783
DBGPRINT(RT_DEBUG_TRACE, ("RTMPUpdateHTIE <== \n"));
787
========================================================================
789
Add Client security information into ASIC WCID table and IVEIV table.
791
========================================================================
793
void RTMPAddWcidAttributeEntry(struct rt_rtmp_adapter *pAd,
796
u8 CipherAlg, struct rt_mac_table_entry *pEntry)
806
DBGPRINT(RT_DEBUG_ERROR,
807
("RTMPAddWcidAttributeEntry: The BSS-index(%d) is out of range for Infra link. \n",
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. */
821
/* Update WCID attribute table */
822
offset = MAC_WCID_ATTRIBUTE_BASE + (Wcid * HW_WCID_ATTRI_SIZE);
825
if (pEntry && pEntry->ValidAsMesh)
826
WCIDAttri = (CipherAlg << 1) | PAIRWISEKEYTABLE;
828
WCIDAttri = (CipherAlg << 1) | SHAREDKEYTABLE;
831
RTMP_IO_WRITE32(pAd, offset, WCIDAttri);
833
/* Update IV/EIV table */
834
offset = MAC_IVEIV_TABLE_BASE + (Wcid * HW_IVEIV_ENTRY_SIZE);
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;
842
/* WEP KeyIdx is default tx key. */
843
IVEIV = (KeyIdx << 6);
846
/* For key index and ext IV bit, so only need to update the position(offset+3). */
848
RTMP_IO_WRITE8(pAd, offset + 3, IVEIV);
849
#endif /* RTMP_MAC_PCI // */
851
RTUSBMultiWrite_OneByte(pAd, offset + 3, &IVEIV);
852
#endif /* RTMP_MAC_USB // */
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));
862
==========================================================================
864
Parse encryption type
866
pAdapter Pointer to our adapter
867
wrq Pointer to the ioctl argument
873
==========================================================================
875
char *GetEncryptType(char enc)
877
if (enc == Ndis802_11WEPDisabled)
879
if (enc == Ndis802_11WEPEnabled)
881
if (enc == Ndis802_11Encryption2Enabled)
883
if (enc == Ndis802_11Encryption3Enabled)
885
if (enc == Ndis802_11Encryption4Enabled)
891
char *GetAuthMode(char auth)
893
if (auth == Ndis802_11AuthModeOpen)
895
if (auth == Ndis802_11AuthModeShared)
897
if (auth == Ndis802_11AuthModeAutoSwitch)
899
if (auth == Ndis802_11AuthModeWPA)
901
if (auth == Ndis802_11AuthModeWPAPSK)
903
if (auth == Ndis802_11AuthModeWPANone)
905
if (auth == Ndis802_11AuthModeWPA2)
907
if (auth == Ndis802_11AuthModeWPA2PSK)
909
if (auth == Ndis802_11AuthModeWPA1WPA2)
911
if (auth == Ndis802_11AuthModeWPA1PSKWPA2PSK)
912
return "WPA1PSKWPA2PSK";
917
int SetCommonHT(struct rt_rtmp_adapter *pAd)
919
struct rt_oid_set_ht_phymode SetHT;
921
if (pAd->CommonCfg.PhyMode < PHY_11ABGN_MIXED)
924
SetHT.PhyMode = pAd->CommonCfg.PhyMode;
925
SetHT.TransmitNo = ((u8)pAd->Antenna.field.TxPath);
926
SetHT.HtMode = (u8)pAd->CommonCfg.RegTransmitSetting.field.HTMODE;
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;
934
RTMPSetHT(pAd, &SetHT);
939
char *RTMPGetRalinkEncryModeStr(u16 encryMode)
942
case Ndis802_11WEPDisabled:
944
case Ndis802_11WEPEnabled:
946
case Ndis802_11Encryption2Enabled:
948
case Ndis802_11Encryption3Enabled:
950
case Ndis802_11Encryption4Enabled: