1
2
3#include "ieee80211.h"
4#include "rtl819x_HT.h"
5u8 MCS_FILTER_ALL[16] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
6
7u8 MCS_FILTER_1SS[16] = {0xff, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
8
9u16 MCS_DATA_RATE[2][2][77] =
10 { { {13, 26, 39, 52, 78, 104, 117, 130, 26, 52, 78 ,104, 156, 208, 234, 260,
11 39, 78, 117, 234, 312, 351, 390, 52, 104, 156, 208, 312, 416, 468, 520,
12 0, 78, 104, 130, 117, 156, 195, 104, 130, 130, 156, 182, 182, 208, 156, 195,
13 195, 234, 273, 273, 312, 130, 156, 181, 156, 181, 208, 234, 208, 234, 260, 260,
14 286, 195, 234, 273, 234, 273, 312, 351, 312, 351, 390, 390, 429},
15 {14, 29, 43, 58, 87, 116, 130, 144, 29, 58, 87, 116, 173, 231, 260, 289,
16 43, 87, 130, 173, 260, 347, 390, 433, 58, 116, 173, 231, 347, 462, 520, 578,
17 0, 87, 116, 144, 130, 173, 217, 116, 144, 144, 173, 202, 202, 231, 173, 217,
18 217, 260, 303, 303, 347, 144, 173, 202, 173, 202, 231, 260, 231, 260, 289, 289,
19 318, 217, 260, 303, 260, 303, 347, 390, 347, 390, 433, 433, 477} },
20 { {27, 54, 81, 108, 162, 216, 243, 270, 54, 108, 162, 216, 324, 432, 486, 540,
21 81, 162, 243, 324, 486, 648, 729, 810, 108, 216, 324, 432, 648, 864, 972, 1080,
22 12, 162, 216, 270, 243, 324, 405, 216, 270, 270, 324, 378, 378, 432, 324, 405,
23 405, 486, 567, 567, 648, 270, 324, 378, 324, 378, 432, 486, 432, 486, 540, 540,
24 594, 405, 486, 567, 486, 567, 648, 729, 648, 729, 810, 810, 891},
25 {30, 60, 90, 120, 180, 240, 270, 300, 60, 120, 180, 240, 360, 480, 540, 600,
26 90, 180, 270, 360, 540, 720, 810, 900, 120, 240, 360, 480, 720, 960, 1080, 1200,
27 13, 180, 240, 300, 270, 360, 450, 240, 300, 300, 360, 420, 420, 480, 360, 450,
28 450, 540, 630, 630, 720, 300, 360, 420, 360, 420, 480, 540, 480, 540, 600, 600,
29 660, 450, 540, 630, 540, 630, 720, 810, 720, 810, 900, 900, 990} }
30 };
31
32static u8 UNKNOWN_BORADCOM[3] = {0x00, 0x14, 0xbf};
33static u8 LINKSYSWRT330_LINKSYSWRT300_BROADCOM[3] = {0x00, 0x1a, 0x70};
34static u8 LINKSYSWRT350_LINKSYSWRT150_BROADCOM[3] = {0x00, 0x1d, 0x7e};
35static u8 NETGEAR834Bv2_BROADCOM[3] = {0x00, 0x1b, 0x2f};
36static u8 BELKINF5D8233V1_RALINK[3] = {0x00, 0x17, 0x3f};
37static u8 BELKINF5D82334V3_RALINK[3] = {0x00, 0x1c, 0xdf};
38static u8 PCI_RALINK[3] = {0x00, 0x90, 0xcc};
39static u8 EDIMAX_RALINK[3] = {0x00, 0x0e, 0x2e};
40static u8 AIRLINK_RALINK[3] = {0x00, 0x18, 0x02};
41static u8 DLINK_ATHEROS[3] = {0x00, 0x1c, 0xf0};
42static u8 CISCO_BROADCOM[3] = {0x00, 0x17, 0x94};
43
44
45
46
47
48
49
50
51
52
53
54void HTUpdateDefaultSetting(struct ieee80211_device* ieee)
55{
56 PRT_HIGH_THROUGHPUT pHTInfo = ieee->pHTInfo;
57
58
59
60
61
62 pHTInfo->bRegShortGI20MHz= 1;
63 pHTInfo->bRegShortGI40MHz= 1;
64
65
66 pHTInfo->bRegBW40MHz = 1;
67
68
69 if(pHTInfo->bRegBW40MHz)
70 pHTInfo->bRegSuppCCK = 1;
71 else
72 pHTInfo->bRegSuppCCK = true;
73
74
75 pHTInfo->nAMSDU_MaxSize = 7935UL;
76 pHTInfo->bAMSDU_Support = 0;
77
78
79 pHTInfo->bAMPDUEnable = 1;
80 pHTInfo->AMPDU_Factor = 2;
81 pHTInfo->MPDU_Density = 0;
82
83
84 pHTInfo->SelfMimoPs = 3;
85 if(pHTInfo->SelfMimoPs == 2)
86 pHTInfo->SelfMimoPs = 3;
87
88 ieee->bTxDisableRateFallBack = 0;
89 ieee->bTxUseDriverAssingedRate = 0;
90
91#ifdef TO_DO_LIST
92
93 pMgntInfo->bTxEnableFwCalcDur = (BOOLEAN)pNdisCommon->bRegTxEnableFwCalcDur;
94#endif
95
96
97 pHTInfo->bRegRT2RTAggregation = 1;
98
99
100 pHTInfo->bRegRxReorderEnable = 1;
101 pHTInfo->RxReorderWinSize = 64;
102 pHTInfo->RxReorderPendingTime = 30;
103
104#ifdef USB_TX_DRIVER_AGGREGATION_ENABLE
105 pHTInfo->UsbTxAggrNum = 4;
106#endif
107#ifdef USB_RX_AGGREGATION_SUPPORT
108 pHTInfo->UsbRxFwAggrEn = 1;
109 pHTInfo->UsbRxFwAggrPageNum = 24;
110 pHTInfo->UsbRxFwAggrPacketNum = 8;
111 pHTInfo->UsbRxFwAggrTimeout = 16;
112#endif
113
114
115}
116
117
118
119
120
121
122
123
124void HTDebugHTCapability(u8* CapIE, u8* TitleString )
125{
126
127 static u8 EWC11NHTCap[] = {0x00, 0x90, 0x4c, 0x33};
128 PHT_CAPABILITY_ELE pCapELE;
129
130 if(!memcmp(CapIE, EWC11NHTCap, sizeof(EWC11NHTCap)))
131 {
132
133 IEEE80211_DEBUG(IEEE80211_DL_HT, "EWC IE in %s()\n", __FUNCTION__);
134 pCapELE = (PHT_CAPABILITY_ELE)(&CapIE[4]);
135 }else
136 pCapELE = (PHT_CAPABILITY_ELE)(&CapIE[0]);
137
138 IEEE80211_DEBUG(IEEE80211_DL_HT, "<Log HT Capability>. Called by %s\n", TitleString );
139
140 IEEE80211_DEBUG(IEEE80211_DL_HT, "\tSupported Channel Width = %s\n", (pCapELE->ChlWidth)?"20MHz": "20/40MHz");
141 IEEE80211_DEBUG(IEEE80211_DL_HT, "\tSupport Short GI for 20M = %s\n", (pCapELE->ShortGI20Mhz)?"YES": "NO");
142 IEEE80211_DEBUG(IEEE80211_DL_HT, "\tSupport Short GI for 40M = %s\n", (pCapELE->ShortGI40Mhz)?"YES": "NO");
143 IEEE80211_DEBUG(IEEE80211_DL_HT, "\tSupport TX STBC = %s\n", (pCapELE->TxSTBC)?"YES": "NO");
144 IEEE80211_DEBUG(IEEE80211_DL_HT, "\tMax AMSDU Size = %s\n", (pCapELE->MaxAMSDUSize)?"3839": "7935");
145 IEEE80211_DEBUG(IEEE80211_DL_HT, "\tSupport CCK in 20/40 mode = %s\n", (pCapELE->DssCCk)?"YES": "NO");
146 IEEE80211_DEBUG(IEEE80211_DL_HT, "\tMax AMPDU Factor = %d\n", pCapELE->MaxRxAMPDUFactor);
147 IEEE80211_DEBUG(IEEE80211_DL_HT, "\tMPDU Density = %d\n", pCapELE->MPDUDensity);
148 IEEE80211_DEBUG(IEEE80211_DL_HT, "\tMCS Rate Set = [%x][%x][%x][%x][%x]\n", pCapELE->MCS[0],\
149 pCapELE->MCS[1], pCapELE->MCS[2], pCapELE->MCS[3], pCapELE->MCS[4]);
150 return;
151
152}
153
154
155
156
157
158
159
160
161void HTDebugHTInfo(u8* InfoIE, u8* TitleString)
162{
163
164 static u8 EWC11NHTInfo[] = {0x00, 0x90, 0x4c, 0x34};
165 PHT_INFORMATION_ELE pHTInfoEle;
166
167 if(!memcmp(InfoIE, EWC11NHTInfo, sizeof(EWC11NHTInfo)))
168 {
169
170 IEEE80211_DEBUG(IEEE80211_DL_HT, "EWC IE in %s()\n", __FUNCTION__);
171 pHTInfoEle = (PHT_INFORMATION_ELE)(&InfoIE[4]);
172 }else
173 pHTInfoEle = (PHT_INFORMATION_ELE)(&InfoIE[0]);
174
175
176 IEEE80211_DEBUG(IEEE80211_DL_HT, "<Log HT Information Element>. Called by %s\n", TitleString);
177
178 IEEE80211_DEBUG(IEEE80211_DL_HT, "\tPrimary channel = %d\n", pHTInfoEle->ControlChl);
179 IEEE80211_DEBUG(IEEE80211_DL_HT, "\tSenondary channel =");
180 switch(pHTInfoEle->ExtChlOffset)
181 {
182 case 0:
183 IEEE80211_DEBUG(IEEE80211_DL_HT, "Not Present\n");
184 break;
185 case 1:
186 IEEE80211_DEBUG(IEEE80211_DL_HT, "Upper channel\n");
187 break;
188 case 2:
189 IEEE80211_DEBUG(IEEE80211_DL_HT, "Reserved. Eooro!!!\n");
190 break;
191 case 3:
192 IEEE80211_DEBUG(IEEE80211_DL_HT, "Lower Channel\n");
193 break;
194 }
195 IEEE80211_DEBUG(IEEE80211_DL_HT, "\tRecommended channel width = %s\n", (pHTInfoEle->RecommemdedTxWidth)?"20Mhz": "40Mhz");
196
197 IEEE80211_DEBUG(IEEE80211_DL_HT, "\tOperation mode for protection = ");
198 switch(pHTInfoEle->OptMode)
199 {
200 case 0:
201 IEEE80211_DEBUG(IEEE80211_DL_HT, "No Protection\n");
202 break;
203 case 1:
204 IEEE80211_DEBUG(IEEE80211_DL_HT, "HT non-member protection mode\n");
205 break;
206 case 2:
207 IEEE80211_DEBUG(IEEE80211_DL_HT, "Suggest to open protection\n");
208 break;
209 case 3:
210 IEEE80211_DEBUG(IEEE80211_DL_HT, "HT mixed mode\n");
211 break;
212 }
213
214 IEEE80211_DEBUG(IEEE80211_DL_HT, "\tBasic MCS Rate Set = [%x][%x][%x][%x][%x]\n", pHTInfoEle->BasicMSC[0],\
215 pHTInfoEle->BasicMSC[1], pHTInfoEle->BasicMSC[2], pHTInfoEle->BasicMSC[3], pHTInfoEle->BasicMSC[4]);
216 return;
217}
218
219
220
221
222bool IsHTHalfNmode40Bandwidth(struct ieee80211_device* ieee)
223{
224 bool retValue = false;
225 PRT_HIGH_THROUGHPUT pHTInfo = ieee->pHTInfo;
226
227 if(pHTInfo->bCurrentHTSupport == false )
228 retValue = false;
229 else if(pHTInfo->bRegBW40MHz == false)
230 retValue = false;
231 else if(!ieee->GetHalfNmodeSupportByAPsHandler(ieee->dev))
232 retValue = false;
233 else if(((PHT_CAPABILITY_ELE)(pHTInfo->PeerHTCapBuf))->ChlWidth)
234 retValue = true;
235 else
236 retValue = false;
237
238 return retValue;
239}
240
241bool IsHTHalfNmodeSGI(struct ieee80211_device* ieee, bool is40MHz)
242{
243 bool retValue = false;
244 PRT_HIGH_THROUGHPUT pHTInfo = ieee->pHTInfo;
245
246 if(pHTInfo->bCurrentHTSupport == false )
247 retValue = false;
248 else if(!ieee->GetHalfNmodeSupportByAPsHandler(ieee->dev))
249 retValue = false;
250 else if(is40MHz)
251 {
252 if(((PHT_CAPABILITY_ELE)(pHTInfo->PeerHTCapBuf))->ShortGI40Mhz)
253 retValue = true;
254 else
255 retValue = false;
256 }
257 else
258 {
259 if(((PHT_CAPABILITY_ELE)(pHTInfo->PeerHTCapBuf))->ShortGI20Mhz)
260 retValue = true;
261 else
262 retValue = false;
263 }
264
265 return retValue;
266}
267
268u16 HTHalfMcsToDataRate(struct ieee80211_device* ieee, u8 nMcsRate)
269{
270
271 u8 is40MHz;
272 u8 isShortGI;
273
274 is40MHz = (IsHTHalfNmode40Bandwidth(ieee))?1:0;
275 isShortGI = (IsHTHalfNmodeSGI(ieee, is40MHz))? 1:0;
276
277 return MCS_DATA_RATE[is40MHz][isShortGI][(nMcsRate&0x7f)];
278}
279
280
281u16 HTMcsToDataRate( struct ieee80211_device* ieee, u8 nMcsRate)
282{
283 PRT_HIGH_THROUGHPUT pHTInfo = ieee->pHTInfo;
284
285 u8 is40MHz = (pHTInfo->bCurBW40MHz)?1:0;
286 u8 isShortGI = (pHTInfo->bCurBW40MHz)?
287 ((pHTInfo->bCurShortGI40MHz)?1:0):
288 ((pHTInfo->bCurShortGI20MHz)?1:0);
289 return MCS_DATA_RATE[is40MHz][isShortGI][(nMcsRate&0x7f)];
290}
291
292
293
294
295
296
297
298
299
300u16 TxCountToDataRate( struct ieee80211_device* ieee, u8 nDataRate)
301{
302
303 u16 CCKOFDMRate[12] = {0x02 , 0x04 , 0x0b , 0x16 , 0x0c , 0x12 , 0x18 , 0x24 , 0x30 , 0x48 , 0x60 , 0x6c};
304 u8 is40MHz = 0;
305 u8 isShortGI = 0;
306
307 if(nDataRate < 12)
308 {
309 return CCKOFDMRate[nDataRate];
310 }
311 else
312 {
313 if (nDataRate >= 0x10 && nDataRate <= 0x1f)
314 {
315 is40MHz = 0;
316 isShortGI = 0;
317
318
319 }
320 else if(nDataRate >=0x20 && nDataRate <= 0x2f )
321 {
322 is40MHz = 1;
323 isShortGI = 0;
324
325
326 }
327 else if(nDataRate >= 0x30 && nDataRate <= 0x3f )
328 {
329 is40MHz = 0;
330 isShortGI = 1;
331
332
333 }
334 else if(nDataRate >= 0x40 && nDataRate <= 0x4f )
335 {
336 is40MHz = 1;
337 isShortGI = 1;
338
339
340 }
341 return MCS_DATA_RATE[is40MHz][isShortGI][nDataRate&0xf];
342 }
343}
344
345
346
347bool IsHTHalfNmodeAPs(struct ieee80211_device* ieee)
348{
349 bool retValue = false;
350 struct ieee80211_network* net = &ieee->current_network;
351#if 0
352 if(pMgntInfo->bHalfNMode == false)
353 retValue = false;
354 else
355#endif
356 if((memcmp(net->bssid, BELKINF5D8233V1_RALINK, 3)==0) ||
357 (memcmp(net->bssid, BELKINF5D82334V3_RALINK, 3)==0) ||
358 (memcmp(net->bssid, PCI_RALINK, 3)==0) ||
359 (memcmp(net->bssid, EDIMAX_RALINK, 3)==0) ||
360 (memcmp(net->bssid, AIRLINK_RALINK, 3)==0) ||
361 (net->ralink_cap_exist))
362 retValue = true;
363 else if((memcmp(net->bssid, UNKNOWN_BORADCOM, 3)==0) ||
364 (memcmp(net->bssid, LINKSYSWRT330_LINKSYSWRT300_BROADCOM, 3)==0)||
365 (memcmp(net->bssid, LINKSYSWRT350_LINKSYSWRT150_BROADCOM, 3)==0)||
366 (memcmp(net->bssid, NETGEAR834Bv2_BROADCOM, 3)==0) ||
367 (net->broadcom_cap_exist))
368 retValue = true;
369 else if(net->bssht.bdRT2RTAggregation)
370 retValue = true;
371 else
372 retValue = false;
373
374 return retValue;
375}
376
377
378
379
380
381
382
383
384void HTIOTPeerDetermine(struct ieee80211_device* ieee)
385{
386 PRT_HIGH_THROUGHPUT pHTInfo = ieee->pHTInfo;
387 struct ieee80211_network* net = &ieee->current_network;
388 if(net->bssht.bdRT2RTAggregation)
389 pHTInfo->IOTPeer = HT_IOT_PEER_REALTEK;
390 else if(net->broadcom_cap_exist)
391 pHTInfo->IOTPeer = HT_IOT_PEER_BROADCOM;
392 else if((memcmp(net->bssid, UNKNOWN_BORADCOM, 3)==0) ||
393 (memcmp(net->bssid, LINKSYSWRT330_LINKSYSWRT300_BROADCOM, 3)==0)||
394 (memcmp(net->bssid, LINKSYSWRT350_LINKSYSWRT150_BROADCOM, 3)==0)||
395 (memcmp(net->bssid, NETGEAR834Bv2_BROADCOM, 3)==0) )
396 pHTInfo->IOTPeer = HT_IOT_PEER_BROADCOM;
397 else if((memcmp(net->bssid, BELKINF5D8233V1_RALINK, 3)==0) ||
398 (memcmp(net->bssid, BELKINF5D82334V3_RALINK, 3)==0) ||
399 (memcmp(net->bssid, PCI_RALINK, 3)==0) ||
400 (memcmp(net->bssid, EDIMAX_RALINK, 3)==0) ||
401 (memcmp(net->bssid, AIRLINK_RALINK, 3)==0) ||
402 net->ralink_cap_exist)
403 pHTInfo->IOTPeer = HT_IOT_PEER_RALINK;
404 else if((net->atheros_cap_exist )|| (memcmp(net->bssid, DLINK_ATHEROS, 3) == 0))
405 pHTInfo->IOTPeer = HT_IOT_PEER_ATHEROS;
406 else if(memcmp(net->bssid, CISCO_BROADCOM, 3)==0)
407 pHTInfo->IOTPeer = HT_IOT_PEER_CISCO;
408 else
409 pHTInfo->IOTPeer = HT_IOT_PEER_UNKNOWN;
410
411 IEEE80211_DEBUG(IEEE80211_DL_IOT, "Joseph debug!! IOTPEER: %x\n", pHTInfo->IOTPeer);
412}
413
414
415
416
417
418
419
420
421u8 HTIOTActIsDisableMCS14(struct ieee80211_device* ieee, u8* PeerMacAddr)
422{
423 u8 ret = 0;
424#if 0
425
426#if (HAL_CODE_BASE==RTL8192 && DEV_BUS_TYPE==USB_INTERFACE)
427 if((memcmp(PeerMacAddr, UNKNOWN_BORADCOM, 3)==0) ||
428 (memcmp(PeerMacAddr, LINKSYSWRT330_LINKSYSWRT300_BROADCOM, 3)==0)
429 )
430 {
431 ret = 1;
432 }
433
434
435 if(pHTInfo->bCurrentRT2RTAggregation)
436 {
437
438 ret = 1;
439 }
440#endif
441#endif
442 return ret;
443 }
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458bool HTIOTActIsDisableMCS15(struct ieee80211_device* ieee)
459{
460 bool retValue = false;
461
462#ifdef TODO
463
464#if (HAL_CODE_BASE==RTL8192)
465
466#if (DEV_BUS_TYPE == USB_INTERFACE)
467
468 retValue = true;
469#elif (DEV_BUS_TYPE == PCI_INTERFACE)
470
471
472
473
474 retValue = false;
475#endif
476#endif
477#endif
478
479
480 return retValue;
481}
482
483
484
485
486
487
488
489
490
491
492
493
494
495bool HTIOTActIsDisableMCSTwoSpatialStream(struct ieee80211_device* ieee, u8 *PeerMacAddr)
496{
497 bool retValue = false;
498
499#ifdef TODO
500
501
502
503
504 if(IS_UNDER_11N_AES_MODE(Adapter))
505 {
506 if((PlatformCompareMemory(PeerMacAddr, BELKINF5D8233V1_RALINK, 3)==0) ||
507 (PlatformCompareMemory(PeerMacAddr, PCI_RALINK, 3)==0) ||
508 (PlatformCompareMemory(PeerMacAddr, EDIMAX_RALINK, 3)==0))
509 {
510
511 retValue = false;
512 }
513 }
514
515
516#endif
517 return retValue;
518}
519
520
521
522
523
524
525
526
527u8 HTIOTActIsDisableEDCATurbo(struct ieee80211_device* ieee, u8* PeerMacAddr)
528{
529 u8 retValue = false;
530
531
532 return retValue;
533#if 0
534 if((memcmp(PeerMacAddr, UNKNOWN_BORADCOM, 3)==0)||
535 (memcmp(PeerMacAddr, LINKSYSWRT330_LINKSYSWRT300_BROADCOM, 3)==0)||
536 (memcmp(PeerMacAddr, LINKSYSWRT350_LINKSYSWRT150_BROADCOM, 3)==0)||
537 (memcmp(PeerMacAddr, NETGEAR834Bv2_BROADCOM, 3)==0))
538
539 {
540 retValue = 1;
541 }
542
543 return retValue;
544#endif
545}
546
547
548
549
550
551
552
553u8 HTIOTActIsMgntUseCCK6M(struct ieee80211_network *network)
554{
555 u8 retValue = 0;
556
557
558
559
560 if(network->broadcom_cap_exist)
561 {
562 retValue = 1;
563 }
564
565 return retValue;
566}
567
568u8 HTIOTActIsCCDFsync(u8* PeerMacAddr)
569{
570 u8 retValue = 0;
571 if( (memcmp(PeerMacAddr, UNKNOWN_BORADCOM, 3)==0) ||
572 (memcmp(PeerMacAddr, LINKSYSWRT330_LINKSYSWRT300_BROADCOM, 3)==0) ||
573 (memcmp(PeerMacAddr, LINKSYSWRT350_LINKSYSWRT150_BROADCOM, 3) ==0))
574 {
575 retValue = 1;
576 }
577
578 return retValue;
579}
580
581void HTResetIOTSetting(
582 PRT_HIGH_THROUGHPUT pHTInfo
583)
584{
585 pHTInfo->IOTAction = 0;
586 pHTInfo->IOTPeer = HT_IOT_PEER_UNKNOWN;
587}
588
589
590
591
592
593
594
595
596
597
598
599
600void HTConstructCapabilityElement(struct ieee80211_device* ieee, u8* posHTCap, u8* len, u8 IsEncrypt)
601{
602 PRT_HIGH_THROUGHPUT pHT = ieee->pHTInfo;
603 PHT_CAPABILITY_ELE pCapELE = NULL;
604
605
606 if ((posHTCap == NULL) || (pHT == NULL))
607 {
608 IEEE80211_DEBUG(IEEE80211_DL_ERR, "posHTCap or pHTInfo can't be null in HTConstructCapabilityElement()\n");
609 return;
610 }
611 memset(posHTCap, 0, *len);
612 if(pHT->ePeerHTSpecVer == HT_SPEC_VER_EWC)
613 {
614 u8 EWC11NHTCap[] = {0x00, 0x90, 0x4c, 0x33};
615 memcpy(posHTCap, EWC11NHTCap, sizeof(EWC11NHTCap));
616 pCapELE = (PHT_CAPABILITY_ELE)&(posHTCap[4]);
617 }else
618 {
619 pCapELE = (PHT_CAPABILITY_ELE)posHTCap;
620 }
621
622
623
624 pCapELE->AdvCoding = 0;
625 if(ieee->GetHalfNmodeSupportByAPsHandler(ieee->dev))
626 {
627 pCapELE->ChlWidth = 0;
628 }
629 else
630 {
631 pCapELE->ChlWidth = (pHT->bRegBW40MHz?1:0);
632 }
633
634
635 pCapELE->MimoPwrSave = pHT->SelfMimoPs;
636 pCapELE->GreenField = 0;
637 pCapELE->ShortGI20Mhz = 1;
638 pCapELE->ShortGI40Mhz = 1;
639
640
641 pCapELE->TxSTBC = 1;
642 pCapELE->RxSTBC = 0;
643 pCapELE->DelayBA = 0;
644 pCapELE->MaxAMSDUSize = (MAX_RECEIVE_BUFFER_SIZE>=7935)?1:0;
645 pCapELE->DssCCk = ((pHT->bRegBW40MHz)?(pHT->bRegSuppCCK?1:0):0);
646 pCapELE->PSMP = 0;
647 pCapELE->LSigTxopProtect = 0;
648
649
650
651
652 IEEE80211_DEBUG(IEEE80211_DL_HT, "TX HT cap/info ele BW=%d MaxAMSDUSize:%d DssCCk:%d\n", pCapELE->ChlWidth, pCapELE->MaxAMSDUSize, pCapELE->DssCCk);
653
654 if( IsEncrypt)
655 {
656 pCapELE->MPDUDensity = 7;
657 pCapELE->MaxRxAMPDUFactor = 2;
658 }
659 else
660 {
661 pCapELE->MaxRxAMPDUFactor = 3;
662 pCapELE->MPDUDensity = 0;
663 }
664
665
666 memcpy(pCapELE->MCS, ieee->Regdot11HTOperationalRateSet, 16);
667 if(pHT->IOTAction & HT_IOT_ACT_DISABLE_MCS15)
668 pCapELE->MCS[1] &= 0x7f;
669
670 if(pHT->IOTAction & HT_IOT_ACT_DISABLE_MCS14)
671 pCapELE->MCS[1] &= 0xbf;
672
673 if(pHT->IOTAction & HT_IOT_ACT_DISABLE_ALL_2SS)
674 pCapELE->MCS[1] &= 0x00;
675
676
677
678 if(ieee->GetHalfNmodeSupportByAPsHandler(ieee->dev))
679 {
680 int i;
681 for(i = 1; i< 16; i++)
682 pCapELE->MCS[i] = 0;
683 }
684
685
686 memset(&pCapELE->ExtHTCapInfo, 0, 2);
687
688
689
690 memset(pCapELE->TxBFCap, 0, 4);
691
692
693 pCapELE->ASCap = 0;
694
695 if(pHT->ePeerHTSpecVer == HT_SPEC_VER_EWC)
696 *len = 30 + 2;
697 else
698 *len = 26 + 2;
699
700
701
702
703
704
705
706 return;
707
708}
709
710
711
712
713
714
715
716
717
718
719void HTConstructInfoElement(struct ieee80211_device* ieee, u8* posHTInfo, u8* len, u8 IsEncrypt)
720{
721 PRT_HIGH_THROUGHPUT pHT = ieee->pHTInfo;
722 PHT_INFORMATION_ELE pHTInfoEle = (PHT_INFORMATION_ELE)posHTInfo;
723 if ((posHTInfo == NULL) || (pHTInfoEle == NULL))
724 {
725 IEEE80211_DEBUG(IEEE80211_DL_ERR, "posHTInfo or pHTInfoEle can't be null in HTConstructInfoElement()\n");
726 return;
727 }
728
729 memset(posHTInfo, 0, *len);
730 if ( (ieee->iw_mode == IW_MODE_ADHOC) || (ieee->iw_mode == IW_MODE_MASTER))
731 {
732 pHTInfoEle->ControlChl = ieee->current_network.channel;
733 pHTInfoEle->ExtChlOffset = ((pHT->bRegBW40MHz == false)?HT_EXTCHNL_OFFSET_NO_EXT:
734 (ieee->current_network.channel<=6)?
735 HT_EXTCHNL_OFFSET_UPPER:HT_EXTCHNL_OFFSET_LOWER);
736 pHTInfoEle->RecommemdedTxWidth = pHT->bRegBW40MHz;
737 pHTInfoEle->RIFS = 0;
738 pHTInfoEle->PSMPAccessOnly = 0;
739 pHTInfoEle->SrvIntGranularity = 0;
740 pHTInfoEle->OptMode = pHT->CurrentOpMode;
741 pHTInfoEle->NonGFDevPresent = 0;
742 pHTInfoEle->DualBeacon = 0;
743 pHTInfoEle->SecondaryBeacon = 0;
744 pHTInfoEle->LSigTxopProtectFull = 0;
745 pHTInfoEle->PcoActive = 0;
746 pHTInfoEle->PcoPhase = 0;
747
748 memset(pHTInfoEle->BasicMSC, 0, 16);
749
750
751 *len = 22 + 2;
752
753 }
754 else
755 {
756
757 *len = 0;
758 }
759
760
761 return;
762}
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791void HTConstructRT2RTAggElement(struct ieee80211_device* ieee, u8* posRT2RTAgg, u8* len)
792{
793 if (posRT2RTAgg == NULL) {
794 IEEE80211_DEBUG(IEEE80211_DL_ERR, "posRT2RTAgg can't be null in HTConstructRT2RTAggElement()\n");
795 return;
796 }
797 memset(posRT2RTAgg, 0, *len);
798 *posRT2RTAgg++ = 0x00;
799 *posRT2RTAgg++ = 0xe0;
800 *posRT2RTAgg++ = 0x4c;
801 *posRT2RTAgg++ = 0x02;
802 *posRT2RTAgg++ = 0x01;
803 *posRT2RTAgg = 0x10;
804
805 if(ieee->bSupportRemoteWakeUp) {
806 *posRT2RTAgg |= 0x08;
807 }
808
809 *len = 6 + 2;
810 return;
811#ifdef TODO
812#if(HAL_CODE_BASE == RTL8192 && DEV_BUS_TYPE == USB_INTERFACE)
813
814
815
816
817
818
819
820
821
822
823
824
825#else
826
827#endif
828
829 posRT2RTAgg->Length = 6;
830#endif
831
832
833
834
835}
836
837
838
839
840
841
842
843
844
845u8 HT_PickMCSRate(struct ieee80211_device* ieee, u8* pOperateMCS)
846{
847 u8 i;
848 if (pOperateMCS == NULL)
849 {
850 IEEE80211_DEBUG(IEEE80211_DL_ERR, "pOperateMCS can't be null in HT_PickMCSRate()\n");
851 return false;
852 }
853
854 switch(ieee->mode)
855 {
856 case IEEE_A:
857 case IEEE_B:
858 case IEEE_G:
859
860
861
862 for(i=0;i<=15;i++){
863 pOperateMCS[i] = 0;
864 }
865 break;
866
867 case IEEE_N_24G:
868 case IEEE_N_5G:
869
870
871
872
873
874 pOperateMCS[0] &=RATE_ADPT_1SS_MASK;
875 pOperateMCS[1] &=RATE_ADPT_2SS_MASK;
876 pOperateMCS[3] &=RATE_ADPT_MCS32_MASK;
877 break;
878
879
880 default:
881
882 break;
883
884 }
885
886 return true;
887}
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908u8 HTGetHighestMCSRate(struct ieee80211_device* ieee, u8* pMCSRateSet, u8* pMCSFilter)
909{
910 u8 i, j;
911 u8 bitMap;
912 u8 mcsRate = 0;
913 u8 availableMcsRate[16];
914 if (pMCSRateSet == NULL || pMCSFilter == NULL)
915 {
916 IEEE80211_DEBUG(IEEE80211_DL_ERR, "pMCSRateSet or pMCSFilter can't be null in HTGetHighestMCSRate()\n");
917 return false;
918 }
919 for(i=0; i<16; i++)
920 availableMcsRate[i] = pMCSRateSet[i] & pMCSFilter[i];
921
922 for(i = 0; i < 16; i++)
923 {
924 if(availableMcsRate[i] != 0)
925 break;
926 }
927 if(i == 16)
928 return false;
929
930 for(i = 0; i < 16; i++)
931 {
932 if(availableMcsRate[i] != 0)
933 {
934 bitMap = availableMcsRate[i];
935 for(j = 0; j < 8; j++)
936 {
937 if((bitMap%2) != 0)
938 {
939 if(HTMcsToDataRate(ieee, (8*i+j)) > HTMcsToDataRate(ieee, mcsRate))
940 mcsRate = (8*i+j);
941 }
942 bitMap = bitMap>>1;
943 }
944 }
945 }
946 return (mcsRate|0x80);
947}
948
949
950
951
952
953
954
955
956
957
958
959
960u8 HTFilterMCSRate( struct ieee80211_device* ieee, u8* pSupportMCS, u8* pOperateMCS)
961{
962
963 u8 i=0;
964
965
966 for(i=0;i<=15;i++){
967 pOperateMCS[i] = ieee->Regdot11HTOperationalRateSet[i]&pSupportMCS[i];
968 }
969
970
971
972
973
974
975 HT_PickMCSRate(ieee, pOperateMCS);
976
977
978 if(ieee->GetHalfNmodeSupportByAPsHandler(ieee->dev))
979 pOperateMCS[1] = 0;
980
981
982
983
984
985 for(i=2; i<=15; i++)
986 pOperateMCS[i] = 0;
987
988 return true;
989}
990void HTSetConnectBwMode(struct ieee80211_device* ieee, HT_CHANNEL_WIDTH Bandwidth, HT_EXTCHNL_OFFSET Offset);
991#if 0
992
993#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20))
994void HTOnAssocRsp_wq(struct work_struct *work)
995{
996 struct ieee80211_device *ieee = container_of(work, struct ieee80211_device, ht_onAssRsp);
997#else
998void HTOnAssocRsp_wq(struct ieee80211_device *ieee)
999{
1000#endif
1001#endif
1002void HTOnAssocRsp(struct ieee80211_device *ieee)
1003{
1004 PRT_HIGH_THROUGHPUT pHTInfo = ieee->pHTInfo;
1005 PHT_CAPABILITY_ELE pPeerHTCap = NULL;
1006 PHT_INFORMATION_ELE pPeerHTInfo = NULL;
1007 u16 nMaxAMSDUSize = 0;
1008 u8* pMcsFilter = NULL;
1009
1010 static u8 EWC11NHTCap[] = {0x00, 0x90, 0x4c, 0x33};
1011 static u8 EWC11NHTInfo[] = {0x00, 0x90, 0x4c, 0x34};
1012
1013 if( pHTInfo->bCurrentHTSupport == false )
1014 {
1015 IEEE80211_DEBUG(IEEE80211_DL_ERR, "<=== HTOnAssocRsp(): HT_DISABLE\n");
1016 return;
1017 }
1018 IEEE80211_DEBUG(IEEE80211_DL_HT, "===> HTOnAssocRsp_wq(): HT_ENABLE\n");
1019
1020
1021
1022
1023
1024
1025 if(!memcmp(pHTInfo->PeerHTCapBuf,EWC11NHTCap, sizeof(EWC11NHTCap)))
1026 pPeerHTCap = (PHT_CAPABILITY_ELE)(&pHTInfo->PeerHTCapBuf[4]);
1027 else
1028 pPeerHTCap = (PHT_CAPABILITY_ELE)(pHTInfo->PeerHTCapBuf);
1029
1030 if(!memcmp(pHTInfo->PeerHTInfoBuf, EWC11NHTInfo, sizeof(EWC11NHTInfo)))
1031 pPeerHTInfo = (PHT_INFORMATION_ELE)(&pHTInfo->PeerHTInfoBuf[4]);
1032 else
1033 pPeerHTInfo = (PHT_INFORMATION_ELE)(pHTInfo->PeerHTInfoBuf);
1034
1035
1036
1037
1038
1039 IEEE80211_DEBUG_DATA(IEEE80211_DL_DATA|IEEE80211_DL_HT, pPeerHTCap, sizeof(HT_CAPABILITY_ELE));
1040
1041
1042
1043 HTSetConnectBwMode(ieee, (HT_CHANNEL_WIDTH)(pPeerHTCap->ChlWidth), (HT_EXTCHNL_OFFSET)(pPeerHTInfo->ExtChlOffset));
1044
1045
1046 pHTInfo->bCurTxBW40MHz = ((pPeerHTInfo->RecommemdedTxWidth == 1)?true:false);
1047
1048
1049
1050
1051
1052 pHTInfo->bCurShortGI20MHz=
1053 ((pHTInfo->bRegShortGI20MHz)?((pPeerHTCap->ShortGI20Mhz==1)?true:false):false);
1054 pHTInfo->bCurShortGI40MHz=
1055 ((pHTInfo->bRegShortGI40MHz)?((pPeerHTCap->ShortGI40Mhz==1)?true:false):false);
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066 pHTInfo->bCurSuppCCK =
1067 ((pHTInfo->bRegSuppCCK)?((pPeerHTCap->DssCCk==1)?true:false):false);
1068
1069
1070
1071
1072
1073 pHTInfo->bCurrent_AMSDU_Support = pHTInfo->bAMSDU_Support;
1074
1075 nMaxAMSDUSize = (pPeerHTCap->MaxAMSDUSize==0)?3839:7935;
1076
1077 if(pHTInfo->nAMSDU_MaxSize > nMaxAMSDUSize )
1078 pHTInfo->nCurrent_AMSDU_MaxSize = nMaxAMSDUSize;
1079 else
1080 pHTInfo->nCurrent_AMSDU_MaxSize = pHTInfo->nAMSDU_MaxSize;
1081
1082
1083
1084
1085
1086 pHTInfo->bCurrentAMPDUEnable = pHTInfo->bAMPDUEnable;
1087
1088
1089
1090
1091 if(!pHTInfo->bRegRT2RTAggregation)
1092 {
1093
1094 if(pHTInfo->AMPDU_Factor > pPeerHTCap->MaxRxAMPDUFactor)
1095 pHTInfo->CurrentAMPDUFactor = pPeerHTCap->MaxRxAMPDUFactor;
1096 else
1097 pHTInfo->CurrentAMPDUFactor = pHTInfo->AMPDU_Factor;
1098
1099 }else
1100 {
1101
1102
1103#if 0
1104 osTmp= PacketGetElement( asocpdu, EID_Vendor, OUI_SUB_REALTEK_AGG, OUI_SUBTYPE_DONT_CARE);
1105 if(osTmp.Length >= 5)
1106#endif
1107 if (ieee->current_network.bssht.bdRT2RTAggregation)
1108 {
1109 if( ieee->pairwise_key_type != KEY_TYPE_NA)
1110
1111 pHTInfo->CurrentAMPDUFactor = pPeerHTCap->MaxRxAMPDUFactor;
1112 else
1113 pHTInfo->CurrentAMPDUFactor = HT_AGG_SIZE_64K;
1114 }else
1115 {
1116 if(pPeerHTCap->MaxRxAMPDUFactor < HT_AGG_SIZE_32K)
1117 pHTInfo->CurrentAMPDUFactor = pPeerHTCap->MaxRxAMPDUFactor;
1118 else
1119 pHTInfo->CurrentAMPDUFactor = HT_AGG_SIZE_32K;
1120 }
1121 }
1122
1123
1124
1125#if 1
1126 if(pHTInfo->MPDU_Density > pPeerHTCap->MPDUDensity)
1127 pHTInfo->CurrentMPDUDensity = pHTInfo->MPDU_Density;
1128 else
1129 pHTInfo->CurrentMPDUDensity = pPeerHTCap->MPDUDensity;
1130 if(ieee->pairwise_key_type != KEY_TYPE_NA )
1131 pHTInfo->CurrentMPDUDensity = 7;
1132#else
1133 if(pHTInfo->MPDU_Density > pPeerHTCap->MPDUDensity)
1134 pHTInfo->CurrentMPDUDensity = pHTInfo->MPDU_Density;
1135 else
1136 pHTInfo->CurrentMPDUDensity = pPeerHTCap->MPDUDensity;
1137#endif
1138
1139
1140
1141
1142 if(0)
1143 {
1144
1145 pHTInfo->bCurrentAMPDUEnable = false;
1146 pHTInfo->ForcedAMSDUMode = HT_AGG_FORCE_ENABLE;
1147 pHTInfo->ForcedAMSDUMaxSize = 7935;
1148
1149 pHTInfo->IOTAction |= HT_IOT_ACT_TX_USE_AMSDU_8K;
1150 }
1151
1152
1153 pHTInfo->bCurRxReorderEnable = pHTInfo->bRegRxReorderEnable;
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163 if(pPeerHTCap->MCS[0] == 0)
1164 pPeerHTCap->MCS[0] = 0xff;
1165
1166 HTFilterMCSRate(ieee, pPeerHTCap->MCS, ieee->dot11HTOperationalRateSet);
1167
1168
1169
1170
1171 pHTInfo->PeerMimoPs = pPeerHTCap->MimoPwrSave;
1172 if(pHTInfo->PeerMimoPs == MIMO_PS_STATIC)
1173 pMcsFilter = MCS_FILTER_1SS;
1174 else
1175 pMcsFilter = MCS_FILTER_ALL;
1176
1177
1178 ieee->HTHighestOperaRate = HTGetHighestMCSRate(ieee, ieee->dot11HTOperationalRateSet, pMcsFilter);
1179 ieee->HTCurrentOperaRate = ieee->HTHighestOperaRate;
1180
1181
1182
1183
1184 pHTInfo->CurrentOpMode = pPeerHTInfo->OptMode;
1185
1186
1187
1188}
1189
1190void HTSetConnectBwModeCallback(struct ieee80211_device* ieee);
1191
1192
1193
1194
1195
1196
1197
1198
1199void HTInitializeHTInfo(struct ieee80211_device* ieee)
1200{
1201 PRT_HIGH_THROUGHPUT pHTInfo = ieee->pHTInfo;
1202
1203
1204
1205
1206 IEEE80211_DEBUG(IEEE80211_DL_HT, "===========>%s()\n", __FUNCTION__);
1207 pHTInfo->bCurrentHTSupport = false;
1208
1209
1210 pHTInfo->bCurBW40MHz = false;
1211 pHTInfo->bCurTxBW40MHz = false;
1212
1213
1214 pHTInfo->bCurShortGI20MHz = false;
1215 pHTInfo->bCurShortGI40MHz = false;
1216 pHTInfo->bForcedShortGI = false;
1217
1218
1219
1220
1221
1222 pHTInfo->bCurSuppCCK = true;
1223
1224
1225 pHTInfo->bCurrent_AMSDU_Support = false;
1226 pHTInfo->nCurrent_AMSDU_MaxSize = pHTInfo->nAMSDU_MaxSize;
1227
1228
1229 pHTInfo->CurrentMPDUDensity = pHTInfo->MPDU_Density;
1230 pHTInfo->CurrentAMPDUFactor = pHTInfo->AMPDU_Factor;
1231
1232
1233
1234
1235 memset((void*)(&(pHTInfo->SelfHTCap)), 0, sizeof(pHTInfo->SelfHTCap));
1236 memset((void*)(&(pHTInfo->SelfHTInfo)), 0, sizeof(pHTInfo->SelfHTInfo));
1237 memset((void*)(&(pHTInfo->PeerHTCapBuf)), 0, sizeof(pHTInfo->PeerHTCapBuf));
1238 memset((void*)(&(pHTInfo->PeerHTInfoBuf)), 0, sizeof(pHTInfo->PeerHTInfoBuf));
1239
1240 pHTInfo->bSwBwInProgress = false;
1241 pHTInfo->ChnlOp = CHNLOP_NONE;
1242
1243
1244 pHTInfo->ePeerHTSpecVer = HT_SPEC_VER_IEEE;
1245
1246
1247 pHTInfo->bCurrentRT2RTAggregation = false;
1248 pHTInfo->bCurrentRT2RTLongSlotTime = false;
1249 pHTInfo->IOTPeer = 0;
1250 pHTInfo->IOTAction = 0;
1251
1252
1253 {
1254 u8* RegHTSuppRateSets = &(ieee->RegHTSuppRateSet[0]);
1255 RegHTSuppRateSets[0] = 0xFF;
1256 RegHTSuppRateSets[1] = 0xFF;
1257 RegHTSuppRateSets[4] = 0x01;
1258 }
1259}
1260
1261
1262
1263
1264
1265
1266
1267void HTInitializeBssDesc(PBSS_HT pBssHT)
1268{
1269
1270 pBssHT->bdSupportHT = false;
1271 memset(pBssHT->bdHTCapBuf, 0, sizeof(pBssHT->bdHTCapBuf));
1272 pBssHT->bdHTCapLen = 0;
1273 memset(pBssHT->bdHTInfoBuf, 0, sizeof(pBssHT->bdHTInfoBuf));
1274 pBssHT->bdHTInfoLen = 0;
1275
1276 pBssHT->bdHTSpecVer= HT_SPEC_VER_IEEE;
1277
1278 pBssHT->bdRT2RTAggregation = false;
1279 pBssHT->bdRT2RTLongSlotTime = false;
1280}
1281#if 0
1282
1283void
1284HTParsingHTCapElement(
1285 IN PADAPTER Adapter,
1286 IN OCTET_STRING HTCapIE,
1287 OUT PRT_WLAN_BSS pBssDesc
1288)
1289{
1290 PMGNT_INFO pMgntInfo = &Adapter->MgntInfo;
1291
1292 if( HTCapIE.Length > sizeof(pBssDesc->BssHT.bdHTCapBuf) )
1293 {
1294 RT_TRACE( COMP_HT, DBG_LOUD, ("HTParsingHTCapElement(): HT Capability Element length is too long!\n") );
1295 return;
1296 }
1297
1298
1299
1300 if(!pMgntInfo->mActingAsAp && !pMgntInfo->mAssoc)
1301 HTDebugHTCapability(DBG_TRACE, Adapter, &HTCapIE, (pu8)"HTParsingHTCapElement()");
1302
1303 HTCapIE.Length = HTCapIE.Length > sizeof(pBssDesc->BssHT.bdHTCapBuf)?\
1304 sizeof(pBssDesc->BssHT.bdHTCapBuf):HTCapIE.Length;
1305
1306 CopyMem(pBssDesc->BssHT.bdHTCapBuf, HTCapIE.Octet, HTCapIE.Length);
1307 pBssDesc->BssHT.bdHTCapLen = HTCapIE.Length;
1308
1309}
1310
1311
1312void
1313HTParsingHTInfoElement(
1314 PADAPTER Adapter,
1315 OCTET_STRING HTInfoIE,
1316 PRT_WLAN_BSS pBssDesc
1317)
1318{
1319 PMGNT_INFO pMgntInfo = &Adapter->MgntInfo;
1320
1321 if( HTInfoIE.Length > sizeof(pBssDesc->BssHT.bdHTInfoBuf))
1322 {
1323 RT_TRACE( COMP_HT, DBG_LOUD, ("HTParsingHTInfoElement(): HT Information Element length is too long!\n") );
1324 return;
1325 }
1326
1327
1328
1329 if(!pMgntInfo->mActingAsAp && !pMgntInfo->mAssoc)
1330 HTDebugHTInfo(DBG_TRACE, Adapter, &HTInfoIE, (pu8)"HTParsingHTInfoElement()");
1331
1332 HTInfoIE.Length = HTInfoIE.Length > sizeof(pBssDesc->BssHT.bdHTInfoBuf)?\
1333 sizeof(pBssDesc->BssHT.bdHTInfoBuf):HTInfoIE.Length;
1334
1335 CopyMem( pBssDesc->BssHT.bdHTInfoBuf, HTInfoIE.Octet, HTInfoIE.Length);
1336 pBssDesc->BssHT.bdHTInfoLen = HTInfoIE.Length;
1337}
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352void HTGetValueFromBeaconOrProbeRsp(
1353 PADAPTER Adapter,
1354 POCTET_STRING pSRCmmpdu,
1355 PRT_WLAN_BSS bssDesc
1356)
1357{
1358 PMGNT_INFO pMgntInfo = &Adapter->MgntInfo;
1359 PRT_HIGH_THROUGHPUT pHTInfo = GET_HT_INFO(pMgntInfo);
1360 OCTET_STRING HTCapIE, HTInfoIE, HTRealtekAgg, mmpdu;
1361 OCTET_STRING BroadcomElement, CiscoElement;
1362
1363 mmpdu.Octet = pSRCmmpdu->Octet;
1364 mmpdu.Length = pSRCmmpdu->Length;
1365
1366
1367
1368
1369
1370
1371
1372 HTInitializeBssDesc (&bssDesc->BssHT);
1373
1374
1375
1376 HTCapIE = PacketGetElement(mmpdu, EID_HTCapability, OUI_SUB_DONT_CARE, OUI_SUBTYPE_DONT_CARE);
1377 if(HTCapIE.Length == 0)
1378 {
1379 HTCapIE = PacketGetElement(mmpdu, EID_Vendor, OUI_SUB_11N_EWC_HT_CAP, OUI_SUBTYPE_DONT_CARE);
1380 if(HTCapIE.Length != 0)
1381 bssDesc->BssHT.bdHTSpecVer= HT_SPEC_VER_EWC;
1382 }
1383 if(HTCapIE.Length != 0)
1384 HTParsingHTCapElement(Adapter, HTCapIE, bssDesc);
1385
1386
1387 HTInfoIE = PacketGetElement(mmpdu, EID_HTInfo, OUI_SUB_DONT_CARE, OUI_SUBTYPE_DONT_CARE);
1388 if(HTInfoIE.Length == 0)
1389 {
1390 HTInfoIE = PacketGetElement(mmpdu, EID_Vendor, OUI_SUB_11N_EWC_HT_INFO, OUI_SUBTYPE_DONT_CARE);
1391 if(HTInfoIE.Length != 0)
1392 bssDesc->BssHT.bdHTSpecVer = HT_SPEC_VER_EWC;
1393 }
1394 if(HTInfoIE.Length != 0)
1395 HTParsingHTInfoElement(Adapter, HTInfoIE, bssDesc);
1396
1397
1398 if(HTCapIE.Length != 0)
1399 {
1400 bssDesc->BssHT.bdSupportHT = true;
1401 if(bssDesc->BssQos.bdQoSMode == QOS_DISABLE)
1402 QosSetLegacyWMMParamWithHT(Adapter, bssDesc);
1403 }
1404 else
1405 {
1406 bssDesc->BssHT.bdSupportHT = false;
1407 }
1408
1409
1410 if(pHTInfo->bRegRT2RTAggregation)
1411 {
1412 if(bssDesc->BssHT.bdSupportHT)
1413 {
1414 HTRealtekAgg = PacketGetElement(mmpdu, EID_Vendor, OUI_SUB_REALTEK_AGG, OUI_SUBTYPE_DONT_CARE);
1415 if(HTRealtekAgg.Length >=5 )
1416 {
1417 bssDesc->BssHT.bdRT2RTAggregation = true;
1418
1419 if((HTRealtekAgg.Octet[4]==1) && (HTRealtekAgg.Octet[5] & 0x02))
1420 bssDesc->BssHT.bdRT2RTLongSlotTime = true;
1421 }
1422 }
1423 }
1424
1425
1426
1427
1428
1429
1430
1431 bssDesc->bBroadcomCapExist= false;
1432
1433 if(HTCapIE.Length != 0 || HTInfoIE.Length != 0)
1434 {
1435 u4Byte Length = 0;
1436
1437 FillOctetString(BroadcomElement, NULL, 0);
1438
1439 BroadcomElement = PacketGetElement( mmpdu, EID_Vendor, OUI_SUB_BROADCOM_IE_1, OUI_SUBTYPE_DONT_CARE);
1440 Length += BroadcomElement.Length;
1441 BroadcomElement = PacketGetElement( mmpdu, EID_Vendor, OUI_SUB_BROADCOM_IE_2, OUI_SUBTYPE_DONT_CARE);
1442 Length += BroadcomElement.Length;
1443 BroadcomElement = PacketGetElement( mmpdu, EID_Vendor, OUI_SUB_BROADCOM_IE_3, OUI_SUBTYPE_DONT_CARE);
1444 Length += BroadcomElement.Length;
1445
1446 if(Length > 0)
1447 bssDesc->bBroadcomCapExist = true;
1448 }
1449
1450
1451
1452 CiscoElement = PacketGetElement( mmpdu, EID_Vendor, OUI_SUB_CISCO_IE, OUI_SUBTYPE_DONT_CARE);
1453 if(CiscoElement.Length != 0){
1454 bssDesc->bCiscoCapExist = true;
1455 }else{
1456 bssDesc->bCiscoCapExist = false;
1457 }
1458}
1459
1460
1461#endif
1462
1463
1464
1465
1466
1467
1468
1469
1470void HTResetSelfAndSavePeerSetting(struct ieee80211_device* ieee, struct ieee80211_network * pNetwork)
1471{
1472 PRT_HIGH_THROUGHPUT pHTInfo = ieee->pHTInfo;
1473
1474
1475
1476
1477 u8 bIOTAction = 0;
1478
1479
1480
1481
1482 IEEE80211_DEBUG(IEEE80211_DL_HT, "==============>%s()\n", __FUNCTION__);
1483
1484
1485 if (pNetwork->bssht.bdSupportHT)
1486 {
1487 pHTInfo->bCurrentHTSupport = true;
1488 pHTInfo->ePeerHTSpecVer = pNetwork->bssht.bdHTSpecVer;
1489
1490
1491 if(pNetwork->bssht.bdHTCapLen > 0 && pNetwork->bssht.bdHTCapLen <= sizeof(pHTInfo->PeerHTCapBuf))
1492 memcpy(pHTInfo->PeerHTCapBuf, pNetwork->bssht.bdHTCapBuf, pNetwork->bssht.bdHTCapLen);
1493
1494 if(pNetwork->bssht.bdHTInfoLen > 0 && pNetwork->bssht.bdHTInfoLen <= sizeof(pHTInfo->PeerHTInfoBuf))
1495 memcpy(pHTInfo->PeerHTInfoBuf, pNetwork->bssht.bdHTInfoBuf, pNetwork->bssht.bdHTInfoLen);
1496
1497
1498 if(pHTInfo->bRegRT2RTAggregation)
1499 {
1500 pHTInfo->bCurrentRT2RTAggregation = pNetwork->bssht.bdRT2RTAggregation;
1501 pHTInfo->bCurrentRT2RTLongSlotTime = pNetwork->bssht.bdRT2RTLongSlotTime;
1502 }
1503 else
1504 {
1505 pHTInfo->bCurrentRT2RTAggregation = false;
1506 pHTInfo->bCurrentRT2RTLongSlotTime = false;
1507 }
1508
1509
1510 HTIOTPeerDetermine(ieee);
1511
1512
1513
1514 pHTInfo->IOTAction = 0;
1515 bIOTAction = HTIOTActIsDisableMCS14(ieee, pNetwork->bssid);
1516 if(bIOTAction)
1517 pHTInfo->IOTAction |= HT_IOT_ACT_DISABLE_MCS14;
1518
1519 bIOTAction = HTIOTActIsDisableMCS15(ieee);
1520 if(bIOTAction)
1521 pHTInfo->IOTAction |= HT_IOT_ACT_DISABLE_MCS15;
1522
1523 bIOTAction = HTIOTActIsDisableMCSTwoSpatialStream(ieee, pNetwork->bssid);
1524 if(bIOTAction)
1525 pHTInfo->IOTAction |= HT_IOT_ACT_DISABLE_ALL_2SS;
1526
1527
1528 bIOTAction = HTIOTActIsDisableEDCATurbo(ieee, pNetwork->bssid);
1529 if(bIOTAction)
1530 pHTInfo->IOTAction |= HT_IOT_ACT_DISABLE_EDCA_TURBO;
1531
1532 bIOTAction = HTIOTActIsMgntUseCCK6M(pNetwork);
1533 if(bIOTAction)
1534 pHTInfo->IOTAction |= HT_IOT_ACT_MGNT_USE_CCK_6M;
1535
1536 bIOTAction = HTIOTActIsCCDFsync(pNetwork->bssid);
1537 if(bIOTAction)
1538 pHTInfo->IOTAction |= HT_IOT_ACT_CDD_FSYNC;
1539
1540
1541 }
1542 else
1543 {
1544 pHTInfo->bCurrentHTSupport = false;
1545 pHTInfo->bCurrentRT2RTAggregation = false;
1546 pHTInfo->bCurrentRT2RTLongSlotTime = false;
1547
1548 pHTInfo->IOTAction = 0;
1549 }
1550
1551}
1552
1553void HTUpdateSelfAndPeerSetting(struct ieee80211_device* ieee, struct ieee80211_network * pNetwork)
1554{
1555 PRT_HIGH_THROUGHPUT pHTInfo = ieee->pHTInfo;
1556
1557 PHT_INFORMATION_ELE pPeerHTInfo = (PHT_INFORMATION_ELE)pNetwork->bssht.bdHTInfoBuf;
1558
1559 if(pHTInfo->bCurrentHTSupport)
1560 {
1561
1562
1563
1564 if(pNetwork->bssht.bdHTInfoLen != 0)
1565 pHTInfo->CurrentOpMode = pPeerHTInfo->OptMode;
1566
1567
1568
1569
1570 }
1571}
1572
1573void HTUseDefaultSetting(struct ieee80211_device* ieee)
1574{
1575 PRT_HIGH_THROUGHPUT pHTInfo = ieee->pHTInfo;
1576
1577
1578 if(pHTInfo->bEnableHT)
1579 {
1580 pHTInfo->bCurrentHTSupport = true;
1581
1582 pHTInfo->bCurSuppCCK = pHTInfo->bRegSuppCCK;
1583
1584 pHTInfo->bCurBW40MHz = pHTInfo->bRegBW40MHz;
1585
1586 pHTInfo->bCurShortGI20MHz= pHTInfo->bRegShortGI20MHz;
1587
1588 pHTInfo->bCurShortGI40MHz= pHTInfo->bRegShortGI40MHz;
1589
1590 pHTInfo->bCurrent_AMSDU_Support = pHTInfo->bAMSDU_Support;
1591
1592 pHTInfo->nCurrent_AMSDU_MaxSize = pHTInfo->nAMSDU_MaxSize;
1593
1594 pHTInfo->bCurrentAMPDUEnable = pHTInfo->bAMPDUEnable;
1595
1596 pHTInfo->CurrentAMPDUFactor = pHTInfo->AMPDU_Factor;
1597
1598 pHTInfo->CurrentMPDUDensity = pHTInfo->CurrentMPDUDensity;
1599
1600
1601
1602
1603 HTFilterMCSRate(ieee, ieee->Regdot11HTOperationalRateSet, ieee->dot11HTOperationalRateSet);
1604
1605#ifdef TODO
1606 Adapter->HalFunc.InitHalRATRTableHandler( Adapter, &pMgntInfo->dot11OperationalRateSet, pMgntInfo->dot11HTOperationalRateSet);
1607#endif
1608 ieee->HTHighestOperaRate = HTGetHighestMCSRate(ieee, ieee->dot11HTOperationalRateSet, MCS_FILTER_ALL);
1609 ieee->HTCurrentOperaRate = ieee->HTHighestOperaRate;
1610
1611 }
1612 else
1613 {
1614 pHTInfo->bCurrentHTSupport = false;
1615 }
1616 return;
1617}
1618
1619
1620
1621
1622
1623
1624
1625
1626u8 HTCCheck(struct ieee80211_device* ieee, u8* pFrame)
1627{
1628 if(ieee->pHTInfo->bCurrentHTSupport)
1629 {
1630 if( (IsQoSDataFrame(pFrame) && Frame_Order(pFrame)) == 1)
1631 {
1632 IEEE80211_DEBUG(IEEE80211_DL_HT, "HT CONTROL FILED EXIST!!\n");
1633 return true;
1634 }
1635 }
1636 return false;
1637}
1638
1639
1640
1641
1642void HTSetConnectBwMode(struct ieee80211_device* ieee, HT_CHANNEL_WIDTH Bandwidth, HT_EXTCHNL_OFFSET Offset)
1643{
1644 PRT_HIGH_THROUGHPUT pHTInfo = ieee->pHTInfo;
1645
1646
1647 if(pHTInfo->bRegBW40MHz == false)
1648 return;
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658 if(pHTInfo->bSwBwInProgress) {
1659
1660 return;
1661 }
1662
1663 if(Bandwidth==HT_CHANNEL_WIDTH_20_40 && (!ieee->GetHalfNmodeSupportByAPsHandler(ieee->dev)))
1664 {
1665
1666 if(ieee->current_network.channel<2 && Offset==HT_EXTCHNL_OFFSET_LOWER)
1667 Offset = HT_EXTCHNL_OFFSET_NO_EXT;
1668 if(Offset==HT_EXTCHNL_OFFSET_UPPER || Offset==HT_EXTCHNL_OFFSET_LOWER) {
1669 pHTInfo->bCurBW40MHz = true;
1670 pHTInfo->CurSTAExtChnlOffset = Offset;
1671 } else {
1672 pHTInfo->bCurBW40MHz = false;
1673 pHTInfo->CurSTAExtChnlOffset = HT_EXTCHNL_OFFSET_NO_EXT;
1674 }
1675 } else {
1676 pHTInfo->bCurBW40MHz = false;
1677 pHTInfo->CurSTAExtChnlOffset = HT_EXTCHNL_OFFSET_NO_EXT;
1678 }
1679
1680 pHTInfo->bSwBwInProgress = true;
1681
1682
1683
1684
1685
1686 HTSetConnectBwModeCallback(ieee);
1687
1688
1689}
1690
1691void HTSetConnectBwModeCallback(struct ieee80211_device* ieee)
1692{
1693 PRT_HIGH_THROUGHPUT pHTInfo = ieee->pHTInfo;
1694
1695 IEEE80211_DEBUG(IEEE80211_DL_HT, "======>%s()\n", __FUNCTION__);
1696
1697 if(pHTInfo->bCurBW40MHz)
1698 {
1699 if(pHTInfo->CurSTAExtChnlOffset==HT_EXTCHNL_OFFSET_UPPER)
1700 ieee->set_chan(ieee->dev, ieee->current_network.channel+2);
1701 else if(pHTInfo->CurSTAExtChnlOffset==HT_EXTCHNL_OFFSET_LOWER)
1702 ieee->set_chan(ieee->dev, ieee->current_network.channel-2);
1703 else
1704 ieee->set_chan(ieee->dev, ieee->current_network.channel);
1705
1706 ieee->SetBWModeHandler(ieee->dev, HT_CHANNEL_WIDTH_20_40, pHTInfo->CurSTAExtChnlOffset);
1707 } else {
1708 ieee->set_chan(ieee->dev, ieee->current_network.channel);
1709 ieee->SetBWModeHandler(ieee->dev, HT_CHANNEL_WIDTH_20, HT_EXTCHNL_OFFSET_NO_EXT);
1710 }
1711
1712 pHTInfo->bSwBwInProgress = false;
1713}
1714
1715#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
1716
1717#else
1718
1719#endif
1720