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