Staging: Add pristine upstream vt6655 driver sources
[pandora-kernel.git] / drivers / staging / vt6655 / bssdb.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  * File: bssdb.c
20  *
21  * Purpose: Handles the Basic Service Set & Node Database functions
22  *
23  * Functions:
24  *      BSSpSearchBSSList - Search known BSS list for Desire SSID or BSSID
25  *      BSSvClearBSSList - Clear BSS List
26  *      BSSbInsertToBSSList - Insert a BSS set into known BSS list
27  *      BSSbUpdateToBSSList - Update BSS set in known BSS list
28  *      BSSDBbIsSTAInNodeDB - Search Node DB table to find the index of matched DstAddr
29  *      BSSvCreateOneNode - Allocate an Node for Node DB
30  *      BSSvUpdateAPNode - Update AP Node content in Index 0 of KnownNodeDB
31  *      BSSvSecondCallBack - One second timer callback function to update Node DB info & AP link status
32  *      BSSvUpdateNodeTxCounter - Update Tx attemps, Tx failure counter in Node DB for auto-fall back rate control
33  *
34  * Revision History:
35  *
36  * Author: Lyndon Chen
37  *
38  * Date: July 17, 2002
39  *
40  */
41
42
43 #if !defined(__TBIT_H__)
44 #include "tbit.h"
45 #endif//chester
46 #if !defined(__TTYPE_H__)
47 #include "ttype.h"
48 #endif
49 #if !defined(__TMACRO_H__)
50 #include "tmacro.h"
51 #endif
52 #if !defined(__TETHER_H__)
53 #include "tether.h"
54 #endif
55 #if !defined(__DEVICE_H__)
56 #include "device.h"
57 #endif
58 #if !defined(__80211HDR_H__)
59 #include "80211hdr.h"
60 #endif
61 #if !defined(__BSSDB_H__)
62 #include "bssdb.h"
63 #endif
64 #if !defined(__WMGR_H__)
65 #include "wmgr.h"
66 #endif
67 #if !defined(__DATARATE_H__)
68 #include "datarate.h"
69 #endif
70 #if !defined(__DESC_H__)
71 #include "desc.h"
72 #endif
73 #if !defined(__WCMD_H__)
74 #include "wcmd.h"
75 #endif
76 #if !defined(__WPA_H__)
77 #include "wpa.h"
78 #endif
79 #if !defined(__BASEBAND_H__)
80 #include "baseband.h"
81 #endif
82 #if !defined(__RF_H__)
83 #include "rf.h"
84 #endif
85 #if !defined(__CARD_H__)
86 #include "card.h"
87 #endif
88 #if !defined(__MAC_H__)
89 #include "mac.h"
90 #endif
91 #if !defined(__WPA2_H__)
92 #include "wpa2.h"
93 #endif
94 #if !defined(__UMEM_H__)
95 #include "umem.h"
96 #endif
97 //DavidWang
98 #if !defined(__IOWPA_H__)
99 #include "iowpa.h"
100 #endif
101
102 //#define       PLICE_DEBUG
103 /*---------------------  Static Definitions -------------------------*/
104
105
106
107
108 /*---------------------  Static Classes  ----------------------------*/
109
110 /*---------------------  Static Variables  --------------------------*/
111 static int          msglevel                =MSG_LEVEL_INFO;
112 //static int          msglevel                =MSG_LEVEL_DEBUG;
113
114
115
116 const WORD             awHWRetry0[5][5] = {
117                                             {RATE_18M, RATE_18M, RATE_12M, RATE_12M, RATE_12M},
118                                             {RATE_24M, RATE_24M, RATE_18M, RATE_12M, RATE_12M},
119                                             {RATE_36M, RATE_36M, RATE_24M, RATE_18M, RATE_18M},
120                                             {RATE_48M, RATE_48M, RATE_36M, RATE_24M, RATE_24M},
121                                             {RATE_54M, RATE_54M, RATE_48M, RATE_36M, RATE_36M}
122                                            };
123 const WORD             awHWRetry1[5][5] = {
124                                             {RATE_18M, RATE_18M, RATE_12M, RATE_6M, RATE_6M},
125                                             {RATE_24M, RATE_24M, RATE_18M, RATE_6M, RATE_6M},
126                                             {RATE_36M, RATE_36M, RATE_24M, RATE_12M, RATE_12M},
127                                             {RATE_48M, RATE_48M, RATE_24M, RATE_12M, RATE_12M},
128                                             {RATE_54M, RATE_54M, RATE_36M, RATE_18M, RATE_18M}
129                                            };
130
131
132
133 /*---------------------  Static Functions  --------------------------*/
134
135 VOID s_vCheckSensitivity(
136     IN HANDLE hDeviceContext
137     );
138
139 #ifdef Calcu_LinkQual
140 VOID s_uCalculateLinkQual(
141     IN HANDLE hDeviceContext
142     );
143 #endif
144
145
146 VOID s_vCheckPreEDThreshold(
147     IN HANDLE hDeviceContext
148     );
149 /*---------------------  Export Variables  --------------------------*/
150
151
152 /*---------------------  Export Functions  --------------------------*/
153
154
155
156
157
158 /*+
159  *
160  * Routine Description:
161  *    Search known BSS list for Desire SSID or BSSID.
162  *
163  * Return Value:
164  *    PTR to KnownBSS or NULL
165  *
166 -*/
167
168 PKnownBSS
169 BSSpSearchBSSList(
170     IN HANDLE hDeviceContext,
171     IN PBYTE pbyDesireBSSID,
172     IN PBYTE pbyDesireSSID,
173     IN CARD_PHY_TYPE ePhyType
174     )
175 {
176     PSDevice        pDevice = (PSDevice)hDeviceContext;
177     PSMgmtObject    pMgmt = pDevice->pMgmt;
178     PBYTE           pbyBSSID = NULL;
179     PWLAN_IE_SSID   pSSID = NULL;
180     PKnownBSS       pCurrBSS = NULL;
181     PKnownBSS       pSelect = NULL;
182 BYTE                 ZeroBSSID[WLAN_BSSID_LEN]={0x00,0x00,0x00,0x00,0x00,0x00};
183     UINT            ii = 0;
184 //    UINT            jj = 0;   //DavidWang
185     if (pbyDesireBSSID != NULL) {
186         DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO"BSSpSearchBSSList BSSID[%02X %02X %02X-%02X %02X %02X]\n",
187                             *pbyDesireBSSID,*(pbyDesireBSSID+1),*(pbyDesireBSSID+2),
188                             *(pbyDesireBSSID+3),*(pbyDesireBSSID+4),*(pbyDesireBSSID+5));
189         if ((!IS_BROADCAST_ADDRESS(pbyDesireBSSID)) &&
190              (memcmp(pbyDesireBSSID, ZeroBSSID, 6)!= 0)) {
191             pbyBSSID = pbyDesireBSSID;
192         }
193     }
194     if (pbyDesireSSID != NULL) {
195         if (((PWLAN_IE_SSID)pbyDesireSSID)->len != 0) {
196             pSSID = (PWLAN_IE_SSID) pbyDesireSSID;
197         }
198     }
199
200     if (pbyBSSID != NULL) {
201         // match BSSID first
202         for (ii = 0; ii <MAX_BSS_NUM; ii++) {
203             pCurrBSS = &(pMgmt->sBSSList[ii]);
204 if(pDevice->bLinkPass==FALSE) pCurrBSS->bSelected = FALSE;
205             if ((pCurrBSS->bActive) &&
206                 (pCurrBSS->bSelected == FALSE)) {
207                 if (IS_ETH_ADDRESS_EQUAL(pCurrBSS->abyBSSID, pbyBSSID)) {
208                     if (pSSID != NULL) {
209                         // compare ssid
210                         if (MEMEqualMemory(pSSID->abySSID,
211                             ((PWLAN_IE_SSID)pCurrBSS->abySSID)->abySSID,
212                             pSSID->len)) {
213                             if ((pMgmt->eConfigMode == WMAC_CONFIG_AUTO) ||
214                                 ((pMgmt->eConfigMode == WMAC_CONFIG_IBSS_STA) && WLAN_GET_CAP_INFO_IBSS(pCurrBSS->wCapInfo)) ||
215                                 ((pMgmt->eConfigMode == WMAC_CONFIG_ESS_STA) && WLAN_GET_CAP_INFO_ESS(pCurrBSS->wCapInfo))
216                                 ) {
217                                 pCurrBSS->bSelected = TRUE;
218                                 return(pCurrBSS);
219                             }
220                         }
221                     } else {
222                         if ((pMgmt->eConfigMode == WMAC_CONFIG_AUTO) ||
223                             ((pMgmt->eConfigMode == WMAC_CONFIG_IBSS_STA) && WLAN_GET_CAP_INFO_IBSS(pCurrBSS->wCapInfo)) ||
224                             ((pMgmt->eConfigMode == WMAC_CONFIG_ESS_STA) && WLAN_GET_CAP_INFO_ESS(pCurrBSS->wCapInfo))
225                             ) {
226                             pCurrBSS->bSelected = TRUE;
227                             return(pCurrBSS);
228                         }
229                     }
230                 }
231             }
232         }
233     } else {
234         // ignore BSSID
235         for (ii = 0; ii <MAX_BSS_NUM; ii++) {
236             pCurrBSS = &(pMgmt->sBSSList[ii]);
237         //2007-0721-01<Add>by MikeLiu
238           pCurrBSS->bSelected = FALSE;
239           if (pCurrBSS->bActive) {
240
241                 if (pSSID != NULL) {
242                     // matched SSID
243                     if (!MEMEqualMemory(pSSID->abySSID,
244                         ((PWLAN_IE_SSID)pCurrBSS->abySSID)->abySSID,
245                         pSSID->len) ||
246                         (pSSID->len != ((PWLAN_IE_SSID)pCurrBSS->abySSID)->len)) {
247                         // SSID not match skip this BSS
248                         continue;
249                     }
250                 }
251                 if (((pMgmt->eConfigMode == WMAC_CONFIG_IBSS_STA) && WLAN_GET_CAP_INFO_ESS(pCurrBSS->wCapInfo)) ||
252                     ((pMgmt->eConfigMode == WMAC_CONFIG_ESS_STA) && WLAN_GET_CAP_INFO_IBSS(pCurrBSS->wCapInfo))
253                     ) {
254                     // Type not match skip this BSS
255                     DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO"BSS type mismatch.... Config[%d] BSS[0x%04x]\n", pMgmt->eConfigMode, pCurrBSS->wCapInfo);
256                     continue;
257                 }
258
259                 if (ePhyType != PHY_TYPE_AUTO) {
260                     if (((ePhyType == PHY_TYPE_11A) && (PHY_TYPE_11A != pCurrBSS->eNetworkTypeInUse)) ||
261                         ((ePhyType != PHY_TYPE_11A) && (PHY_TYPE_11A == pCurrBSS->eNetworkTypeInUse))) {
262                         // PhyType not match skip this BSS
263                         DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Physical type mismatch.... ePhyType[%d] BSS[%d]\n", ePhyType, pCurrBSS->eNetworkTypeInUse);
264                         continue;
265                     }
266                 }
267 /*
268                 if (pMgmt->eAuthenMode < WMAC_AUTH_WPA) {
269                     if (pCurrBSS->bWPAValid == TRUE) {
270                         // WPA AP will reject connection of station without WPA enable.
271                         continue;
272                     }
273                 } else if ((pMgmt->eAuthenMode == WMAC_AUTH_WPA) ||
274                            (pMgmt->eAuthenMode == WMAC_AUTH_WPAPSK)) {
275                     if (pCurrBSS->bWPAValid == FALSE) {
276                         // station with WPA enable can't join NonWPA AP.
277                         continue;
278                     }
279                 } else if ((pMgmt->eAuthenMode == WMAC_AUTH_WPA2) ||
280                            (pMgmt->eAuthenMode == WMAC_AUTH_WPA2PSK)) {
281                     if (pCurrBSS->bWPA2Valid == FALSE) {
282                         // station with WPA2 enable can't join NonWPA2 AP.
283                         continue;
284                     }
285                 }
286 */
287                 if (pSelect == NULL) {
288                     pSelect = pCurrBSS;
289                 } else {
290                     // compare RSSI, select signal strong one
291                     if (pCurrBSS->uRSSI < pSelect->uRSSI) {
292                         pSelect = pCurrBSS;
293                     }
294                 }
295             }
296         }
297         if (pSelect != NULL) {
298             pSelect->bSelected = TRUE;
299 /*
300                         if (pDevice->bRoaming == FALSE)  {
301         //       Einsn Add @20070907
302                         ZERO_MEMORY(pbyDesireSSID, WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN + 1);
303                         MEMvCopy(pbyDesireSSID,pCurrBSS->abySSID,WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN + 1) ;
304                                                 }*/
305
306             return(pSelect);
307         }
308     }
309     return(NULL);
310
311 }
312
313
314 /*+
315  *
316  * Routine Description:
317  *    Clear BSS List
318  *
319  * Return Value:
320  *    None.
321  *
322 -*/
323
324
325 VOID
326 BSSvClearBSSList(
327     IN HANDLE hDeviceContext,
328     IN BOOL bKeepCurrBSSID
329     )
330 {
331     PSDevice     pDevice = (PSDevice)hDeviceContext;
332     PSMgmtObject    pMgmt = pDevice->pMgmt;
333     UINT            ii;
334
335     for (ii = 0; ii < MAX_BSS_NUM; ii++) {
336         if (bKeepCurrBSSID) {
337             if (pMgmt->sBSSList[ii].bActive &&
338                 IS_ETH_ADDRESS_EQUAL(pMgmt->sBSSList[ii].abyBSSID, pMgmt->abyCurrBSSID)) {
339                // bKeepCurrBSSID = FALSE;
340                 continue;
341             }
342         }
343
344         if ((pMgmt->sBSSList[ii].bActive) && (pMgmt->sBSSList[ii].uClearCount < BSS_CLEAR_COUNT)) {
345              pMgmt->sBSSList[ii].uClearCount ++;
346              continue;
347         }
348
349         pMgmt->sBSSList[ii].bActive = FALSE;
350         memset(&pMgmt->sBSSList[ii], 0, sizeof(KnownBSS));
351     }
352     BSSvClearAnyBSSJoinRecord(pDevice);
353
354     return;
355 }
356
357
358
359 /*+
360  *
361  * Routine Description:
362  *    search BSS list by BSSID & SSID if matched
363  *
364  * Return Value:
365  *    TRUE if found.
366  *
367 -*/
368 PKnownBSS
369 BSSpAddrIsInBSSList(
370     IN HANDLE hDeviceContext,
371     IN PBYTE abyBSSID,
372     IN PWLAN_IE_SSID pSSID
373     )
374 {
375     PSDevice     pDevice = (PSDevice)hDeviceContext;
376     PSMgmtObject    pMgmt = pDevice->pMgmt;
377     PKnownBSS       pBSSList = NULL;
378     UINT            ii;
379
380     for (ii = 0; ii < MAX_BSS_NUM; ii++) {
381         pBSSList = &(pMgmt->sBSSList[ii]);
382         if (pBSSList->bActive) {
383             if (IS_ETH_ADDRESS_EQUAL(pBSSList->abyBSSID, abyBSSID)) {
384 //                if (pSSID == NULL)
385 //                    return pBSSList;
386                 if (pSSID->len == ((PWLAN_IE_SSID)pBSSList->abySSID)->len){
387                     if (memcmp(pSSID->abySSID,
388                             ((PWLAN_IE_SSID)pBSSList->abySSID)->abySSID,
389                             pSSID->len) == 0)
390                         return pBSSList;
391                 }
392             }
393         }
394     }
395
396     return NULL;
397 };
398
399
400
401
402 /*+
403  *
404  * Routine Description:
405  *    Insert a BSS set into known BSS list
406  *
407  * Return Value:
408  *    TRUE if success.
409  *
410 -*/
411
412 BOOL
413 BSSbInsertToBSSList (
414     IN HANDLE hDeviceContext,
415     IN PBYTE abyBSSIDAddr,
416     IN QWORD qwTimestamp,
417     IN WORD wBeaconInterval,
418     IN WORD wCapInfo,
419     IN BYTE byCurrChannel,
420     IN PWLAN_IE_SSID pSSID,
421     IN PWLAN_IE_SUPP_RATES pSuppRates,
422     IN PWLAN_IE_SUPP_RATES pExtSuppRates,
423     IN PERPObject psERP,
424     IN PWLAN_IE_RSN pRSN,
425     IN PWLAN_IE_RSN_EXT pRSNWPA,
426     IN PWLAN_IE_COUNTRY pIE_Country,
427     IN PWLAN_IE_QUIET pIE_Quiet,
428     IN UINT uIELength,
429     IN PBYTE pbyIEs,
430     IN HANDLE pRxPacketContext
431     )
432 {
433
434     PSDevice     pDevice = (PSDevice)hDeviceContext;
435     PSMgmtObject    pMgmt = pDevice->pMgmt;
436     PSRxMgmtPacket  pRxPacket = (PSRxMgmtPacket)pRxPacketContext;
437     PKnownBSS       pBSSList = NULL;
438     UINT            ii;
439     BOOL            bParsingQuiet = FALSE;
440     PWLAN_IE_QUIET  pQuiet = NULL;
441
442
443
444     pBSSList = (PKnownBSS)&(pMgmt->sBSSList[0]);
445
446     for (ii = 0; ii < MAX_BSS_NUM; ii++) {
447         pBSSList = (PKnownBSS)&(pMgmt->sBSSList[ii]);
448         if (!pBSSList->bActive)
449                 break;
450     }
451
452     if (ii == MAX_BSS_NUM){
453         DEVICE_PRT(MSG_LEVEL_NOTICE, KERN_INFO "Get free KnowBSS node failed.\n");
454         return FALSE;
455     }
456     // save the BSS info
457     pBSSList->bActive = TRUE;
458     memcpy( pBSSList->abyBSSID, abyBSSIDAddr, WLAN_BSSID_LEN);
459     HIDWORD(pBSSList->qwBSSTimestamp) = cpu_to_le32(HIDWORD(qwTimestamp));
460     LODWORD(pBSSList->qwBSSTimestamp) = cpu_to_le32(LODWORD(qwTimestamp));
461     pBSSList->wBeaconInterval = cpu_to_le16(wBeaconInterval);
462     pBSSList->wCapInfo = cpu_to_le16(wCapInfo);
463     pBSSList->uClearCount = 0;
464
465     if (pSSID->len > WLAN_SSID_MAXLEN)
466         pSSID->len = WLAN_SSID_MAXLEN;
467     memcpy( pBSSList->abySSID, pSSID, pSSID->len + WLAN_IEHDR_LEN);
468
469     pBSSList->uChannel = byCurrChannel;
470
471     if (pSuppRates->len > WLAN_RATES_MAXLEN)
472         pSuppRates->len = WLAN_RATES_MAXLEN;
473     memcpy( pBSSList->abySuppRates, pSuppRates, pSuppRates->len + WLAN_IEHDR_LEN);
474
475     if (pExtSuppRates != NULL) {
476         if (pExtSuppRates->len > WLAN_RATES_MAXLEN)
477             pExtSuppRates->len = WLAN_RATES_MAXLEN;
478         memcpy(pBSSList->abyExtSuppRates, pExtSuppRates, pExtSuppRates->len + WLAN_IEHDR_LEN);
479         DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO"BSSbInsertToBSSList: pExtSuppRates->len = %d\n", pExtSuppRates->len);
480
481     } else {
482         memset(pBSSList->abyExtSuppRates, 0, WLAN_IEHDR_LEN + WLAN_RATES_MAXLEN + 1);
483     }
484     pBSSList->sERP.byERP = psERP->byERP;
485     pBSSList->sERP.bERPExist = psERP->bERPExist;
486
487     // Check if BSS is 802.11a/b/g
488     if (pBSSList->uChannel > CB_MAX_CHANNEL_24G) {
489         pBSSList->eNetworkTypeInUse = PHY_TYPE_11A;
490     } else {
491         if (pBSSList->sERP.bERPExist == TRUE) {
492             pBSSList->eNetworkTypeInUse = PHY_TYPE_11G;
493         } else {
494             pBSSList->eNetworkTypeInUse = PHY_TYPE_11B;
495         }
496     }
497
498     pBSSList->byRxRate = pRxPacket->byRxRate;
499     pBSSList->qwLocalTSF = pRxPacket->qwLocalTSF;
500     pBSSList->uRSSI = pRxPacket->uRSSI;
501     pBSSList->bySQ = pRxPacket->bySQ;
502
503    if ((pMgmt->eCurrMode == WMAC_MODE_ESS_STA) &&
504         (pMgmt->eCurrState == WMAC_STATE_ASSOC)) {
505         // assoc with BSS
506         if (pBSSList == pMgmt->pCurrBSS) {
507             bParsingQuiet = TRUE;
508         }
509     }
510
511     WPA_ClearRSN(pBSSList);
512
513     if (pRSNWPA != NULL) {
514         UINT uLen = pRSNWPA->len + 2;
515
516         if (uLen <= (uIELength - (UINT)(ULONG_PTR)((PBYTE)pRSNWPA - pbyIEs))) {
517             pBSSList->wWPALen = uLen;
518             memcpy(pBSSList->byWPAIE, pRSNWPA, uLen);
519             WPA_ParseRSN(pBSSList, pRSNWPA);
520         }
521     }
522
523     WPA2_ClearRSN(pBSSList);
524
525     if (pRSN != NULL) {
526         UINT uLen = pRSN->len + 2;
527         if (uLen <= (uIELength - (UINT)(ULONG_PTR)((PBYTE)pRSN - pbyIEs))) {
528             pBSSList->wRSNLen = uLen;
529             memcpy(pBSSList->byRSNIE, pRSN, uLen);
530             WPA2vParseRSN(pBSSList, pRSN);
531         }
532     }
533
534     if ((pMgmt->eAuthenMode == WMAC_AUTH_WPA2) || (pBSSList->bWPA2Valid == TRUE)) {
535
536         PSKeyItem  pTransmitKey = NULL;
537         BOOL       bIs802_1x = FALSE;
538
539         for (ii = 0; ii < pBSSList->wAKMSSAuthCount; ii ++) {
540             if (pBSSList->abyAKMSSAuthType[ii] == WLAN_11i_AKMSS_802_1X) {
541                 bIs802_1x = TRUE;
542                 break;
543             }
544         }
545         if ((bIs802_1x == TRUE) && (pSSID->len == ((PWLAN_IE_SSID)pMgmt->abyDesireSSID)->len) &&
546             (MEMEqualMemory(pSSID->abySSID, ((PWLAN_IE_SSID)pMgmt->abyDesireSSID)->abySSID, pSSID->len))) {
547
548             bAdd_PMKID_Candidate((HANDLE)pDevice, pBSSList->abyBSSID, &pBSSList->sRSNCapObj);
549
550             if ((pDevice->bLinkPass == TRUE) && (pMgmt->eCurrState == WMAC_STATE_ASSOC)) {
551                 if ((KeybGetTransmitKey(&(pDevice->sKey), pDevice->abyBSSID, PAIRWISE_KEY, &pTransmitKey) == TRUE) ||
552                     (KeybGetTransmitKey(&(pDevice->sKey), pDevice->abyBSSID, GROUP_KEY, &pTransmitKey) == TRUE)) {
553                     pDevice->gsPMKIDCandidate.StatusType = Ndis802_11StatusType_PMKID_CandidateList;
554                     pDevice->gsPMKIDCandidate.Version = 1;
555
556                 }
557
558             }
559         }
560     }
561
562     if (pDevice->bUpdateBBVGA) {
563         // Moniter if RSSI is too strong.
564         pBSSList->byRSSIStatCnt = 0;
565         RFvRSSITodBm(pDevice, (BYTE)(pRxPacket->uRSSI), &pBSSList->ldBmMAX);
566         pBSSList->ldBmAverage[0] = pBSSList->ldBmMAX;
567         for (ii = 1; ii < RSSI_STAT_COUNT; ii++)
568             pBSSList->ldBmAverage[ii] = 0;
569     }
570
571     if ((pIE_Country != NULL) &&
572         (pMgmt->b11hEnable == TRUE)) {
573         CARDvSetCountryInfo(pMgmt->pAdapter,
574                             pBSSList->eNetworkTypeInUse,
575                             pIE_Country);
576     }
577
578
579
580     if ((bParsingQuiet == TRUE) && (pIE_Quiet != NULL)) {
581         if ((((PWLAN_IE_QUIET)pIE_Quiet)->len == 8) &&
582             (((PWLAN_IE_QUIET)pIE_Quiet)->byQuietCount != 0)) {
583             // valid EID
584             if (pQuiet == NULL) {
585                 pQuiet = (PWLAN_IE_QUIET)pIE_Quiet;
586                 CARDbSetQuiet(  pMgmt->pAdapter,
587                                 TRUE,
588                                 pQuiet->byQuietCount,
589                                 pQuiet->byQuietPeriod,
590                                 *((PWORD)pQuiet->abyQuietDuration),
591                                 *((PWORD)pQuiet->abyQuietOffset)
592                                 );
593             } else {
594                 pQuiet = (PWLAN_IE_QUIET)pIE_Quiet;
595                 CARDbSetQuiet(  pMgmt->pAdapter,
596                                 FALSE,
597                                 pQuiet->byQuietCount,
598                                 pQuiet->byQuietPeriod,
599                                 *((PWORD)pQuiet->abyQuietDuration),
600                                 *((PWORD)pQuiet->abyQuietOffset)
601                                 );
602             }
603         }
604     }
605
606     if ((bParsingQuiet == TRUE) &&
607         (pQuiet != NULL)) {
608         CARDbStartQuiet(pMgmt->pAdapter);
609     }
610
611     pBSSList->uIELength = uIELength;
612     if (pBSSList->uIELength > WLAN_BEACON_FR_MAXLEN)
613         pBSSList->uIELength = WLAN_BEACON_FR_MAXLEN;
614     MEMvCopy(pBSSList->abyIEs, pbyIEs, pBSSList->uIELength);
615
616     return TRUE;
617 }
618
619
620 /*+
621  *
622  * Routine Description:
623  *    Update BSS set in known BSS list
624  *
625  * Return Value:
626  *    TRUE if success.
627  *
628 -*/
629 // TODO: input structure modify
630
631 BOOL
632 BSSbUpdateToBSSList (
633     IN HANDLE hDeviceContext,
634     IN QWORD qwTimestamp,
635     IN WORD wBeaconInterval,
636     IN WORD wCapInfo,
637     IN BYTE byCurrChannel,
638     IN BOOL bChannelHit,
639     IN PWLAN_IE_SSID pSSID,
640     IN PWLAN_IE_SUPP_RATES pSuppRates,
641     IN PWLAN_IE_SUPP_RATES pExtSuppRates,
642     IN PERPObject psERP,
643     IN PWLAN_IE_RSN pRSN,
644     IN PWLAN_IE_RSN_EXT pRSNWPA,
645     IN PWLAN_IE_COUNTRY pIE_Country,
646     IN PWLAN_IE_QUIET pIE_Quiet,
647     IN PKnownBSS pBSSList,
648     IN UINT uIELength,
649     IN PBYTE pbyIEs,
650     IN HANDLE pRxPacketContext
651     )
652 {
653     int             ii;
654     PSDevice        pDevice = (PSDevice)hDeviceContext;
655     PSMgmtObject    pMgmt = pDevice->pMgmt;
656     PSRxMgmtPacket  pRxPacket = (PSRxMgmtPacket)pRxPacketContext;
657     LONG            ldBm;
658     BOOL            bParsingQuiet = FALSE;
659     PWLAN_IE_QUIET  pQuiet = NULL;
660
661
662
663     if (pBSSList == NULL)
664         return FALSE;
665
666     HIDWORD(pBSSList->qwBSSTimestamp) = cpu_to_le32(HIDWORD(qwTimestamp));
667     LODWORD(pBSSList->qwBSSTimestamp) = cpu_to_le32(LODWORD(qwTimestamp));
668     pBSSList->wBeaconInterval = cpu_to_le16(wBeaconInterval);
669     pBSSList->wCapInfo = cpu_to_le16(wCapInfo);
670     pBSSList->uClearCount = 0;
671     pBSSList->uChannel = byCurrChannel;
672 //    DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO"BSSbUpdateToBSSList: pBSSList->uChannel: %d\n", pBSSList->uChannel);
673
674     if (pSSID->len > WLAN_SSID_MAXLEN)
675         pSSID->len = WLAN_SSID_MAXLEN;
676
677     if ((pSSID->len != 0) && (pSSID->abySSID[0] != 0))
678         memcpy(pBSSList->abySSID, pSSID, pSSID->len + WLAN_IEHDR_LEN);
679     memcpy(pBSSList->abySuppRates, pSuppRates,pSuppRates->len + WLAN_IEHDR_LEN);
680
681     if (pExtSuppRates != NULL) {
682         memcpy(pBSSList->abyExtSuppRates, pExtSuppRates,pExtSuppRates->len + WLAN_IEHDR_LEN);
683     } else {
684         memset(pBSSList->abyExtSuppRates, 0, WLAN_IEHDR_LEN + WLAN_RATES_MAXLEN + 1);
685     }
686     pBSSList->sERP.byERP = psERP->byERP;
687     pBSSList->sERP.bERPExist = psERP->bERPExist;
688
689     // Check if BSS is 802.11a/b/g
690     if (pBSSList->uChannel > CB_MAX_CHANNEL_24G) {
691         pBSSList->eNetworkTypeInUse = PHY_TYPE_11A;
692     } else {
693         if (pBSSList->sERP.bERPExist == TRUE) {
694             pBSSList->eNetworkTypeInUse = PHY_TYPE_11G;
695         } else {
696             pBSSList->eNetworkTypeInUse = PHY_TYPE_11B;
697         }
698     }
699
700     pBSSList->byRxRate = pRxPacket->byRxRate;
701     pBSSList->qwLocalTSF = pRxPacket->qwLocalTSF;
702     if(bChannelHit)
703         pBSSList->uRSSI = pRxPacket->uRSSI;
704     pBSSList->bySQ = pRxPacket->bySQ;
705
706    if ((pMgmt->eCurrMode == WMAC_MODE_ESS_STA) &&
707         (pMgmt->eCurrState == WMAC_STATE_ASSOC)) {
708         // assoc with BSS
709         if (pBSSList == pMgmt->pCurrBSS) {
710             bParsingQuiet = TRUE;
711         }
712     }
713
714     WPA_ClearRSN(pBSSList);         //mike update
715
716     if (pRSNWPA != NULL) {
717         UINT uLen = pRSNWPA->len + 2;
718         if (uLen <= (uIELength - (UINT)(ULONG_PTR)((PBYTE)pRSNWPA - pbyIEs))) {
719             pBSSList->wWPALen = uLen;
720             memcpy(pBSSList->byWPAIE, pRSNWPA, uLen);
721             WPA_ParseRSN(pBSSList, pRSNWPA);
722         }
723     }
724
725   WPA2_ClearRSN(pBSSList);  //mike update
726
727     if (pRSN != NULL) {
728         UINT uLen = pRSN->len + 2;
729         if (uLen <= (uIELength - (UINT)(ULONG_PTR)((PBYTE)pRSN - pbyIEs))) {
730             pBSSList->wRSNLen = uLen;
731             memcpy(pBSSList->byRSNIE, pRSN, uLen);
732             WPA2vParseRSN(pBSSList, pRSN);
733         }
734     }
735
736     if (pRxPacket->uRSSI != 0) {
737         RFvRSSITodBm(pDevice, (BYTE)(pRxPacket->uRSSI), &ldBm);
738         // Moniter if RSSI is too strong.
739         pBSSList->byRSSIStatCnt++;
740         pBSSList->byRSSIStatCnt %= RSSI_STAT_COUNT;
741         pBSSList->ldBmAverage[pBSSList->byRSSIStatCnt] = ldBm;
742         for(ii=0;ii<RSSI_STAT_COUNT;ii++) {
743             if (pBSSList->ldBmAverage[ii] != 0) {
744                 pBSSList->ldBmMAX = max(pBSSList->ldBmAverage[ii], ldBm);
745             }
746         }
747     }
748
749     if ((pIE_Country != NULL) &&
750         (pMgmt->b11hEnable == TRUE)) {
751         CARDvSetCountryInfo(pMgmt->pAdapter,
752                             pBSSList->eNetworkTypeInUse,
753                             pIE_Country);
754     }
755
756     if ((bParsingQuiet == TRUE) && (pIE_Quiet != NULL)) {
757         if ((((PWLAN_IE_QUIET)pIE_Quiet)->len == 8) &&
758             (((PWLAN_IE_QUIET)pIE_Quiet)->byQuietCount != 0)) {
759             // valid EID
760             if (pQuiet == NULL) {
761                 pQuiet = (PWLAN_IE_QUIET)pIE_Quiet;
762                 CARDbSetQuiet(  pMgmt->pAdapter,
763                                 TRUE,
764                                 pQuiet->byQuietCount,
765                                 pQuiet->byQuietPeriod,
766                                 *((PWORD)pQuiet->abyQuietDuration),
767                                 *((PWORD)pQuiet->abyQuietOffset)
768                                 );
769             } else {
770                 pQuiet = (PWLAN_IE_QUIET)pIE_Quiet;
771                 CARDbSetQuiet(  pMgmt->pAdapter,
772                                 FALSE,
773                                 pQuiet->byQuietCount,
774                                 pQuiet->byQuietPeriod,
775                                 *((PWORD)pQuiet->abyQuietDuration),
776                                 *((PWORD)pQuiet->abyQuietOffset)
777                                 );
778             }
779         }
780     }
781
782     if ((bParsingQuiet == TRUE) &&
783         (pQuiet != NULL)) {
784         CARDbStartQuiet(pMgmt->pAdapter);
785     }
786
787     pBSSList->uIELength = uIELength;
788     if (pBSSList->uIELength > WLAN_BEACON_FR_MAXLEN)
789         pBSSList->uIELength = WLAN_BEACON_FR_MAXLEN;
790     memcpy(pBSSList->abyIEs, pbyIEs, pBSSList->uIELength);
791
792     return TRUE;
793 }
794
795
796
797
798
799 /*+
800  *
801  * Routine Description:
802  *    Search Node DB table to find the index of matched DstAddr
803  *
804  * Return Value:
805  *    None
806  *
807 -*/
808
809 BOOL
810 BSSDBbIsSTAInNodeDB(
811     IN PVOID pMgmtObject,
812     IN PBYTE abyDstAddr,
813     OUT PUINT puNodeIndex
814     )
815 {
816     PSMgmtObject    pMgmt = (PSMgmtObject) pMgmtObject;
817     UINT            ii;
818
819     // Index = 0 reserved for AP Node
820     for (ii = 1; ii < (MAX_NODE_NUM + 1); ii++) {
821         if (pMgmt->sNodeDBTable[ii].bActive) {
822             if (IS_ETH_ADDRESS_EQUAL(abyDstAddr, pMgmt->sNodeDBTable[ii].abyMACAddr)) {
823                 *puNodeIndex = ii;
824                 return TRUE;
825             }
826         }
827     }
828
829    return FALSE;
830 };
831
832
833
834 /*+
835  *
836  * Routine Description:
837  *    Find an empty node and allocated; if no empty found,
838  *    instand used of most inactive one.
839  *
840  * Return Value:
841  *    None
842  *
843 -*/
844 VOID
845 BSSvCreateOneNode(
846     IN HANDLE hDeviceContext,
847     OUT PUINT puNodeIndex
848     )
849 {
850
851     PSDevice     pDevice = (PSDevice)hDeviceContext;
852     PSMgmtObject    pMgmt = pDevice->pMgmt;
853     UINT            ii;
854     UINT            BigestCount = 0;
855     UINT            SelectIndex;
856     struct sk_buff  *skb;
857     // Index = 0 reserved for AP Node (In STA mode)
858     // Index = 0 reserved for Broadcast/MultiCast (In AP mode)
859     SelectIndex = 1;
860     for (ii = 1; ii < (MAX_NODE_NUM + 1); ii++) {
861         if (pMgmt->sNodeDBTable[ii].bActive) {
862             if (pMgmt->sNodeDBTable[ii].uInActiveCount > BigestCount) {
863                 BigestCount = pMgmt->sNodeDBTable[ii].uInActiveCount;
864                 SelectIndex = ii;
865             }
866         }
867         else {
868             break;
869         }
870     }
871
872     // if not found replace uInActiveCount is largest one.
873     if ( ii == (MAX_NODE_NUM + 1)) {
874         *puNodeIndex = SelectIndex;
875         DEVICE_PRT(MSG_LEVEL_NOTICE, KERN_INFO "Replace inactive node = %d\n", SelectIndex);
876         // clear ps buffer
877         if (pMgmt->sNodeDBTable[*puNodeIndex].sTxPSQueue.next != NULL) {
878             while ((skb = skb_dequeue(&pMgmt->sNodeDBTable[*puNodeIndex].sTxPSQueue)) != NULL)
879             dev_kfree_skb(skb);
880         }
881     }
882     else {
883         *puNodeIndex = ii;
884     }
885
886     memset(&pMgmt->sNodeDBTable[*puNodeIndex], 0, sizeof(KnownNodeDB));
887     pMgmt->sNodeDBTable[*puNodeIndex].bActive = TRUE;
888     pMgmt->sNodeDBTable[*puNodeIndex].uRatePollTimeout = FALLBACK_POLL_SECOND;
889     // for AP mode PS queue
890     skb_queue_head_init(&pMgmt->sNodeDBTable[*puNodeIndex].sTxPSQueue);
891     pMgmt->sNodeDBTable[*puNodeIndex].byAuthSequence = 0;
892     pMgmt->sNodeDBTable[*puNodeIndex].wEnQueueCnt = 0;
893     DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Create node index = %d\n", ii);
894     return;
895 };
896
897
898
899 /*+
900  *
901  * Routine Description:
902  *    Remove Node by NodeIndex
903  *
904  *
905  * Return Value:
906  *    None
907  *
908 -*/
909 VOID
910 BSSvRemoveOneNode(
911     IN HANDLE hDeviceContext,
912     IN UINT uNodeIndex
913     )
914 {
915
916     PSDevice        pDevice = (PSDevice)hDeviceContext;
917     PSMgmtObject    pMgmt = pDevice->pMgmt;
918     BYTE            byMask[8] = {1, 2, 4, 8, 0x10, 0x20, 0x40, 0x80};
919     struct sk_buff  *skb;
920
921
922     while ((skb = skb_dequeue(&pMgmt->sNodeDBTable[uNodeIndex].sTxPSQueue)) != NULL)
923             dev_kfree_skb(skb);
924     // clear context
925     memset(&pMgmt->sNodeDBTable[uNodeIndex], 0, sizeof(KnownNodeDB));
926     // clear tx bit map
927     pMgmt->abyPSTxMap[pMgmt->sNodeDBTable[uNodeIndex].wAID >> 3] &=  ~byMask[pMgmt->sNodeDBTable[uNodeIndex].wAID & 7];
928
929     return;
930 };
931 /*+
932  *
933  * Routine Description:
934  *    Update AP Node content in Index 0 of KnownNodeDB
935  *
936  *
937  * Return Value:
938  *    None
939  *
940 -*/
941
942 VOID
943 BSSvUpdateAPNode(
944     IN HANDLE hDeviceContext,
945     IN PWORD pwCapInfo,
946     IN PWLAN_IE_SUPP_RATES pSuppRates,
947     IN PWLAN_IE_SUPP_RATES pExtSuppRates
948     )
949 {
950     PSDevice     pDevice = (PSDevice)hDeviceContext;
951     PSMgmtObject    pMgmt = pDevice->pMgmt;
952     UINT            uRateLen = WLAN_RATES_MAXLEN;
953
954     memset(&pMgmt->sNodeDBTable[0], 0, sizeof(KnownNodeDB));
955
956     pMgmt->sNodeDBTable[0].bActive = TRUE;
957     if (pDevice->eCurrentPHYType == PHY_TYPE_11B) {
958         uRateLen = WLAN_RATES_MAXLEN_11B;
959     }
960     pMgmt->abyCurrSuppRates[1] = RATEuSetIE((PWLAN_IE_SUPP_RATES)pSuppRates,
961                                             (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates,
962                                             uRateLen);
963     pMgmt->abyCurrExtSuppRates[1] = RATEuSetIE((PWLAN_IE_SUPP_RATES)pExtSuppRates,
964                                             (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates,
965                                             uRateLen);
966     RATEvParseMaxRate((PVOID) pDevice,
967                        (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates,
968                        (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates,
969                        TRUE,
970                        &(pMgmt->sNodeDBTable[0].wMaxBasicRate),
971                        &(pMgmt->sNodeDBTable[0].wMaxSuppRate),
972                        &(pMgmt->sNodeDBTable[0].wSuppRate),
973                        &(pMgmt->sNodeDBTable[0].byTopCCKBasicRate),
974                        &(pMgmt->sNodeDBTable[0].byTopOFDMBasicRate)
975                       );
976     memcpy(pMgmt->sNodeDBTable[0].abyMACAddr, pMgmt->abyCurrBSSID, WLAN_ADDR_LEN);
977     pMgmt->sNodeDBTable[0].wTxDataRate = pMgmt->sNodeDBTable[0].wMaxSuppRate;
978     pMgmt->sNodeDBTable[0].bShortPreamble = WLAN_GET_CAP_INFO_SHORTPREAMBLE(*pwCapInfo);
979     pMgmt->sNodeDBTable[0].uRatePollTimeout = FALLBACK_POLL_SECOND;
980 #ifdef  PLICE_DEBUG
981         printk("BSSvUpdateAPNode:MaxSuppRate is %d\n",pMgmt->sNodeDBTable[0].wMaxSuppRate);
982 #endif
983     // Auto rate fallback function initiation.
984     // RATEbInit(pDevice);
985     DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pMgmt->sNodeDBTable[0].wTxDataRate = %d \n", pMgmt->sNodeDBTable[0].wTxDataRate);
986
987 };
988
989
990
991
992
993 /*+
994  *
995  * Routine Description:
996  *    Add Multicast Node content in Index 0 of KnownNodeDB
997  *
998  *
999  * Return Value:
1000  *    None
1001  *
1002 -*/
1003
1004
1005 VOID
1006 BSSvAddMulticastNode(
1007     IN HANDLE hDeviceContext
1008     )
1009 {
1010     PSDevice     pDevice = (PSDevice)hDeviceContext;
1011     PSMgmtObject    pMgmt = pDevice->pMgmt;
1012
1013     if (!pDevice->bEnableHostWEP)
1014         memset(&pMgmt->sNodeDBTable[0], 0, sizeof(KnownNodeDB));
1015     memset(pMgmt->sNodeDBTable[0].abyMACAddr, 0xff, WLAN_ADDR_LEN);
1016     pMgmt->sNodeDBTable[0].bActive = TRUE;
1017     pMgmt->sNodeDBTable[0].bPSEnable = FALSE;
1018     skb_queue_head_init(&pMgmt->sNodeDBTable[0].sTxPSQueue);
1019     RATEvParseMaxRate((PVOID) pDevice,
1020                       (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates,
1021                       (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates,
1022                       TRUE,
1023                       &(pMgmt->sNodeDBTable[0].wMaxBasicRate),
1024                       &(pMgmt->sNodeDBTable[0].wMaxSuppRate),
1025                        &(pMgmt->sNodeDBTable[0].wSuppRate),
1026                       &(pMgmt->sNodeDBTable[0].byTopCCKBasicRate),
1027                       &(pMgmt->sNodeDBTable[0].byTopOFDMBasicRate)
1028                      );
1029     pMgmt->sNodeDBTable[0].wTxDataRate = pMgmt->sNodeDBTable[0].wMaxBasicRate;
1030 #ifdef  PLICE_DEBUG
1031         printk("BSSvAddMultiCastNode:pMgmt->sNodeDBTable[0].wTxDataRate is %d\n",pMgmt->sNodeDBTable[0].wTxDataRate);
1032 #endif
1033     pMgmt->sNodeDBTable[0].uRatePollTimeout = FALLBACK_POLL_SECOND;
1034
1035 };
1036
1037
1038
1039
1040
1041 /*+
1042  *
1043  * Routine Description:
1044  *
1045  *
1046  *  Second call back function to update Node DB info & AP link status
1047  *
1048  *
1049  * Return Value:
1050  *    none.
1051  *
1052 -*/
1053  //2008-4-14 <add> by chester for led issue
1054  #ifdef FOR_LED_ON_NOTEBOOK
1055 BOOL cc=FALSE;
1056 UINT status;
1057 #endif
1058 VOID
1059 BSSvSecondCallBack(
1060     IN  HANDLE hDeviceContext
1061     )
1062 {
1063     PSDevice        pDevice = (PSDevice)hDeviceContext;
1064     PSMgmtObject    pMgmt = pDevice->pMgmt;
1065     UINT            ii;
1066     PWLAN_IE_SSID   pItemSSID, pCurrSSID;
1067     UINT            uSleepySTACnt = 0;
1068     UINT            uNonShortSlotSTACnt = 0;
1069     UINT            uLongPreambleSTACnt = 0;
1070 viawget_wpa_header* wpahdr;
1071
1072     spin_lock_irq(&pDevice->lock);
1073
1074     pDevice->uAssocCount = 0;
1075
1076     pDevice->byERPFlag &=
1077         ~(WLAN_SET_ERP_BARKER_MODE(1) | WLAN_SET_ERP_NONERP_PRESENT(1));
1078  //2008-4-14 <add> by chester for led issue
1079 #ifdef FOR_LED_ON_NOTEBOOK
1080 MACvGPIOIn(pDevice->PortOffset, &pDevice->byGPIO);
1081 if (((BITbIsBitOff(pDevice->byGPIO,GPIO0_DATA)&&(pDevice->bHWRadioOff == FALSE))||(BITbIsBitOn(pDevice->byGPIO,GPIO0_DATA)&&(pDevice->bHWRadioOff == TRUE)))&&(cc==FALSE)){
1082 cc=TRUE;
1083 }
1084 else if(cc==TRUE){
1085
1086 if(pDevice->bHWRadioOff == TRUE){
1087             if (BITbIsBitOff(pDevice->byGPIO,GPIO0_DATA))
1088 //||(BITbIsBitOff(pDevice->byGPIO,GPIO0_DATA) && BITbIsBitOn(pDevice->byRadioCtl, EEP_RADIOCTL_INV)))
1089 {if(status==1) goto start;
1090 status=1;
1091 CARDbRadioPowerOff(pDevice);
1092                 pMgmt->sNodeDBTable[0].bActive = FALSE;
1093                 pMgmt->eCurrMode = WMAC_MODE_STANDBY;
1094                 pMgmt->eCurrState = WMAC_STATE_IDLE;
1095                 //netif_stop_queue(pDevice->dev);
1096                 pDevice->bLinkPass = FALSE;
1097
1098 }
1099   if (BITbIsBitOn(pDevice->byGPIO,GPIO0_DATA))
1100 //||(BITbIsBitOff(pDevice->byGPIO,GPIO0_DATA) && BITbIsBitOn(pDevice->byRadioCtl, EEP_RADIOCTL_INV)))
1101 {if(status==2) goto start;
1102 status=2;
1103 CARDbRadioPowerOn(pDevice);
1104 } }
1105 else{
1106             if (BITbIsBitOn(pDevice->byGPIO,GPIO0_DATA))
1107 //||(BITbIsBitOff(pDevice->byGPIO,GPIO0_DATA) && BITbIsBitOn(pDevice->byRadioCtl, EEP_RADIOCTL_INV)))
1108 {if(status==3) goto start;
1109 status=3;
1110 CARDbRadioPowerOff(pDevice);
1111                 pMgmt->sNodeDBTable[0].bActive = FALSE;
1112                 pMgmt->eCurrMode = WMAC_MODE_STANDBY;
1113                 pMgmt->eCurrState = WMAC_STATE_IDLE;
1114                 //netif_stop_queue(pDevice->dev);
1115                 pDevice->bLinkPass = FALSE;
1116
1117 }
1118   if (BITbIsBitOff(pDevice->byGPIO,GPIO0_DATA))
1119 //||(BITbIsBitOff(pDevice->byGPIO,GPIO0_DATA) && BITbIsBitOn(pDevice->byRadioCtl, EEP_RADIOCTL_INV)))
1120 {if(status==4) goto start;
1121 status=4;
1122 CARDbRadioPowerOn(pDevice);
1123 } }
1124 }
1125 start:
1126 #endif
1127
1128
1129     if (pDevice->wUseProtectCntDown > 0) {
1130         pDevice->wUseProtectCntDown --;
1131     }
1132     else {
1133         // disable protect mode
1134         pDevice->byERPFlag &= ~(WLAN_SET_ERP_USE_PROTECTION(1));
1135     }
1136
1137 {
1138        pDevice->byReAssocCount++;
1139    if((pDevice->byReAssocCount > 10) && (pDevice->bLinkPass != TRUE)) {  //10 sec timeout
1140                      printk("Re-association timeout!!!\n");
1141                    pDevice->byReAssocCount = 0;
1142                      #ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
1143                     // if(pDevice->bWPASuppWextEnabled == TRUE)
1144                         {
1145                         union iwreq_data  wrqu;
1146                         memset(&wrqu, 0, sizeof (wrqu));
1147                           wrqu.ap_addr.sa_family = ARPHRD_ETHER;
1148                         printk("wireless_send_event--->SIOCGIWAP(disassociated)\n");
1149                         wireless_send_event(pDevice->dev, SIOCGIWAP, &wrqu, NULL);
1150                        }
1151                     #endif
1152      }
1153    else if(pDevice->bLinkPass == TRUE)
1154         pDevice->byReAssocCount = 0;
1155 }
1156
1157 #ifdef Calcu_LinkQual
1158    s_uCalculateLinkQual((HANDLE)pDevice);
1159 #endif
1160
1161     for (ii = 0; ii < (MAX_NODE_NUM + 1); ii++) {
1162
1163         if (pMgmt->sNodeDBTable[ii].bActive) {
1164
1165             // Increase in-activity counter
1166             pMgmt->sNodeDBTable[ii].uInActiveCount++;
1167
1168             if (ii > 0) {
1169                 if (pMgmt->sNodeDBTable[ii].uInActiveCount > MAX_INACTIVE_COUNT) {
1170                     BSSvRemoveOneNode(pDevice, ii);
1171                     DEVICE_PRT(MSG_LEVEL_NOTICE, KERN_INFO
1172                         "Inactive timeout [%d] sec, STA index = [%d] remove\n", MAX_INACTIVE_COUNT, ii);
1173                     continue;
1174                 }
1175
1176                 if (pMgmt->sNodeDBTable[ii].eNodeState >= NODE_ASSOC) {
1177
1178                     pDevice->uAssocCount++;
1179
1180                     // check if Non ERP exist
1181                     if (pMgmt->sNodeDBTable[ii].uInActiveCount < ERP_RECOVER_COUNT) {
1182                         if (!pMgmt->sNodeDBTable[ii].bShortPreamble) {
1183                             pDevice->byERPFlag |= WLAN_SET_ERP_BARKER_MODE(1);
1184                             uLongPreambleSTACnt ++;
1185                         }
1186                         if (!pMgmt->sNodeDBTable[ii].bERPExist) {
1187                             pDevice->byERPFlag |= WLAN_SET_ERP_NONERP_PRESENT(1);
1188                             pDevice->byERPFlag |= WLAN_SET_ERP_USE_PROTECTION(1);
1189                         }
1190                         if (!pMgmt->sNodeDBTable[ii].bShortSlotTime)
1191                             uNonShortSlotSTACnt++;
1192                     }
1193                 }
1194
1195                 // check if any STA in PS mode
1196                 if (pMgmt->sNodeDBTable[ii].bPSEnable)
1197                     uSleepySTACnt++;
1198
1199
1200             }
1201
1202             // Rate fallback check
1203
1204             if (!pDevice->bFixRate) {
1205 /*
1206                 if ((pMgmt->eCurrMode == WMAC_MODE_ESS_STA) && (ii == 0))
1207                     RATEvTxRateFallBack(pDevice, &(pMgmt->sNodeDBTable[ii]));
1208 */
1209                 if (ii > 0) {
1210                     // ii = 0 for multicast node (AP & Adhoc)
1211                     RATEvTxRateFallBack((PVOID)pDevice, &(pMgmt->sNodeDBTable[ii]));
1212                 }
1213                 else {
1214                     // ii = 0 reserved for unicast AP node (Infra STA)
1215                     if (pMgmt->eCurrMode == WMAC_MODE_ESS_STA)
1216 #ifdef  PLICE_DEBUG
1217                 printk("SecondCallback:Before:TxDataRate is %d\n",pMgmt->sNodeDBTable[0].wTxDataRate);
1218 #endif
1219                         RATEvTxRateFallBack((PVOID)pDevice, &(pMgmt->sNodeDBTable[ii]));
1220 #ifdef  PLICE_DEBUG
1221                 printk("SecondCallback:After:TxDataRate is %d\n",pMgmt->sNodeDBTable[0].wTxDataRate);
1222 #endif
1223
1224                 }
1225
1226             }
1227
1228             // check if pending PS queue
1229             if (pMgmt->sNodeDBTable[ii].wEnQueueCnt != 0) {
1230                 DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Index= %d, Queue = %d pending \n",
1231                            ii, pMgmt->sNodeDBTable[ii].wEnQueueCnt);
1232                 if ((ii >0) && (pMgmt->sNodeDBTable[ii].wEnQueueCnt > 15)) {
1233                     BSSvRemoveOneNode(pDevice, ii);
1234                     DEVICE_PRT(MSG_LEVEL_NOTICE, KERN_INFO "Pending many queues PS STA Index = %d remove \n", ii);
1235                     continue;
1236                 }
1237             }
1238         }
1239
1240     }
1241
1242
1243     if ((pMgmt->eCurrMode == WMAC_MODE_ESS_AP) && (pDevice->eCurrentPHYType == PHY_TYPE_11G)) {
1244
1245         // on/off protect mode
1246         if (WLAN_GET_ERP_USE_PROTECTION(pDevice->byERPFlag)) {
1247             if (!pDevice->bProtectMode) {
1248                 MACvEnableProtectMD(pDevice->PortOffset);
1249                 pDevice->bProtectMode = TRUE;
1250             }
1251         }
1252         else {
1253             if (pDevice->bProtectMode) {
1254                 MACvDisableProtectMD(pDevice->PortOffset);
1255                 pDevice->bProtectMode = FALSE;
1256             }
1257         }
1258         // on/off short slot time
1259
1260         if (uNonShortSlotSTACnt > 0) {
1261             if (pDevice->bShortSlotTime) {
1262                 pDevice->bShortSlotTime = FALSE;
1263                 BBvSetShortSlotTime(pDevice);
1264                 vUpdateIFS((PVOID)pDevice);
1265             }
1266         }
1267         else {
1268             if (!pDevice->bShortSlotTime) {
1269                 pDevice->bShortSlotTime = TRUE;
1270                 BBvSetShortSlotTime(pDevice);
1271                 vUpdateIFS((PVOID)pDevice);
1272             }
1273         }
1274
1275         // on/off barker long preamble mode
1276
1277         if (uLongPreambleSTACnt > 0) {
1278             if (!pDevice->bBarkerPreambleMd) {
1279                 MACvEnableBarkerPreambleMd(pDevice->PortOffset);
1280                 pDevice->bBarkerPreambleMd = TRUE;
1281             }
1282         }
1283         else {
1284             if (pDevice->bBarkerPreambleMd) {
1285                 MACvDisableBarkerPreambleMd(pDevice->PortOffset);
1286                 pDevice->bBarkerPreambleMd = FALSE;
1287             }
1288         }
1289
1290     }
1291
1292
1293     // Check if any STA in PS mode, enable DTIM multicast deliver
1294     if (pMgmt->eCurrMode == WMAC_MODE_ESS_AP) {
1295         if (uSleepySTACnt > 0)
1296             pMgmt->sNodeDBTable[0].bPSEnable = TRUE;
1297         else
1298             pMgmt->sNodeDBTable[0].bPSEnable = FALSE;
1299     }
1300
1301     pItemSSID = (PWLAN_IE_SSID)pMgmt->abyDesireSSID;
1302     pCurrSSID = (PWLAN_IE_SSID)pMgmt->abyCurrSSID;
1303 //printk("pCurrSSID=%s\n",pCurrSSID->abySSID);
1304     if ((pMgmt->eCurrMode == WMAC_MODE_STANDBY) ||
1305         (pMgmt->eCurrMode == WMAC_MODE_ESS_STA)) {
1306
1307         if (pMgmt->sNodeDBTable[0].bActive) { // Assoc with BSS
1308            // DEVICE_PRT(MSG_LEVEL_INFO, KERN_INFO "Callback inactive Count = [%d]\n", pMgmt->sNodeDBTable[0].uInActiveCount);
1309             //if (pDevice->bUpdateBBVGA) {
1310             //  s_vCheckSensitivity((HANDLE) pDevice);
1311             //}
1312             if (pDevice->bUpdateBBVGA) {
1313                // s_vCheckSensitivity((HANDLE) pDevice);
1314                s_vCheckPreEDThreshold((HANDLE)pDevice);
1315             }
1316             if ((pMgmt->sNodeDBTable[0].uInActiveCount >= (LOST_BEACON_COUNT/2)) &&
1317                 (pDevice->byBBVGACurrent != pDevice->abyBBVGA[0]) ) {
1318                 pDevice->byBBVGANew = pDevice->abyBBVGA[0];
1319                 bScheduleCommand((HANDLE) pDevice, WLAN_CMD_CHANGE_BBSENSITIVITY, NULL);
1320             }
1321
1322
1323                 if (pMgmt->sNodeDBTable[0].uInActiveCount >= LOST_BEACON_COUNT) {
1324                 pMgmt->sNodeDBTable[0].bActive = FALSE;
1325                 pMgmt->eCurrMode = WMAC_MODE_STANDBY;
1326                 pMgmt->eCurrState = WMAC_STATE_IDLE;
1327                 netif_stop_queue(pDevice->dev);
1328                 pDevice->bLinkPass = FALSE;
1329                 pDevice->bRoaming = TRUE;
1330                 DEVICE_PRT(MSG_LEVEL_NOTICE, KERN_INFO "Lost AP beacon [%d] sec, disconnected !\n", pMgmt->sNodeDBTable[0].uInActiveCount);
1331         if ((pDevice->bWPADEVUp) && (pDevice->skb != NULL)) {
1332              wpahdr = (viawget_wpa_header *)pDevice->skb->data;
1333              wpahdr->type = VIAWGET_DISASSOC_MSG;
1334              wpahdr->resp_ie_len = 0;
1335              wpahdr->req_ie_len = 0;
1336              skb_put(pDevice->skb, sizeof(viawget_wpa_header));
1337              pDevice->skb->dev = pDevice->wpadev;
1338 //2008-4-3 modify by Chester for wpa
1339 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22)
1340              pDevice->skb->mac_header = pDevice->skb->data;
1341 #else
1342             pDevice->skb->mac.raw = pDevice->skb->data;
1343 #endif
1344              pDevice->skb->pkt_type = PACKET_HOST;
1345              pDevice->skb->protocol = htons(ETH_P_802_2);
1346              memset(pDevice->skb->cb, 0, sizeof(pDevice->skb->cb));
1347              netif_rx(pDevice->skb);
1348              pDevice->skb = dev_alloc_skb((int)pDevice->rx_buf_sz);
1349          };
1350    #ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
1351   // if(pDevice->bWPASuppWextEnabled == TRUE)
1352       {
1353         union iwreq_data  wrqu;
1354         memset(&wrqu, 0, sizeof (wrqu));
1355         wrqu.ap_addr.sa_family = ARPHRD_ETHER;
1356         printk("wireless_send_event--->SIOCGIWAP(disassociated)\n");
1357         wireless_send_event(pDevice->dev, SIOCGIWAP, &wrqu, NULL);
1358      }
1359   #endif
1360                         }
1361         }
1362         else if (pItemSSID->len != 0) {
1363             if (pDevice->uAutoReConnectTime < 10) {
1364                 pDevice->uAutoReConnectTime++;
1365         #ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
1366                 //network manager support need not do Roaming scan???
1367                 if(pDevice->bWPASuppWextEnabled ==TRUE)
1368                  pDevice->uAutoReConnectTime = 0;
1369              #endif
1370
1371             }
1372             else {
1373                     //mike use old encryption status for wpa reauthen
1374               if(pDevice->bWPADEVUp)
1375                   pDevice->eEncryptionStatus = pDevice->eOldEncryptionStatus;
1376                 DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Roaming ...\n");
1377                 BSSvClearBSSList((HANDLE)pDevice, pDevice->bLinkPass);
1378         pMgmt->eScanType = WMAC_SCAN_ACTIVE;
1379                 bScheduleCommand((HANDLE) pDevice, WLAN_CMD_BSSID_SCAN, pMgmt->abyDesireSSID);
1380                 bScheduleCommand((HANDLE) pDevice, WLAN_CMD_SSID, pMgmt->abyDesireSSID);
1381                 pDevice->uAutoReConnectTime = 0;
1382             }
1383         }
1384     }
1385
1386     if (pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) {
1387         // if adhoc started which essid is NULL string, rescaning.
1388         if ((pMgmt->eCurrState == WMAC_STATE_STARTED) && (pCurrSSID->len == 0)) {
1389             if (pDevice->uAutoReConnectTime < 10) {
1390                 pDevice->uAutoReConnectTime++;
1391             }
1392             else {
1393                 DEVICE_PRT(MSG_LEVEL_NOTICE, KERN_INFO "Adhoc re-scaning ...\n");
1394         pMgmt->eScanType = WMAC_SCAN_ACTIVE;
1395                 bScheduleCommand((HANDLE) pDevice, WLAN_CMD_BSSID_SCAN, NULL);
1396                 bScheduleCommand((HANDLE) pDevice, WLAN_CMD_SSID, NULL);
1397                 pDevice->uAutoReConnectTime = 0;
1398             };
1399         }
1400         if (pMgmt->eCurrState == WMAC_STATE_JOINTED) {
1401             if (pDevice->bUpdateBBVGA) {
1402                //s_vCheckSensitivity((HANDLE) pDevice);
1403                s_vCheckPreEDThreshold((HANDLE)pDevice);
1404             }
1405                 if (pMgmt->sNodeDBTable[0].uInActiveCount >=ADHOC_LOST_BEACON_COUNT) {
1406                     DEVICE_PRT(MSG_LEVEL_NOTICE, KERN_INFO "Lost other STA beacon [%d] sec, started !\n", pMgmt->sNodeDBTable[0].uInActiveCount);
1407                 pMgmt->sNodeDBTable[0].uInActiveCount = 0;
1408                 pMgmt->eCurrState = WMAC_STATE_STARTED;
1409                 netif_stop_queue(pDevice->dev);
1410                 pDevice->bLinkPass = FALSE;
1411             }
1412         }
1413     }
1414
1415     spin_unlock_irq(&pDevice->lock);
1416
1417     pMgmt->sTimerSecondCallback.expires = RUN_AT(HZ);
1418     add_timer(&pMgmt->sTimerSecondCallback);
1419     return;
1420 }
1421
1422
1423
1424
1425 /*+
1426  *
1427  * Routine Description:
1428  *
1429  *
1430  *  Update Tx attemps, Tx failure counter in Node DB
1431  *
1432  *
1433  * Return Value:
1434  *    none.
1435  *
1436 -*/
1437
1438
1439
1440 VOID
1441 BSSvUpdateNodeTxCounter(
1442     IN HANDLE      hDeviceContext,
1443     IN BYTE        byTsr0,
1444     IN BYTE        byTsr1,
1445     IN PBYTE       pbyBuffer,
1446     IN UINT        uFIFOHeaderSize
1447     )
1448 {
1449     PSDevice        pDevice = (PSDevice)hDeviceContext;
1450     PSMgmtObject    pMgmt = pDevice->pMgmt;
1451     UINT            uNodeIndex = 0;
1452     BYTE            byTxRetry = (byTsr0 & TSR0_NCR);
1453     PSTxBufHead     pTxBufHead;
1454     PS802_11Header  pMACHeader;
1455     WORD            wRate;
1456     WORD            wFallBackRate = RATE_1M;
1457     BYTE            byFallBack;
1458     UINT            ii;
1459 //      UINT            txRetryTemp;
1460 //PLICE_DEBUG->
1461         //txRetryTemp = byTxRetry;
1462         //if (txRetryTemp== 8)
1463         //txRetryTemp -=3;
1464 //PLICE_DEBUG <-
1465     pTxBufHead = (PSTxBufHead) pbyBuffer;
1466     if (pTxBufHead->wFIFOCtl & FIFOCTL_AUTO_FB_0) {
1467         byFallBack = AUTO_FB_0;
1468     } else if (pTxBufHead->wFIFOCtl & FIFOCTL_AUTO_FB_1) {
1469         byFallBack = AUTO_FB_1;
1470     } else {
1471         byFallBack = AUTO_FB_NONE;
1472     }
1473     wRate = pTxBufHead->wReserved; //?wRate
1474     //printk("BSSvUpdateNodeTxCounter:byTxRetry is %d\n",byTxRetry);
1475
1476 //printk("BSSvUpdateNodeTx:wRate is %d,byFallback is %d\n",wRate,byFallBack);
1477 //#ifdef        PLICE_DEBUG
1478         //printk("BSSvUpdateNodeTx: wRate is %d\n",wRate);
1479 ////#endif
1480     // Only Unicast using support rates
1481     if (pTxBufHead->wFIFOCtl & FIFOCTL_NEEDACK) {
1482         DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO"wRate %04X, byTsr0 %02X, byTsr1 %02X\n", wRate, byTsr0, byTsr1);
1483         if (pMgmt->eCurrMode == WMAC_MODE_ESS_STA) {
1484             pMgmt->sNodeDBTable[0].uTxAttempts += 1;
1485             if ((byTsr1 & TSR1_TERR) == 0) {
1486                 // transmit success, TxAttempts at least plus one
1487                 pMgmt->sNodeDBTable[0].uTxOk[MAX_RATE]++;
1488                 if ( (byFallBack == AUTO_FB_NONE) ||
1489                      (wRate < RATE_18M) ) {
1490                     wFallBackRate = wRate;
1491                 } else if (byFallBack == AUTO_FB_0) {
1492 //PLICE_DEBUG
1493                                   if (byTxRetry < 5)
1494                                 //if (txRetryTemp < 5)
1495                                         wFallBackRate = awHWRetry0[wRate-RATE_18M][byTxRetry];
1496                         //wFallBackRate = awHWRetry0[wRate-RATE_12M][byTxRetry];
1497                         //wFallBackRate = awHWRetry0[wRate-RATE_18M][txRetryTemp] +1;
1498                 else
1499                         wFallBackRate = awHWRetry0[wRate-RATE_18M][4];
1500                         //wFallBackRate = awHWRetry0[wRate-RATE_12M][4];
1501                 } else if (byFallBack == AUTO_FB_1) {
1502                     if (byTxRetry < 5)
1503                         wFallBackRate = awHWRetry1[wRate-RATE_18M][byTxRetry];
1504                     else
1505                         wFallBackRate = awHWRetry1[wRate-RATE_18M][4];
1506                 }
1507                 pMgmt->sNodeDBTable[0].uTxOk[wFallBackRate]++;
1508             } else {
1509                 pMgmt->sNodeDBTable[0].uTxFailures ++;
1510             }
1511             pMgmt->sNodeDBTable[0].uTxRetry += byTxRetry;
1512             if (byTxRetry != 0) {
1513                 pMgmt->sNodeDBTable[0].uTxFail[MAX_RATE]+=byTxRetry;
1514                 if ( (byFallBack == AUTO_FB_NONE) ||
1515                      (wRate < RATE_18M) ) {
1516                     pMgmt->sNodeDBTable[0].uTxFail[wRate]+=byTxRetry;
1517                 } else if (byFallBack == AUTO_FB_0) {
1518 //PLICE_DEBUG
1519                                    for(ii=0;ii<byTxRetry;ii++)
1520                 //for (ii=0;ii<txRetryTemp;ii++)
1521                 {
1522                         if (ii < 5)
1523                                 {
1524
1525 //PLICE_DEBUG
1526                                                 wFallBackRate = awHWRetry0[wRate-RATE_18M][ii];
1527                                         //printk(" II is %d:BSSvUpdateNodeTx:wFallBackRate is %d\n",ii,wFallBackRate);
1528                                 //wFallBackRate = awHWRetry0[wRate-RATE_12M][ii];
1529                                 }
1530                         else
1531                                 {
1532                         wFallBackRate = awHWRetry0[wRate-RATE_18M][4];
1533                         //printk("ii is %d BSSvUpdateNodeTx:wFallBackRate is %d\n",ii,wFallBackRate);
1534                                 //wFallBackRate = awHWRetry0[wRate-RATE_12M][4];
1535                                 }
1536                                                 pMgmt->sNodeDBTable[0].uTxFail[wFallBackRate]++;
1537                     }
1538                 } else if (byFallBack == AUTO_FB_1) {
1539                     for(ii=0;ii<byTxRetry;ii++) {
1540                         if (ii < 5)
1541                             wFallBackRate = awHWRetry1[wRate-RATE_18M][ii];
1542                         else
1543                             wFallBackRate = awHWRetry1[wRate-RATE_18M][4];
1544                         pMgmt->sNodeDBTable[0].uTxFail[wFallBackRate]++;
1545                     }
1546                 }
1547             }
1548         };
1549
1550         if ((pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) ||
1551             (pMgmt->eCurrMode == WMAC_MODE_ESS_AP)) {
1552
1553             pMACHeader = (PS802_11Header)(pbyBuffer + uFIFOHeaderSize);
1554
1555             if (BSSDBbIsSTAInNodeDB((HANDLE)pMgmt, &(pMACHeader->abyAddr1[0]), &uNodeIndex)){
1556                 pMgmt->sNodeDBTable[uNodeIndex].uTxAttempts += 1;
1557                 if ((byTsr1 & TSR1_TERR) == 0) {
1558                     // transmit success, TxAttempts at least plus one
1559                     pMgmt->sNodeDBTable[uNodeIndex].uTxOk[MAX_RATE]++;
1560                     if ( (byFallBack == AUTO_FB_NONE) ||
1561                          (wRate < RATE_18M) ) {
1562                         wFallBackRate = wRate;
1563                     } else if (byFallBack == AUTO_FB_0) {
1564                         if (byTxRetry < 5)
1565                             wFallBackRate = awHWRetry0[wRate-RATE_18M][byTxRetry];
1566                         else
1567                             wFallBackRate = awHWRetry0[wRate-RATE_18M][4];
1568                     } else if (byFallBack == AUTO_FB_1) {
1569                         if (byTxRetry < 5)
1570                             wFallBackRate = awHWRetry1[wRate-RATE_18M][byTxRetry];
1571                         else
1572                             wFallBackRate = awHWRetry1[wRate-RATE_18M][4];
1573                     }
1574                     pMgmt->sNodeDBTable[uNodeIndex].uTxOk[wFallBackRate]++;
1575                 } else {
1576                     pMgmt->sNodeDBTable[uNodeIndex].uTxFailures ++;
1577                 }
1578                 pMgmt->sNodeDBTable[uNodeIndex].uTxRetry += byTxRetry;
1579                 if (byTxRetry != 0) {
1580                     pMgmt->sNodeDBTable[uNodeIndex].uTxFail[MAX_RATE]+=byTxRetry;
1581                     if ( (byFallBack == AUTO_FB_NONE) ||
1582                          (wRate < RATE_18M) ) {
1583                         pMgmt->sNodeDBTable[uNodeIndex].uTxFail[wRate]+=byTxRetry;
1584                     } else if (byFallBack == AUTO_FB_0) {
1585                         for(ii=0;ii<byTxRetry;ii++) {
1586                             if (ii < 5)
1587                                 wFallBackRate = awHWRetry0[wRate-RATE_18M][ii];
1588                             else
1589                                 wFallBackRate = awHWRetry0[wRate-RATE_18M][4];
1590                             pMgmt->sNodeDBTable[uNodeIndex].uTxFail[wFallBackRate]++;
1591                         }
1592                     } else if (byFallBack == AUTO_FB_1) {
1593                         for(ii=0;ii<byTxRetry;ii++) {
1594                             if (ii < 5)
1595                                 wFallBackRate = awHWRetry1[wRate-RATE_18M][ii];
1596                             else
1597                                 wFallBackRate = awHWRetry1[wRate-RATE_18M][4];
1598                             pMgmt->sNodeDBTable[uNodeIndex].uTxFail[wFallBackRate]++;
1599                         }
1600                     }
1601                 }
1602             };
1603         }
1604     };
1605
1606     return;
1607
1608 }
1609
1610
1611
1612
1613 /*+
1614  *
1615  * Routine Description:
1616  *    Clear Nodes & skb in DB Table
1617  *
1618  *
1619  * Parameters:
1620  *  In:
1621  *      hDeviceContext        - The adapter context.
1622  *      uStartIndex           - starting index
1623  *  Out:
1624  *      none
1625  *
1626  * Return Value:
1627  *    None.
1628  *
1629 -*/
1630
1631
1632 VOID
1633 BSSvClearNodeDBTable(
1634     IN HANDLE hDeviceContext,
1635     IN UINT uStartIndex
1636     )
1637
1638 {
1639     PSDevice     pDevice = (PSDevice)hDeviceContext;
1640     PSMgmtObject    pMgmt = pDevice->pMgmt;
1641     struct sk_buff  *skb;
1642     UINT            ii;
1643
1644     for (ii = uStartIndex; ii < (MAX_NODE_NUM + 1); ii++) {
1645         if (pMgmt->sNodeDBTable[ii].bActive) {
1646             // check if sTxPSQueue has been initial
1647             if (pMgmt->sNodeDBTable[ii].sTxPSQueue.next != NULL) {
1648                 while ((skb = skb_dequeue(&pMgmt->sNodeDBTable[ii].sTxPSQueue)) != NULL){
1649                         DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO "PS skb != NULL %d\n", ii);
1650                         dev_kfree_skb(skb);
1651                 }
1652             }
1653             memset(&pMgmt->sNodeDBTable[ii], 0, sizeof(KnownNodeDB));
1654         }
1655     }
1656
1657     return;
1658 };
1659
1660
1661 VOID s_vCheckSensitivity(
1662     IN HANDLE hDeviceContext
1663     )
1664 {
1665     PSDevice        pDevice = (PSDevice)hDeviceContext;
1666     PKnownBSS       pBSSList = NULL;
1667     PSMgmtObject    pMgmt = pDevice->pMgmt;
1668     int             ii;
1669
1670     if ((pDevice->byLocalID <= REV_ID_VT3253_A1) && (pDevice->byRFType == RF_RFMD2959) &&
1671         (pMgmt->eCurrMode == WMAC_MODE_IBSS_STA)) {
1672         return;
1673     }
1674
1675     if ((pMgmt->eCurrState == WMAC_STATE_ASSOC) ||
1676         ((pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) && (pMgmt->eCurrState == WMAC_STATE_JOINTED))) {
1677         pBSSList = BSSpAddrIsInBSSList(pDevice, pMgmt->abyCurrBSSID, (PWLAN_IE_SSID)pMgmt->abyCurrSSID);
1678         if (pBSSList != NULL) {
1679             // Updata BB Reg if RSSI is too strong.
1680             LONG    LocalldBmAverage = 0;
1681             LONG    uNumofdBm = 0;
1682             for (ii = 0; ii < RSSI_STAT_COUNT; ii++) {
1683                 if (pBSSList->ldBmAverage[ii] != 0) {
1684                     uNumofdBm ++;
1685                     LocalldBmAverage += pBSSList->ldBmAverage[ii];
1686                 }
1687             }
1688             if (uNumofdBm > 0) {
1689                 LocalldBmAverage = LocalldBmAverage/uNumofdBm;
1690                 for (ii=0;ii<BB_VGA_LEVEL;ii++) {
1691                     DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO"LocalldBmAverage:%ld, %ld %02x\n", LocalldBmAverage, pDevice->ldBmThreshold[ii], pDevice->abyBBVGA[ii]);
1692                     if (LocalldBmAverage < pDevice->ldBmThreshold[ii]) {
1693                             pDevice->byBBVGANew = pDevice->abyBBVGA[ii];
1694                         break;
1695                     }
1696                 }
1697                 if (pDevice->byBBVGANew != pDevice->byBBVGACurrent) {
1698                     pDevice->uBBVGADiffCount++;
1699                     if (pDevice->uBBVGADiffCount >= BB_VGA_CHANGE_THRESHOLD)
1700                         bScheduleCommand((HANDLE) pDevice, WLAN_CMD_CHANGE_BBSENSITIVITY, NULL);
1701                 } else {
1702                     pDevice->uBBVGADiffCount = 0;
1703                 }
1704             }
1705         }
1706     }
1707 }
1708
1709
1710 VOID
1711 BSSvClearAnyBSSJoinRecord (
1712     IN HANDLE hDeviceContext
1713     )
1714 {
1715     PSDevice        pDevice = (PSDevice)hDeviceContext;
1716     PSMgmtObject    pMgmt = pDevice->pMgmt;
1717     UINT            ii;
1718
1719     for (ii = 0; ii < MAX_BSS_NUM; ii++) {
1720         pMgmt->sBSSList[ii].bSelected = FALSE;
1721     }
1722     return;
1723 }
1724
1725 #ifdef Calcu_LinkQual
1726 VOID s_uCalculateLinkQual(
1727     IN HANDLE hDeviceContext
1728     )
1729 {
1730    PSDevice        pDevice = (PSDevice)hDeviceContext;
1731    ULONG TxOkRatio, TxCnt;
1732    ULONG RxOkRatio,RxCnt;
1733    ULONG RssiRatio;
1734    long ldBm;
1735
1736 TxCnt = pDevice->scStatistic.TxNoRetryOkCount +
1737               pDevice->scStatistic.TxRetryOkCount +
1738               pDevice->scStatistic.TxFailCount;
1739 RxCnt = pDevice->scStatistic.RxFcsErrCnt +
1740               pDevice->scStatistic.RxOkCnt;
1741 TxOkRatio = (TxCnt < 6) ? 4000:((pDevice->scStatistic.TxNoRetryOkCount * 4000) / TxCnt);
1742 RxOkRatio = (RxCnt < 6) ? 2000:((pDevice->scStatistic.RxOkCnt * 2000) / RxCnt);
1743 //decide link quality
1744 if(pDevice->bLinkPass !=TRUE)
1745 {
1746  //  printk("s_uCalculateLinkQual-->Link disconnect and Poor quality**\n");
1747    pDevice->scStatistic.LinkQuality = 0;
1748    pDevice->scStatistic.SignalStren = 0;
1749 }
1750 else
1751 {
1752    RFvRSSITodBm(pDevice, (BYTE)(pDevice->uCurrRSSI), &ldBm);
1753    if(-ldBm < 50)  {
1754         RssiRatio = 4000;
1755      }
1756    else if(-ldBm > 90) {
1757         RssiRatio = 0;
1758      }
1759    else {
1760         RssiRatio = (40-(-ldBm-50))*4000/40;
1761      }
1762    pDevice->scStatistic.SignalStren = RssiRatio/40;
1763    pDevice->scStatistic.LinkQuality = (RssiRatio+TxOkRatio+RxOkRatio)/100;
1764 }
1765    pDevice->scStatistic.RxFcsErrCnt = 0;
1766    pDevice->scStatistic.RxOkCnt = 0;
1767    pDevice->scStatistic.TxFailCount = 0;
1768    pDevice->scStatistic.TxNoRetryOkCount = 0;
1769    pDevice->scStatistic.TxRetryOkCount = 0;
1770    return;
1771 }
1772 #endif
1773
1774 VOID s_vCheckPreEDThreshold(
1775     IN HANDLE hDeviceContext
1776     )
1777 {
1778     PSDevice        pDevice = (PSDevice)hDeviceContext;
1779     PKnownBSS       pBSSList = NULL;
1780     PSMgmtObject    pMgmt = &(pDevice->sMgmtObj);
1781
1782     if ((pMgmt->eCurrState == WMAC_STATE_ASSOC) ||
1783         ((pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) && (pMgmt->eCurrState == WMAC_STATE_JOINTED))) {
1784         pBSSList = BSSpAddrIsInBSSList(pDevice, pMgmt->abyCurrBSSID, (PWLAN_IE_SSID)pMgmt->abyCurrSSID);
1785         if (pBSSList != NULL) {
1786             pDevice->byBBPreEDRSSI = (BYTE) (~(pBSSList->ldBmAverRange) + 1);
1787             //BBvUpdatePreEDThreshold(pDevice, FALSE);
1788         }
1789     }
1790     return;
1791 }