]> rtime.felk.cvut.cz Git - mcf548x/linux.git/blob - drivers/staging/rt2860/common/cmm_info.c
Initial 2.6.37
[mcf548x/linux.git] / drivers / staging / rt2860 / common / cmm_info.c
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 */
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 */
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 */
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 */
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 */
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 */
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 */
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 */
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
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
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
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 }