summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPiazza Lo <piazza.lo@mediatek.com>2017-11-16 09:06:19 +0800
committerAndy Quan <andyq@google.com>2017-11-16 01:57:44 +0000
commit117a61e5d0e7fdffa19d7c630aa892c69da15be6 (patch)
tree58c32f314c913a49f50fd1962a8eb04c45f25f62
parent43a148684467dfd797e0717233774ae3749a491c (diff)
downloadmediatek-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)
-rwxr-xr-xdrivers/misc/mediatek/connectivity/wlan/gen3/common/wlan_oid.c3
-rw-r--r--drivers/misc/mediatek/connectivity/wlan/gen3/include/mgmt/ais_fsm.h4
-rw-r--r--drivers/misc/mediatek/connectivity/wlan/gen3/include/mgmt/scan.h4
-rw-r--r--drivers/misc/mediatek/connectivity/wlan/gen3/mgmt/ais_fsm.c50
-rw-r--r--drivers/misc/mediatek/connectivity/wlan/gen3/mgmt/scan.c4
-rw-r--r--drivers/misc/mediatek/connectivity/wlan/gen3/mgmt/scan_fsm.c25
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
- }
-}