Commit e1c77579 authored by Joe Perches's avatar Joe Perches Committed by Greg Kroah-Hartman

staging:vt6655:bssdb: Whitespace cleanups

Neatening only.
git diff -w shows no differences.
Signed-off-by: default avatarJoe Perches <joe@perches.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 37529367
...@@ -66,44 +66,44 @@ ...@@ -66,44 +66,44 @@
/*--------------------- Static Classes ----------------------------*/ /*--------------------- Static Classes ----------------------------*/
/*--------------------- Static Variables --------------------------*/ /*--------------------- Static Variables --------------------------*/
static int msglevel =MSG_LEVEL_INFO; static int msglevel = MSG_LEVEL_INFO;
//static int msglevel =MSG_LEVEL_DEBUG; //static int msglevel =MSG_LEVEL_DEBUG;
const unsigned short awHWRetry0[5][5] = { const unsigned short awHWRetry0[5][5] = {
{RATE_18M, RATE_18M, RATE_12M, RATE_12M, RATE_12M}, {RATE_18M, RATE_18M, RATE_12M, RATE_12M, RATE_12M},
{RATE_24M, RATE_24M, RATE_18M, RATE_12M, RATE_12M}, {RATE_24M, RATE_24M, RATE_18M, RATE_12M, RATE_12M},
{RATE_36M, RATE_36M, RATE_24M, RATE_18M, RATE_18M}, {RATE_36M, RATE_36M, RATE_24M, RATE_18M, RATE_18M},
{RATE_48M, RATE_48M, RATE_36M, RATE_24M, RATE_24M}, {RATE_48M, RATE_48M, RATE_36M, RATE_24M, RATE_24M},
{RATE_54M, RATE_54M, RATE_48M, RATE_36M, RATE_36M} {RATE_54M, RATE_54M, RATE_48M, RATE_36M, RATE_36M}
}; };
const unsigned short awHWRetry1[5][5] = { const unsigned short awHWRetry1[5][5] = {
{RATE_18M, RATE_18M, RATE_12M, RATE_6M, RATE_6M}, {RATE_18M, RATE_18M, RATE_12M, RATE_6M, RATE_6M},
{RATE_24M, RATE_24M, RATE_18M, RATE_6M, RATE_6M}, {RATE_24M, RATE_24M, RATE_18M, RATE_6M, RATE_6M},
{RATE_36M, RATE_36M, RATE_24M, RATE_12M, RATE_12M}, {RATE_36M, RATE_36M, RATE_24M, RATE_12M, RATE_12M},
{RATE_48M, RATE_48M, RATE_24M, RATE_12M, RATE_12M}, {RATE_48M, RATE_48M, RATE_24M, RATE_12M, RATE_12M},
{RATE_54M, RATE_54M, RATE_36M, RATE_18M, RATE_18M} {RATE_54M, RATE_54M, RATE_36M, RATE_18M, RATE_18M}
}; };
/*--------------------- Static Functions --------------------------*/ /*--------------------- Static Functions --------------------------*/
void s_vCheckSensitivity( void s_vCheckSensitivity(
void *hDeviceContext void *hDeviceContext
); );
#ifdef Calcu_LinkQual #ifdef Calcu_LinkQual
void s_uCalculateLinkQual( void s_uCalculateLinkQual(
void *hDeviceContext void *hDeviceContext
); );
#endif #endif
void s_vCheckPreEDThreshold( void s_vCheckPreEDThreshold(
void *hDeviceContext void *hDeviceContext
); );
/*--------------------- Export Variables --------------------------*/ /*--------------------- Export Variables --------------------------*/
...@@ -121,149 +121,149 @@ void s_vCheckPreEDThreshold( ...@@ -121,149 +121,149 @@ void s_vCheckPreEDThreshold(
* Return Value: * Return Value:
* PTR to KnownBSS or NULL * PTR to KnownBSS or NULL
* *
-*/ -*/
PKnownBSS PKnownBSS
BSSpSearchBSSList( BSSpSearchBSSList(
void *hDeviceContext, void *hDeviceContext,
unsigned char *pbyDesireBSSID, unsigned char *pbyDesireBSSID,
unsigned char *pbyDesireSSID, unsigned char *pbyDesireSSID,
CARD_PHY_TYPE ePhyType CARD_PHY_TYPE ePhyType
) )
{ {
PSDevice pDevice = (PSDevice)hDeviceContext; PSDevice pDevice = (PSDevice)hDeviceContext;
PSMgmtObject pMgmt = pDevice->pMgmt; PSMgmtObject pMgmt = pDevice->pMgmt;
unsigned char *pbyBSSID = NULL; unsigned char *pbyBSSID = NULL;
PWLAN_IE_SSID pSSID = NULL; PWLAN_IE_SSID pSSID = NULL;
PKnownBSS pCurrBSS = NULL; PKnownBSS pCurrBSS = NULL;
PKnownBSS pSelect = NULL; PKnownBSS pSelect = NULL;
unsigned char ZeroBSSID[WLAN_BSSID_LEN]={0x00,0x00,0x00,0x00,0x00,0x00}; unsigned char ZeroBSSID[WLAN_BSSID_LEN] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
unsigned int ii = 0; unsigned int ii = 0;
if (pbyDesireBSSID != NULL) { if (pbyDesireBSSID != NULL) {
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO
"BSSpSearchBSSList BSSID[%pM]\n", pbyDesireBSSID); "BSSpSearchBSSList BSSID[%pM]\n", pbyDesireBSSID);
if ((!is_broadcast_ether_addr(pbyDesireBSSID)) && if ((!is_broadcast_ether_addr(pbyDesireBSSID)) &&
(memcmp(pbyDesireBSSID, ZeroBSSID, 6)!= 0)){ (memcmp(pbyDesireBSSID, ZeroBSSID, 6) != 0)) {
pbyBSSID = pbyDesireBSSID; pbyBSSID = pbyDesireBSSID;
} }
} }
if (pbyDesireSSID != NULL) { if (pbyDesireSSID != NULL) {
if (((PWLAN_IE_SSID)pbyDesireSSID)->len != 0) { if (((PWLAN_IE_SSID)pbyDesireSSID)->len != 0) {
pSSID = (PWLAN_IE_SSID) pbyDesireSSID; pSSID = (PWLAN_IE_SSID) pbyDesireSSID;
} }
} }
if (pbyBSSID != NULL) { if (pbyBSSID != NULL) {
// match BSSID first // match BSSID first
for (ii = 0; ii <MAX_BSS_NUM; ii++) { for (ii = 0; ii < MAX_BSS_NUM; ii++) {
pCurrBSS = &(pMgmt->sBSSList[ii]); pCurrBSS = &(pMgmt->sBSSList[ii]);
if(pDevice->bLinkPass==false) pCurrBSS->bSelected = false; if (pDevice->bLinkPass == false) pCurrBSS->bSelected = false;
if ((pCurrBSS->bActive) && if ((pCurrBSS->bActive) &&
(pCurrBSS->bSelected == false)) { (pCurrBSS->bSelected == false)) {
if (!compare_ether_addr(pCurrBSS->abyBSSID, pbyBSSID)) { if (!compare_ether_addr(pCurrBSS->abyBSSID, pbyBSSID)) {
if (pSSID != NULL) { if (pSSID != NULL) {
// compare ssid // compare ssid
if ( !memcmp(pSSID->abySSID, if (!memcmp(pSSID->abySSID,
((PWLAN_IE_SSID)pCurrBSS->abySSID)->abySSID, ((PWLAN_IE_SSID)pCurrBSS->abySSID)->abySSID,
pSSID->len)) { pSSID->len)) {
if ((pMgmt->eConfigMode == WMAC_CONFIG_AUTO) || if ((pMgmt->eConfigMode == WMAC_CONFIG_AUTO) ||
((pMgmt->eConfigMode == WMAC_CONFIG_IBSS_STA) && WLAN_GET_CAP_INFO_IBSS(pCurrBSS->wCapInfo)) || ((pMgmt->eConfigMode == WMAC_CONFIG_IBSS_STA) && WLAN_GET_CAP_INFO_IBSS(pCurrBSS->wCapInfo)) ||
((pMgmt->eConfigMode == WMAC_CONFIG_ESS_STA) && WLAN_GET_CAP_INFO_ESS(pCurrBSS->wCapInfo)) ((pMgmt->eConfigMode == WMAC_CONFIG_ESS_STA) && WLAN_GET_CAP_INFO_ESS(pCurrBSS->wCapInfo))
) { ) {
pCurrBSS->bSelected = true; pCurrBSS->bSelected = true;
return(pCurrBSS); return(pCurrBSS);
} }
} }
} else { } else {
if ((pMgmt->eConfigMode == WMAC_CONFIG_AUTO) || if ((pMgmt->eConfigMode == WMAC_CONFIG_AUTO) ||
((pMgmt->eConfigMode == WMAC_CONFIG_IBSS_STA) && WLAN_GET_CAP_INFO_IBSS(pCurrBSS->wCapInfo)) || ((pMgmt->eConfigMode == WMAC_CONFIG_IBSS_STA) && WLAN_GET_CAP_INFO_IBSS(pCurrBSS->wCapInfo)) ||
((pMgmt->eConfigMode == WMAC_CONFIG_ESS_STA) && WLAN_GET_CAP_INFO_ESS(pCurrBSS->wCapInfo)) ((pMgmt->eConfigMode == WMAC_CONFIG_ESS_STA) && WLAN_GET_CAP_INFO_ESS(pCurrBSS->wCapInfo))
) { ) {
pCurrBSS->bSelected = true; pCurrBSS->bSelected = true;
return(pCurrBSS); return(pCurrBSS);
} }
} }
} }
} }
} }
} else { } else {
// ignore BSSID // ignore BSSID
for (ii = 0; ii <MAX_BSS_NUM; ii++) { for (ii = 0; ii < MAX_BSS_NUM; ii++) {
pCurrBSS = &(pMgmt->sBSSList[ii]); pCurrBSS = &(pMgmt->sBSSList[ii]);
//2007-0721-01<Add>by MikeLiu //2007-0721-01<Add>by MikeLiu
pCurrBSS->bSelected = false; pCurrBSS->bSelected = false;
if (pCurrBSS->bActive) { if (pCurrBSS->bActive) {
if (pSSID != NULL) { if (pSSID != NULL) {
// matched SSID // matched SSID
if (! !memcmp(pSSID->abySSID, if (!!memcmp(pSSID->abySSID,
((PWLAN_IE_SSID)pCurrBSS->abySSID)->abySSID, ((PWLAN_IE_SSID)pCurrBSS->abySSID)->abySSID,
pSSID->len) || pSSID->len) ||
(pSSID->len != ((PWLAN_IE_SSID)pCurrBSS->abySSID)->len)) { (pSSID->len != ((PWLAN_IE_SSID)pCurrBSS->abySSID)->len)) {
// SSID not match skip this BSS // SSID not match skip this BSS
continue; continue;
} }
} }
if (((pMgmt->eConfigMode == WMAC_CONFIG_IBSS_STA) && WLAN_GET_CAP_INFO_ESS(pCurrBSS->wCapInfo)) || if (((pMgmt->eConfigMode == WMAC_CONFIG_IBSS_STA) && WLAN_GET_CAP_INFO_ESS(pCurrBSS->wCapInfo)) ||
((pMgmt->eConfigMode == WMAC_CONFIG_ESS_STA) && WLAN_GET_CAP_INFO_IBSS(pCurrBSS->wCapInfo)) ((pMgmt->eConfigMode == WMAC_CONFIG_ESS_STA) && WLAN_GET_CAP_INFO_IBSS(pCurrBSS->wCapInfo))
){ ) {
// Type not match skip this BSS // Type not match skip this BSS
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"BSS type mismatch.... Config[%d] BSS[0x%04x]\n", pMgmt->eConfigMode, pCurrBSS->wCapInfo); DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "BSS type mismatch.... Config[%d] BSS[0x%04x]\n", pMgmt->eConfigMode, pCurrBSS->wCapInfo);
continue; continue;
} }
if (ePhyType != PHY_TYPE_AUTO) { if (ePhyType != PHY_TYPE_AUTO) {
if (((ePhyType == PHY_TYPE_11A) && (PHY_TYPE_11A != pCurrBSS->eNetworkTypeInUse)) || if (((ePhyType == PHY_TYPE_11A) && (PHY_TYPE_11A != pCurrBSS->eNetworkTypeInUse)) ||
((ePhyType != PHY_TYPE_11A) && (PHY_TYPE_11A == pCurrBSS->eNetworkTypeInUse))) { ((ePhyType != PHY_TYPE_11A) && (PHY_TYPE_11A == pCurrBSS->eNetworkTypeInUse))) {
// PhyType not match skip this BSS // PhyType not match skip this BSS
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Physical type mismatch.... ePhyType[%d] BSS[%d]\n", ePhyType, pCurrBSS->eNetworkTypeInUse); DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Physical type mismatch.... ePhyType[%d] BSS[%d]\n", ePhyType, pCurrBSS->eNetworkTypeInUse);
continue; continue;
} }
} }
/* /*
if (pMgmt->eAuthenMode < WMAC_AUTH_WPA) { if (pMgmt->eAuthenMode < WMAC_AUTH_WPA) {
if (pCurrBSS->bWPAValid == true) { if (pCurrBSS->bWPAValid == true) {
// WPA AP will reject connection of station without WPA enable. // WPA AP will reject connection of station without WPA enable.
continue; continue;
} }
} else if ((pMgmt->eAuthenMode == WMAC_AUTH_WPA) || } else if ((pMgmt->eAuthenMode == WMAC_AUTH_WPA) ||
(pMgmt->eAuthenMode == WMAC_AUTH_WPAPSK)) { (pMgmt->eAuthenMode == WMAC_AUTH_WPAPSK)) {
if (pCurrBSS->bWPAValid == false) { if (pCurrBSS->bWPAValid == false) {
// station with WPA enable can't join NonWPA AP. // station with WPA enable can't join NonWPA AP.
continue; continue;
} }
} else if ((pMgmt->eAuthenMode == WMAC_AUTH_WPA2) || } else if ((pMgmt->eAuthenMode == WMAC_AUTH_WPA2) ||
(pMgmt->eAuthenMode == WMAC_AUTH_WPA2PSK)) { (pMgmt->eAuthenMode == WMAC_AUTH_WPA2PSK)) {
if (pCurrBSS->bWPA2Valid == false) { if (pCurrBSS->bWPA2Valid == false) {
// station with WPA2 enable can't join NonWPA2 AP. // station with WPA2 enable can't join NonWPA2 AP.
continue; continue;
} }
} }
*/ */
if (pSelect == NULL) { if (pSelect == NULL) {
pSelect = pCurrBSS; pSelect = pCurrBSS;
} else { } else {
// compare RSSI, select signal strong one // compare RSSI, select signal strong one
if (pCurrBSS->uRSSI < pSelect->uRSSI) { if (pCurrBSS->uRSSI < pSelect->uRSSI) {
pSelect = pCurrBSS; pSelect = pCurrBSS;
} }
} }
} }
} }
if (pSelect != NULL) { if (pSelect != NULL) {
pSelect->bSelected = true; pSelect->bSelected = true;
/* /*
if (pDevice->bRoaming == false) { if (pDevice->bRoaming == false) {
// Einsn Add @20070907 // Einsn Add @20070907
memset(pbyDesireSSID, 0, WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN + 1); memset(pbyDesireSSID, 0, WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN + 1);
memcpy(pbyDesireSSID,pCurrBSS->abySSID,WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN + 1) ; memcpy(pbyDesireSSID,pCurrBSS->abySSID,WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN + 1);
}*/ }*/
return(pSelect); return(pSelect);
} }
} }
return(NULL); return(NULL);
} }
...@@ -276,39 +276,39 @@ if(pDevice->bLinkPass==false) pCurrBSS->bSelected = false; ...@@ -276,39 +276,39 @@ if(pDevice->bLinkPass==false) pCurrBSS->bSelected = false;
* Return Value: * Return Value:
* None. * None.
* *
-*/ -*/
void void
BSSvClearBSSList( BSSvClearBSSList(
void *hDeviceContext, void *hDeviceContext,
bool bKeepCurrBSSID bool bKeepCurrBSSID
) )
{ {
PSDevice pDevice = (PSDevice)hDeviceContext; PSDevice pDevice = (PSDevice)hDeviceContext;
PSMgmtObject pMgmt = pDevice->pMgmt; PSMgmtObject pMgmt = pDevice->pMgmt;
unsigned int ii; unsigned int ii;
for (ii = 0; ii < MAX_BSS_NUM; ii++) { for (ii = 0; ii < MAX_BSS_NUM; ii++) {
if (bKeepCurrBSSID) { if (bKeepCurrBSSID) {
if (pMgmt->sBSSList[ii].bActive && if (pMgmt->sBSSList[ii].bActive &&
!compare_ether_addr(pMgmt->sBSSList[ii].abyBSSID, pMgmt->abyCurrBSSID)) { !compare_ether_addr(pMgmt->sBSSList[ii].abyBSSID, pMgmt->abyCurrBSSID)) {
// bKeepCurrBSSID = false; // bKeepCurrBSSID = false;
continue; continue;
} }
} }
if ((pMgmt->sBSSList[ii].bActive) && (pMgmt->sBSSList[ii].uClearCount < BSS_CLEAR_COUNT)) { if ((pMgmt->sBSSList[ii].bActive) && (pMgmt->sBSSList[ii].uClearCount < BSS_CLEAR_COUNT)) {
pMgmt->sBSSList[ii].uClearCount ++; pMgmt->sBSSList[ii].uClearCount++;
continue; continue;
} }
pMgmt->sBSSList[ii].bActive = false; pMgmt->sBSSList[ii].bActive = false;
memset(&pMgmt->sBSSList[ii], 0, sizeof(KnownBSS)); memset(&pMgmt->sBSSList[ii], 0, sizeof(KnownBSS));
} }
BSSvClearAnyBSSJoinRecord(pDevice); BSSvClearAnyBSSJoinRecord(pDevice);
return; return;
} }
...@@ -321,36 +321,36 @@ BSSvClearBSSList( ...@@ -321,36 +321,36 @@ BSSvClearBSSList(
* Return Value: * Return Value:
* true if found. * true if found.
* *
-*/ -*/
PKnownBSS PKnownBSS
BSSpAddrIsInBSSList( BSSpAddrIsInBSSList(
void *hDeviceContext, void *hDeviceContext,
unsigned char *abyBSSID, unsigned char *abyBSSID,
PWLAN_IE_SSID pSSID PWLAN_IE_SSID pSSID
) )
{ {
PSDevice pDevice = (PSDevice)hDeviceContext; PSDevice pDevice = (PSDevice)hDeviceContext;
PSMgmtObject pMgmt = pDevice->pMgmt; PSMgmtObject pMgmt = pDevice->pMgmt;
PKnownBSS pBSSList = NULL; PKnownBSS pBSSList = NULL;
unsigned int ii; unsigned int ii;
for (ii = 0; ii < MAX_BSS_NUM; ii++) { for (ii = 0; ii < MAX_BSS_NUM; ii++) {
pBSSList = &(pMgmt->sBSSList[ii]); pBSSList = &(pMgmt->sBSSList[ii]);
if (pBSSList->bActive) { if (pBSSList->bActive) {
if (!compare_ether_addr(pBSSList->abyBSSID, abyBSSID)) { if (!compare_ether_addr(pBSSList->abyBSSID, abyBSSID)) {
// if (pSSID == NULL) // if (pSSID == NULL)
// return pBSSList; // return pBSSList;
if (pSSID->len == ((PWLAN_IE_SSID)pBSSList->abySSID)->len){ if (pSSID->len == ((PWLAN_IE_SSID)pBSSList->abySSID)->len) {
if (memcmp(pSSID->abySSID, if (memcmp(pSSID->abySSID,
((PWLAN_IE_SSID)pBSSList->abySSID)->abySSID, ((PWLAN_IE_SSID)pBSSList->abySSID)->abySSID,
pSSID->len) == 0) pSSID->len) == 0)
return pBSSList; return pBSSList;
} }
} }
} }
} }
return NULL; return NULL;
}; };
...@@ -363,210 +363,210 @@ BSSpAddrIsInBSSList( ...@@ -363,210 +363,210 @@ BSSpAddrIsInBSSList(
* Return Value: * Return Value:
* true if success. * true if success.
* *
-*/ -*/
bool bool
BSSbInsertToBSSList ( BSSbInsertToBSSList(
void *hDeviceContext, void *hDeviceContext,
unsigned char *abyBSSIDAddr, unsigned char *abyBSSIDAddr,
QWORD qwTimestamp, QWORD qwTimestamp,
unsigned short wBeaconInterval, unsigned short wBeaconInterval,
unsigned short wCapInfo, unsigned short wCapInfo,
unsigned char byCurrChannel, unsigned char byCurrChannel,
PWLAN_IE_SSID pSSID, PWLAN_IE_SSID pSSID,
PWLAN_IE_SUPP_RATES pSuppRates, PWLAN_IE_SUPP_RATES pSuppRates,
PWLAN_IE_SUPP_RATES pExtSuppRates, PWLAN_IE_SUPP_RATES pExtSuppRates,
PERPObject psERP, PERPObject psERP,
PWLAN_IE_RSN pRSN, PWLAN_IE_RSN pRSN,
PWLAN_IE_RSN_EXT pRSNWPA, PWLAN_IE_RSN_EXT pRSNWPA,
PWLAN_IE_COUNTRY pIE_Country, PWLAN_IE_COUNTRY pIE_Country,
PWLAN_IE_QUIET pIE_Quiet, PWLAN_IE_QUIET pIE_Quiet,
unsigned int uIELength, unsigned int uIELength,
unsigned char *pbyIEs, unsigned char *pbyIEs,
void *pRxPacketContext void *pRxPacketContext
) )
{ {
PSDevice pDevice = (PSDevice)hDeviceContext; PSDevice pDevice = (PSDevice)hDeviceContext;
PSMgmtObject pMgmt = pDevice->pMgmt; PSMgmtObject pMgmt = pDevice->pMgmt;
PSRxMgmtPacket pRxPacket = (PSRxMgmtPacket)pRxPacketContext; PSRxMgmtPacket pRxPacket = (PSRxMgmtPacket)pRxPacketContext;
PKnownBSS pBSSList = NULL; PKnownBSS pBSSList = NULL;
unsigned int ii; unsigned int ii;
bool bParsingQuiet = false; bool bParsingQuiet = false;
PWLAN_IE_QUIET pQuiet = NULL; PWLAN_IE_QUIET pQuiet = NULL;
pBSSList = (PKnownBSS)&(pMgmt->sBSSList[0]); pBSSList = (PKnownBSS)&(pMgmt->sBSSList[0]);
for (ii = 0; ii < MAX_BSS_NUM; ii++) { for (ii = 0; ii < MAX_BSS_NUM; ii++) {
pBSSList = (PKnownBSS)&(pMgmt->sBSSList[ii]); pBSSList = (PKnownBSS)&(pMgmt->sBSSList[ii]);
if (!pBSSList->bActive) if (!pBSSList->bActive)
break; break;
} }
if (ii == MAX_BSS_NUM){ if (ii == MAX_BSS_NUM) {
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Get free KnowBSS node failed.\n"); DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Get free KnowBSS node failed.\n");
return false; return false;
} }
// save the BSS info // save the BSS info
pBSSList->bActive = true; pBSSList->bActive = true;
memcpy( pBSSList->abyBSSID, abyBSSIDAddr, WLAN_BSSID_LEN); memcpy(pBSSList->abyBSSID, abyBSSIDAddr, WLAN_BSSID_LEN);
HIDWORD(pBSSList->qwBSSTimestamp) = cpu_to_le32(HIDWORD(qwTimestamp)); HIDWORD(pBSSList->qwBSSTimestamp) = cpu_to_le32(HIDWORD(qwTimestamp));
LODWORD(pBSSList->qwBSSTimestamp) = cpu_to_le32(LODWORD(qwTimestamp)); LODWORD(pBSSList->qwBSSTimestamp) = cpu_to_le32(LODWORD(qwTimestamp));
pBSSList->wBeaconInterval = cpu_to_le16(wBeaconInterval); pBSSList->wBeaconInterval = cpu_to_le16(wBeaconInterval);
pBSSList->wCapInfo = cpu_to_le16(wCapInfo); pBSSList->wCapInfo = cpu_to_le16(wCapInfo);
pBSSList->uClearCount = 0; pBSSList->uClearCount = 0;
if (pSSID->len > WLAN_SSID_MAXLEN) if (pSSID->len > WLAN_SSID_MAXLEN)
pSSID->len = WLAN_SSID_MAXLEN; pSSID->len = WLAN_SSID_MAXLEN;
memcpy( pBSSList->abySSID, pSSID, pSSID->len + WLAN_IEHDR_LEN); memcpy(pBSSList->abySSID, pSSID, pSSID->len + WLAN_IEHDR_LEN);
pBSSList->uChannel = byCurrChannel; pBSSList->uChannel = byCurrChannel;
if (pSuppRates->len > WLAN_RATES_MAXLEN) if (pSuppRates->len > WLAN_RATES_MAXLEN)
pSuppRates->len = WLAN_RATES_MAXLEN; pSuppRates->len = WLAN_RATES_MAXLEN;
memcpy( pBSSList->abySuppRates, pSuppRates, pSuppRates->len + WLAN_IEHDR_LEN); memcpy(pBSSList->abySuppRates, pSuppRates, pSuppRates->len + WLAN_IEHDR_LEN);
if (pExtSuppRates != NULL) { if (pExtSuppRates != NULL) {
if (pExtSuppRates->len > WLAN_RATES_MAXLEN) if (pExtSuppRates->len > WLAN_RATES_MAXLEN)
pExtSuppRates->len = WLAN_RATES_MAXLEN; pExtSuppRates->len = WLAN_RATES_MAXLEN;
memcpy(pBSSList->abyExtSuppRates, pExtSuppRates, pExtSuppRates->len + WLAN_IEHDR_LEN); memcpy(pBSSList->abyExtSuppRates, pExtSuppRates, pExtSuppRates->len + WLAN_IEHDR_LEN);
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"BSSbInsertToBSSList: pExtSuppRates->len = %d\n", pExtSuppRates->len); DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "BSSbInsertToBSSList: pExtSuppRates->len = %d\n", pExtSuppRates->len);
} else { } else {
memset(pBSSList->abyExtSuppRates, 0, WLAN_IEHDR_LEN + WLAN_RATES_MAXLEN + 1); memset(pBSSList->abyExtSuppRates, 0, WLAN_IEHDR_LEN + WLAN_RATES_MAXLEN + 1);
} }
pBSSList->sERP.byERP = psERP->byERP; pBSSList->sERP.byERP = psERP->byERP;
pBSSList->sERP.bERPExist = psERP->bERPExist; pBSSList->sERP.bERPExist = psERP->bERPExist;
// Check if BSS is 802.11a/b/g // Check if BSS is 802.11a/b/g
if (pBSSList->uChannel > CB_MAX_CHANNEL_24G) { if (pBSSList->uChannel > CB_MAX_CHANNEL_24G) {
pBSSList->eNetworkTypeInUse = PHY_TYPE_11A; pBSSList->eNetworkTypeInUse = PHY_TYPE_11A;
} else { } else {
if (pBSSList->sERP.bERPExist == true) { if (pBSSList->sERP.bERPExist == true) {
pBSSList->eNetworkTypeInUse = PHY_TYPE_11G; pBSSList->eNetworkTypeInUse = PHY_TYPE_11G;
} else { } else {
pBSSList->eNetworkTypeInUse = PHY_TYPE_11B; pBSSList->eNetworkTypeInUse = PHY_TYPE_11B;
} }
} }
pBSSList->byRxRate = pRxPacket->byRxRate; pBSSList->byRxRate = pRxPacket->byRxRate;
pBSSList->qwLocalTSF = pRxPacket->qwLocalTSF; pBSSList->qwLocalTSF = pRxPacket->qwLocalTSF;
pBSSList->uRSSI = pRxPacket->uRSSI; pBSSList->uRSSI = pRxPacket->uRSSI;
pBSSList->bySQ = pRxPacket->bySQ; pBSSList->bySQ = pRxPacket->bySQ;
if ((pMgmt->eCurrMode == WMAC_MODE_ESS_STA) && if ((pMgmt->eCurrMode == WMAC_MODE_ESS_STA) &&
(pMgmt->eCurrState == WMAC_STATE_ASSOC)) { (pMgmt->eCurrState == WMAC_STATE_ASSOC)) {
// assoc with BSS // assoc with BSS
if (pBSSList == pMgmt->pCurrBSS) { if (pBSSList == pMgmt->pCurrBSS) {
bParsingQuiet = true; bParsingQuiet = true;
} }
} }
WPA_ClearRSN(pBSSList); WPA_ClearRSN(pBSSList);
if (pRSNWPA != NULL) { if (pRSNWPA != NULL) {
unsigned int uLen = pRSNWPA->len + 2; unsigned int uLen = pRSNWPA->len + 2;
if (uLen <= (uIELength - (unsigned int)((unsigned char *)pRSNWPA - pbyIEs))) { if (uLen <= (uIELength - (unsigned int)((unsigned char *)pRSNWPA - pbyIEs))) {
pBSSList->wWPALen = uLen; pBSSList->wWPALen = uLen;
memcpy(pBSSList->byWPAIE, pRSNWPA, uLen); memcpy(pBSSList->byWPAIE, pRSNWPA, uLen);
WPA_ParseRSN(pBSSList, pRSNWPA); WPA_ParseRSN(pBSSList, pRSNWPA);
} }
} }
WPA2_ClearRSN(pBSSList); WPA2_ClearRSN(pBSSList);
if (pRSN != NULL) { if (pRSN != NULL) {
unsigned int uLen = pRSN->len + 2; unsigned int uLen = pRSN->len + 2;
if (uLen <= (uIELength - (unsigned int)((unsigned char *)pRSN - pbyIEs))) { if (uLen <= (uIELength - (unsigned int)((unsigned char *)pRSN - pbyIEs))) {
pBSSList->wRSNLen = uLen; pBSSList->wRSNLen = uLen;
memcpy(pBSSList->byRSNIE, pRSN, uLen); memcpy(pBSSList->byRSNIE, pRSN, uLen);
WPA2vParseRSN(pBSSList, pRSN); WPA2vParseRSN(pBSSList, pRSN);
} }
} }
if ((pMgmt->eAuthenMode == WMAC_AUTH_WPA2) || (pBSSList->bWPA2Valid == true)) { if ((pMgmt->eAuthenMode == WMAC_AUTH_WPA2) || (pBSSList->bWPA2Valid == true)) {
PSKeyItem pTransmitKey = NULL; PSKeyItem pTransmitKey = NULL;
bool bIs802_1x = false; bool bIs802_1x = false;
for (ii = 0; ii < pBSSList->wAKMSSAuthCount; ii ++) { for (ii = 0; ii < pBSSList->wAKMSSAuthCount; ii++) {
if (pBSSList->abyAKMSSAuthType[ii] == WLAN_11i_AKMSS_802_1X) { if (pBSSList->abyAKMSSAuthType[ii] == WLAN_11i_AKMSS_802_1X) {
bIs802_1x = true; bIs802_1x = true;
break; break;
} }
} }
if ((bIs802_1x == true) && (pSSID->len == ((PWLAN_IE_SSID)pMgmt->abyDesireSSID)->len) && if ((bIs802_1x == true) && (pSSID->len == ((PWLAN_IE_SSID)pMgmt->abyDesireSSID)->len) &&
( !memcmp(pSSID->abySSID, ((PWLAN_IE_SSID)pMgmt->abyDesireSSID)->abySSID, pSSID->len))) { (!memcmp(pSSID->abySSID, ((PWLAN_IE_SSID)pMgmt->abyDesireSSID)->abySSID, pSSID->len))) {
bAdd_PMKID_Candidate((void *)pDevice, pBSSList->abyBSSID, &pBSSList->sRSNCapObj); bAdd_PMKID_Candidate((void *)pDevice, pBSSList->abyBSSID, &pBSSList->sRSNCapObj);
if ((pDevice->bLinkPass == true) && (pMgmt->eCurrState == WMAC_STATE_ASSOC)) { if ((pDevice->bLinkPass == true) && (pMgmt->eCurrState == WMAC_STATE_ASSOC)) {
if ((KeybGetTransmitKey(&(pDevice->sKey), pDevice->abyBSSID, PAIRWISE_KEY, &pTransmitKey) == true) || if ((KeybGetTransmitKey(&(pDevice->sKey), pDevice->abyBSSID, PAIRWISE_KEY, &pTransmitKey) == true) ||
(KeybGetTransmitKey(&(pDevice->sKey), pDevice->abyBSSID, GROUP_KEY, &pTransmitKey) == true)) { (KeybGetTransmitKey(&(pDevice->sKey), pDevice->abyBSSID, GROUP_KEY, &pTransmitKey) == true)) {
pDevice->gsPMKIDCandidate.StatusType = Ndis802_11StatusType_PMKID_CandidateList; pDevice->gsPMKIDCandidate.StatusType = Ndis802_11StatusType_PMKID_CandidateList;
pDevice->gsPMKIDCandidate.Version = 1; pDevice->gsPMKIDCandidate.Version = 1;
} }
} }
} }
} }
if (pDevice->bUpdateBBVGA) { if (pDevice->bUpdateBBVGA) {
// Moniter if RSSI is too strong. // Moniter if RSSI is too strong.
pBSSList->byRSSIStatCnt = 0; pBSSList->byRSSIStatCnt = 0;
RFvRSSITodBm(pDevice, (unsigned char)(pRxPacket->uRSSI), &pBSSList->ldBmMAX); RFvRSSITodBm(pDevice, (unsigned char)(pRxPacket->uRSSI), &pBSSList->ldBmMAX);
pBSSList->ldBmAverage[0] = pBSSList->ldBmMAX; pBSSList->ldBmAverage[0] = pBSSList->ldBmMAX;
for (ii = 1; ii < RSSI_STAT_COUNT; ii++) for (ii = 1; ii < RSSI_STAT_COUNT; ii++)
pBSSList->ldBmAverage[ii] = 0; pBSSList->ldBmAverage[ii] = 0;
} }
if ((pIE_Country != NULL) && if ((pIE_Country != NULL) &&
(pMgmt->b11hEnable == true)) { (pMgmt->b11hEnable == true)) {
set_country_info(pMgmt->pAdapter, pBSSList->eNetworkTypeInUse, set_country_info(pMgmt->pAdapter, pBSSList->eNetworkTypeInUse,
pIE_Country); pIE_Country);
} }
if ((bParsingQuiet == true) && (pIE_Quiet != NULL)) { if ((bParsingQuiet == true) && (pIE_Quiet != NULL)) {
if ((((PWLAN_IE_QUIET)pIE_Quiet)->len == 8) && if ((((PWLAN_IE_QUIET)pIE_Quiet)->len == 8) &&
(((PWLAN_IE_QUIET)pIE_Quiet)->byQuietCount != 0)) { (((PWLAN_IE_QUIET)pIE_Quiet)->byQuietCount != 0)) {
// valid EID // valid EID
if (pQuiet == NULL) { if (pQuiet == NULL) {
pQuiet = (PWLAN_IE_QUIET)pIE_Quiet; pQuiet = (PWLAN_IE_QUIET)pIE_Quiet;
CARDbSetQuiet( pMgmt->pAdapter, CARDbSetQuiet(pMgmt->pAdapter,
true, true,
pQuiet->byQuietCount, pQuiet->byQuietCount,
pQuiet->byQuietPeriod, pQuiet->byQuietPeriod,
*((unsigned short *)pQuiet->abyQuietDuration), *((unsigned short *)pQuiet->abyQuietDuration),
*((unsigned short *)pQuiet->abyQuietOffset) *((unsigned short *)pQuiet->abyQuietOffset)
); );
} else { } else {
pQuiet = (PWLAN_IE_QUIET)pIE_Quiet; pQuiet = (PWLAN_IE_QUIET)pIE_Quiet;
CARDbSetQuiet( pMgmt->pAdapter, CARDbSetQuiet(pMgmt->pAdapter,
false, false,
pQuiet->byQuietCount, pQuiet->byQuietCount,
pQuiet->byQuietPeriod, pQuiet->byQuietPeriod,
*((unsigned short *)pQuiet->abyQuietDuration), *((unsigned short *)pQuiet->abyQuietDuration),
*((unsigned short *)pQuiet->abyQuietOffset) *((unsigned short *)pQuiet->abyQuietOffset)
); );
} }
} }
} }
if ((bParsingQuiet == true) && if ((bParsingQuiet == true) &&
(pQuiet != NULL)) { (pQuiet != NULL)) {
CARDbStartQuiet(pMgmt->pAdapter); CARDbStartQuiet(pMgmt->pAdapter);
} }
pBSSList->uIELength = uIELength; pBSSList->uIELength = uIELength;
if (pBSSList->uIELength > WLAN_BEACON_FR_MAXLEN) if (pBSSList->uIELength > WLAN_BEACON_FR_MAXLEN)
pBSSList->uIELength = WLAN_BEACON_FR_MAXLEN; pBSSList->uIELength = WLAN_BEACON_FR_MAXLEN;
memcpy(pBSSList->abyIEs, pbyIEs, pBSSList->uIELength); memcpy(pBSSList->abyIEs, pbyIEs, pBSSList->uIELength);
return true; return true;
} }
...@@ -578,171 +578,171 @@ BSSbInsertToBSSList ( ...@@ -578,171 +578,171 @@ BSSbInsertToBSSList (
* Return Value: * Return Value:
* true if success. * true if success.
* *
-*/ -*/
// TODO: input structure modify // TODO: input structure modify
bool bool
BSSbUpdateToBSSList ( BSSbUpdateToBSSList(
void *hDeviceContext, void *hDeviceContext,
QWORD qwTimestamp, QWORD qwTimestamp,
unsigned short wBeaconInterval, unsigned short wBeaconInterval,
unsigned short wCapInfo, unsigned short wCapInfo,
unsigned char byCurrChannel, unsigned char byCurrChannel,
bool bChannelHit, bool bChannelHit,
PWLAN_IE_SSID pSSID, PWLAN_IE_SSID pSSID,
PWLAN_IE_SUPP_RATES pSuppRates, PWLAN_IE_SUPP_RATES pSuppRates,
PWLAN_IE_SUPP_RATES pExtSuppRates, PWLAN_IE_SUPP_RATES pExtSuppRates,
PERPObject psERP, PERPObject psERP,
PWLAN_IE_RSN pRSN, PWLAN_IE_RSN pRSN,
PWLAN_IE_RSN_EXT pRSNWPA, PWLAN_IE_RSN_EXT pRSNWPA,
PWLAN_IE_COUNTRY pIE_Country, PWLAN_IE_COUNTRY pIE_Country,
PWLAN_IE_QUIET pIE_Quiet, PWLAN_IE_QUIET pIE_Quiet,
PKnownBSS pBSSList, PKnownBSS pBSSList,
unsigned int uIELength, unsigned int uIELength,
unsigned char *pbyIEs, unsigned char *pbyIEs,
void *pRxPacketContext void *pRxPacketContext
) )
{ {
int ii; int ii;
PSDevice pDevice = (PSDevice)hDeviceContext; PSDevice pDevice = (PSDevice)hDeviceContext;
PSMgmtObject pMgmt = pDevice->pMgmt; PSMgmtObject pMgmt = pDevice->pMgmt;
PSRxMgmtPacket pRxPacket = (PSRxMgmtPacket)pRxPacketContext; PSRxMgmtPacket pRxPacket = (PSRxMgmtPacket)pRxPacketContext;
long ldBm; long ldBm;
bool bParsingQuiet = false; bool bParsingQuiet = false;
PWLAN_IE_QUIET pQuiet = NULL; PWLAN_IE_QUIET pQuiet = NULL;
if (pBSSList == NULL) if (pBSSList == NULL)
return false; return false;
HIDWORD(pBSSList->qwBSSTimestamp) = cpu_to_le32(HIDWORD(qwTimestamp)); HIDWORD(pBSSList->qwBSSTimestamp) = cpu_to_le32(HIDWORD(qwTimestamp));
LODWORD(pBSSList->qwBSSTimestamp) = cpu_to_le32(LODWORD(qwTimestamp)); LODWORD(pBSSList->qwBSSTimestamp) = cpu_to_le32(LODWORD(qwTimestamp));
pBSSList->wBeaconInterval = cpu_to_le16(wBeaconInterval); pBSSList->wBeaconInterval = cpu_to_le16(wBeaconInterval);
pBSSList->wCapInfo = cpu_to_le16(wCapInfo); pBSSList->wCapInfo = cpu_to_le16(wCapInfo);
pBSSList->uClearCount = 0; pBSSList->uClearCount = 0;
pBSSList->uChannel = byCurrChannel; pBSSList->uChannel = byCurrChannel;
// DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"BSSbUpdateToBSSList: pBSSList->uChannel: %d\n", pBSSList->uChannel); // DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "BSSbUpdateToBSSList: pBSSList->uChannel: %d\n", pBSSList->uChannel);
if (pSSID->len > WLAN_SSID_MAXLEN) if (pSSID->len > WLAN_SSID_MAXLEN)
pSSID->len = WLAN_SSID_MAXLEN; pSSID->len = WLAN_SSID_MAXLEN;
if ((pSSID->len != 0) && (pSSID->abySSID[0] != 0)) if ((pSSID->len != 0) && (pSSID->abySSID[0] != 0))
memcpy(pBSSList->abySSID, pSSID, pSSID->len + WLAN_IEHDR_LEN); memcpy(pBSSList->abySSID, pSSID, pSSID->len + WLAN_IEHDR_LEN);
memcpy(pBSSList->abySuppRates, pSuppRates,pSuppRates->len + WLAN_IEHDR_LEN); memcpy(pBSSList->abySuppRates, pSuppRates, pSuppRates->len + WLAN_IEHDR_LEN);
if (pExtSuppRates != NULL) { if (pExtSuppRates != NULL) {
memcpy(pBSSList->abyExtSuppRates, pExtSuppRates,pExtSuppRates->len + WLAN_IEHDR_LEN); memcpy(pBSSList->abyExtSuppRates, pExtSuppRates, pExtSuppRates->len + WLAN_IEHDR_LEN);
} else { } else {
memset(pBSSList->abyExtSuppRates, 0, WLAN_IEHDR_LEN + WLAN_RATES_MAXLEN + 1); memset(pBSSList->abyExtSuppRates, 0, WLAN_IEHDR_LEN + WLAN_RATES_MAXLEN + 1);
} }
pBSSList->sERP.byERP = psERP->byERP; pBSSList->sERP.byERP = psERP->byERP;
pBSSList->sERP.bERPExist = psERP->bERPExist; pBSSList->sERP.bERPExist = psERP->bERPExist;
// Check if BSS is 802.11a/b/g // Check if BSS is 802.11a/b/g
if (pBSSList->uChannel > CB_MAX_CHANNEL_24G) { if (pBSSList->uChannel > CB_MAX_CHANNEL_24G) {
pBSSList->eNetworkTypeInUse = PHY_TYPE_11A; pBSSList->eNetworkTypeInUse = PHY_TYPE_11A;
} else { } else {
if (pBSSList->sERP.bERPExist == true) { if (pBSSList->sERP.bERPExist == true) {
pBSSList->eNetworkTypeInUse = PHY_TYPE_11G; pBSSList->eNetworkTypeInUse = PHY_TYPE_11G;
} else { } else {
pBSSList->eNetworkTypeInUse = PHY_TYPE_11B; pBSSList->eNetworkTypeInUse = PHY_TYPE_11B;
} }
} }
pBSSList->byRxRate = pRxPacket->byRxRate; pBSSList->byRxRate = pRxPacket->byRxRate;
pBSSList->qwLocalTSF = pRxPacket->qwLocalTSF; pBSSList->qwLocalTSF = pRxPacket->qwLocalTSF;
if(bChannelHit) if (bChannelHit)
pBSSList->uRSSI = pRxPacket->uRSSI; pBSSList->uRSSI = pRxPacket->uRSSI;
pBSSList->bySQ = pRxPacket->bySQ; pBSSList->bySQ = pRxPacket->bySQ;
if ((pMgmt->eCurrMode == WMAC_MODE_ESS_STA) && if ((pMgmt->eCurrMode == WMAC_MODE_ESS_STA) &&
(pMgmt->eCurrState == WMAC_STATE_ASSOC)) { (pMgmt->eCurrState == WMAC_STATE_ASSOC)) {
// assoc with BSS // assoc with BSS
if (pBSSList == pMgmt->pCurrBSS) { if (pBSSList == pMgmt->pCurrBSS) {
bParsingQuiet = true; bParsingQuiet = true;
} }
} }
WPA_ClearRSN(pBSSList); //mike update WPA_ClearRSN(pBSSList); //mike update
if (pRSNWPA != NULL) { if (pRSNWPA != NULL) {
unsigned int uLen = pRSNWPA->len + 2; unsigned int uLen = pRSNWPA->len + 2;
if (uLen <= (uIELength - (unsigned int)((unsigned char *)pRSNWPA - pbyIEs))) { if (uLen <= (uIELength - (unsigned int)((unsigned char *)pRSNWPA - pbyIEs))) {
pBSSList->wWPALen = uLen; pBSSList->wWPALen = uLen;
memcpy(pBSSList->byWPAIE, pRSNWPA, uLen); memcpy(pBSSList->byWPAIE, pRSNWPA, uLen);
WPA_ParseRSN(pBSSList, pRSNWPA); WPA_ParseRSN(pBSSList, pRSNWPA);
} }
} }
WPA2_ClearRSN(pBSSList); //mike update WPA2_ClearRSN(pBSSList); //mike update
if (pRSN != NULL) { if (pRSN != NULL) {
unsigned int uLen = pRSN->len + 2; unsigned int uLen = pRSN->len + 2;
if (uLen <= (uIELength - (unsigned int)((unsigned char *)pRSN - pbyIEs))) { if (uLen <= (uIELength - (unsigned int)((unsigned char *)pRSN - pbyIEs))) {
pBSSList->wRSNLen = uLen; pBSSList->wRSNLen = uLen;
memcpy(pBSSList->byRSNIE, pRSN, uLen); memcpy(pBSSList->byRSNIE, pRSN, uLen);
WPA2vParseRSN(pBSSList, pRSN); WPA2vParseRSN(pBSSList, pRSN);
} }
} }
if (pRxPacket->uRSSI != 0) { if (pRxPacket->uRSSI != 0) {
RFvRSSITodBm(pDevice, (unsigned char)(pRxPacket->uRSSI), &ldBm); RFvRSSITodBm(pDevice, (unsigned char)(pRxPacket->uRSSI), &ldBm);
// Moniter if RSSI is too strong. // Moniter if RSSI is too strong.
pBSSList->byRSSIStatCnt++; pBSSList->byRSSIStatCnt++;
pBSSList->byRSSIStatCnt %= RSSI_STAT_COUNT; pBSSList->byRSSIStatCnt %= RSSI_STAT_COUNT;
pBSSList->ldBmAverage[pBSSList->byRSSIStatCnt] = ldBm; pBSSList->ldBmAverage[pBSSList->byRSSIStatCnt] = ldBm;
for(ii=0;ii<RSSI_STAT_COUNT;ii++) { for (ii = 0; ii < RSSI_STAT_COUNT; ii++) {
if (pBSSList->ldBmAverage[ii] != 0) { if (pBSSList->ldBmAverage[ii] != 0) {
pBSSList->ldBmMAX = max(pBSSList->ldBmAverage[ii], ldBm); pBSSList->ldBmMAX = max(pBSSList->ldBmAverage[ii], ldBm);
} }
} }
} }
if ((pIE_Country != NULL) && if ((pIE_Country != NULL) &&
(pMgmt->b11hEnable == true)) { (pMgmt->b11hEnable == true)) {
set_country_info(pMgmt->pAdapter, pBSSList->eNetworkTypeInUse, set_country_info(pMgmt->pAdapter, pBSSList->eNetworkTypeInUse,
pIE_Country); pIE_Country);
} }
if ((bParsingQuiet == true) && (pIE_Quiet != NULL)) { if ((bParsingQuiet == true) && (pIE_Quiet != NULL)) {
if ((((PWLAN_IE_QUIET)pIE_Quiet)->len == 8) && if ((((PWLAN_IE_QUIET)pIE_Quiet)->len == 8) &&
(((PWLAN_IE_QUIET)pIE_Quiet)->byQuietCount != 0)) { (((PWLAN_IE_QUIET)pIE_Quiet)->byQuietCount != 0)) {
// valid EID // valid EID
if (pQuiet == NULL) { if (pQuiet == NULL) {
pQuiet = (PWLAN_IE_QUIET)pIE_Quiet; pQuiet = (PWLAN_IE_QUIET)pIE_Quiet;
CARDbSetQuiet( pMgmt->pAdapter, CARDbSetQuiet(pMgmt->pAdapter,
true, true,
pQuiet->byQuietCount, pQuiet->byQuietCount,
pQuiet->byQuietPeriod, pQuiet->byQuietPeriod,
*((unsigned short *)pQuiet->abyQuietDuration), *((unsigned short *)pQuiet->abyQuietDuration),
*((unsigned short *)pQuiet->abyQuietOffset) *((unsigned short *)pQuiet->abyQuietOffset)
); );
} else { } else {
pQuiet = (PWLAN_IE_QUIET)pIE_Quiet; pQuiet = (PWLAN_IE_QUIET)pIE_Quiet;
CARDbSetQuiet( pMgmt->pAdapter, CARDbSetQuiet(pMgmt->pAdapter,
false, false,
pQuiet->byQuietCount, pQuiet->byQuietCount,
pQuiet->byQuietPeriod, pQuiet->byQuietPeriod,
*((unsigned short *)pQuiet->abyQuietDuration), *((unsigned short *)pQuiet->abyQuietDuration),
*((unsigned short *)pQuiet->abyQuietOffset) *((unsigned short *)pQuiet->abyQuietOffset)
); );
} }
} }
} }
if ((bParsingQuiet == true) && if ((bParsingQuiet == true) &&
(pQuiet != NULL)) { (pQuiet != NULL)) {
CARDbStartQuiet(pMgmt->pAdapter); CARDbStartQuiet(pMgmt->pAdapter);
} }
pBSSList->uIELength = uIELength; pBSSList->uIELength = uIELength;
if (pBSSList->uIELength > WLAN_BEACON_FR_MAXLEN) if (pBSSList->uIELength > WLAN_BEACON_FR_MAXLEN)
pBSSList->uIELength = WLAN_BEACON_FR_MAXLEN; pBSSList->uIELength = WLAN_BEACON_FR_MAXLEN;
memcpy(pBSSList->abyIEs, pbyIEs, pBSSList->uIELength); memcpy(pBSSList->abyIEs, pbyIEs, pBSSList->uIELength);
return true; return true;
} }
...@@ -757,26 +757,26 @@ BSSbUpdateToBSSList ( ...@@ -757,26 +757,26 @@ BSSbUpdateToBSSList (
* Return Value: * Return Value:
* None * None
* *
-*/ -*/
bool bool
BSSDBbIsSTAInNodeDB(void *pMgmtObject, unsigned char *abyDstAddr, BSSDBbIsSTAInNodeDB(void *pMgmtObject, unsigned char *abyDstAddr,
unsigned int *puNodeIndex) unsigned int *puNodeIndex)
{ {
PSMgmtObject pMgmt = (PSMgmtObject) pMgmtObject; PSMgmtObject pMgmt = (PSMgmtObject) pMgmtObject;
unsigned int ii; unsigned int ii;
// Index = 0 reserved for AP Node // Index = 0 reserved for AP Node
for (ii = 1; ii < (MAX_NODE_NUM + 1); ii++) { for (ii = 1; ii < (MAX_NODE_NUM + 1); ii++) {
if (pMgmt->sNodeDBTable[ii].bActive) { if (pMgmt->sNodeDBTable[ii].bActive) {
if (!compare_ether_addr(abyDstAddr, pMgmt->sNodeDBTable[ii].abyMACAddr)) { if (!compare_ether_addr(abyDstAddr, pMgmt->sNodeDBTable[ii].abyMACAddr)) {
*puNodeIndex = ii; *puNodeIndex = ii;
return true; return true;
} }
} }
} }
return false; return false;
}; };
...@@ -790,55 +790,55 @@ BSSDBbIsSTAInNodeDB(void *pMgmtObject, unsigned char *abyDstAddr, ...@@ -790,55 +790,55 @@ BSSDBbIsSTAInNodeDB(void *pMgmtObject, unsigned char *abyDstAddr,
* Return Value: * Return Value:
* None * None
* *
-*/ -*/
void void
BSSvCreateOneNode(void *hDeviceContext, unsigned int *puNodeIndex) BSSvCreateOneNode(void *hDeviceContext, unsigned int *puNodeIndex)
{ {
PSDevice pDevice = (PSDevice)hDeviceContext; PSDevice pDevice = (PSDevice)hDeviceContext;
PSMgmtObject pMgmt = pDevice->pMgmt; PSMgmtObject pMgmt = pDevice->pMgmt;
unsigned int ii; unsigned int ii;
unsigned int BigestCount = 0; unsigned int BigestCount = 0;
unsigned int SelectIndex; unsigned int SelectIndex;
struct sk_buff *skb; struct sk_buff *skb;
// Index = 0 reserved for AP Node (In STA mode) // Index = 0 reserved for AP Node (In STA mode)
// Index = 0 reserved for Broadcast/MultiCast (In AP mode) // Index = 0 reserved for Broadcast/MultiCast (In AP mode)
SelectIndex = 1; SelectIndex = 1;
for (ii = 1; ii < (MAX_NODE_NUM + 1); ii++) { for (ii = 1; ii < (MAX_NODE_NUM + 1); ii++) {
if (pMgmt->sNodeDBTable[ii].bActive) { if (pMgmt->sNodeDBTable[ii].bActive) {
if (pMgmt->sNodeDBTable[ii].uInActiveCount > BigestCount) { if (pMgmt->sNodeDBTable[ii].uInActiveCount > BigestCount) {
BigestCount = pMgmt->sNodeDBTable[ii].uInActiveCount; BigestCount = pMgmt->sNodeDBTable[ii].uInActiveCount;
SelectIndex = ii; SelectIndex = ii;
} }
} }
else { else {
break; break;
} }
} }
// if not found replace uInActiveCount is largest one. // if not found replace uInActiveCount is largest one.
if ( ii == (MAX_NODE_NUM + 1)) { if (ii == (MAX_NODE_NUM + 1)) {
*puNodeIndex = SelectIndex; *puNodeIndex = SelectIndex;
DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "Replace inactive node = %d\n", SelectIndex); DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "Replace inactive node = %d\n", SelectIndex);
// clear ps buffer // clear ps buffer
if (pMgmt->sNodeDBTable[*puNodeIndex].sTxPSQueue.next != NULL) { if (pMgmt->sNodeDBTable[*puNodeIndex].sTxPSQueue.next != NULL) {
while ((skb = skb_dequeue(&pMgmt->sNodeDBTable[*puNodeIndex].sTxPSQueue)) != NULL) while ((skb = skb_dequeue(&pMgmt->sNodeDBTable[*puNodeIndex].sTxPSQueue)) != NULL)
dev_kfree_skb(skb); dev_kfree_skb(skb);
} }
} }
else { else {
*puNodeIndex = ii; *puNodeIndex = ii;
} }
memset(&pMgmt->sNodeDBTable[*puNodeIndex], 0, sizeof(KnownNodeDB)); memset(&pMgmt->sNodeDBTable[*puNodeIndex], 0, sizeof(KnownNodeDB));
pMgmt->sNodeDBTable[*puNodeIndex].bActive = true; pMgmt->sNodeDBTable[*puNodeIndex].bActive = true;
pMgmt->sNodeDBTable[*puNodeIndex].uRatePollTimeout = FALLBACK_POLL_SECOND; pMgmt->sNodeDBTable[*puNodeIndex].uRatePollTimeout = FALLBACK_POLL_SECOND;
// for AP mode PS queue // for AP mode PS queue
skb_queue_head_init(&pMgmt->sNodeDBTable[*puNodeIndex].sTxPSQueue); skb_queue_head_init(&pMgmt->sNodeDBTable[*puNodeIndex].sTxPSQueue);
pMgmt->sNodeDBTable[*puNodeIndex].byAuthSequence = 0; pMgmt->sNodeDBTable[*puNodeIndex].byAuthSequence = 0;
pMgmt->sNodeDBTable[*puNodeIndex].wEnQueueCnt = 0; pMgmt->sNodeDBTable[*puNodeIndex].wEnQueueCnt = 0;
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Create node index = %d\n", ii); DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Create node index = %d\n", ii);
return; return;
}; };
...@@ -852,28 +852,28 @@ BSSvCreateOneNode(void *hDeviceContext, unsigned int *puNodeIndex) ...@@ -852,28 +852,28 @@ BSSvCreateOneNode(void *hDeviceContext, unsigned int *puNodeIndex)
* Return Value: * Return Value:
* None * None
* *
-*/ -*/
void void
BSSvRemoveOneNode( BSSvRemoveOneNode(
void *hDeviceContext, void *hDeviceContext,
unsigned int uNodeIndex unsigned int uNodeIndex
) )
{ {
PSDevice pDevice = (PSDevice)hDeviceContext; PSDevice pDevice = (PSDevice)hDeviceContext;
PSMgmtObject pMgmt = pDevice->pMgmt; PSMgmtObject pMgmt = pDevice->pMgmt;
unsigned char byMask[8] = {1, 2, 4, 8, 0x10, 0x20, 0x40, 0x80}; unsigned char byMask[8] = {1, 2, 4, 8, 0x10, 0x20, 0x40, 0x80};
struct sk_buff *skb; struct sk_buff *skb;
while ((skb = skb_dequeue(&pMgmt->sNodeDBTable[uNodeIndex].sTxPSQueue)) != NULL) while ((skb = skb_dequeue(&pMgmt->sNodeDBTable[uNodeIndex].sTxPSQueue)) != NULL)
dev_kfree_skb(skb); dev_kfree_skb(skb);
// clear context // clear context
memset(&pMgmt->sNodeDBTable[uNodeIndex], 0, sizeof(KnownNodeDB)); memset(&pMgmt->sNodeDBTable[uNodeIndex], 0, sizeof(KnownNodeDB));
// clear tx bit map // clear tx bit map
pMgmt->abyPSTxMap[pMgmt->sNodeDBTable[uNodeIndex].wAID >> 3] &= ~byMask[pMgmt->sNodeDBTable[uNodeIndex].wAID & 7]; pMgmt->abyPSTxMap[pMgmt->sNodeDBTable[uNodeIndex].wAID >> 3] &= ~byMask[pMgmt->sNodeDBTable[uNodeIndex].wAID & 7];
return; return;
}; };
/*+ /*+
* *
...@@ -884,52 +884,52 @@ BSSvRemoveOneNode( ...@@ -884,52 +884,52 @@ BSSvRemoveOneNode(
* Return Value: * Return Value:
* None * None
* *
-*/ -*/
void void
BSSvUpdateAPNode( BSSvUpdateAPNode(
void *hDeviceContext, void *hDeviceContext,
unsigned short *pwCapInfo, unsigned short *pwCapInfo,
PWLAN_IE_SUPP_RATES pSuppRates, PWLAN_IE_SUPP_RATES pSuppRates,
PWLAN_IE_SUPP_RATES pExtSuppRates PWLAN_IE_SUPP_RATES pExtSuppRates
) )
{ {
PSDevice pDevice = (PSDevice)hDeviceContext; PSDevice pDevice = (PSDevice)hDeviceContext;
PSMgmtObject pMgmt = pDevice->pMgmt; PSMgmtObject pMgmt = pDevice->pMgmt;
unsigned int uRateLen = WLAN_RATES_MAXLEN; unsigned int uRateLen = WLAN_RATES_MAXLEN;
memset(&pMgmt->sNodeDBTable[0], 0, sizeof(KnownNodeDB)); memset(&pMgmt->sNodeDBTable[0], 0, sizeof(KnownNodeDB));
pMgmt->sNodeDBTable[0].bActive = true; pMgmt->sNodeDBTable[0].bActive = true;
if (pDevice->eCurrentPHYType == PHY_TYPE_11B) { if (pDevice->eCurrentPHYType == PHY_TYPE_11B) {
uRateLen = WLAN_RATES_MAXLEN_11B; uRateLen = WLAN_RATES_MAXLEN_11B;
} }
pMgmt->abyCurrSuppRates[1] = RATEuSetIE((PWLAN_IE_SUPP_RATES)pSuppRates, pMgmt->abyCurrSuppRates[1] = RATEuSetIE((PWLAN_IE_SUPP_RATES)pSuppRates,
(PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates, (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates,
uRateLen); uRateLen);
pMgmt->abyCurrExtSuppRates[1] = RATEuSetIE((PWLAN_IE_SUPP_RATES)pExtSuppRates, pMgmt->abyCurrExtSuppRates[1] = RATEuSetIE((PWLAN_IE_SUPP_RATES)pExtSuppRates,
(PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates, (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates,
uRateLen); uRateLen);
RATEvParseMaxRate((void *)pDevice, RATEvParseMaxRate((void *)pDevice,
(PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates, (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates,
(PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates, (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates,
true, true,
&(pMgmt->sNodeDBTable[0].wMaxBasicRate), &(pMgmt->sNodeDBTable[0].wMaxBasicRate),
&(pMgmt->sNodeDBTable[0].wMaxSuppRate), &(pMgmt->sNodeDBTable[0].wMaxSuppRate),
&(pMgmt->sNodeDBTable[0].wSuppRate), &(pMgmt->sNodeDBTable[0].wSuppRate),
&(pMgmt->sNodeDBTable[0].byTopCCKBasicRate), &(pMgmt->sNodeDBTable[0].byTopCCKBasicRate),
&(pMgmt->sNodeDBTable[0].byTopOFDMBasicRate) &(pMgmt->sNodeDBTable[0].byTopOFDMBasicRate)
); );
memcpy(pMgmt->sNodeDBTable[0].abyMACAddr, pMgmt->abyCurrBSSID, WLAN_ADDR_LEN); memcpy(pMgmt->sNodeDBTable[0].abyMACAddr, pMgmt->abyCurrBSSID, WLAN_ADDR_LEN);
pMgmt->sNodeDBTable[0].wTxDataRate = pMgmt->sNodeDBTable[0].wMaxSuppRate; pMgmt->sNodeDBTable[0].wTxDataRate = pMgmt->sNodeDBTable[0].wMaxSuppRate;
pMgmt->sNodeDBTable[0].bShortPreamble = WLAN_GET_CAP_INFO_SHORTPREAMBLE(*pwCapInfo); pMgmt->sNodeDBTable[0].bShortPreamble = WLAN_GET_CAP_INFO_SHORTPREAMBLE(*pwCapInfo);
pMgmt->sNodeDBTable[0].uRatePollTimeout = FALLBACK_POLL_SECOND; pMgmt->sNodeDBTable[0].uRatePollTimeout = FALLBACK_POLL_SECOND;
#ifdef PLICE_DEBUG #ifdef PLICE_DEBUG
printk("BSSvUpdateAPNode:MaxSuppRate is %d\n",pMgmt->sNodeDBTable[0].wMaxSuppRate); printk("BSSvUpdateAPNode:MaxSuppRate is %d\n", pMgmt->sNodeDBTable[0].wMaxSuppRate);
#endif #endif
// Auto rate fallback function initiation. // Auto rate fallback function initiation.
// RATEbInit(pDevice); // RATEbInit(pDevice);
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pMgmt->sNodeDBTable[0].wTxDataRate = %d \n", pMgmt->sNodeDBTable[0].wTxDataRate); DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "pMgmt->sNodeDBTable[0].wTxDataRate = %d \n", pMgmt->sNodeDBTable[0].wTxDataRate);
}; };
...@@ -946,38 +946,38 @@ BSSvUpdateAPNode( ...@@ -946,38 +946,38 @@ BSSvUpdateAPNode(
* Return Value: * Return Value:
* None * None
* *
-*/ -*/
void void
BSSvAddMulticastNode( BSSvAddMulticastNode(
void *hDeviceContext void *hDeviceContext
) )
{ {
PSDevice pDevice = (PSDevice)hDeviceContext; PSDevice pDevice = (PSDevice)hDeviceContext;
PSMgmtObject pMgmt = pDevice->pMgmt; PSMgmtObject pMgmt = pDevice->pMgmt;
if (!pDevice->bEnableHostWEP) if (!pDevice->bEnableHostWEP)
memset(&pMgmt->sNodeDBTable[0], 0, sizeof(KnownNodeDB)); memset(&pMgmt->sNodeDBTable[0], 0, sizeof(KnownNodeDB));
memset(pMgmt->sNodeDBTable[0].abyMACAddr, 0xff, WLAN_ADDR_LEN); memset(pMgmt->sNodeDBTable[0].abyMACAddr, 0xff, WLAN_ADDR_LEN);
pMgmt->sNodeDBTable[0].bActive = true; pMgmt->sNodeDBTable[0].bActive = true;
pMgmt->sNodeDBTable[0].bPSEnable = false; pMgmt->sNodeDBTable[0].bPSEnable = false;
skb_queue_head_init(&pMgmt->sNodeDBTable[0].sTxPSQueue); skb_queue_head_init(&pMgmt->sNodeDBTable[0].sTxPSQueue);
RATEvParseMaxRate((void *)pDevice, RATEvParseMaxRate((void *)pDevice,
(PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates, (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates,
(PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates, (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates,
true, true,
&(pMgmt->sNodeDBTable[0].wMaxBasicRate), &(pMgmt->sNodeDBTable[0].wMaxBasicRate),
&(pMgmt->sNodeDBTable[0].wMaxSuppRate), &(pMgmt->sNodeDBTable[0].wMaxSuppRate),
&(pMgmt->sNodeDBTable[0].wSuppRate), &(pMgmt->sNodeDBTable[0].wSuppRate),
&(pMgmt->sNodeDBTable[0].byTopCCKBasicRate), &(pMgmt->sNodeDBTable[0].byTopCCKBasicRate),
&(pMgmt->sNodeDBTable[0].byTopOFDMBasicRate) &(pMgmt->sNodeDBTable[0].byTopOFDMBasicRate)
); );
pMgmt->sNodeDBTable[0].wTxDataRate = pMgmt->sNodeDBTable[0].wMaxBasicRate; pMgmt->sNodeDBTable[0].wTxDataRate = pMgmt->sNodeDBTable[0].wMaxBasicRate;
#ifdef PLICE_DEBUG #ifdef PLICE_DEBUG
printk("BSSvAddMultiCastNode:pMgmt->sNodeDBTable[0].wTxDataRate is %d\n",pMgmt->sNodeDBTable[0].wTxDataRate); printk("BSSvAddMultiCastNode:pMgmt->sNodeDBTable[0].wTxDataRate is %d\n", pMgmt->sNodeDBTable[0].wTxDataRate);
#endif #endif
pMgmt->sNodeDBTable[0].uRatePollTimeout = FALLBACK_POLL_SECOND; pMgmt->sNodeDBTable[0].uRatePollTimeout = FALLBACK_POLL_SECOND;
}; };
...@@ -996,369 +996,369 @@ BSSvAddMulticastNode( ...@@ -996,369 +996,369 @@ BSSvAddMulticastNode(
* Return Value: * Return Value:
* none. * none.
* *
-*/ -*/
//2008-4-14 <add> by chester for led issue //2008-4-14 <add> by chester for led issue
#ifdef FOR_LED_ON_NOTEBOOK #ifdef FOR_LED_ON_NOTEBOOK
bool cc=false; bool cc = false;
unsigned int status; unsigned int status;
#endif #endif
void void
BSSvSecondCallBack( BSSvSecondCallBack(
void *hDeviceContext void *hDeviceContext
) )
{ {
PSDevice pDevice = (PSDevice)hDeviceContext; PSDevice pDevice = (PSDevice)hDeviceContext;
PSMgmtObject pMgmt = pDevice->pMgmt; PSMgmtObject pMgmt = pDevice->pMgmt;
unsigned int ii; unsigned int ii;
PWLAN_IE_SSID pItemSSID, pCurrSSID; PWLAN_IE_SSID pItemSSID, pCurrSSID;
unsigned int uSleepySTACnt = 0; unsigned int uSleepySTACnt = 0;
unsigned int uNonShortSlotSTACnt = 0; unsigned int uNonShortSlotSTACnt = 0;
unsigned int uLongPreambleSTACnt = 0; unsigned int uLongPreambleSTACnt = 0;
viawget_wpa_header* wpahdr; //DavidWang viawget_wpa_header *wpahdr; //DavidWang
spin_lock_irq(&pDevice->lock); spin_lock_irq(&pDevice->lock);
pDevice->uAssocCount = 0; pDevice->uAssocCount = 0;
pDevice->byERPFlag &= pDevice->byERPFlag &=
~(WLAN_SET_ERP_BARKER_MODE(1) | WLAN_SET_ERP_NONERP_PRESENT(1)); ~(WLAN_SET_ERP_BARKER_MODE(1) | WLAN_SET_ERP_NONERP_PRESENT(1));
//2008-4-14 <add> by chester for led issue //2008-4-14 <add> by chester for led issue
#ifdef FOR_LED_ON_NOTEBOOK #ifdef FOR_LED_ON_NOTEBOOK
MACvGPIOIn(pDevice->PortOffset, &pDevice->byGPIO); MACvGPIOIn(pDevice->PortOffset, &pDevice->byGPIO);
if ((( !(pDevice->byGPIO & GPIO0_DATA)&&(pDevice->bHWRadioOff == false))||((pDevice->byGPIO & GPIO0_DATA)&&(pDevice->bHWRadioOff == true)))&&(cc==false)){ if (((!(pDevice->byGPIO & GPIO0_DATA) && (pDevice->bHWRadioOff == false)) || ((pDevice->byGPIO & GPIO0_DATA) && (pDevice->bHWRadioOff == true))) && (cc == false)) {
cc=true; cc = true;
} }
else if(cc==true){ else if (cc == true) {
if(pDevice->bHWRadioOff == true){ if (pDevice->bHWRadioOff == true) {
if ( !(pDevice->byGPIO & GPIO0_DATA)) if (!(pDevice->byGPIO & GPIO0_DATA))
//||( !(pDevice->byGPIO & GPIO0_DATA) && (pDevice->byRadioCtl & EEP_RADIOCTL_INV))) //||(!(pDevice->byGPIO & GPIO0_DATA) && (pDevice->byRadioCtl & EEP_RADIOCTL_INV)))
{if(status==1) goto start; { if (status == 1) goto start;
status=1; status = 1;
CARDbRadioPowerOff(pDevice); CARDbRadioPowerOff(pDevice);
pMgmt->sNodeDBTable[0].bActive = false; pMgmt->sNodeDBTable[0].bActive = false;
pMgmt->eCurrMode = WMAC_MODE_STANDBY; pMgmt->eCurrMode = WMAC_MODE_STANDBY;
pMgmt->eCurrState = WMAC_STATE_IDLE; pMgmt->eCurrState = WMAC_STATE_IDLE;
//netif_stop_queue(pDevice->dev); //netif_stop_queue(pDevice->dev);
pDevice->bLinkPass = false; pDevice->bLinkPass = false;
} }
if (pDevice->byGPIO &GPIO0_DATA) if (pDevice->byGPIO & GPIO0_DATA)
//||( !(pDevice->byGPIO & GPIO0_DATA) && (pDevice->byRadioCtl & EEP_RADIOCTL_INV))) //||(!(pDevice->byGPIO & GPIO0_DATA) && (pDevice->byRadioCtl & EEP_RADIOCTL_INV)))
{if(status==2) goto start; {if (status == 2) goto start;
status=2; status = 2;
CARDbRadioPowerOn(pDevice); CARDbRadioPowerOn(pDevice);
} } } }
else{ else{
if (pDevice->byGPIO & GPIO0_DATA) if (pDevice->byGPIO & GPIO0_DATA)
//||( !(pDevice->byGPIO & GPIO0_DATA) && (pDevice->byRadioCtl & EEP_RADIOCTL_INV))) //||(!(pDevice->byGPIO & GPIO0_DATA) && (pDevice->byRadioCtl & EEP_RADIOCTL_INV)))
{if(status==3) goto start; {if (status == 3) goto start;
status=3; status = 3;
CARDbRadioPowerOff(pDevice); CARDbRadioPowerOff(pDevice);
pMgmt->sNodeDBTable[0].bActive = false; pMgmt->sNodeDBTable[0].bActive = false;
pMgmt->eCurrMode = WMAC_MODE_STANDBY; pMgmt->eCurrMode = WMAC_MODE_STANDBY;
pMgmt->eCurrState = WMAC_STATE_IDLE; pMgmt->eCurrState = WMAC_STATE_IDLE;
//netif_stop_queue(pDevice->dev); //netif_stop_queue(pDevice->dev);
pDevice->bLinkPass = false; pDevice->bLinkPass = false;
} }
if ( !(pDevice->byGPIO & GPIO0_DATA)) if (!(pDevice->byGPIO & GPIO0_DATA))
//||( !(pDevice->byGPIO & GPIO0_DATA) && (pDevice->byRadioCtl & EEP_RADIOCTL_INV))) //||(!(pDevice->byGPIO & GPIO0_DATA) && (pDevice->byRadioCtl & EEP_RADIOCTL_INV)))
{if(status==4) goto start; {if (status == 4) goto start;
status=4; status = 4;
CARDbRadioPowerOn(pDevice); CARDbRadioPowerOn(pDevice);
} } } }
} }
start: start:
#endif #endif
if (pDevice->wUseProtectCntDown > 0) { if (pDevice->wUseProtectCntDown > 0) {
pDevice->wUseProtectCntDown --; pDevice->wUseProtectCntDown--;
} }
else { else {
// disable protect mode // disable protect mode
pDevice->byERPFlag &= ~(WLAN_SET_ERP_USE_PROTECTION(1)); pDevice->byERPFlag &= ~(WLAN_SET_ERP_USE_PROTECTION(1));
} }
{ {
pDevice->byReAssocCount++; pDevice->byReAssocCount++;
if((pDevice->byReAssocCount > 10) && (pDevice->bLinkPass != true)) { //10 sec timeout if ((pDevice->byReAssocCount > 10) && (pDevice->bLinkPass != true)) { //10 sec timeout
printk("Re-association timeout!!!\n"); printk("Re-association timeout!!!\n");
pDevice->byReAssocCount = 0; pDevice->byReAssocCount = 0;
#ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT #ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
// if(pDevice->bWPASuppWextEnabled == true) // if (pDevice->bWPASuppWextEnabled == true)
{ {
union iwreq_data wrqu; union iwreq_data wrqu;
memset(&wrqu, 0, sizeof (wrqu)); memset(&wrqu, 0, sizeof(wrqu));
wrqu.ap_addr.sa_family = ARPHRD_ETHER; wrqu.ap_addr.sa_family = ARPHRD_ETHER;
PRINT_K("wireless_send_event--->SIOCGIWAP(disassociated)\n"); PRINT_K("wireless_send_event--->SIOCGIWAP(disassociated)\n");
wireless_send_event(pDevice->dev, SIOCGIWAP, &wrqu, NULL); wireless_send_event(pDevice->dev, SIOCGIWAP, &wrqu, NULL);
} }
#endif #endif
} }
else if(pDevice->bLinkPass == true) else if (pDevice->bLinkPass == true)
pDevice->byReAssocCount = 0; pDevice->byReAssocCount = 0;
} }
#ifdef Calcu_LinkQual #ifdef Calcu_LinkQual
s_uCalculateLinkQual((void *)pDevice); s_uCalculateLinkQual((void *)pDevice);
#endif #endif
for (ii = 0; ii < (MAX_NODE_NUM + 1); ii++) { for (ii = 0; ii < (MAX_NODE_NUM + 1); ii++) {
if (pMgmt->sNodeDBTable[ii].bActive) {
// Increase in-activity counter
pMgmt->sNodeDBTable[ii].uInActiveCount++;
if (ii > 0) { if (pMgmt->sNodeDBTable[ii].bActive) {
if (pMgmt->sNodeDBTable[ii].uInActiveCount > MAX_INACTIVE_COUNT) { // Increase in-activity counter
BSSvRemoveOneNode(pDevice, ii); pMgmt->sNodeDBTable[ii].uInActiveCount++;
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO
"Inactive timeout [%d] sec, STA index = [%d] remove\n", MAX_INACTIVE_COUNT, ii);
continue;
}
if (pMgmt->sNodeDBTable[ii].eNodeState >= NODE_ASSOC) { if (ii > 0) {
if (pMgmt->sNodeDBTable[ii].uInActiveCount > MAX_INACTIVE_COUNT) {
pDevice->uAssocCount++; BSSvRemoveOneNode(pDevice, ii);
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO
"Inactive timeout [%d] sec, STA index = [%d] remove\n", MAX_INACTIVE_COUNT, ii);
continue;
}
// check if Non ERP exist if (pMgmt->sNodeDBTable[ii].eNodeState >= NODE_ASSOC) {
if (pMgmt->sNodeDBTable[ii].uInActiveCount < ERP_RECOVER_COUNT) {
if (!pMgmt->sNodeDBTable[ii].bShortPreamble) { pDevice->uAssocCount++;
pDevice->byERPFlag |= WLAN_SET_ERP_BARKER_MODE(1);
uLongPreambleSTACnt ++; // check if Non ERP exist
} if (pMgmt->sNodeDBTable[ii].uInActiveCount < ERP_RECOVER_COUNT) {
if (!pMgmt->sNodeDBTable[ii].bERPExist) { if (!pMgmt->sNodeDBTable[ii].bShortPreamble) {
pDevice->byERPFlag |= WLAN_SET_ERP_NONERP_PRESENT(1); pDevice->byERPFlag |= WLAN_SET_ERP_BARKER_MODE(1);
pDevice->byERPFlag |= WLAN_SET_ERP_USE_PROTECTION(1); uLongPreambleSTACnt++;
} }
if (!pMgmt->sNodeDBTable[ii].bShortSlotTime) if (!pMgmt->sNodeDBTable[ii].bERPExist) {
uNonShortSlotSTACnt++; pDevice->byERPFlag |= WLAN_SET_ERP_NONERP_PRESENT(1);
} pDevice->byERPFlag |= WLAN_SET_ERP_USE_PROTECTION(1);
} }
if (!pMgmt->sNodeDBTable[ii].bShortSlotTime)
uNonShortSlotSTACnt++;
}
}
// check if any STA in PS mode // check if any STA in PS mode
if (pMgmt->sNodeDBTable[ii].bPSEnable) if (pMgmt->sNodeDBTable[ii].bPSEnable)
uSleepySTACnt++; uSleepySTACnt++;
} }
// Rate fallback check // Rate fallback check
if (!pDevice->bFixRate) { if (!pDevice->bFixRate) {
/* /*
if ((pMgmt->eCurrMode == WMAC_MODE_ESS_STA) && (ii == 0)) if ((pMgmt->eCurrMode == WMAC_MODE_ESS_STA) && (ii == 0))
RATEvTxRateFallBack(pDevice, &(pMgmt->sNodeDBTable[ii])); RATEvTxRateFallBack(pDevice, &(pMgmt->sNodeDBTable[ii]));
*/ */
if (ii > 0) { if (ii > 0) {
// ii = 0 for multicast node (AP & Adhoc) // ii = 0 for multicast node (AP & Adhoc)
RATEvTxRateFallBack((void *)pDevice, &(pMgmt->sNodeDBTable[ii])); RATEvTxRateFallBack((void *)pDevice, &(pMgmt->sNodeDBTable[ii]));
} }
else { else {
// ii = 0 reserved for unicast AP node (Infra STA) // ii = 0 reserved for unicast AP node (Infra STA)
if (pMgmt->eCurrMode == WMAC_MODE_ESS_STA) if (pMgmt->eCurrMode == WMAC_MODE_ESS_STA)
#ifdef PLICE_DEBUG #ifdef PLICE_DEBUG
printk("SecondCallback:Before:TxDataRate is %d\n",pMgmt->sNodeDBTable[0].wTxDataRate); printk("SecondCallback:Before:TxDataRate is %d\n", pMgmt->sNodeDBTable[0].wTxDataRate);
#endif #endif
RATEvTxRateFallBack((void *)pDevice, &(pMgmt->sNodeDBTable[ii])); RATEvTxRateFallBack((void *)pDevice, &(pMgmt->sNodeDBTable[ii]));
#ifdef PLICE_DEBUG #ifdef PLICE_DEBUG
printk("SecondCallback:After:TxDataRate is %d\n",pMgmt->sNodeDBTable[0].wTxDataRate); printk("SecondCallback:After:TxDataRate is %d\n", pMgmt->sNodeDBTable[0].wTxDataRate);
#endif #endif
}
}
// check if pending PS queue
if (pMgmt->sNodeDBTable[ii].wEnQueueCnt != 0) {
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Index= %d, Queue = %d pending \n",
ii, pMgmt->sNodeDBTable[ii].wEnQueueCnt);
if ((ii > 0) && (pMgmt->sNodeDBTable[ii].wEnQueueCnt > 15)) {
BSSvRemoveOneNode(pDevice, ii);
DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "Pending many queues PS STA Index = %d remove \n", ii);
continue;
}
}
}
}
if ((pMgmt->eCurrMode == WMAC_MODE_ESS_AP) && (pDevice->eCurrentPHYType == PHY_TYPE_11G)) {
// on/off protect mode
if (WLAN_GET_ERP_USE_PROTECTION(pDevice->byERPFlag)) {
if (!pDevice->bProtectMode) {
MACvEnableProtectMD(pDevice->PortOffset);
pDevice->bProtectMode = true;
}
}
else {
if (pDevice->bProtectMode) {
MACvDisableProtectMD(pDevice->PortOffset);
pDevice->bProtectMode = false;
}
}
// on/off short slot time
if (uNonShortSlotSTACnt > 0) {
if (pDevice->bShortSlotTime) {
pDevice->bShortSlotTime = false;
BBvSetShortSlotTime(pDevice);
vUpdateIFS((void *)pDevice);
}
}
else {
if (!pDevice->bShortSlotTime) {
pDevice->bShortSlotTime = true;
BBvSetShortSlotTime(pDevice);
vUpdateIFS((void *)pDevice);
}
}
// on/off barker long preamble mode
if (uLongPreambleSTACnt > 0) {
if (!pDevice->bBarkerPreambleMd) {
MACvEnableBarkerPreambleMd(pDevice->PortOffset);
pDevice->bBarkerPreambleMd = true;
}
}
else {
if (pDevice->bBarkerPreambleMd) {
MACvDisableBarkerPreambleMd(pDevice->PortOffset);
pDevice->bBarkerPreambleMd = false;
}
}
}
// Check if any STA in PS mode, enable DTIM multicast deliver
if (pMgmt->eCurrMode == WMAC_MODE_ESS_AP) {
if (uSleepySTACnt > 0)
pMgmt->sNodeDBTable[0].bPSEnable = true;
else
pMgmt->sNodeDBTable[0].bPSEnable = false;
}
pItemSSID = (PWLAN_IE_SSID)pMgmt->abyDesireSSID;
pCurrSSID = (PWLAN_IE_SSID)pMgmt->abyCurrSSID;
if ((pMgmt->eCurrMode == WMAC_MODE_STANDBY) ||
(pMgmt->eCurrMode == WMAC_MODE_ESS_STA)) {
if (pMgmt->sNodeDBTable[0].bActive) { // Assoc with BSS
// DBG_PRT(MSG_LEVEL_INFO, KERN_INFO "Callback inactive Count = [%d]\n", pMgmt->sNodeDBTable[0].uInActiveCount);
//if (pDevice->bUpdateBBVGA) {
// s_vCheckSensitivity((void *) pDevice);
//}
if (pDevice->bUpdateBBVGA) {
// s_vCheckSensitivity((void *) pDevice);
s_vCheckPreEDThreshold((void *)pDevice);
}
if ((pMgmt->sNodeDBTable[0].uInActiveCount >= (LOST_BEACON_COUNT/2)) &&
(pDevice->byBBVGACurrent != pDevice->abyBBVGA[0])) {
pDevice->byBBVGANew = pDevice->abyBBVGA[0];
bScheduleCommand((void *)pDevice, WLAN_CMD_CHANGE_BBSENSITIVITY, NULL);
}
if (pMgmt->sNodeDBTable[0].uInActiveCount >= LOST_BEACON_COUNT) {
pMgmt->sNodeDBTable[0].bActive = false;
pMgmt->eCurrMode = WMAC_MODE_STANDBY;
pMgmt->eCurrState = WMAC_STATE_IDLE;
netif_stop_queue(pDevice->dev);
pDevice->bLinkPass = false;
pDevice->bRoaming = true;
DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "Lost AP beacon [%d] sec, disconnected !\n", pMgmt->sNodeDBTable[0].uInActiveCount);
if ((pDevice->bWPADEVUp) && (pDevice->skb != NULL)) {
wpahdr = (viawget_wpa_header *)pDevice->skb->data;
wpahdr->type = VIAWGET_DISASSOC_MSG;
wpahdr->resp_ie_len = 0;
wpahdr->req_ie_len = 0;
skb_put(pDevice->skb, sizeof(viawget_wpa_header));
pDevice->skb->dev = pDevice->wpadev;
skb_reset_mac_header(pDevice->skb);
pDevice->skb->pkt_type = PACKET_HOST;
pDevice->skb->protocol = htons(ETH_P_802_2);
memset(pDevice->skb->cb, 0, sizeof(pDevice->skb->cb));
netif_rx(pDevice->skb);
pDevice->skb = dev_alloc_skb((int)pDevice->rx_buf_sz);
}
#ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
// if (pDevice->bWPASuppWextEnabled == true)
{
union iwreq_data wrqu;
memset(&wrqu, 0, sizeof(wrqu));
wrqu.ap_addr.sa_family = ARPHRD_ETHER;
PRINT_K("wireless_send_event--->SIOCGIWAP(disassociated)\n");
wireless_send_event(pDevice->dev, SIOCGIWAP, &wrqu, NULL);
}
#endif
}
}
else if (pItemSSID->len != 0) {
if (pDevice->uAutoReConnectTime < 10) {
pDevice->uAutoReConnectTime++;
#ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
//network manager support need not do Roaming scan???
if (pDevice->bWPASuppWextEnabled == true)
pDevice->uAutoReConnectTime = 0;
#endif
}
else {
//mike use old encryption status for wpa reauthen
if (pDevice->bWPADEVUp)
pDevice->eEncryptionStatus = pDevice->eOldEncryptionStatus;
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Roaming ...\n");
BSSvClearBSSList((void *)pDevice, pDevice->bLinkPass);
pMgmt->eScanType = WMAC_SCAN_ACTIVE;
bScheduleCommand((void *)pDevice, WLAN_CMD_BSSID_SCAN, pMgmt->abyDesireSSID);
bScheduleCommand((void *)pDevice, WLAN_CMD_SSID, pMgmt->abyDesireSSID);
pDevice->uAutoReConnectTime = 0;
}
}
}
if (pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) {
// if adhoc started which essid is NULL string, rescanning.
if ((pMgmt->eCurrState == WMAC_STATE_STARTED) && (pCurrSSID->len == 0)) {
if (pDevice->uAutoReConnectTime < 10) {
pDevice->uAutoReConnectTime++;
}
else {
DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "Adhoc re-scanning ...\n");
pMgmt->eScanType = WMAC_SCAN_ACTIVE;
bScheduleCommand((void *)pDevice, WLAN_CMD_BSSID_SCAN, NULL);
bScheduleCommand((void *)pDevice, WLAN_CMD_SSID, NULL);
pDevice->uAutoReConnectTime = 0;
};
} }
if (pMgmt->eCurrState == WMAC_STATE_JOINTED) {
if (pDevice->bUpdateBBVGA) {
//s_vCheckSensitivity((void *) pDevice);
s_vCheckPreEDThreshold((void *)pDevice);
}
if (pMgmt->sNodeDBTable[0].uInActiveCount >= ADHOC_LOST_BEACON_COUNT) {
DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "Lost other STA beacon [%d] sec, started !\n", pMgmt->sNodeDBTable[0].uInActiveCount);
pMgmt->sNodeDBTable[0].uInActiveCount = 0;
pMgmt->eCurrState = WMAC_STATE_STARTED;
netif_stop_queue(pDevice->dev);
pDevice->bLinkPass = false;
}
}
}
spin_unlock_irq(&pDevice->lock);
} pMgmt->sTimerSecondCallback.expires = RUN_AT(HZ);
add_timer(&pMgmt->sTimerSecondCallback);
// check if pending PS queue return;
if (pMgmt->sNodeDBTable[ii].wEnQueueCnt != 0) {
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Index= %d, Queue = %d pending \n",
ii, pMgmt->sNodeDBTable[ii].wEnQueueCnt);
if ((ii >0) && (pMgmt->sNodeDBTable[ii].wEnQueueCnt > 15)) {
BSSvRemoveOneNode(pDevice, ii);
DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "Pending many queues PS STA Index = %d remove \n", ii);
continue;
}
}
}
}
if ((pMgmt->eCurrMode == WMAC_MODE_ESS_AP) && (pDevice->eCurrentPHYType == PHY_TYPE_11G)) {
// on/off protect mode
if (WLAN_GET_ERP_USE_PROTECTION(pDevice->byERPFlag)) {
if (!pDevice->bProtectMode) {
MACvEnableProtectMD(pDevice->PortOffset);
pDevice->bProtectMode = true;
}
}
else {
if (pDevice->bProtectMode) {
MACvDisableProtectMD(pDevice->PortOffset);
pDevice->bProtectMode = false;
}
}
// on/off short slot time
if (uNonShortSlotSTACnt > 0) {
if (pDevice->bShortSlotTime) {
pDevice->bShortSlotTime = false;
BBvSetShortSlotTime(pDevice);
vUpdateIFS((void *)pDevice);
}
}
else {
if (!pDevice->bShortSlotTime) {
pDevice->bShortSlotTime = true;
BBvSetShortSlotTime(pDevice);
vUpdateIFS((void *)pDevice);
}
}
// on/off barker long preamble mode
if (uLongPreambleSTACnt > 0) {
if (!pDevice->bBarkerPreambleMd) {
MACvEnableBarkerPreambleMd(pDevice->PortOffset);
pDevice->bBarkerPreambleMd = true;
}
}
else {
if (pDevice->bBarkerPreambleMd) {
MACvDisableBarkerPreambleMd(pDevice->PortOffset);
pDevice->bBarkerPreambleMd = false;
}
}
}
// Check if any STA in PS mode, enable DTIM multicast deliver
if (pMgmt->eCurrMode == WMAC_MODE_ESS_AP) {
if (uSleepySTACnt > 0)
pMgmt->sNodeDBTable[0].bPSEnable = true;
else
pMgmt->sNodeDBTable[0].bPSEnable = false;
}
pItemSSID = (PWLAN_IE_SSID)pMgmt->abyDesireSSID;
pCurrSSID = (PWLAN_IE_SSID)pMgmt->abyCurrSSID;
if ((pMgmt->eCurrMode == WMAC_MODE_STANDBY) ||
(pMgmt->eCurrMode == WMAC_MODE_ESS_STA)) {
if (pMgmt->sNodeDBTable[0].bActive) { // Assoc with BSS
// DBG_PRT(MSG_LEVEL_INFO, KERN_INFO "Callback inactive Count = [%d]\n", pMgmt->sNodeDBTable[0].uInActiveCount);
//if (pDevice->bUpdateBBVGA) {
// s_vCheckSensitivity((void *) pDevice);
//}
if (pDevice->bUpdateBBVGA) {
// s_vCheckSensitivity((void *) pDevice);
s_vCheckPreEDThreshold((void *)pDevice);
}
if ((pMgmt->sNodeDBTable[0].uInActiveCount >= (LOST_BEACON_COUNT/2)) &&
(pDevice->byBBVGACurrent != pDevice->abyBBVGA[0]) ) {
pDevice->byBBVGANew = pDevice->abyBBVGA[0];
bScheduleCommand((void *) pDevice, WLAN_CMD_CHANGE_BBSENSITIVITY, NULL);
}
if (pMgmt->sNodeDBTable[0].uInActiveCount >= LOST_BEACON_COUNT) {
pMgmt->sNodeDBTable[0].bActive = false;
pMgmt->eCurrMode = WMAC_MODE_STANDBY;
pMgmt->eCurrState = WMAC_STATE_IDLE;
netif_stop_queue(pDevice->dev);
pDevice->bLinkPass = false;
pDevice->bRoaming = true;
DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "Lost AP beacon [%d] sec, disconnected !\n", pMgmt->sNodeDBTable[0].uInActiveCount);
if ((pDevice->bWPADEVUp) && (pDevice->skb != NULL)) {
wpahdr = (viawget_wpa_header *)pDevice->skb->data;
wpahdr->type = VIAWGET_DISASSOC_MSG;
wpahdr->resp_ie_len = 0;
wpahdr->req_ie_len = 0;
skb_put(pDevice->skb, sizeof(viawget_wpa_header));
pDevice->skb->dev = pDevice->wpadev;
skb_reset_mac_header(pDevice->skb);
pDevice->skb->pkt_type = PACKET_HOST;
pDevice->skb->protocol = htons(ETH_P_802_2);
memset(pDevice->skb->cb, 0, sizeof(pDevice->skb->cb));
netif_rx(pDevice->skb);
pDevice->skb = dev_alloc_skb((int)pDevice->rx_buf_sz);
}
#ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
// if(pDevice->bWPASuppWextEnabled == true)
{
union iwreq_data wrqu;
memset(&wrqu, 0, sizeof (wrqu));
wrqu.ap_addr.sa_family = ARPHRD_ETHER;
PRINT_K("wireless_send_event--->SIOCGIWAP(disassociated)\n");
wireless_send_event(pDevice->dev, SIOCGIWAP, &wrqu, NULL);
}
#endif
}
}
else if (pItemSSID->len != 0) {
if (pDevice->uAutoReConnectTime < 10) {
pDevice->uAutoReConnectTime++;
#ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
//network manager support need not do Roaming scan???
if(pDevice->bWPASuppWextEnabled ==true)
pDevice->uAutoReConnectTime = 0;
#endif
}
else {
//mike use old encryption status for wpa reauthen
if(pDevice->bWPADEVUp)
pDevice->eEncryptionStatus = pDevice->eOldEncryptionStatus;
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Roaming ...\n");
BSSvClearBSSList((void *)pDevice, pDevice->bLinkPass);
pMgmt->eScanType = WMAC_SCAN_ACTIVE;
bScheduleCommand((void *) pDevice, WLAN_CMD_BSSID_SCAN, pMgmt->abyDesireSSID);
bScheduleCommand((void *) pDevice, WLAN_CMD_SSID, pMgmt->abyDesireSSID);
pDevice->uAutoReConnectTime = 0;
}
}
}
if (pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) {
// if adhoc started which essid is NULL string, rescanning.
if ((pMgmt->eCurrState == WMAC_STATE_STARTED) && (pCurrSSID->len == 0)) {
if (pDevice->uAutoReConnectTime < 10) {
pDevice->uAutoReConnectTime++;
}
else {
DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "Adhoc re-scanning ...\n");
pMgmt->eScanType = WMAC_SCAN_ACTIVE;
bScheduleCommand((void *) pDevice, WLAN_CMD_BSSID_SCAN, NULL);
bScheduleCommand((void *) pDevice, WLAN_CMD_SSID, NULL);
pDevice->uAutoReConnectTime = 0;
};
}
if (pMgmt->eCurrState == WMAC_STATE_JOINTED) {
if (pDevice->bUpdateBBVGA) {
//s_vCheckSensitivity((void *) pDevice);
s_vCheckPreEDThreshold((void *)pDevice);
}
if (pMgmt->sNodeDBTable[0].uInActiveCount >=ADHOC_LOST_BEACON_COUNT) {
DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "Lost other STA beacon [%d] sec, started !\n", pMgmt->sNodeDBTable[0].uInActiveCount);
pMgmt->sNodeDBTable[0].uInActiveCount = 0;
pMgmt->eCurrState = WMAC_STATE_STARTED;
netif_stop_queue(pDevice->dev);
pDevice->bLinkPass = false;
}
}
}
spin_unlock_irq(&pDevice->lock);
pMgmt->sTimerSecondCallback.expires = RUN_AT(HZ);
add_timer(&pMgmt->sTimerSecondCallback);
return;
} }
...@@ -1375,177 +1375,177 @@ CARDbRadioPowerOn(pDevice); ...@@ -1375,177 +1375,177 @@ CARDbRadioPowerOn(pDevice);
* Return Value: * Return Value:
* none. * none.
* *
-*/ -*/
void void
BSSvUpdateNodeTxCounter( BSSvUpdateNodeTxCounter(
void *hDeviceContext, void *hDeviceContext,
unsigned char byTsr0, unsigned char byTsr0,
unsigned char byTsr1, unsigned char byTsr1,
unsigned char *pbyBuffer, unsigned char *pbyBuffer,
unsigned int uFIFOHeaderSize unsigned int uFIFOHeaderSize
) )
{ {
PSDevice pDevice = (PSDevice)hDeviceContext; PSDevice pDevice = (PSDevice)hDeviceContext;
PSMgmtObject pMgmt = pDevice->pMgmt; PSMgmtObject pMgmt = pDevice->pMgmt;
unsigned int uNodeIndex = 0; unsigned int uNodeIndex = 0;
unsigned char byTxRetry = (byTsr0 & TSR0_NCR); unsigned char byTxRetry = (byTsr0 & TSR0_NCR);
PSTxBufHead pTxBufHead; PSTxBufHead pTxBufHead;
PS802_11Header pMACHeader; PS802_11Header pMACHeader;
unsigned short wRate; unsigned short wRate;
unsigned short wFallBackRate = RATE_1M; unsigned short wFallBackRate = RATE_1M;
unsigned char byFallBack; unsigned char byFallBack;
unsigned int ii; unsigned int ii;
// unsigned int txRetryTemp; // unsigned int txRetryTemp;
//PLICE_DEBUG-> //PLICE_DEBUG->
//txRetryTemp = byTxRetry; //txRetryTemp = byTxRetry;
//if (txRetryTemp== 8) //if (txRetryTemp== 8)
//txRetryTemp -=3; //txRetryTemp -=3;
//PLICE_DEBUG <- //PLICE_DEBUG <-
pTxBufHead = (PSTxBufHead) pbyBuffer; pTxBufHead = (PSTxBufHead) pbyBuffer;
if (pTxBufHead->wFIFOCtl & FIFOCTL_AUTO_FB_0) { if (pTxBufHead->wFIFOCtl & FIFOCTL_AUTO_FB_0) {
byFallBack = AUTO_FB_0; byFallBack = AUTO_FB_0;
} else if (pTxBufHead->wFIFOCtl & FIFOCTL_AUTO_FB_1) { } else if (pTxBufHead->wFIFOCtl & FIFOCTL_AUTO_FB_1) {
byFallBack = AUTO_FB_1; byFallBack = AUTO_FB_1;
} else { } else {
byFallBack = AUTO_FB_NONE; byFallBack = AUTO_FB_NONE;
} }
wRate = pTxBufHead->wReserved; //?wRate wRate = pTxBufHead->wReserved; //?wRate
//printk("BSSvUpdateNodeTxCounter:byTxRetry is %d\n",byTxRetry); //printk("BSSvUpdateNodeTxCounter:byTxRetry is %d\n",byTxRetry);
//printk("BSSvUpdateNodeTx:wRate is %d,byFallback is %d\n",wRate,byFallBack); //printk("BSSvUpdateNodeTx:wRate is %d,byFallback is %d\n",wRate,byFallBack);
//#ifdef PLICE_DEBUG //#ifdef PLICE_DEBUG
//printk("BSSvUpdateNodeTx: wRate is %d\n",wRate); //printk("BSSvUpdateNodeTx: wRate is %d\n",wRate);
////#endif ////#endif
// Only Unicast using support rates // Only Unicast using support rates
if (pTxBufHead->wFIFOCtl & FIFOCTL_NEEDACK) { if (pTxBufHead->wFIFOCtl & FIFOCTL_NEEDACK) {
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"wRate %04X, byTsr0 %02X, byTsr1 %02X\n", wRate, byTsr0, byTsr1); DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "wRate %04X, byTsr0 %02X, byTsr1 %02X\n", wRate, byTsr0, byTsr1);
if (pMgmt->eCurrMode == WMAC_MODE_ESS_STA) { if (pMgmt->eCurrMode == WMAC_MODE_ESS_STA) {
pMgmt->sNodeDBTable[0].uTxAttempts += 1; pMgmt->sNodeDBTable[0].uTxAttempts += 1;
if ((byTsr1 & TSR1_TERR) == 0) { if ((byTsr1 & TSR1_TERR) == 0) {
// transmit success, TxAttempts at least plus one // transmit success, TxAttempts at least plus one
pMgmt->sNodeDBTable[0].uTxOk[MAX_RATE]++; pMgmt->sNodeDBTable[0].uTxOk[MAX_RATE]++;
if ( (byFallBack == AUTO_FB_NONE) || if ((byFallBack == AUTO_FB_NONE) ||
(wRate < RATE_18M) ) { (wRate < RATE_18M)) {
wFallBackRate = wRate; wFallBackRate = wRate;
} else if (byFallBack == AUTO_FB_0) { } else if (byFallBack == AUTO_FB_0) {
//PLICE_DEBUG //PLICE_DEBUG
if (byTxRetry < 5) if (byTxRetry < 5)
//if (txRetryTemp < 5) //if (txRetryTemp < 5)
wFallBackRate = awHWRetry0[wRate-RATE_18M][byTxRetry]; wFallBackRate = awHWRetry0[wRate-RATE_18M][byTxRetry];
//wFallBackRate = awHWRetry0[wRate-RATE_12M][byTxRetry]; //wFallBackRate = awHWRetry0[wRate-RATE_12M][byTxRetry];
//wFallBackRate = awHWRetry0[wRate-RATE_18M][txRetryTemp] +1; //wFallBackRate = awHWRetry0[wRate-RATE_18M][txRetryTemp] +1;
else else
wFallBackRate = awHWRetry0[wRate-RATE_18M][4]; wFallBackRate = awHWRetry0[wRate-RATE_18M][4];
//wFallBackRate = awHWRetry0[wRate-RATE_12M][4]; //wFallBackRate = awHWRetry0[wRate-RATE_12M][4];
} else if (byFallBack == AUTO_FB_1) { } else if (byFallBack == AUTO_FB_1) {
if (byTxRetry < 5) if (byTxRetry < 5)
wFallBackRate = awHWRetry1[wRate-RATE_18M][byTxRetry]; wFallBackRate = awHWRetry1[wRate-RATE_18M][byTxRetry];
else else
wFallBackRate = awHWRetry1[wRate-RATE_18M][4]; wFallBackRate = awHWRetry1[wRate-RATE_18M][4];
} }
pMgmt->sNodeDBTable[0].uTxOk[wFallBackRate]++; pMgmt->sNodeDBTable[0].uTxOk[wFallBackRate]++;
} else { } else {
pMgmt->sNodeDBTable[0].uTxFailures ++; pMgmt->sNodeDBTable[0].uTxFailures++;
} }
pMgmt->sNodeDBTable[0].uTxRetry += byTxRetry; pMgmt->sNodeDBTable[0].uTxRetry += byTxRetry;
if (byTxRetry != 0) { if (byTxRetry != 0) {
pMgmt->sNodeDBTable[0].uTxFail[MAX_RATE]+=byTxRetry; pMgmt->sNodeDBTable[0].uTxFail[MAX_RATE] += byTxRetry;
if ( (byFallBack == AUTO_FB_NONE) || if ((byFallBack == AUTO_FB_NONE) ||
(wRate < RATE_18M) ) { (wRate < RATE_18M)) {
pMgmt->sNodeDBTable[0].uTxFail[wRate]+=byTxRetry; pMgmt->sNodeDBTable[0].uTxFail[wRate] += byTxRetry;
} else if (byFallBack == AUTO_FB_0) { } else if (byFallBack == AUTO_FB_0) {
//PLICE_DEBUG //PLICE_DEBUG
for(ii=0;ii<byTxRetry;ii++) for (ii = 0; ii < byTxRetry; ii++)
//for (ii=0;ii<txRetryTemp;ii++) //for (ii=0;ii<txRetryTemp;ii++)
{ {
if (ii < 5) if (ii < 5)
{ {
//PLICE_DEBUG //PLICE_DEBUG
wFallBackRate = awHWRetry0[wRate-RATE_18M][ii]; wFallBackRate = awHWRetry0[wRate-RATE_18M][ii];
//printk(" II is %d:BSSvUpdateNodeTx:wFallBackRate is %d\n",ii,wFallBackRate); //printk(" II is %d:BSSvUpdateNodeTx:wFallBackRate is %d\n",ii,wFallBackRate);
//wFallBackRate = awHWRetry0[wRate-RATE_12M][ii]; //wFallBackRate = awHWRetry0[wRate-RATE_12M][ii];
} }
else else
{ {
wFallBackRate = awHWRetry0[wRate-RATE_18M][4]; wFallBackRate = awHWRetry0[wRate-RATE_18M][4];
//printk("ii is %d BSSvUpdateNodeTx:wFallBackRate is %d\n",ii,wFallBackRate); //printk("ii is %d BSSvUpdateNodeTx:wFallBackRate is %d\n",ii,wFallBackRate);
//wFallBackRate = awHWRetry0[wRate-RATE_12M][4]; //wFallBackRate = awHWRetry0[wRate-RATE_12M][4];
} }
pMgmt->sNodeDBTable[0].uTxFail[wFallBackRate]++; pMgmt->sNodeDBTable[0].uTxFail[wFallBackRate]++;
} }
} else if (byFallBack == AUTO_FB_1) { } else if (byFallBack == AUTO_FB_1) {
for(ii=0;ii<byTxRetry;ii++) { for (ii = 0; ii < byTxRetry; ii++) {
if (ii < 5) if (ii < 5)
wFallBackRate = awHWRetry1[wRate-RATE_18M][ii]; wFallBackRate = awHWRetry1[wRate-RATE_18M][ii];
else else
wFallBackRate = awHWRetry1[wRate-RATE_18M][4]; wFallBackRate = awHWRetry1[wRate-RATE_18M][4];
pMgmt->sNodeDBTable[0].uTxFail[wFallBackRate]++; pMgmt->sNodeDBTable[0].uTxFail[wFallBackRate]++;
} }
} }
} }
} }
if ((pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) || if ((pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) ||
(pMgmt->eCurrMode == WMAC_MODE_ESS_AP)) { (pMgmt->eCurrMode == WMAC_MODE_ESS_AP)) {
pMACHeader = (PS802_11Header)(pbyBuffer + uFIFOHeaderSize); pMACHeader = (PS802_11Header)(pbyBuffer + uFIFOHeaderSize);
if (BSSDBbIsSTAInNodeDB((void *)pMgmt, &(pMACHeader->abyAddr1[0]), &uNodeIndex)){ if (BSSDBbIsSTAInNodeDB((void *)pMgmt, &(pMACHeader->abyAddr1[0]), &uNodeIndex)) {
pMgmt->sNodeDBTable[uNodeIndex].uTxAttempts += 1; pMgmt->sNodeDBTable[uNodeIndex].uTxAttempts += 1;
if ((byTsr1 & TSR1_TERR) == 0) { if ((byTsr1 & TSR1_TERR) == 0) {
// transmit success, TxAttempts at least plus one // transmit success, TxAttempts at least plus one
pMgmt->sNodeDBTable[uNodeIndex].uTxOk[MAX_RATE]++; pMgmt->sNodeDBTable[uNodeIndex].uTxOk[MAX_RATE]++;
if ( (byFallBack == AUTO_FB_NONE) || if ((byFallBack == AUTO_FB_NONE) ||
(wRate < RATE_18M) ) { (wRate < RATE_18M)) {
wFallBackRate = wRate; wFallBackRate = wRate;
} else if (byFallBack == AUTO_FB_0) { } else if (byFallBack == AUTO_FB_0) {
if (byTxRetry < 5) if (byTxRetry < 5)
wFallBackRate = awHWRetry0[wRate-RATE_18M][byTxRetry]; wFallBackRate = awHWRetry0[wRate-RATE_18M][byTxRetry];
else else
wFallBackRate = awHWRetry0[wRate-RATE_18M][4]; wFallBackRate = awHWRetry0[wRate-RATE_18M][4];
} else if (byFallBack == AUTO_FB_1) { } else if (byFallBack == AUTO_FB_1) {
if (byTxRetry < 5) if (byTxRetry < 5)
wFallBackRate = awHWRetry1[wRate-RATE_18M][byTxRetry]; wFallBackRate = awHWRetry1[wRate-RATE_18M][byTxRetry];
else else
wFallBackRate = awHWRetry1[wRate-RATE_18M][4]; wFallBackRate = awHWRetry1[wRate-RATE_18M][4];
} }
pMgmt->sNodeDBTable[uNodeIndex].uTxOk[wFallBackRate]++; pMgmt->sNodeDBTable[uNodeIndex].uTxOk[wFallBackRate]++;
} else { } else {
pMgmt->sNodeDBTable[uNodeIndex].uTxFailures ++; pMgmt->sNodeDBTable[uNodeIndex].uTxFailures++;
} }
pMgmt->sNodeDBTable[uNodeIndex].uTxRetry += byTxRetry; pMgmt->sNodeDBTable[uNodeIndex].uTxRetry += byTxRetry;
if (byTxRetry != 0) { if (byTxRetry != 0) {
pMgmt->sNodeDBTable[uNodeIndex].uTxFail[MAX_RATE]+=byTxRetry; pMgmt->sNodeDBTable[uNodeIndex].uTxFail[MAX_RATE] += byTxRetry;
if ( (byFallBack == AUTO_FB_NONE) || if ((byFallBack == AUTO_FB_NONE) ||
(wRate < RATE_18M) ) { (wRate < RATE_18M)) {
pMgmt->sNodeDBTable[uNodeIndex].uTxFail[wRate]+=byTxRetry; pMgmt->sNodeDBTable[uNodeIndex].uTxFail[wRate] += byTxRetry;
} else if (byFallBack == AUTO_FB_0) { } else if (byFallBack == AUTO_FB_0) {
for(ii=0;ii<byTxRetry;ii++) { for (ii = 0; ii < byTxRetry; ii++) {
if (ii < 5) if (ii < 5)
wFallBackRate = awHWRetry0[wRate-RATE_18M][ii]; wFallBackRate = awHWRetry0[wRate - RATE_18M][ii];
else else
wFallBackRate = awHWRetry0[wRate-RATE_18M][4]; wFallBackRate = awHWRetry0[wRate - RATE_18M][4];
pMgmt->sNodeDBTable[uNodeIndex].uTxFail[wFallBackRate]++; pMgmt->sNodeDBTable[uNodeIndex].uTxFail[wFallBackRate]++;
} }
} else if (byFallBack == AUTO_FB_1) { } else if (byFallBack == AUTO_FB_1) {
for(ii=0;ii<byTxRetry;ii++) { for (ii = 0; ii < byTxRetry; ii++) {
if (ii < 5) if (ii < 5)
wFallBackRate = awHWRetry1[wRate-RATE_18M][ii]; wFallBackRate = awHWRetry1[wRate-RATE_18M][ii];
else else
wFallBackRate = awHWRetry1[wRate-RATE_18M][4]; wFallBackRate = awHWRetry1[wRate-RATE_18M][4];
pMgmt->sNodeDBTable[uNodeIndex].uTxFail[wFallBackRate]++; pMgmt->sNodeDBTable[uNodeIndex].uTxFail[wFallBackRate]++;
} }
} }
} }
} }
} }
} }
return; return;
} }
...@@ -1569,167 +1569,167 @@ BSSvUpdateNodeTxCounter( ...@@ -1569,167 +1569,167 @@ BSSvUpdateNodeTxCounter(
* Return Value: * Return Value:
* None. * None.
* *
-*/ -*/
void void
BSSvClearNodeDBTable( BSSvClearNodeDBTable(
void *hDeviceContext, void *hDeviceContext,
unsigned int uStartIndex unsigned int uStartIndex
) )
{ {
PSDevice pDevice = (PSDevice)hDeviceContext; PSDevice pDevice = (PSDevice)hDeviceContext;
PSMgmtObject pMgmt = pDevice->pMgmt; PSMgmtObject pMgmt = pDevice->pMgmt;
struct sk_buff *skb; struct sk_buff *skb;
unsigned int ii; unsigned int ii;
for (ii = uStartIndex; ii < (MAX_NODE_NUM + 1); ii++) { for (ii = uStartIndex; ii < (MAX_NODE_NUM + 1); ii++) {
if (pMgmt->sNodeDBTable[ii].bActive) { if (pMgmt->sNodeDBTable[ii].bActive) {
// check if sTxPSQueue has been initial // check if sTxPSQueue has been initial
if (pMgmt->sNodeDBTable[ii].sTxPSQueue.next != NULL) { if (pMgmt->sNodeDBTable[ii].sTxPSQueue.next != NULL) {
while ((skb = skb_dequeue(&pMgmt->sNodeDBTable[ii].sTxPSQueue)) != NULL){ while ((skb = skb_dequeue(&pMgmt->sNodeDBTable[ii].sTxPSQueue)) != NULL) {
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "PS skb != NULL %d\n", ii); DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "PS skb != NULL %d\n", ii);
dev_kfree_skb(skb); dev_kfree_skb(skb);
} }
} }
memset(&pMgmt->sNodeDBTable[ii], 0, sizeof(KnownNodeDB)); memset(&pMgmt->sNodeDBTable[ii], 0, sizeof(KnownNodeDB));
} }
} }
return; return;
}; };
void s_vCheckSensitivity( void s_vCheckSensitivity(
void *hDeviceContext void *hDeviceContext
) )
{ {
PSDevice pDevice = (PSDevice)hDeviceContext; PSDevice pDevice = (PSDevice)hDeviceContext;
PKnownBSS pBSSList = NULL; PKnownBSS pBSSList = NULL;
PSMgmtObject pMgmt = pDevice->pMgmt; PSMgmtObject pMgmt = pDevice->pMgmt;
int ii; int ii;
if ((pDevice->byLocalID <= REV_ID_VT3253_A1) && (pDevice->byRFType == RF_RFMD2959) && if ((pDevice->byLocalID <= REV_ID_VT3253_A1) && (pDevice->byRFType == RF_RFMD2959) &&
(pMgmt->eCurrMode == WMAC_MODE_IBSS_STA)) { (pMgmt->eCurrMode == WMAC_MODE_IBSS_STA)) {
return; return;
} }
if ((pMgmt->eCurrState == WMAC_STATE_ASSOC) || if ((pMgmt->eCurrState == WMAC_STATE_ASSOC) ||
((pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) && (pMgmt->eCurrState == WMAC_STATE_JOINTED))) { ((pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) && (pMgmt->eCurrState == WMAC_STATE_JOINTED))) {
pBSSList = BSSpAddrIsInBSSList(pDevice, pMgmt->abyCurrBSSID, (PWLAN_IE_SSID)pMgmt->abyCurrSSID); pBSSList = BSSpAddrIsInBSSList(pDevice, pMgmt->abyCurrBSSID, (PWLAN_IE_SSID)pMgmt->abyCurrSSID);
if (pBSSList != NULL) { if (pBSSList != NULL) {
// Updata BB Reg if RSSI is too strong. // Updata BB Reg if RSSI is too strong.
long LocalldBmAverage = 0; long LocalldBmAverage = 0;
long uNumofdBm = 0; long uNumofdBm = 0;
for (ii = 0; ii < RSSI_STAT_COUNT; ii++) { for (ii = 0; ii < RSSI_STAT_COUNT; ii++) {
if (pBSSList->ldBmAverage[ii] != 0) { if (pBSSList->ldBmAverage[ii] != 0) {
uNumofdBm ++; uNumofdBm++;
LocalldBmAverage += pBSSList->ldBmAverage[ii]; LocalldBmAverage += pBSSList->ldBmAverage[ii];
} }
} }
if (uNumofdBm > 0) { if (uNumofdBm > 0) {
LocalldBmAverage = LocalldBmAverage/uNumofdBm; LocalldBmAverage = LocalldBmAverage/uNumofdBm;
for (ii=0;ii<BB_VGA_LEVEL;ii++) { for (ii = 0; ii < BB_VGA_LEVEL; ii++) {
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"LocalldBmAverage:%ld, %ld %02x\n", LocalldBmAverage, pDevice->ldBmThreshold[ii], pDevice->abyBBVGA[ii]); DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "LocalldBmAverage:%ld, %ld %02x\n", LocalldBmAverage, pDevice->ldBmThreshold[ii], pDevice->abyBBVGA[ii]);
if (LocalldBmAverage < pDevice->ldBmThreshold[ii]) { if (LocalldBmAverage < pDevice->ldBmThreshold[ii]) {
pDevice->byBBVGANew = pDevice->abyBBVGA[ii]; pDevice->byBBVGANew = pDevice->abyBBVGA[ii];
break; break;
} }
} }
if (pDevice->byBBVGANew != pDevice->byBBVGACurrent) { if (pDevice->byBBVGANew != pDevice->byBBVGACurrent) {
pDevice->uBBVGADiffCount++; pDevice->uBBVGADiffCount++;
if (pDevice->uBBVGADiffCount >= BB_VGA_CHANGE_THRESHOLD) if (pDevice->uBBVGADiffCount >= BB_VGA_CHANGE_THRESHOLD)
bScheduleCommand((void *) pDevice, WLAN_CMD_CHANGE_BBSENSITIVITY, NULL); bScheduleCommand((void *)pDevice, WLAN_CMD_CHANGE_BBSENSITIVITY, NULL);
} else { } else {
pDevice->uBBVGADiffCount = 0; pDevice->uBBVGADiffCount = 0;
} }
} }
} }
} }
} }
void void
BSSvClearAnyBSSJoinRecord ( BSSvClearAnyBSSJoinRecord(
void *hDeviceContext void *hDeviceContext
) )
{ {
PSDevice pDevice = (PSDevice)hDeviceContext; PSDevice pDevice = (PSDevice)hDeviceContext;
PSMgmtObject pMgmt = pDevice->pMgmt; PSMgmtObject pMgmt = pDevice->pMgmt;
unsigned int ii; unsigned int ii;
for (ii = 0; ii < MAX_BSS_NUM; ii++) { for (ii = 0; ii < MAX_BSS_NUM; ii++) {
pMgmt->sBSSList[ii].bSelected = false; pMgmt->sBSSList[ii].bSelected = false;
} }
return; return;
} }
#ifdef Calcu_LinkQual #ifdef Calcu_LinkQual
void s_uCalculateLinkQual( void s_uCalculateLinkQual(
void *hDeviceContext void *hDeviceContext
) )
{ {
PSDevice pDevice = (PSDevice)hDeviceContext; PSDevice pDevice = (PSDevice)hDeviceContext;
unsigned long TxOkRatio, TxCnt; unsigned long TxOkRatio, TxCnt;
unsigned long RxOkRatio,RxCnt; unsigned long RxOkRatio, RxCnt;
unsigned long RssiRatio; unsigned long RssiRatio;
long ldBm; long ldBm;
TxCnt = pDevice->scStatistic.TxNoRetryOkCount + TxCnt = pDevice->scStatistic.TxNoRetryOkCount +
pDevice->scStatistic.TxRetryOkCount + pDevice->scStatistic.TxRetryOkCount +
pDevice->scStatistic.TxFailCount; pDevice->scStatistic.TxFailCount;
RxCnt = pDevice->scStatistic.RxFcsErrCnt + RxCnt = pDevice->scStatistic.RxFcsErrCnt +
pDevice->scStatistic.RxOkCnt; pDevice->scStatistic.RxOkCnt;
TxOkRatio = (TxCnt < 6) ? 4000:((pDevice->scStatistic.TxNoRetryOkCount * 4000) / TxCnt); TxOkRatio = (TxCnt < 6) ? 4000 : ((pDevice->scStatistic.TxNoRetryOkCount * 4000) / TxCnt);
RxOkRatio = (RxCnt < 6) ? 2000:((pDevice->scStatistic.RxOkCnt * 2000) / RxCnt); RxOkRatio = (RxCnt < 6) ? 2000 : ((pDevice->scStatistic.RxOkCnt * 2000) / RxCnt);
//decide link quality //decide link quality
if(pDevice->bLinkPass !=true) if (pDevice->bLinkPass != true)
{ {
// printk("s_uCalculateLinkQual-->Link disconnect and Poor quality**\n"); // printk("s_uCalculateLinkQual-->Link disconnect and Poor quality**\n");
pDevice->scStatistic.LinkQuality = 0; pDevice->scStatistic.LinkQuality = 0;
pDevice->scStatistic.SignalStren = 0; pDevice->scStatistic.SignalStren = 0;
} }
else else
{ {
RFvRSSITodBm(pDevice, (unsigned char)(pDevice->uCurrRSSI), &ldBm); RFvRSSITodBm(pDevice, (unsigned char)(pDevice->uCurrRSSI), &ldBm);
if(-ldBm < 50) { if (-ldBm < 50) {
RssiRatio = 4000; RssiRatio = 4000;
} }
else if(-ldBm > 90) { else if (-ldBm > 90) {
RssiRatio = 0; RssiRatio = 0;
} }
else { else {
RssiRatio = (40-(-ldBm-50))*4000/40; RssiRatio = (40-(-ldBm-50))*4000/40;
} }
pDevice->scStatistic.SignalStren = RssiRatio/40; pDevice->scStatistic.SignalStren = RssiRatio/40;
pDevice->scStatistic.LinkQuality = (RssiRatio+TxOkRatio+RxOkRatio)/100; pDevice->scStatistic.LinkQuality = (RssiRatio+TxOkRatio+RxOkRatio)/100;
} }
pDevice->scStatistic.RxFcsErrCnt = 0; pDevice->scStatistic.RxFcsErrCnt = 0;
pDevice->scStatistic.RxOkCnt = 0; pDevice->scStatistic.RxOkCnt = 0;
pDevice->scStatistic.TxFailCount = 0; pDevice->scStatistic.TxFailCount = 0;
pDevice->scStatistic.TxNoRetryOkCount = 0; pDevice->scStatistic.TxNoRetryOkCount = 0;
pDevice->scStatistic.TxRetryOkCount = 0; pDevice->scStatistic.TxRetryOkCount = 0;
return; return;
} }
#endif #endif
void s_vCheckPreEDThreshold( void s_vCheckPreEDThreshold(
void *hDeviceContext void *hDeviceContext
) )
{ {
PSDevice pDevice = (PSDevice)hDeviceContext; PSDevice pDevice = (PSDevice)hDeviceContext;
PKnownBSS pBSSList = NULL; PKnownBSS pBSSList = NULL;
PSMgmtObject pMgmt = &(pDevice->sMgmtObj); PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
if ((pMgmt->eCurrState == WMAC_STATE_ASSOC) || if ((pMgmt->eCurrState == WMAC_STATE_ASSOC) ||
((pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) && (pMgmt->eCurrState == WMAC_STATE_JOINTED))) { ((pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) && (pMgmt->eCurrState == WMAC_STATE_JOINTED))) {
pBSSList = BSSpAddrIsInBSSList(pDevice, pMgmt->abyCurrBSSID, (PWLAN_IE_SSID)pMgmt->abyCurrSSID); pBSSList = BSSpAddrIsInBSSList(pDevice, pMgmt->abyCurrBSSID, (PWLAN_IE_SSID)pMgmt->abyCurrSSID);
if (pBSSList != NULL) { if (pBSSList != NULL) {
pDevice->byBBPreEDRSSI = (unsigned char) (~(pBSSList->ldBmAverRange) + 1); pDevice->byBBPreEDRSSI = (unsigned char) (~(pBSSList->ldBmAverRange) + 1);
//BBvUpdatePreEDThreshold(pDevice, false); //BBvUpdatePreEDThreshold(pDevice, false);
} }
} }
return; return;
} }
...@@ -39,7 +39,7 @@ ...@@ -39,7 +39,7 @@
#define MAX_NODE_NUM 64 #define MAX_NODE_NUM 64
#define MAX_BSS_NUM 42 #define MAX_BSS_NUM 42
#define LOST_BEACON_COUNT 10 // 10 sec, XP defined #define LOST_BEACON_COUNT 10 // 10 sec, XP defined
#define MAX_PS_TX_BUF 32 // sta max power saving tx buf #define MAX_PS_TX_BUF 32 // sta max power saving tx buf
#define ADHOC_LOST_BEACON_COUNT 30 // 30 sec, beacon lost for adhoc only #define ADHOC_LOST_BEACON_COUNT 30 // 30 sec, beacon lost for adhoc only
#define MAX_INACTIVE_COUNT 300 // 300 sec, inactive STA node refresh #define MAX_INACTIVE_COUNT 300 // 300 sec, inactive STA node refresh
...@@ -81,159 +81,159 @@ ...@@ -81,159 +81,159 @@
typedef enum _NDIS_802_11_NETWORK_TYPE typedef enum _NDIS_802_11_NETWORK_TYPE
{ {
Ndis802_11FH, Ndis802_11FH,
Ndis802_11DS, Ndis802_11DS,
Ndis802_11OFDM5, Ndis802_11OFDM5,
Ndis802_11OFDM24, Ndis802_11OFDM24,
Ndis802_11NetworkTypeMax // not a real type, defined as an upper bound Ndis802_11NetworkTypeMax // not a real type, defined as an upper bound
} NDIS_802_11_NETWORK_TYPE, *PNDIS_802_11_NETWORK_TYPE; } NDIS_802_11_NETWORK_TYPE, *PNDIS_802_11_NETWORK_TYPE;
typedef struct tagSERPObject { typedef struct tagSERPObject {
bool bERPExist; bool bERPExist;
unsigned char byERP; unsigned char byERP;
}ERPObject, *PERPObject; } ERPObject, *PERPObject;
typedef struct tagSRSNCapObject { typedef struct tagSRSNCapObject {
bool bRSNCapExist; bool bRSNCapExist;
unsigned short wRSNCap; unsigned short wRSNCap;
}SRSNCapObject, *PSRSNCapObject; } SRSNCapObject, *PSRSNCapObject;
// BSS info(AP) // BSS info(AP)
#pragma pack(1) #pragma pack(1)
typedef struct tagKnownBSS { typedef struct tagKnownBSS {
// BSS info // BSS info
bool bActive; bool bActive;
unsigned char abyBSSID[WLAN_BSSID_LEN]; unsigned char abyBSSID[WLAN_BSSID_LEN];
unsigned int uChannel; unsigned int uChannel;
unsigned char abySuppRates[WLAN_IEHDR_LEN + WLAN_RATES_MAXLEN + 1]; unsigned char abySuppRates[WLAN_IEHDR_LEN + WLAN_RATES_MAXLEN + 1];
unsigned char abyExtSuppRates[WLAN_IEHDR_LEN + WLAN_RATES_MAXLEN + 1]; unsigned char abyExtSuppRates[WLAN_IEHDR_LEN + WLAN_RATES_MAXLEN + 1];
unsigned int uRSSI; unsigned int uRSSI;
unsigned char bySQ; unsigned char bySQ;
unsigned short wBeaconInterval; unsigned short wBeaconInterval;
unsigned short wCapInfo; unsigned short wCapInfo;
unsigned char abySSID[WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN + 1]; unsigned char abySSID[WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN + 1];
unsigned char byRxRate; unsigned char byRxRate;
// unsigned short wATIMWindow; // unsigned short wATIMWindow;
unsigned char byRSSIStatCnt; unsigned char byRSSIStatCnt;
long ldBmMAX; long ldBmMAX;
long ldBmAverage[RSSI_STAT_COUNT]; long ldBmAverage[RSSI_STAT_COUNT];
long ldBmAverRange; long ldBmAverRange;
//For any BSSID selection improvment //For any BSSID selection improvment
bool bSelected; bool bSelected;
//++ WPA informations //++ WPA informations
bool bWPAValid; bool bWPAValid;
unsigned char byGKType; unsigned char byGKType;
unsigned char abyPKType[4]; unsigned char abyPKType[4];
unsigned short wPKCount; unsigned short wPKCount;
unsigned char abyAuthType[4]; unsigned char abyAuthType[4];
unsigned short wAuthCount; unsigned short wAuthCount;
unsigned char byDefaultK_as_PK; unsigned char byDefaultK_as_PK;
unsigned char byReplayIdx; unsigned char byReplayIdx;
//-- //--
//++ WPA2 informations //++ WPA2 informations
bool bWPA2Valid; bool bWPA2Valid;
unsigned char byCSSGK; unsigned char byCSSGK;
unsigned short wCSSPKCount; unsigned short wCSSPKCount;
unsigned char abyCSSPK[4]; unsigned char abyCSSPK[4];
unsigned short wAKMSSAuthCount; unsigned short wAKMSSAuthCount;
unsigned char abyAKMSSAuthType[4]; unsigned char abyAKMSSAuthType[4];
//++ wpactl //++ wpactl
unsigned char byWPAIE[MAX_WPA_IE_LEN]; unsigned char byWPAIE[MAX_WPA_IE_LEN];
unsigned char byRSNIE[MAX_WPA_IE_LEN]; unsigned char byRSNIE[MAX_WPA_IE_LEN];
unsigned short wWPALen; unsigned short wWPALen;
unsigned short wRSNLen; unsigned short wRSNLen;
// Clear count // Clear count
unsigned int uClearCount; unsigned int uClearCount;
// unsigned char abyIEs[WLAN_BEACON_FR_MAXLEN]; // unsigned char abyIEs[WLAN_BEACON_FR_MAXLEN];
unsigned int uIELength; unsigned int uIELength;
QWORD qwBSSTimestamp; QWORD qwBSSTimestamp;
QWORD qwLocalTSF; // local TSF timer QWORD qwLocalTSF; // local TSF timer
// NDIS_802_11_NETWORK_TYPE NetworkTypeInUse; // NDIS_802_11_NETWORK_TYPE NetworkTypeInUse;
CARD_PHY_TYPE eNetworkTypeInUse; CARD_PHY_TYPE eNetworkTypeInUse;
ERPObject sERP; ERPObject sERP;
SRSNCapObject sRSNCapObj; SRSNCapObject sRSNCapObj;
unsigned char abyIEs[1024]; // don't move this field !! unsigned char abyIEs[1024]; // don't move this field !!
}__attribute__ ((__packed__)) } __attribute__ ((__packed__))
KnownBSS , *PKnownBSS; KnownBSS , *PKnownBSS;
//2006-1116-01,<Add> by NomadZhao //2006-1116-01,<Add> by NomadZhao
#pragma pack() #pragma pack()
typedef enum tagNODE_STATE { typedef enum tagNODE_STATE {
NODE_FREE, NODE_FREE,
NODE_AGED, NODE_AGED,
NODE_KNOWN, NODE_KNOWN,
NODE_AUTH, NODE_AUTH,
NODE_ASSOC NODE_ASSOC
} NODE_STATE, *PNODE_STATE; } NODE_STATE, *PNODE_STATE;
// STA node info // STA node info
typedef struct tagKnownNodeDB { typedef struct tagKnownNodeDB {
// STA info // STA info
bool bActive; bool bActive;
unsigned char abyMACAddr[WLAN_ADDR_LEN]; unsigned char abyMACAddr[WLAN_ADDR_LEN];
unsigned char abyCurrSuppRates[WLAN_IEHDR_LEN + WLAN_RATES_MAXLEN]; unsigned char abyCurrSuppRates[WLAN_IEHDR_LEN + WLAN_RATES_MAXLEN];
unsigned char abyCurrExtSuppRates[WLAN_IEHDR_LEN + WLAN_RATES_MAXLEN]; unsigned char abyCurrExtSuppRates[WLAN_IEHDR_LEN + WLAN_RATES_MAXLEN];
unsigned short wTxDataRate; unsigned short wTxDataRate;
bool bShortPreamble; bool bShortPreamble;
bool bERPExist; bool bERPExist;
bool bShortSlotTime; bool bShortSlotTime;
unsigned int uInActiveCount; unsigned int uInActiveCount;
unsigned short wMaxBasicRate; //Get from byTopOFDMBasicRate or byTopCCKBasicRate which depends on packetTyp. unsigned short wMaxBasicRate; //Get from byTopOFDMBasicRate or byTopCCKBasicRate which depends on packetTyp.
unsigned short wMaxSuppRate; //Records the highest supported rate getting from SuppRates IE and ExtSuppRates IE in Beacon. unsigned short wMaxSuppRate; //Records the highest supported rate getting from SuppRates IE and ExtSuppRates IE in Beacon.
unsigned short wSuppRate; unsigned short wSuppRate;
unsigned char byTopOFDMBasicRate;//Records the highest basic rate in OFDM mode unsigned char byTopOFDMBasicRate;//Records the highest basic rate in OFDM mode
unsigned char byTopCCKBasicRate; //Records the highest basic rate in CCK mode unsigned char byTopCCKBasicRate; //Records the highest basic rate in CCK mode
// For AP mode // For AP mode
struct sk_buff_head sTxPSQueue; struct sk_buff_head sTxPSQueue;
unsigned short wCapInfo; unsigned short wCapInfo;
unsigned short wListenInterval; unsigned short wListenInterval;
unsigned short wAID; unsigned short wAID;
NODE_STATE eNodeState; NODE_STATE eNodeState;
bool bPSEnable; bool bPSEnable;
bool bRxPSPoll; bool bRxPSPoll;
unsigned char byAuthSequence; unsigned char byAuthSequence;
unsigned long ulLastRxJiffer; unsigned long ulLastRxJiffer;
unsigned char bySuppRate; unsigned char bySuppRate;
unsigned long dwFlags; unsigned long dwFlags;
unsigned short wEnQueueCnt; unsigned short wEnQueueCnt;
bool bOnFly; bool bOnFly;
unsigned long long KeyRSC; unsigned long long KeyRSC;
unsigned char byKeyIndex; unsigned char byKeyIndex;
unsigned long dwKeyIndex; unsigned long dwKeyIndex;
unsigned char byCipherSuite; unsigned char byCipherSuite;
unsigned long dwTSC47_16; unsigned long dwTSC47_16;
unsigned short wTSC15_0; unsigned short wTSC15_0;
unsigned int uWepKeyLength; unsigned int uWepKeyLength;
unsigned char abyWepKey[WLAN_WEPMAX_KEYLEN]; unsigned char abyWepKey[WLAN_WEPMAX_KEYLEN];
// //
// Auto rate fallback vars // Auto rate fallback vars
bool bIsInFallback; bool bIsInFallback;
unsigned int uAverageRSSI; unsigned int uAverageRSSI;
unsigned int uRateRecoveryTimeout; unsigned int uRateRecoveryTimeout;
unsigned int uRatePollTimeout; unsigned int uRatePollTimeout;
unsigned int uTxFailures; unsigned int uTxFailures;
unsigned int uTxAttempts; unsigned int uTxAttempts;
unsigned int uTxRetry; unsigned int uTxRetry;
unsigned int uFailureRatio; unsigned int uFailureRatio;
unsigned int uRetryRatio; unsigned int uRetryRatio;
unsigned int uTxOk[MAX_RATE+1]; unsigned int uTxOk[MAX_RATE+1];
unsigned int uTxFail[MAX_RATE+1]; unsigned int uTxFail[MAX_RATE+1];
unsigned int uTimeCount; unsigned int uTimeCount;
} KnownNodeDB, *PKnownNodeDB; } KnownNodeDB, *PKnownNodeDB;
...@@ -244,122 +244,122 @@ typedef struct tagKnownNodeDB { ...@@ -244,122 +244,122 @@ typedef struct tagKnownNodeDB {
PKnownBSS PKnownBSS
BSSpSearchBSSList( BSSpSearchBSSList(
void *hDeviceContext, void *hDeviceContext,
unsigned char *pbyDesireBSSID, unsigned char *pbyDesireBSSID,
unsigned char *pbyDesireSSID, unsigned char *pbyDesireSSID,
CARD_PHY_TYPE ePhyType CARD_PHY_TYPE ePhyType
); );
PKnownBSS PKnownBSS
BSSpAddrIsInBSSList( BSSpAddrIsInBSSList(
void *hDeviceContext, void *hDeviceContext,
unsigned char *abyBSSID, unsigned char *abyBSSID,
PWLAN_IE_SSID pSSID PWLAN_IE_SSID pSSID
); );
void void
BSSvClearBSSList( BSSvClearBSSList(
void *hDeviceContext, void *hDeviceContext,
bool bKeepCurrBSSID bool bKeepCurrBSSID
); );
bool bool
BSSbInsertToBSSList( BSSbInsertToBSSList(
void *hDeviceContext, void *hDeviceContext,
unsigned char *abyBSSIDAddr, unsigned char *abyBSSIDAddr,
QWORD qwTimestamp, QWORD qwTimestamp,
unsigned short wBeaconInterval, unsigned short wBeaconInterval,
unsigned short wCapInfo, unsigned short wCapInfo,
unsigned char byCurrChannel, unsigned char byCurrChannel,
PWLAN_IE_SSID pSSID, PWLAN_IE_SSID pSSID,
PWLAN_IE_SUPP_RATES pSuppRates, PWLAN_IE_SUPP_RATES pSuppRates,
PWLAN_IE_SUPP_RATES pExtSuppRates, PWLAN_IE_SUPP_RATES pExtSuppRates,
PERPObject psERP, PERPObject psERP,
PWLAN_IE_RSN pRSN, PWLAN_IE_RSN pRSN,
PWLAN_IE_RSN_EXT pRSNWPA, PWLAN_IE_RSN_EXT pRSNWPA,
PWLAN_IE_COUNTRY pIE_Country, PWLAN_IE_COUNTRY pIE_Country,
PWLAN_IE_QUIET pIE_Quiet, PWLAN_IE_QUIET pIE_Quiet,
unsigned int uIELength, unsigned int uIELength,
unsigned char *pbyIEs, unsigned char *pbyIEs,
void *pRxPacketContext void *pRxPacketContext
); );
bool bool
BSSbUpdateToBSSList( BSSbUpdateToBSSList(
void *hDeviceContext, void *hDeviceContext,
QWORD qwTimestamp, QWORD qwTimestamp,
unsigned short wBeaconInterval, unsigned short wBeaconInterval,
unsigned short wCapInfo, unsigned short wCapInfo,
unsigned char byCurrChannel, unsigned char byCurrChannel,
bool bChannelHit, bool bChannelHit,
PWLAN_IE_SSID pSSID, PWLAN_IE_SSID pSSID,
PWLAN_IE_SUPP_RATES pSuppRates, PWLAN_IE_SUPP_RATES pSuppRates,
PWLAN_IE_SUPP_RATES pExtSuppRates, PWLAN_IE_SUPP_RATES pExtSuppRates,
PERPObject psERP, PERPObject psERP,
PWLAN_IE_RSN pRSN, PWLAN_IE_RSN pRSN,
PWLAN_IE_RSN_EXT pRSNWPA, PWLAN_IE_RSN_EXT pRSNWPA,
PWLAN_IE_COUNTRY pIE_Country, PWLAN_IE_COUNTRY pIE_Country,
PWLAN_IE_QUIET pIE_Quiet, PWLAN_IE_QUIET pIE_Quiet,
PKnownBSS pBSSList, PKnownBSS pBSSList,
unsigned int uIELength, unsigned int uIELength,
unsigned char *pbyIEs, unsigned char *pbyIEs,
void *pRxPacketContext void *pRxPacketContext
); );
bool bool
BSSDBbIsSTAInNodeDB(void *hDeviceContext, unsigned char *abyDstAddr, BSSDBbIsSTAInNodeDB(void *hDeviceContext, unsigned char *abyDstAddr,
unsigned int *puNodeIndex); unsigned int *puNodeIndex);
void void
BSSvCreateOneNode(void *hDeviceContext, unsigned int *puNodeIndex); BSSvCreateOneNode(void *hDeviceContext, unsigned int *puNodeIndex);
void void
BSSvUpdateAPNode( BSSvUpdateAPNode(
void *hDeviceContext, void *hDeviceContext,
unsigned short *pwCapInfo, unsigned short *pwCapInfo,
PWLAN_IE_SUPP_RATES pItemRates, PWLAN_IE_SUPP_RATES pItemRates,
PWLAN_IE_SUPP_RATES pExtSuppRates PWLAN_IE_SUPP_RATES pExtSuppRates
); );
void void
BSSvSecondCallBack( BSSvSecondCallBack(
void *hDeviceContext void *hDeviceContext
); );
void void
BSSvUpdateNodeTxCounter( BSSvUpdateNodeTxCounter(
void *hDeviceContext, void *hDeviceContext,
unsigned char byTsr0, unsigned char byTsr0,
unsigned char byTsr1, unsigned char byTsr1,
unsigned char *pbyBuffer, unsigned char *pbyBuffer,
unsigned int uFIFOHeaderSize unsigned int uFIFOHeaderSize
); );
void void
BSSvRemoveOneNode( BSSvRemoveOneNode(
void *hDeviceContext, void *hDeviceContext,
unsigned int uNodeIndex unsigned int uNodeIndex
); );
void void
BSSvAddMulticastNode( BSSvAddMulticastNode(
void *hDeviceContext void *hDeviceContext
); );
void void
BSSvClearNodeDBTable( BSSvClearNodeDBTable(
void *hDeviceContext, void *hDeviceContext,
unsigned int uStartIndex unsigned int uStartIndex
); );
void void
BSSvClearAnyBSSJoinRecord( BSSvClearAnyBSSJoinRecord(
void *hDeviceContext void *hDeviceContext
); );
#endif //__BSSDB_H__ #endif //__BSSDB_H__
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment