diff options
| author | kaliu <kaliu@qti.qualcomm.com> | 2016-07-18 18:31:47 +0800 |
|---|---|---|
| committer | Anjaneedevi Kapparapu <akappa@codeaurora.org> | 2016-07-19 16:02:30 +0530 |
| commit | 4fd53babc8ba62cc5820c8057cd61709b2738aa7 (patch) | |
| tree | 4d454453ca04b31b312eed39015250f4962f3bee | |
| parent | 6e8c53c0dd4890001284ffcf7661ffb439b20f01 (diff) | |
qcacld-2.0: Fix eSmeCommandDelStaSession stuck in smeCmdActiveList
1. Start AP+AP in DFS channel, QCMAP_CLI will start these two APs
one by one. When starting second AP, first started AP detects radar,
so both two APs will do channel switch.
2. While selecting target channel, host found no available channels
as it has encountered serval radar before, so all channels are tagged to
non-usable, then SME issues eSmeCommandDelStaSession to close AP session.
3. eSmeCommandDelStaSession finally will cause vdev detach in WMA layer,
but found currently bss of AP2 is in started status because in step1 AP2
is doing starting, so vdev detach failed which causes sme del session
can't be removed from smeCmdActiveList.
Solution is pending disconnection, when AP reached started status, then
stop AP.
Change-Id: I03ed2db558c5a57883c1051501a57f325f40b6cf
CRs-Fixed: 1037388
| -rw-r--r-- | CORE/HDD/src/wlan_hdd_cfg80211.c | 3 | ||||
| -rw-r--r-- | CORE/SAP/src/sapFsm.c | 63 | ||||
| -rw-r--r-- | CORE/SAP/src/sapInternal.h | 3 |
3 files changed, 62 insertions, 7 deletions
diff --git a/CORE/HDD/src/wlan_hdd_cfg80211.c b/CORE/HDD/src/wlan_hdd_cfg80211.c index fa8c537567ea..d2793dee52a6 100644 --- a/CORE/HDD/src/wlan_hdd_cfg80211.c +++ b/CORE/HDD/src/wlan_hdd_cfg80211.c @@ -14170,7 +14170,8 @@ static int wlan_hdd_cfg80211_start_bss(hdd_adapter_t *pHostapdAdapter, WLANSAP_ResetSapConfigAddIE(pConfig, eUPDATE_IE_ALL); - if (!VOS_IS_STATUS_SUCCESS(status)) + if (!VOS_IS_STATUS_SUCCESS(status) || + pHostapdState->vosStatus != VOS_STATUS_SUCCESS) { VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR, ("%s: ERROR: HDD vos wait for single_event failed!!"), diff --git a/CORE/SAP/src/sapFsm.c b/CORE/SAP/src/sapFsm.c index 5f55eb805e2e..54de7bbab5d8 100644 --- a/CORE/SAP/src/sapFsm.c +++ b/CORE/SAP/src/sapFsm.c @@ -3775,16 +3775,25 @@ sapFsm } } } - else if (msg == eSAP_HDD_STOP_INFRA_BSS || - msg == eSAP_MAC_START_FAILS) + else if (msg == eSAP_HDD_STOP_INFRA_BSS) { - /*Transition from eSAP_STARTING to eSAP_DISCONNECTED (both without substates)*/ + /* Transition from eSAP_STARTING to eSAP_DISCONNECTPENDING */ VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH, "In %s, from state %s => %s", - __func__, "eSAP_STARTING", "eSAP_DISCONNECTED"); + __func__, "eSAP_STARTING", "eSAP_DISCONNECTPENDING"); + sapContext->sapsMachine = eSAP_DISCONNECTPENDING; + } + else if (msg == eSAP_MAC_START_FAILS) + { + /*Transition from eSAP_STARTING to eSAP_DISCONNECTED (both without substates)*/ + VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH, + "In %s, from state %s => %s", __func__, + "eSAP_STARTING", "eSAP_DISCONNECTED"); /*Advance outer statevar */ sapContext->sapsMachine = eSAP_DISCONNECTED; - vosStatus = sapSignalHDDevent( sapContext, NULL, eSAP_START_BSS_EVENT, (v_PVOID_t)eSAP_STATUS_FAILURE); + vosStatus = sapSignalHDDevent(sapContext, NULL, + eSAP_START_BSS_EVENT, + (v_PVOID_t)eSAP_STATUS_FAILURE); vosStatus = sapGotoDisconnected(sapContext); /* Close the SME session*/ @@ -3829,7 +3838,51 @@ sapFsm /* Intentionally left blank */ } break; + case eSAP_DISCONNECTPENDING: + /* eSAP_DISCONNECTPENDING is state for handling SAP Disconnection + * when DUT is in eSAP_STARTING state. Should not used for OTHER + * purpose. + */ + if (msg == eSAP_MAC_START_BSS_SUCCESS) { + VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH, + "In %s, from state %s => %s", __func__, + "eSAP_DISCONNECTPENDING", "eSAP_DISCONNECTING"); + sapContext->sapsMachine = eSAP_DISCONNECTING; + vosStatus = sapSignalHDDevent(sapContext, NULL, + eSAP_START_BSS_EVENT, + (v_PVOID_t)eSAP_STATUS_FAILURE); + vosStatus = sapGotoDisconnecting(sapContext); + } else if (msg == eSAP_MAC_START_FAILS) { + VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH, + "In %s, from state %s => %s", __func__, + "eSAP_DISCONNECTPENDING", "eSAP_DISCONNECTED"); + sapContext->sapsMachine = eSAP_DISCONNECTED; + vosStatus = sapSignalHDDevent(sapContext, NULL, + eSAP_START_BSS_EVENT, + (v_PVOID_t)eSAP_STATUS_FAILURE); + vosStatus = sapGotoDisconnected(sapContext); + if (eSAP_TRUE == sapContext->isSapSessionOpen) + { + tHalHandle hHal = VOS_GET_HAL_CB(sapContext->pvosGCtx); + if (NULL == hHal) + { + VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR, + "In %s, NULL hHal in state %s, msg %d", + __func__, "eSAP_DISCONNECTPENDING", msg); + } + else if (eHAL_STATUS_SUCCESS == + sap_CloseSession(hHal, sapContext, NULL, FALSE)) + { + sapContext->isSapSessionOpen = eSAP_FALSE; + } + } + } else { + VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR, + "In %s, in state %s, invalid event msg %d", + __func__, "eSAP_DISCONNECTPENDING", msg); + } + break; case eSAP_STARTED: if (msg == eSAP_HDD_STOP_INFRA_BSS) { diff --git a/CORE/SAP/src/sapInternal.h b/CORE/SAP/src/sapInternal.h index e4054623b289..b173120a2d11 100644 --- a/CORE/SAP/src/sapInternal.h +++ b/CORE/SAP/src/sapInternal.h @@ -135,7 +135,8 @@ typedef enum { eSAP_DFS_CAC_WAIT, eSAP_STARTING, eSAP_STARTED, - eSAP_DISCONNECTING + eSAP_DISCONNECTING, + eSAP_DISCONNECTPENDING } eSapFsmStates_t; /*---------------------------------------------------------------------------- |
