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