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