summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkaliu <kaliu@qti.qualcomm.com>2016-07-18 18:31:47 +0800
committerAnjaneedevi Kapparapu <akappa@codeaurora.org>2016-07-19 16:02:30 +0530
commit4fd53babc8ba62cc5820c8057cd61709b2738aa7 (patch)
tree4d454453ca04b31b312eed39015250f4962f3bee
parent6e8c53c0dd4890001284ffcf7661ffb439b20f01 (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.c3
-rw-r--r--CORE/SAP/src/sapFsm.c63
-rw-r--r--CORE/SAP/src/sapInternal.h3
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;
/*----------------------------------------------------------------------------