diff options
author | Piazza Lo <piazza.lo@mediatek.com> | 2017-11-16 09:06:19 +0800 |
---|---|---|
committer | Andy Quan <andyq@google.com> | 2017-11-16 01:57:44 +0000 |
commit | 117a61e5d0e7fdffa19d7c630aa892c69da15be6 (patch) | |
tree | 58c32f314c913a49f50fd1962a8eb04c45f25f62 | |
parent | 43a148684467dfd797e0717233774ae3749a491c (diff) | |
download | mediatek-117a61e5d0e7fdffa19d7c630aa892c69da15be6.tar.gz |
Fix BUG "WIFI is disconnect,but WLAN timeout wakelock hold 20mins"
BUG:67517669
Change-Id: I40f0e6f90240914251a91f96819f0531c70f8a35
Signed-off-by: Piazza Lo <piazza.lo@mediatek.com>
(cherry picked from commit a1aa7f8ab312a0dcb871e7660111bce0aa2560dd)
6 files changed, 43 insertions, 47 deletions
diff --git a/drivers/misc/mediatek/connectivity/wlan/gen3/common/wlan_oid.c b/drivers/misc/mediatek/connectivity/wlan/gen3/common/wlan_oid.c index 99d363c1a8ca..f80719210841 100755 --- a/drivers/misc/mediatek/connectivity/wlan/gen3/common/wlan_oid.c +++ b/drivers/misc/mediatek/connectivity/wlan/gen3/common/wlan_oid.c @@ -1947,6 +1947,9 @@ wlanoidSetBssidListScanAdv(IN P_ADAPTER_T prAdapter, else return WLAN_STATUS_FAILURE; } + + if (timerPendingTimer(&prAdapter->rWifiVar.rAisFsmInfo.rScanDoneTimer)) + cnmTimerStopTimer(prAdapter, &prAdapter->rWifiVar.rAisFsmInfo.rScanDoneTimer); cnmTimerStartTimer(prAdapter, &prAdapter->rWifiVar.rAisFsmInfo.rScanDoneTimer, SEC_TO_MSEC(AIS_SCN_DONE_TIMEOUT_SEC)); return WLAN_STATUS_SUCCESS; diff --git a/drivers/misc/mediatek/connectivity/wlan/gen3/include/mgmt/ais_fsm.h b/drivers/misc/mediatek/connectivity/wlan/gen3/include/mgmt/ais_fsm.h index d19c93511cd5..330ac29ecde7 100644 --- a/drivers/misc/mediatek/connectivity/wlan/gen3/include/mgmt/ais_fsm.h +++ b/drivers/misc/mediatek/connectivity/wlan/gen3/include/mgmt/ais_fsm.h @@ -397,7 +397,7 @@ typedef struct _AIS_FSM_INFO_T { TIMER_T rIbssAloneTimer; - TIMER_T rIndicationOfDisconnectTimer; + UINT_32 u4PostponeIndStartTime; TIMER_T rJoinTimeoutTimer; @@ -529,7 +529,7 @@ VOID aisIndicationOfMediaStateToHost(IN P_ADAPTER_T prAdapter, ENUM_PARAM_MEDIA_STATE_T eConnectionState, BOOLEAN fgDelayIndication); -VOID aisPostponedEventOfDisconnTimeout(IN P_ADAPTER_T prAdapter, ULONG ulParamPtr); +VOID aisCheckPostponedDisconnTimeout(IN P_ADAPTER_T prAdapter, P_AIS_FSM_INFO_T prAisFsmInfo); VOID aisUpdateBssInfoForJOIN(IN P_ADAPTER_T prAdapter, P_STA_RECORD_T prStaRec, P_SW_RFB_T prAssocRspSwRfb); diff --git a/drivers/misc/mediatek/connectivity/wlan/gen3/include/mgmt/scan.h b/drivers/misc/mediatek/connectivity/wlan/gen3/include/mgmt/scan.h index 9dc9fa8c4c35..df6997b517ce 100644 --- a/drivers/misc/mediatek/connectivity/wlan/gen3/include/mgmt/scan.h +++ b/drivers/misc/mediatek/connectivity/wlan/gen3/include/mgmt/scan.h @@ -675,8 +675,6 @@ typedef struct _SCAN_INFO_T { TIMER_T rWaitForGscanResutsTimer; BOOLEAN fgGscnGetResWaiting; #endif - TIMER_T rScanDoneTimer; - UINT_8 ucScanDoneTimeoutCnt; } SCAN_INFO_T, *P_SCAN_INFO_T; @@ -999,6 +997,4 @@ VOID scnGscnGetResultReplyCheck(IN P_ADAPTER_T prAdapter); VOID scnGscnGetResultReplyCheckTimeout(IN P_ADAPTER_T prAdapter, ULONG ulParamPtr); -VOID scnScanDoneTimeout(IN P_ADAPTER_T prAdapter, ULONG ulParamPtr); - #endif /* _SCAN_H */ diff --git a/drivers/misc/mediatek/connectivity/wlan/gen3/mgmt/ais_fsm.c b/drivers/misc/mediatek/connectivity/wlan/gen3/mgmt/ais_fsm.c index 153421fb555e..9a93a49c4e66 100644 --- a/drivers/misc/mediatek/connectivity/wlan/gen3/mgmt/ais_fsm.c +++ b/drivers/misc/mediatek/connectivity/wlan/gen3/mgmt/ais_fsm.c @@ -1309,6 +1309,7 @@ VOID aisFsmInit(IN P_ADAPTER_T prAdapter) #endif /* CFG_SUPPORT_ROAMING */ prAisFsmInfo->fgIsChannelRequested = FALSE; prAisFsmInfo->fgIsChannelGranted = FALSE; + prAisFsmInfo->u4PostponeIndStartTime = 0; /* 4 <1.1> Initiate FSM - Timer INIT */ cnmTimerInitTimer(prAdapter, @@ -1320,10 +1321,6 @@ VOID aisFsmInit(IN P_ADAPTER_T prAdapter) (PFN_MGMT_TIMEOUT_FUNC) aisFsmRunEventIbssAloneTimeOut, (ULONG) NULL); cnmTimerInitTimer(prAdapter, - &prAisFsmInfo->rIndicationOfDisconnectTimer, - (PFN_MGMT_TIMEOUT_FUNC) aisPostponedEventOfDisconnTimeout, (ULONG) NULL); - - cnmTimerInitTimer(prAdapter, &prAisFsmInfo->rScanDoneTimer, (PFN_MGMT_TIMEOUT_FUNC) aisFsmRunEventScanDoneTimeOut, (ULONG) NULL); @@ -1415,7 +1412,6 @@ VOID aisFsmUninit(IN P_ADAPTER_T prAdapter) /* 4 <1> Stop all timers */ cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rBGScanTimer); cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rIbssAloneTimer); - cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rIndicationOfDisconnectTimer); cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rJoinTimeoutTimer); cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rScanDoneTimer); @@ -1914,6 +1910,8 @@ VOID aisFsmSteps(IN P_ADAPTER_T prAdapter, ENUM_AIS_STATE_T eNextState) fgIsTransition = (BOOLEAN) FALSE; + aisCheckPostponedDisconnTimeout(prAdapter, prAisFsmInfo); + /* Do tasks of the State that we just entered */ switch (prAisFsmInfo->eCurrentState) { /* NOTE(Kevin): we don't have to rearrange the sequence of following @@ -2161,6 +2159,8 @@ VOID aisFsmSteps(IN P_ADAPTER_T prAdapter, ENUM_AIS_STATE_T eNextState) DBGLOG(AIS, LOUD, "SCAN: Idle Begin - Current Time = %u\n", kalGetTimeTick()); + if (timerPendingTimer(&prAisFsmInfo->rBGScanTimer)) + cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rBGScanTimer); cnmTimerStartTimer(prAdapter, &prAisFsmInfo->rBGScanTimer, SEC_TO_MSEC(prAisFsmInfo->u4SleepInterval)); @@ -2383,6 +2383,8 @@ VOID aisFsmSteps(IN P_ADAPTER_T prAdapter, ENUM_AIS_STATE_T eNextState) prAisBssInfo, prAisBssInfo->prStaRecOfAP, (P_SW_RFB_T) NULL, REASON_CODE_DEAUTH_LEAVING_BSS, aisDeauthXmitComplete); + if (timerPendingTimer(&prAisFsmInfo->rDeauthDoneTimer)) + cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rDeauthDoneTimer); cnmTimerStartTimer(prAdapter, &prAisFsmInfo->rDeauthDoneTimer, 100); break; @@ -3329,7 +3331,7 @@ aisIndicationOfMediaStateToHost(IN P_ADAPTER_T prAdapter, if (!fgDelayIndication) { /* 4 <0> Cancel Delay Timer */ - cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rIndicationOfDisconnectTimer); + prAisFsmInfo->u4PostponeIndStartTime = 0; /* 4 <1> Fill EVENT_CONNECTION_STATUS */ rEventConnStatus.ucMediaStatus = (UINT_8) eConnectionState; @@ -3391,9 +3393,7 @@ aisIndicationOfMediaStateToHost(IN P_ADAPTER_T prAdapter, DBGLOG(AIS, INFO, "Postpone the indication of Disconnect for %d seconds\n", prConnSettings->ucDelayTimeOfDisconnectEvent); - cnmTimerStartTimer(prAdapter, - &prAisFsmInfo->rIndicationOfDisconnectTimer, - SEC_TO_MSEC(prConnSettings->ucDelayTimeOfDisconnectEvent)); + prAisFsmInfo->u4PostponeIndStartTime = kalGetTimeTick(); } return; @@ -3408,22 +3408,44 @@ aisIndicationOfMediaStateToHost(IN P_ADAPTER_T prAdapter, * @return (none) */ /*----------------------------------------------------------------------------*/ -VOID aisPostponedEventOfDisconnTimeout(IN P_ADAPTER_T prAdapter, ULONG ulParamPtr) +VOID aisCheckPostponedDisconnTimeout(IN P_ADAPTER_T prAdapter, P_AIS_FSM_INFO_T prAisFsmInfo) { P_BSS_INFO_T prAisBssInfo; P_CONNECTION_SETTINGS_T prConnSettings; + BOOLEAN fgFound = TRUE; + + /* firstly, check if we have started postpone indication. + ** otherwise, give a chance to do join before indicate to host + **/ + if (prAisFsmInfo->u4PostponeIndStartTime == 0) + return; + + /* if we're in req channel/join/search state, don't report disconnect. */ + if (prAisFsmInfo->eCurrentState == AIS_STATE_JOIN || + prAisFsmInfo->eCurrentState == AIS_STATE_SEARCH || + prAisFsmInfo->eCurrentState == AIS_STATE_REQ_CHANNEL_JOIN) + return; prAisBssInfo = prAdapter->prAisBssInfo; prConnSettings = &(prAdapter->rWifiVar.rConnSettings); + DBGLOG(AIS, EVENT, "aisPostponedEventOfDisconnTimeout\n"); + if (!CHECK_FOR_TIMEOUT(kalGetTimeTick(), prAisFsmInfo->u4PostponeIndStartTime, + SEC_TO_MSEC(prConnSettings->ucDelayTimeOfDisconnectEvent))) + return; + /* 4 <1> Deactivate previous AP's STA_RECORD_T in Driver if have. */ if (prAisBssInfo->prStaRecOfAP) { /* cnmStaRecChangeState(prAdapter, prAisBssInfo->prStaRecOfAP, STA_STATE_1); */ prAisBssInfo->prStaRecOfAP = (P_STA_RECORD_T) NULL; } - /* 4 <2> Remove pending connection request */ - aisFsmIsRequestPending(prAdapter, AIS_REQUEST_RECONNECT, TRUE); + + /* 4 <2> Remove all connection request */ + while (fgFound) + fgFound = aisFsmIsRequestPending(prAdapter, AIS_REQUEST_RECONNECT, TRUE); + if (prAisFsmInfo->eCurrentState == AIS_STATE_LOOKING_FOR) + prAisFsmInfo->eCurrentState = AIS_STATE_IDLE; prConnSettings->fgIsDisconnectedByNonRequest = TRUE; prAisBssInfo->u2DeauthReason = REASON_CODE_BEACON_TIMEOUT; /* 4 <3> Indicate Disconnected Event to Host immediately. */ @@ -4392,6 +4414,8 @@ VOID aisFsmRunEventChGrant(IN P_ADAPTER_T prAdapter, IN P_MSG_HDR_T prMsgHdr) /* 3. state transition to join/ibss-alone/ibss-merge */ /* 3.1 set timeout timer in cases join could not be completed */ + if (timerPendingTimer(&prAisFsmInfo->rJoinTimeoutTimer)) + cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rJoinTimeoutTimer); cnmTimerStartTimer(prAdapter, &prAisFsmInfo->rJoinTimeoutTimer, prAisFsmInfo->u4ChGrantedInterval - AIS_JOIN_CH_GRANT_THRESHOLD); @@ -4408,6 +4432,8 @@ VOID aisFsmRunEventChGrant(IN P_ADAPTER_T prAdapter, IN P_MSG_HDR_T prMsgHdr) prAisFsmInfo->u4ChGrantedInterval = u4GrantInterval; /* 3.1 set timeout timer in cases upper layer cancel_remain_on_channel never comes */ + if (timerPendingTimer(&prAisFsmInfo->rChannelTimeoutTimer)) + cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rChannelTimeoutTimer); cnmTimerStartTimer(prAdapter, &prAisFsmInfo->rChannelTimeoutTimer, prAisFsmInfo->u4ChGrantedInterval); /* 3.2 switch to remain_on_channel state */ diff --git a/drivers/misc/mediatek/connectivity/wlan/gen3/mgmt/scan.c b/drivers/misc/mediatek/connectivity/wlan/gen3/mgmt/scan.c index 790be1f63f41..414954787eea 100644 --- a/drivers/misc/mediatek/connectivity/wlan/gen3/mgmt/scan.c +++ b/drivers/misc/mediatek/connectivity/wlan/gen3/mgmt/scan.c @@ -840,10 +840,6 @@ VOID scnInit(IN P_ADAPTER_T prAdapter) (PFN_MGMT_TIMEOUT_FUNC) scnGscnGetResultReplyCheckTimeout, (ULONG) NULL); #endif - cnmTimerInitTimer(prAdapter, - &prScanInfo->rScanDoneTimer, (PFN_MGMT_TIMEOUT_FUNC) scnScanDoneTimeout, (ULONG) NULL); - prScanInfo->ucScanDoneTimeoutCnt = 0; - return; } /* end of scnInit() */ diff --git a/drivers/misc/mediatek/connectivity/wlan/gen3/mgmt/scan_fsm.c b/drivers/misc/mediatek/connectivity/wlan/gen3/mgmt/scan_fsm.c index 4bf4eb14c7d5..de01f0ab9ed9 100644 --- a/drivers/misc/mediatek/connectivity/wlan/gen3/mgmt/scan_fsm.c +++ b/drivers/misc/mediatek/connectivity/wlan/gen3/mgmt/scan_fsm.c @@ -412,9 +412,6 @@ VOID scnFsmSteps(IN P_ADAPTER_T prAdapter, IN ENUM_SCAN_STATE_T eNextState) scnSendScanReq(prAdapter); else scnSendScanReqV2(prAdapter); - cnmTimerStartTimer(prAdapter, &prScanInfo->rScanDoneTimer, - SEC_TO_MSEC(AIS_SCN_DONE_TIMEOUT_SEC)); - /* prScanInfo->ucScanDoneTimeoutCnt = 0; */ break; default: @@ -894,8 +891,6 @@ VOID scnEventScanDone(IN P_ADAPTER_T prAdapter, IN P_EVENT_SCAN_DONE prScanDone, prScanInfo = &(prAdapter->rWifiVar.rScanInfo); prScanParam = &prScanInfo->rScanParam; - cnmTimerStopTimer(prAdapter, &prScanInfo->rScanDoneTimer); - prScanInfo->ucScanDoneTimeoutCnt = 0; if (fgIsNewVersion) { DBGLOG(SCN, INFO, "New scnEventScanDone Version%d!size of ScanDone%d,ucCompleteChanCount[%d],ucCurrentState%d\n", @@ -2305,24 +2300,4 @@ VOID scnGscnGetResultReplyCheckTimeout(IN P_ADAPTER_T prAdapter, ULONG ulParamPt } #endif -VOID scnScanDoneTimeout(IN P_ADAPTER_T prAdapter, ULONG ulParamPtr) -{ - - P_SCAN_INFO_T prScanInfo; - - prScanInfo = &(prAdapter->rWifiVar.rScanInfo); - DBGLOG(SCN, WARN, "scnScanDoneTimeout %d \r\n", prScanInfo->ucScanDoneTimeoutCnt); - - prScanInfo->ucScanDoneTimeoutCnt++; - /* whole chip reset check */ - if (prScanInfo->ucScanDoneTimeoutCnt > SCAN_DONE_TIMEOUT_THRESHOLD) { - - DBGLOG(SCN, ERROR, - " meet SCAN_DONE_TIMEOUT_THRESHOLD %d, trigger whole chip reset !! \r\n", - SCAN_DONE_TIMEOUT_THRESHOLD); -#if CFG_CHIP_RESET_SUPPORT - glResetTrigger(prAdapter); -#endif - } -} |