Browse Source

qcacld-3.0: Purge all serialization commands on csr stop

During csr stop, csr_roam_close_session try to purge all the pending
commands for the vdev. But as vdev is already logically deleted,
the cmds are not purged as the purge by vdev API fails to get the
vdev ref.

As in csr stop, driver clean up all the sme session so instead of
calling purge commands for vdev, call purge cmd for all the vdev.

Also the active command timeout for the delete vdev is 30 sec while
HDD waits for 15 sec. The active command timeout should be less
than the HDD timeout. Thus set active cmd timeout as 10 sec and
HDD timeout as 11 sec

Change-Id: I1d45de261c50f1835379a9cc1df4631f3e32f459
CRs-Fixed: 2339694
Abhishek Singh 6 years ago
parent
commit
13bf0ce6cd

+ 1 - 5
core/hdd/inc/wlan_hdd_main.h

@@ -227,11 +227,7 @@ enum hdd_driver_flags {
 #define WLAN_WAIT_TIME_COUNTRY     1000
 #define WLAN_WAIT_TIME_COUNTRY     1000
 #define WLAN_WAIT_TIME_LINK_STATUS 800
 #define WLAN_WAIT_TIME_LINK_STATUS 800
 #define WLAN_WAIT_TIME_POWER_STATS 800
 #define WLAN_WAIT_TIME_POWER_STATS 800
-/* Amount of time to wait for sme close session callback.
- * This value should be larger than the timeout used by WDI to wait for
- * a response from WCNSS
- */
-#define WLAN_WAIT_TIME_SESSIONOPENCLOSE  15000
+
 #define WLAN_WAIT_TIME_ABORTSCAN         2000
 #define WLAN_WAIT_TIME_ABORTSCAN         2000
 
 
 /** Maximum time(ms) to wait for mc thread suspend **/
 /** Maximum time(ms) to wait for mc thread suspend **/

+ 2 - 2
core/hdd/src/wlan_hdd_main.c

@@ -3780,7 +3780,7 @@ int hdd_vdev_destroy(struct hdd_adapter *adapter)
 	/* block on a completion variable until sme session is closed */
 	/* block on a completion variable until sme session is closed */
 	status = qdf_wait_for_event_completion(
 	status = qdf_wait_for_event_completion(
 			&adapter->qdf_session_close_event,
 			&adapter->qdf_session_close_event,
-			WLAN_WAIT_TIME_SESSIONOPENCLOSE);
+			SME_CMD_VDEV_CREATE_DELETE_TIMEOUT);
 
 
 	if (QDF_IS_STATUS_ERROR(status)) {
 	if (QDF_IS_STATUS_ERROR(status)) {
 		clear_bit(SME_SESSION_OPENED, &adapter->event_flags);
 		clear_bit(SME_SESSION_OPENED, &adapter->event_flags);
@@ -3879,7 +3879,7 @@ int hdd_vdev_create(struct hdd_adapter *adapter,
 
 
 	/* block on a completion variable until sme session is opened */
 	/* block on a completion variable until sme session is opened */
 	status = qdf_wait_for_event_completion(&adapter->qdf_session_open_event,
 	status = qdf_wait_for_event_completion(&adapter->qdf_session_open_event,
-			WLAN_WAIT_TIME_SESSIONOPENCLOSE);
+			SME_CMD_VDEV_CREATE_DELETE_TIMEOUT);
 	if (QDF_STATUS_SUCCESS != status) {
 	if (QDF_STATUS_SUCCESS != status) {
 		if (adapter->qdf_session_open_event.force_set) {
 		if (adapter->qdf_session_open_event.force_set) {
 			/*
 			/*

+ 43 - 11
core/sme/inc/csr_internal.h

@@ -1320,16 +1320,49 @@ void csr_nonscan_active_ll_insert_head(
 tListElem *csr_nonscan_pending_ll_next(
 tListElem *csr_nonscan_pending_ll_next(
 			struct sAniSirGlobal *mac_ctx,
 			struct sAniSirGlobal *mac_ctx,
 		tListElem *entry, bool inter_locked);
 		tListElem *entry, bool inter_locked);
-void purge_sme_session_pending_cmd_list(
-			struct sAniSirGlobal *mac_ctx,
-		uint32_t session_id);
-void purge_sme_session_active_cmd_list(
-			struct sAniSirGlobal *mac_ctx,
-		uint32_t session_id);
-void purge_sme_session_pending_scan_cmd_list(struct sAniSirGlobal *mac_ctx,
-		uint32_t session_id);
-void purge_sme_session_active_scan_cmd_list(struct sAniSirGlobal *mac_ctx,
-		uint32_t session_id);
+
+/**
+ * csr_purge_vdev_pending_ser_cmd_list() - purge all scan and non-scan
+ * pending cmds for the vdev id
+ * @mac_ctx: pointer to global MAC context
+ * @vdev_id : vdev id for which the pending cmds need to be purged
+ *
+ * Return : none
+ */
+void csr_purge_vdev_pending_ser_cmd_list(struct sAniSirGlobal *mac_ctx,
+					 uint32_t vdev_id);
+
+/**
+ * csr_purge_vdev_all_ser_cmd_list() - purge all scan and non-scan
+ * active and pending cmds for the vdev id
+ * @mac_ctx: pointer to global MAC context
+ * @vdev_id : vdev id for which cmds need to be purged
+ *
+ * Return : none
+ */
+void csr_purge_vdev_all_ser_cmd_list(struct sAniSirGlobal *mac_ctx,
+				     uint32_t vdev_id);
+
+/**
+ * csr_purge_vdev_all_scan_ser_cmd_list() - purge all scan active and pending
+ * cmds for the vdev id
+ * @mac_ctx: pointer to global MAC context
+ * @vdev_id : vdev id for which cmds need to be purged
+ *
+ * Return : none
+ */
+void csr_purge_vdev_all_scan_ser_cmd_list(struct sAniSirGlobal *mac_ctx,
+					  uint32_t vdev_id);
+
+/**
+ * csr_purge_pdev_all_ser_cmd_list() - purge all scan and non-scan
+ * active and pending cmds for all vdevs in pdev
+ * @mac_ctx: pointer to global MAC context
+ *
+ * Return : none
+ */
+void csr_purge_pdev_all_ser_cmd_list(struct sAniSirGlobal *mac_ctx);
+
 bool csr_wait_for_connection_update(tpAniSirGlobal mac,
 bool csr_wait_for_connection_update(tpAniSirGlobal mac,
 		bool do_release_reacquire_lock);
 		bool do_release_reacquire_lock);
 enum QDF_OPMODE csr_get_session_persona(tpAniSirGlobal pmac,
 enum QDF_OPMODE csr_get_session_persona(tpAniSirGlobal pmac,
@@ -1358,5 +1391,4 @@ QDF_STATUS csr_roam_update_config(
  * Return : true if channel causes MCC, else false
  * Return : true if channel causes MCC, else false
  */
  */
 bool csr_is_mcc_channel(tpAniSirGlobal mac_ctx, uint8_t channel);
 bool csr_is_mcc_channel(tpAniSirGlobal mac_ctx, uint8_t channel);
-
 #endif
 #endif

+ 5 - 0
core/sme/inc/sme_api.h

@@ -105,6 +105,11 @@
 /* SME timeout for Start/Stop BSS commands is set to 10 secs */
 /* SME timeout for Start/Stop BSS commands is set to 10 secs */
 #define SME_START_STOP_BSS_CMD_TIMEOUT (10 * 1000)
 #define SME_START_STOP_BSS_CMD_TIMEOUT (10 * 1000)
 #define SME_CMD_START_STOP_BSS_TIMEOUT (SME_START_STOP_BSS_CMD_TIMEOUT + 1000)
 #define SME_CMD_START_STOP_BSS_TIMEOUT (SME_START_STOP_BSS_CMD_TIMEOUT + 1000)
+
+/* SME timeout for vdev delete is set to 10 secs */
+#define SME_VDEV_DELETE_CMD_TIMEOUT (10 * 1000)
+#define SME_CMD_VDEV_CREATE_DELETE_TIMEOUT (SME_VDEV_DELETE_CMD_TIMEOUT + 1000)
+
 /*--------------------------------------------------------------------------
 /*--------------------------------------------------------------------------
   Type declarations
   Type declarations
   ------------------------------------------------------------------------*/
   ------------------------------------------------------------------------*/

+ 25 - 7
core/sme/src/csr/csr_api_roam.c

@@ -1259,6 +1259,11 @@ QDF_STATUS csr_stop(tpAniSirGlobal pMac)
 	ucfg_scan_set_enable(pMac->psoc, false);
 	ucfg_scan_set_enable(pMac->psoc, false);
 	ucfg_scan_unregister_requester(pMac->psoc, pMac->scan.requester_id);
 	ucfg_scan_unregister_requester(pMac->psoc, pMac->scan.requester_id);
 
 
+	/*
+	 * purge all serialization commnad if there are any pending to make
+	 * sure memory and vdev ref are freed.
+	 */
+	csr_purge_pdev_all_ser_cmd_list(pMac);
 	for (sessionId = 0; sessionId < CSR_ROAM_SESSION_MAX; sessionId++)
 	for (sessionId = 0; sessionId < CSR_ROAM_SESSION_MAX; sessionId++)
 		csr_roam_close_session(pMac, sessionId, true);
 		csr_roam_close_session(pMac, sessionId, true);
 
 
@@ -1421,6 +1426,11 @@ static QDF_STATUS csr_roam_close(tpAniSirGlobal pMac)
 {
 {
 	uint32_t sessionId;
 	uint32_t sessionId;
 
 
+	/*
+	 * purge all serialization commnad if there are any pending to make
+	 * sure memory and vdev ref are freed.
+	 */
+	csr_purge_pdev_all_ser_cmd_list(pMac);
 	for (sessionId = 0; sessionId < CSR_ROAM_SESSION_MAX; sessionId++)
 	for (sessionId = 0; sessionId < CSR_ROAM_SESSION_MAX; sessionId++)
 		csr_roam_close_session(pMac, sessionId, true);
 		csr_roam_close_session(pMac, sessionId, true);
 
 
@@ -17116,7 +17126,13 @@ QDF_STATUS csr_process_del_sta_session_rsp(tpAniSirGlobal mac_ctx,
 	rsp = (struct del_sta_self_params *) pMsg;
 	rsp = (struct del_sta_self_params *) pMsg;
 	sessionId = rsp->session_id;
 	sessionId = rsp->session_id;
 	sme_debug("Del Sta rsp status = %d", rsp->status);
 	sme_debug("Del Sta rsp status = %d", rsp->status);
-	/* This session is done. */
+
+	/*
+	 * This session is done. This will also flush all the pending command
+	 * for this vdev, as vdev is deleted and no command should be sent
+	 * for this vdev. Active cmnd is e_sme_command_del_sta_session and will
+	 * be removed anyway next.
+	 */
 	csr_cleanup_session(mac_ctx, sessionId);
 	csr_cleanup_session(mac_ctx, sessionId);
 
 
 	/* Remove this command out of the non scan active list */
 	/* Remove this command out of the non scan active list */
@@ -17187,8 +17203,7 @@ void csr_cleanup_session(tpAniSirGlobal pMac, uint32_t sessionId)
 #ifdef FEATURE_WLAN_BTAMP_UT_RF
 #ifdef FEATURE_WLAN_BTAMP_UT_RF
 		qdf_mc_timer_destroy(&pSession->hTimerJoinRetry);
 		qdf_mc_timer_destroy(&pSession->hTimerJoinRetry);
 #endif
 #endif
-		purge_sme_session_pending_cmd_list(pMac, sessionId);
-		purge_sme_session_pending_scan_cmd_list(pMac, sessionId);
+		csr_purge_vdev_pending_ser_cmd_list(pMac, sessionId);
 		csr_init_session(pMac, sessionId);
 		csr_init_session(pMac, sessionId);
 	}
 	}
 }
 }
@@ -17219,10 +17234,11 @@ QDF_STATUS csr_roam_close_session(tpAniSirGlobal mac_ctx,
 					 session_id);
 					 session_id);
 	}
 	}
 
 
-	purge_sme_session_pending_cmd_list(mac_ctx, session_id);
-	purge_sme_session_active_cmd_list(mac_ctx, session_id);
-	purge_sme_session_pending_scan_cmd_list(mac_ctx, session_id);
-	purge_sme_session_active_scan_cmd_list(mac_ctx, session_id);
+	/*
+	 * Flush only scan commands. Non scan commands should go in sequence
+	 * as expected by firmware and should not be flushed.
+	 */
+	csr_purge_vdev_all_scan_ser_cmd_list(mac_ctx, session_id);
 	if (!session->session_close_cb) {
 	if (!session->session_close_cb) {
 		sme_err("no close session callback registered");
 		sme_err("no close session callback registered");
 		return QDF_STATUS_E_FAILURE;
 		return QDF_STATUS_E_FAILURE;
@@ -20263,6 +20279,8 @@ QDF_STATUS csr_set_serialization_params_to_cmd(tpAniSirGlobal mac_ctx,
 	    ((cmd->cmd_type == WLAN_SER_CMD_HDD_ISSUED) ||
 	    ((cmd->cmd_type == WLAN_SER_CMD_HDD_ISSUED) ||
 	    (cmd->cmd_type == WLAN_SER_CMD_VDEV_STOP_BSS)))
 	    (cmd->cmd_type == WLAN_SER_CMD_VDEV_STOP_BSS)))
 		cmd->cmd_timeout_duration = SME_START_STOP_BSS_CMD_TIMEOUT;
 		cmd->cmd_timeout_duration = SME_START_STOP_BSS_CMD_TIMEOUT;
+	else if (cmd->cmd_type == WLAN_SER_CMD_DEL_STA_SESSION)
+		cmd->cmd_timeout_duration = SME_VDEV_DELETE_CMD_TIMEOUT;
 	else
 	else
 		cmd->cmd_timeout_duration = SME_DEFAULT_CMD_TIMEOUT;
 		cmd->cmd_timeout_duration = SME_DEFAULT_CMD_TIMEOUT;
 
 

+ 15 - 21
core/sme/src/csr/csr_util.c

@@ -409,40 +409,34 @@ const char *csr_phy_mode_str(eCsrPhyMode phy_mode)
 	}
 	}
 }
 }
 
 
-void purge_sme_session_active_scan_cmd_list(struct sAniSirGlobal *mac_ctx,
-				uint32_t session_id)
+void csr_purge_vdev_pending_ser_cmd_list(struct sAniSirGlobal *mac_ctx,
+					 uint32_t vdev_id)
 {
 {
-	uint8_t vdev_id = session_id;
-
 	wlan_serialization_purge_cmd_list_by_vdev_id(mac_ctx->psoc, vdev_id,
 	wlan_serialization_purge_cmd_list_by_vdev_id(mac_ctx->psoc, vdev_id,
-			true, false, false, false, false);
+						     false, true, false,
+						     true, false);
 }
 }
 
 
-void purge_sme_session_pending_scan_cmd_list(struct sAniSirGlobal *mac_ctx,
-				uint32_t session_id)
+void csr_purge_vdev_all_ser_cmd_list(struct sAniSirGlobal *mac_ctx,
+				     uint32_t vdev_id)
 {
 {
-	uint8_t vdev_id = session_id;
-
 	wlan_serialization_purge_cmd_list_by_vdev_id(mac_ctx->psoc, vdev_id,
 	wlan_serialization_purge_cmd_list_by_vdev_id(mac_ctx->psoc, vdev_id,
-			false, true, false, false, false);
+						     true, true, true,
+						     true, true);
 }
 }
 
 
-void purge_sme_session_pending_cmd_list(struct sAniSirGlobal *mac_ctx,
-				uint32_t session_id)
+void csr_purge_vdev_all_scan_ser_cmd_list(struct sAniSirGlobal *mac_ctx,
+					  uint32_t vdev_id)
 {
 {
-	uint8_t vdev_id = session_id;
-
 	wlan_serialization_purge_cmd_list_by_vdev_id(mac_ctx->psoc, vdev_id,
 	wlan_serialization_purge_cmd_list_by_vdev_id(mac_ctx->psoc, vdev_id,
-			false, false, false, true, false);
+						     true, true, false,
+						     false, false);
 }
 }
 
 
-void purge_sme_session_active_cmd_list(struct sAniSirGlobal *mac_ctx,
-				uint32_t session_id)
+void csr_purge_pdev_all_ser_cmd_list(struct sAniSirGlobal *mac_ctx)
 {
 {
-	uint8_t vdev_id = session_id;
-
-	wlan_serialization_purge_cmd_list_by_vdev_id(mac_ctx->psoc, vdev_id,
-			false, false, true, false, false);
+	wlan_serialization_purge_cmd_list(mac_ctx->psoc, NULL, true, true,
+					  true, true, true);
 }
 }
 
 
 void csr_nonscan_active_ll_insert_head(struct sAniSirGlobal *mac_ctx,
 void csr_nonscan_active_ll_insert_head(struct sAniSirGlobal *mac_ctx,