Merge branch 'perf-uprobes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
[deliverable/linux.git] / drivers / staging / vt6655 / vntwifi.c
CommitLineData
5449c685
FB
1/*
2 * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
3 * All rights reserved.
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License along
16 * with this program; if not, write to the Free Software Foundation, Inc.,
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 *
20 * File: vntwifi.c
21 *
22 * Purpose: export functions for vntwifi lib
23 *
24 * Functions:
25 *
26 * Revision History:
27 *
28 * Author: Yiching Chen
29 *
30 * Date: feb. 2, 2005
31 *
32 */
33
5449c685 34#include "vntwifi.h"
5449c685 35#include "IEEE11h.h"
5449c685 36#include "country.h"
5449c685 37#include "device.h"
5449c685 38#include "wmgr.h"
5449c685 39#include "datarate.h"
a7ad322a 40
5449c685
FB
41//#define PLICE_DEBUG
42
43/*--------------------- Static Definitions -------------------------*/
44//static int msglevel =MSG_LEVEL_DEBUG;
45//static int msglevel =MSG_LEVEL_INFO;
46
47/*--------------------- Static Classes ----------------------------*/
48
49/*--------------------- Static Variables --------------------------*/
50
51/*--------------------- Static Functions --------------------------*/
52
53/*--------------------- Export Variables --------------------------*/
54
55/*--------------------- Export Functions --------------------------*/
56
57/*+
58 *
59 * Description:
60 * Set Operation Mode
61 *
62 * Parameters:
63 * In:
64 * pMgmtHandle - pointer to management object
65 * eOPMode - Opreation Mode
66 * Out:
67 * none
68 *
69 * Return Value: none
70 *
71-*/
6b35b7b3 72void
5449c685 73VNTWIFIvSetOPMode (
3a215e0f
CC
74 void *pMgmtHandle,
75 WMAC_CONFIG_MODE eOPMode
5449c685
FB
76 )
77{
78 PSMgmtObject pMgmt = (PSMgmtObject)pMgmtHandle;
79
80 pMgmt->eConfigMode = eOPMode;
81}
82
83
84/*+
85 *
86 * Description:
87 * Set Operation Mode
88 *
89 * Parameters:
90 * In:
91 * pMgmtHandle - pointer to management object
92 * wBeaconPeriod - Beacon Period
93 * wATIMWindow - ATIM window
94 * uChannel - channel number
95 * Out:
96 * none
97 *
98 * Return Value: none
99 *
100-*/
6b35b7b3 101void
5449c685 102VNTWIFIvSetIBSSParameter (
3a215e0f 103 void *pMgmtHandle,
2986db5f
CC
104 unsigned short wBeaconPeriod,
105 unsigned short wATIMWindow,
b6e95cd5 106 unsigned int uChannel
5449c685
FB
107 )
108{
109 PSMgmtObject pMgmt = (PSMgmtObject)pMgmtHandle;
110
111 pMgmt->wIBSSBeaconPeriod = wBeaconPeriod;
112 pMgmt->wIBSSATIMWindow = wATIMWindow;
113 pMgmt->uIBSSChannel = uChannel;
114}
115
116/*+
117 *
118 * Description:
119 * Get current SSID
120 *
121 * Parameters:
122 * In:
123 * pMgmtHandle - pointer to management object
124 * Out:
125 * none
126 *
127 * Return Value: current SSID pointer.
128 *
129-*/
130PWLAN_IE_SSID
131VNTWIFIpGetCurrentSSID (
3a215e0f 132 void *pMgmtHandle
5449c685
FB
133 )
134{
135 PSMgmtObject pMgmt = (PSMgmtObject)pMgmtHandle;
136 return((PWLAN_IE_SSID) pMgmt->abyCurrSSID);
137}
138
139/*+
140 *
141 * Description:
142 * Get current link channel
143 *
144 * Parameters:
145 * In:
146 * pMgmtHandle - pointer to management object
147 * Out:
148 * none
149 *
150 * Return Value: current Channel.
151 *
152-*/
b6e95cd5 153unsigned int
5449c685 154VNTWIFIpGetCurrentChannel (
3a215e0f 155 void *pMgmtHandle
5449c685
FB
156 )
157{
158 PSMgmtObject pMgmt = (PSMgmtObject)pMgmtHandle;
159 if (pMgmtHandle != NULL) {
160 return (pMgmt->uCurrChannel);
161 }
162 return 0;
163}
164
165/*+
166 *
167 * Description:
168 * Get current Assoc ID
169 *
170 * Parameters:
171 * In:
172 * pMgmtHandle - pointer to management object
173 * Out:
174 * none
175 *
176 * Return Value: current Assoc ID
177 *
178-*/
2986db5f 179unsigned short
5449c685 180VNTWIFIwGetAssocID (
3a215e0f 181 void *pMgmtHandle
5449c685
FB
182 )
183{
184 PSMgmtObject pMgmt = (PSMgmtObject)pMgmtHandle;
185 return(pMgmt->wCurrAID);
186}
187
188
189
190/*+
191 *
192 * Description:
193 * This routine return max support rate of IES
194 *
195 * Parameters:
196 * In:
197 * pSupportRateIEs
198 * pExtSupportRateIEs
199 *
200 * Out:
201 *
202 * Return Value: max support rate
203 *
204-*/
3fc9b584 205unsigned char
5449c685 206VNTWIFIbyGetMaxSupportRate (
3a215e0f
CC
207 PWLAN_IE_SUPP_RATES pSupportRateIEs,
208 PWLAN_IE_SUPP_RATES pExtSupportRateIEs
5449c685
FB
209 )
210{
3fc9b584
CC
211 unsigned char byMaxSupportRate = RATE_1M;
212 unsigned char bySupportRate = RATE_1M;
b6e95cd5 213 unsigned int ii = 0;
5449c685
FB
214
215 if (pSupportRateIEs) {
216 for (ii = 0; ii < pSupportRateIEs->len; ii++) {
217 bySupportRate = DATARATEbyGetRateIdx(pSupportRateIEs->abyRates[ii]);
218 if (bySupportRate > byMaxSupportRate) {
219 byMaxSupportRate = bySupportRate;
220 }
221 }
222 }
223 if (pExtSupportRateIEs) {
224 for (ii = 0; ii < pExtSupportRateIEs->len; ii++) {
225 bySupportRate = DATARATEbyGetRateIdx(pExtSupportRateIEs->abyRates[ii]);
226 if (bySupportRate > byMaxSupportRate) {
227 byMaxSupportRate = bySupportRate;
228 }
229 }
230 }
231
232 return byMaxSupportRate;
233}
234
235/*+
236 *
237 * Description:
238 * This routine return data rate of ACK packtet
239 *
240 * Parameters:
241 * In:
242 * byRxDataRate
243 * pSupportRateIEs
244 * pExtSupportRateIEs
245 *
246 * Out:
247 *
248 * Return Value: max support rate
249 *
250-*/
3fc9b584 251unsigned char
5449c685 252VNTWIFIbyGetACKTxRate (
3fc9b584 253 unsigned char byRxDataRate,
3a215e0f
CC
254 PWLAN_IE_SUPP_RATES pSupportRateIEs,
255 PWLAN_IE_SUPP_RATES pExtSupportRateIEs
5449c685
FB
256 )
257{
3fc9b584
CC
258 unsigned char byMaxAckRate;
259 unsigned char byBasicRate;
b6e95cd5 260 unsigned int ii;
5449c685
FB
261
262 if (byRxDataRate <= RATE_11M) {
263 byMaxAckRate = RATE_1M;
264 } else {
265 // 24M is mandatory for 802.11a and 802.11g
266 byMaxAckRate = RATE_24M;
267 }
268 if (pSupportRateIEs) {
269 for (ii = 0; ii < pSupportRateIEs->len; ii++) {
270 if (pSupportRateIEs->abyRates[ii] & 0x80) {
271 byBasicRate = DATARATEbyGetRateIdx(pSupportRateIEs->abyRates[ii]);
272 if ((byBasicRate <= byRxDataRate) &&
273 (byBasicRate > byMaxAckRate)) {
274 byMaxAckRate = byBasicRate;
275 }
276 }
277 }
278 }
279 if (pExtSupportRateIEs) {
280 for (ii = 0; ii < pExtSupportRateIEs->len; ii++) {
281 if (pExtSupportRateIEs->abyRates[ii] & 0x80) {
282 byBasicRate = DATARATEbyGetRateIdx(pExtSupportRateIEs->abyRates[ii]);
283 if ((byBasicRate <= byRxDataRate) &&
284 (byBasicRate > byMaxAckRate)) {
285 byMaxAckRate = byBasicRate;
286 }
287 }
288 }
289 }
290
291 return byMaxAckRate;
292}
293
294/*+
295 *
296 * Description:
297 * Set Authentication Mode
298 *
299 * Parameters:
300 * In:
301 * pMgmtHandle - pointer to management object
302 * eAuthMode - Authentication mode
303 * Out:
304 * none
305 *
306 * Return Value: none
307 *
308-*/
6b35b7b3 309void
5449c685 310VNTWIFIvSetAuthenticationMode (
3a215e0f
CC
311 void *pMgmtHandle,
312 WMAC_AUTHENTICATION_MODE eAuthMode
5449c685
FB
313 )
314{
315 PSMgmtObject pMgmt = (PSMgmtObject)pMgmtHandle;
316
317 pMgmt->eAuthenMode = eAuthMode;
318 if ((eAuthMode == WMAC_AUTH_SHAREKEY) ||
319 (eAuthMode == WMAC_AUTH_AUTO)) {
1b12068a 320 pMgmt->bShareKeyAlgorithm = true;
5449c685 321 } else {
5a5a2a6a 322 pMgmt->bShareKeyAlgorithm = false;
5449c685
FB
323 }
324}
325
326/*+
327 *
328 * Description:
329 * Set Encryption Mode
330 *
331 * Parameters:
332 * In:
333 * pMgmtHandle - pointer to management object
334 * eAuthMode - Authentication mode
335 * Out:
336 * none
337 *
338 * Return Value: none
339 *
340-*/
6b35b7b3 341void
5449c685 342VNTWIFIvSetEncryptionMode (
3a215e0f
CC
343 void *pMgmtHandle,
344 WMAC_ENCRYPTION_MODE eEncryptionMode
5449c685
FB
345 )
346{
347 PSMgmtObject pMgmt = (PSMgmtObject)pMgmtHandle;
348
349 pMgmt->eEncryptionMode = eEncryptionMode;
350 if ((eEncryptionMode == WMAC_ENCRYPTION_WEPEnabled) ||
351 (eEncryptionMode == WMAC_ENCRYPTION_TKIPEnabled) ||
352 (eEncryptionMode == WMAC_ENCRYPTION_AESEnabled) ) {
1b12068a 353 pMgmt->bPrivacyInvoked = true;
5449c685 354 } else {
5a5a2a6a 355 pMgmt->bPrivacyInvoked = false;
5449c685
FB
356 }
357}
358
359
360
7b6a0013 361bool
5449c685 362VNTWIFIbConfigPhyMode (
3a215e0f
CC
363 void *pMgmtHandle,
364 CARD_PHY_TYPE ePhyType
5449c685
FB
365 )
366{
367 PSMgmtObject pMgmt = (PSMgmtObject)pMgmtHandle;
368
369 if ((ePhyType != PHY_TYPE_AUTO) &&
370 (ePhyType != pMgmt->eCurrentPHYMode)) {
1b12068a 371 if (CARDbSetPhyParameter(pMgmt->pAdapter, ePhyType, 0, 0, NULL, NULL)==true) {
5449c685
FB
372 pMgmt->eCurrentPHYMode = ePhyType;
373 } else {
5a5a2a6a 374 return(false);
5449c685
FB
375 }
376 }
377 pMgmt->eConfigPHYMode = ePhyType;
1b12068a 378 return(true);
5449c685
FB
379}
380
381
6b35b7b3 382void
5449c685 383VNTWIFIbGetConfigPhyMode (
3a215e0f 384 void *pMgmtHandle,
3cdec554 385 void *pePhyType
5449c685
FB
386 )
387{
388 PSMgmtObject pMgmt = (PSMgmtObject)pMgmtHandle;
389
390 if ((pMgmt != NULL) && (pePhyType != NULL)) {
391 *(PCARD_PHY_TYPE)pePhyType = pMgmt->eConfigPHYMode;
392 }
393}
394
395/*+
396 *
397 * Description:
398 * Clear BSS List Database except current assoc BSS
399 *
400 * Parameters:
401 * In:
402 * pMgmtHandle - Management Object structure
403 * bLinkPass - Current Link status
404 * Out:
405 *
406 * Return Value: None.
407 *
408-*/
409
410
411/*+
412 *
413 * Description:
414 * Query BSS List in management database
415 *
416 * Parameters:
417 * In:
418 * pMgmtHandle - Management Object structure
419 * Out:
420 * puBSSCount - BSS count
421 * pvFirstBSS - pointer to first BSS
422 *
423 * Return Value: None.
424 *
425-*/
426
6b35b7b3 427void
fe4f34bd 428VNTWIFIvQueryBSSList(void *pMgmtHandle, unsigned int *puBSSCount, void **pvFirstBSS)
5449c685 429{
b6e95cd5 430 unsigned int ii = 0;
5449c685
FB
431 PSMgmtObject pMgmt = (PSMgmtObject)pMgmtHandle;
432 PKnownBSS pBSS = NULL;
b6e95cd5 433 unsigned int uCount = 0;
5449c685
FB
434
435 *pvFirstBSS = NULL;
436
437 for (ii = 0; ii < MAX_BSS_NUM; ii++) {
438 pBSS = &(pMgmt->sBSSList[ii]);
439 if (!pBSS->bActive) {
440 continue;
441 }
442 if (*pvFirstBSS == NULL) {
443 *pvFirstBSS = &(pMgmt->sBSSList[ii]);
444 }
445 uCount++;
446 }
447 *puBSSCount = uCount;
448}
449
450
451
452
6b35b7b3 453void
5449c685 454VNTWIFIvGetNextBSS (
3a215e0f
CC
455 void *pMgmtHandle,
456 void *pvCurrentBSS,
3cdec554 457 void **pvNextBSS
5449c685
FB
458 )
459{
460 PKnownBSS pBSS = (PKnownBSS) pvCurrentBSS;
461 PSMgmtObject pMgmt = (PSMgmtObject)pMgmtHandle;
462
463 *pvNextBSS = NULL;
464
465 while (*pvNextBSS == NULL) {
466 pBSS++;
467 if (pBSS > &(pMgmt->sBSSList[MAX_BSS_NUM])) {
468 return;
469 }
1b12068a 470 if (pBSS->bActive == true) {
5449c685
FB
471 *pvNextBSS = pBSS;
472 return;
473 }
474 }
475}
476
477
478
479
480
481/*+
482 *
483 * Description:
484 * Update Tx attemps, Tx failure counter in Node DB
485 *
486 * In:
487 * Out:
488 * none
489 *
490 * Return Value: none
491 *
492-*/
6b35b7b3 493void
5449c685 494VNTWIFIvUpdateNodeTxCounter(
3a215e0f 495 void *pMgmtHandle,
2989e96f 496 unsigned char *pbyDestAddress,
7b6a0013 497 bool bTxOk,
2986db5f 498 unsigned short wRate,
2989e96f 499 unsigned char *pbyTxFailCount
5449c685
FB
500 )
501{
502 PSMgmtObject pMgmt = (PSMgmtObject)pMgmtHandle;
b6e95cd5
CC
503 unsigned int uNodeIndex = 0;
504 unsigned int ii;
5449c685
FB
505
506 if ((pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) ||
507 (pMgmt->eCurrMode == WMAC_MODE_ESS_AP)) {
5a5a2a6a 508 if (BSSDBbIsSTAInNodeDB(pMgmt, pbyDestAddress, &uNodeIndex) == false) {
5449c685
FB
509 return;
510 }
511 }
512 pMgmt->sNodeDBTable[uNodeIndex].uTxAttempts++;
1b12068a 513 if (bTxOk == true) {
5449c685
FB
514 // transmit success, TxAttempts at least plus one
515 pMgmt->sNodeDBTable[uNodeIndex].uTxOk[MAX_RATE]++;
516 pMgmt->sNodeDBTable[uNodeIndex].uTxOk[wRate]++;
517 } else {
518 pMgmt->sNodeDBTable[uNodeIndex].uTxFailures++;
519 }
520 pMgmt->sNodeDBTable[uNodeIndex].uTxRetry += pbyTxFailCount[MAX_RATE];
521 for(ii=0;ii<MAX_RATE;ii++) {
522 pMgmt->sNodeDBTable[uNodeIndex].uTxFail[ii] += pbyTxFailCount[ii];
523 }
524 return;
525}
526
527
6b35b7b3 528void
5449c685 529VNTWIFIvGetTxRate(
3a215e0f 530 void *pMgmtHandle,
2989e96f 531 unsigned char *pbyDestAddress,
15df6c2b 532 unsigned short *pwTxDataRate,
2989e96f
CC
533 unsigned char *pbyACKRate,
534 unsigned char *pbyCCKBasicRate,
535 unsigned char *pbyOFDMBasicRate
5449c685
FB
536 )
537{
538 PSMgmtObject pMgmt = (PSMgmtObject)pMgmtHandle;
b6e95cd5 539 unsigned int uNodeIndex = 0;
2986db5f 540 unsigned short wTxDataRate = RATE_1M;
3fc9b584
CC
541 unsigned char byACKRate = RATE_1M;
542 unsigned char byCCKBasicRate = RATE_1M;
543 unsigned char byOFDMBasicRate = RATE_24M;
5449c685
FB
544 PWLAN_IE_SUPP_RATES pSupportRateIEs = NULL;
545 PWLAN_IE_SUPP_RATES pExtSupportRateIEs = NULL;
546
547
548 if ((pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) ||
549 (pMgmt->eCurrMode == WMAC_MODE_ESS_AP)) {
550 // Adhoc Tx rate decided from node DB
551 if(BSSDBbIsSTAInNodeDB(pMgmt, pbyDestAddress, &uNodeIndex)) {
552 wTxDataRate = (pMgmt->sNodeDBTable[uNodeIndex].wTxDataRate);
553 pSupportRateIEs = (PWLAN_IE_SUPP_RATES) (pMgmt->sNodeDBTable[uNodeIndex].abyCurrSuppRates);
554 pExtSupportRateIEs = (PWLAN_IE_SUPP_RATES) (pMgmt->sNodeDBTable[uNodeIndex].abyCurrExtSuppRates);
555 } else {
556 if (pMgmt->eCurrentPHYMode != PHY_TYPE_11A) {
557 wTxDataRate = RATE_2M;
558 } else {
559 wTxDataRate = RATE_24M;
560 }
561 pSupportRateIEs = (PWLAN_IE_SUPP_RATES) pMgmt->abyCurrSuppRates;
562 pExtSupportRateIEs = (PWLAN_IE_SUPP_RATES) pMgmt->abyCurrExtSuppRates;
563 }
564 } else { // Infrastructure: rate decided from AP Node, index = 0
565
566 wTxDataRate = (pMgmt->sNodeDBTable[0].wTxDataRate);
567#ifdef PLICE_DEBUG
3c02dc22 568 printk(KERN_DEBUG "GetTxRate:AP MAC is %pM,TxRate is %d\n",
e7cde7b3 569 pMgmt->sNodeDBTable[0].abyMACAddr, wTxDataRate);
5449c685
FB
570#endif
571
572
573 pSupportRateIEs = (PWLAN_IE_SUPP_RATES) pMgmt->abyCurrSuppRates;
574 pExtSupportRateIEs = (PWLAN_IE_SUPP_RATES) pMgmt->abyCurrExtSuppRates;
575 }
3fc9b584 576 byACKRate = VNTWIFIbyGetACKTxRate( (unsigned char) wTxDataRate,
5449c685
FB
577 pSupportRateIEs,
578 pExtSupportRateIEs
579 );
3fc9b584
CC
580 if (byACKRate > (unsigned char) wTxDataRate) {
581 byACKRate = (unsigned char) wTxDataRate;
5449c685
FB
582 }
583 byCCKBasicRate = VNTWIFIbyGetACKTxRate( RATE_11M,
584 pSupportRateIEs,
585 pExtSupportRateIEs
586 );
587 byOFDMBasicRate = VNTWIFIbyGetACKTxRate(RATE_54M,
588 pSupportRateIEs,
589 pExtSupportRateIEs
590 );
591 *pwTxDataRate = wTxDataRate;
592 *pbyACKRate = byACKRate;
593 *pbyCCKBasicRate = byCCKBasicRate;
594 *pbyOFDMBasicRate = byOFDMBasicRate;
595 return;
596}
597
3fc9b584 598unsigned char
5449c685 599VNTWIFIbyGetKeyCypher(
3a215e0f 600 void *pMgmtHandle,
7b6a0013 601 bool bGroupKey
5449c685
FB
602 )
603{
604 PSMgmtObject pMgmt = (PSMgmtObject)pMgmtHandle;
605
1b12068a 606 if (bGroupKey == true) {
5449c685
FB
607 return (pMgmt->byCSSGK);
608 } else {
609 return (pMgmt->byCSSPK);
610 }
611}
612
613
614/*
7b6a0013 615bool
5449c685 616VNTWIFIbInit(
3a215e0f 617 void *pAdapterHandler,
3cdec554 618 void **pMgmtHandler
5449c685
FB
619 )
620{
621
622 PSMgmtObject pMgmt = NULL;
b6e95cd5 623 unsigned int ii;
5449c685
FB
624
625
626 pMgmt = (PSMgmtObject)kmalloc(sizeof(SMgmtObject), (int)GFP_ATOMIC);
627 if (pMgmt == NULL) {
628 *pMgmtHandler = NULL;
5a5a2a6a 629 return false;
5449c685
FB
630 }
631
632 memset(pMgmt, 0, sizeof(SMgmtObject));
830a619c 633 pMgmt->pAdapter = (void *) pAdapterHandler;
5449c685
FB
634
635 // should initial MAC address abyMACAddr
636 for(ii=0;ii<WLAN_BSSID_LEN;ii++) {
637 pMgmt->abyDesireBSSID[ii] = 0xFF;
638 }
639 pMgmt->pbyPSPacketPool = &pMgmt->byPSPacketPool[0];
640 pMgmt->pbyMgmtPacketPool = &pMgmt->byMgmtPacketPool[0];
641 pMgmt->byCSSPK = KEY_CTL_NONE;
642 pMgmt->byCSSGK = KEY_CTL_NONE;
643 pMgmt->wIBSSBeaconPeriod = DEFAULT_IBSS_BI;
644
645 pMgmt->cbFreeCmdQueue = CMD_Q_SIZE;
646 pMgmt->uCmdDequeueIdx = 0;
647 pMgmt->uCmdEnqueueIdx = 0;
648 pMgmt->eCommandState = WLAN_CMD_STATE_IDLE;
5a5a2a6a
CC
649 pMgmt->bCmdStop = false;
650 pMgmt->bCmdRunning = false;
5449c685
FB
651
652 *pMgmtHandler = pMgmt;
1b12068a 653 return true;
5449c685
FB
654}
655*/
656
657
658
7b6a0013 659bool
5449c685 660VNTWIFIbSetPMKIDCache (
3a215e0f 661 void *pMgmtObject,
e3fd16d0 662 unsigned long ulCount,
3a215e0f 663 void *pPMKIDInfo
5449c685
FB
664 )
665{
666 PSMgmtObject pMgmt = (PSMgmtObject) pMgmtObject;
667
668 if (ulCount > MAX_PMKID_CACHE) {
5a5a2a6a 669 return (false);
5449c685
FB
670 }
671 pMgmt->gsPMKIDCache.BSSIDInfoCount = ulCount;
51b6d9c2 672 memcpy(pMgmt->gsPMKIDCache.BSSIDInfo, pPMKIDInfo, (ulCount*sizeof(PMKIDInfo)));
1b12068a 673 return (true);
5449c685
FB
674}
675
676
677
2986db5f 678unsigned short
5449c685 679VNTWIFIwGetMaxSupportRate(
3a215e0f 680 void *pMgmtObject
5449c685
FB
681 )
682{
2986db5f 683 unsigned short wRate = RATE_54M;
5449c685
FB
684 PSMgmtObject pMgmt = (PSMgmtObject) pMgmtObject;
685
686 for(wRate = RATE_54M; wRate > RATE_1M; wRate--) {
256a816b 687 if (pMgmt->sNodeDBTable[0].wSuppRate & (1<<wRate)) {
5449c685
FB
688 return (wRate);
689 }
690 }
691 if (pMgmt->eCurrentPHYMode == PHY_TYPE_11A) {
692 return (RATE_6M);
693 } else {
694 return (RATE_1M);
695 }
696}
697
698
6b35b7b3 699void
5449c685 700VNTWIFIvSet11h (
3a215e0f 701 void *pMgmtObject,
7b6a0013 702 bool b11hEnable
5449c685
FB
703 )
704{
705 PSMgmtObject pMgmt = (PSMgmtObject) pMgmtObject;
706
707 pMgmt->b11hEnable = b11hEnable;
708}
709
7b6a0013 710bool
5449c685 711VNTWIFIbMeasureReport(
3a215e0f 712 void *pMgmtObject,
7b6a0013 713 bool bEndOfReport,
3a215e0f 714 void *pvMeasureEID,
3fc9b584
CC
715 unsigned char byReportMode,
716 unsigned char byBasicMap,
717 unsigned char byCCAFraction,
2989e96f 718 unsigned char *pbyRPIs
5449c685
FB
719 )
720{
721 PSMgmtObject pMgmt = (PSMgmtObject) pMgmtObject;
2989e96f 722 unsigned char *pbyCurrentEID = (unsigned char *) (pMgmt->pCurrMeasureEIDRep);
5449c685
FB
723
724 //spin_lock_irq(&pDevice->lock);
725 if ((pvMeasureEID != NULL) &&
726 (pMgmt->uLengthOfRepEIDs < (WLAN_A3FR_MAXLEN - sizeof(MEASEURE_REP) - sizeof(WLAN_80211HDR_A3) - 3))
727 ) {
728 pMgmt->pCurrMeasureEIDRep->byElementID = WLAN_EID_MEASURE_REP;
729 pMgmt->pCurrMeasureEIDRep->len = 3;
730 pMgmt->pCurrMeasureEIDRep->byToken = ((PWLAN_IE_MEASURE_REQ) pvMeasureEID)->byToken;
731 pMgmt->pCurrMeasureEIDRep->byMode = byReportMode;
732 pMgmt->pCurrMeasureEIDRep->byType = ((PWLAN_IE_MEASURE_REQ) pvMeasureEID)->byType;
733 switch (pMgmt->pCurrMeasureEIDRep->byType) {
734 case MEASURE_TYPE_BASIC :
735 pMgmt->pCurrMeasureEIDRep->len += sizeof(MEASEURE_REP_BASIC);
51b6d9c2 736 memcpy( &(pMgmt->pCurrMeasureEIDRep->sRep.sBasic),
5449c685
FB
737 &(((PWLAN_IE_MEASURE_REQ) pvMeasureEID)->sReq),
738 sizeof(MEASEURE_REQ));
739 pMgmt->pCurrMeasureEIDRep->sRep.sBasic.byMap = byBasicMap;
740 break;
741 case MEASURE_TYPE_CCA :
742 pMgmt->pCurrMeasureEIDRep->len += sizeof(MEASEURE_REP_CCA);
51b6d9c2 743 memcpy( &(pMgmt->pCurrMeasureEIDRep->sRep.sCCA),
5449c685
FB
744 &(((PWLAN_IE_MEASURE_REQ) pvMeasureEID)->sReq),
745 sizeof(MEASEURE_REQ));
746 pMgmt->pCurrMeasureEIDRep->sRep.sCCA.byCCABusyFraction = byCCAFraction;
747 break;
748 case MEASURE_TYPE_RPI :
749 pMgmt->pCurrMeasureEIDRep->len += sizeof(MEASEURE_REP_RPI);
51b6d9c2 750 memcpy( &(pMgmt->pCurrMeasureEIDRep->sRep.sRPI),
5449c685
FB
751 &(((PWLAN_IE_MEASURE_REQ) pvMeasureEID)->sReq),
752 sizeof(MEASEURE_REQ));
51b6d9c2 753 memcpy(pMgmt->pCurrMeasureEIDRep->sRep.sRPI.abyRPIdensity, pbyRPIs, 8);
5449c685
FB
754 break;
755 default :
756 break;
757 }
758 pbyCurrentEID += (2 + pMgmt->pCurrMeasureEIDRep->len);
759 pMgmt->uLengthOfRepEIDs += (2 + pMgmt->pCurrMeasureEIDRep->len);
760 pMgmt->pCurrMeasureEIDRep = (PWLAN_IE_MEASURE_REP) pbyCurrentEID;
761 }
1b12068a 762 if (bEndOfReport == true) {
5449c685
FB
763 IEEE11hbMSRRepTx(pMgmt);
764 }
765 //spin_unlock_irq(&pDevice->lock);
1b12068a 766 return (true);
5449c685
FB
767}
768
769
7b6a0013 770bool
5449c685 771VNTWIFIbChannelSwitch(
3a215e0f 772 void *pMgmtObject,
3fc9b584 773 unsigned char byNewChannel
5449c685
FB
774 )
775{
776 PSMgmtObject pMgmt = (PSMgmtObject) pMgmtObject;
777
778 //spin_lock_irq(&pDevice->lock);
779 pMgmt->uCurrChannel = byNewChannel;
5a5a2a6a 780 pMgmt->bSwitchChannel = false;
5449c685 781 //spin_unlock_irq(&pDevice->lock);
1b12068a 782 return true;
5449c685
FB
783}
784
785/*
7b6a0013 786bool
5449c685 787VNTWIFIbRadarPresent(
3a215e0f 788 void *pMgmtObject,
3fc9b584 789 unsigned char byChannel
5449c685
FB
790 )
791{
792 PSMgmtObject pMgmt = (PSMgmtObject) pMgmtObject;
793 if ((pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) &&
3fc9b584 794 (byChannel == (unsigned char) pMgmt->uCurrChannel) &&
1b12068a
CC
795 (pMgmt->bSwitchChannel != true) &&
796 (pMgmt->b11hEnable == true)) {
2ef98c60 797 if (!compare_ether_addr(pMgmt->abyIBSSDFSOwner, CARDpGetCurrentAddress(pMgmt->pAdapter))) {
3fc9b584 798 pMgmt->byNewChannel = CARDbyAutoChannelSelect(pMgmt->pAdapter,(unsigned char) pMgmt->uCurrChannel);
1b12068a 799 pMgmt->bSwitchChannel = true;
5449c685
FB
800 }
801 BEACONbSendBeacon(pMgmt);
802 CARDbChannelSwitch(pMgmt->pAdapter, 0, pMgmt->byNewChannel, 10);
803 }
1b12068a 804 return true;
5449c685
FB
805}
806*/
807
This page took 0.318224 seconds and 5 git commands to generate.