qcacld-3.0: Fix WDI pipe enable failure due to double invoke

qcacld-2.0 to qcacld-3.0 propagation

Fix an issue which enables WDI pipes even when RM resource request
failed,  which will cause to invoke WDI pipe enable twice when RM_
RESOURCE_GRANTED notification arrives later.
Also fixed a possible discrapancy between connected client stat count
and actual  number of connected clients.

Change-Id: Ibb86ef6ada398fcc669e3a894daadc09e6096b0f
CRs-fixed: 927581
diff --git a/core/hdd/src/wlan_hdd_ipa.c b/core/hdd/src/wlan_hdd_ipa.c
index 61a61a0..422a448 100644
--- a/core/hdd/src/wlan_hdd_ipa.c
+++ b/core/hdd/src/wlan_hdd_ipa.c
@@ -973,7 +973,9 @@
 	p_cds_contextType cds_ctx = hdd_ipa->hdd_ctx->pcds_context;
 
 	/* ACTIVATE TX PIPE */
-	HDD_IPA_LOG(CDF_TRACE_LEVEL_INFO, "%s: Enable TX PIPE", __func__);
+	HDD_IPA_LOG(CDF_TRACE_LEVEL_INFO,
+			"%s: Enable TX PIPE(tx_pipe_handle=%d)",
+			__func__, hdd_ipa->tx_pipe_handle);
 	result = ipa_enable_wdi_pipe(hdd_ipa->tx_pipe_handle);
 	if (result) {
 		HDD_IPA_LOG(CDF_TRACE_LEVEL_ERROR,
@@ -991,7 +993,9 @@
 	ol_txrx_ipa_uc_set_active(cds_ctx->pdev_txrx_ctx, true, true);
 
 	/* ACTIVATE RX PIPE */
-	HDD_IPA_LOG(CDF_TRACE_LEVEL_INFO, "%s: Enable RX PIPE", __func__);
+	HDD_IPA_LOG(CDF_TRACE_LEVEL_INFO,
+			"%s: Enable RX PIPE(rx_pipe_handle=%d)",
+			__func__, hdd_ipa->rx_pipe_handle);
 	result = ipa_enable_wdi_pipe(hdd_ipa->rx_pipe_handle);
 	if (result) {
 		HDD_IPA_LOG(CDF_TRACE_LEVEL_ERROR,
@@ -1068,32 +1072,39 @@
 {
 	hdd_ipa->activated_fw_pipe = 0;
 	hdd_ipa->resource_loading = true;
+
 	/* If RM feature enabled
 	 * Request PROD Resource first
 	 * PROD resource may return sync or async manners */
-	if ((hdd_ipa_is_rm_enabled(hdd_ipa->hdd_ctx)) &&
-	    (!ipa_rm_request_resource(IPA_RM_RESOURCE_WLAN_PROD))) {
-		/* RM PROD request sync return
-		 * enable pipe immediately */
-		if (hdd_ipa_uc_enable_pipes(hdd_ipa)) {
-			HDD_IPA_LOG(CDF_TRACE_LEVEL_ERROR,
-				    "%s: IPA WDI Pipes activate fail",
-				    __func__);
-			hdd_ipa->resource_loading = false;
-			return -EBUSY;
+	if (hdd_ipa_is_rm_enabled(hdd_ipa->hdd_ctx)) {
+		if (!ipa_rm_request_resource(IPA_RM_RESOURCE_WLAN_PROD)) {
+			/* RM PROD request sync return
+			 * enable pipe immediately
+			 */
+			if (hdd_ipa_uc_enable_pipes(hdd_ipa)) {
+				HDD_IPA_LOG(CDF_TRACE_LEVEL_ERROR,
+					"%s: IPA WDI Pipe activation failed",
+					__func__);
+				hdd_ipa->resource_loading = false;
+				return -EBUSY;
+			}
 		}
 	} else {
 		/* RM Disabled
-		 * Just enabled all the PIPEs */
+		 * Just enabled all the PIPEs
+		 */
 		if (hdd_ipa_uc_enable_pipes(hdd_ipa)) {
 			HDD_IPA_LOG(CDF_TRACE_LEVEL_ERROR,
-				    "%s: IPA WDI Pipes activate fail",
+				    "%s: IPA WDI Pipe activation failed",
 				    __func__);
 			hdd_ipa->resource_loading = false;
 			return -EBUSY;
 		}
 		hdd_ipa->resource_loading = false;
 	}
+
+	HDD_IPA_LOG(CDF_TRACE_LEVEL_INFO,
+			"%s: IPA WDI Pipes activated successfully", __func__);
 	return 0;
 }
 
@@ -3520,11 +3531,10 @@
 			(!hdd_ipa->sta_connected)) {
 			/* Enable IPA UC TX PIPE when STA connected */
 			ret = hdd_ipa_uc_handle_first_con(hdd_ipa);
-			if (!ret) {
+			if (ret) {
+				cdf_mutex_release(&hdd_ipa->event_lock);
 				HDD_IPA_LOG(CDF_TRACE_LEVEL_ERROR,
 					"handle 1st con ret %d", ret);
-			} else {
-				cdf_mutex_release(&hdd_ipa->event_lock);
 				hdd_ipa_uc_offload_enable_disable(adapter,
 					SIR_STA_RX_DATA_OFFLOAD, 0);
 				goto end;
@@ -3672,8 +3682,6 @@
 			cdf_mutex_release(&hdd_ipa->event_lock);
 			return 0;
 		}
-		hdd_ipa->sap_num_connected_sta++;
-		hdd_ipa->pending_cons_req = false;
 		cdf_mutex_release(&hdd_ipa->event_lock);
 
 		meta.msg_type = type;
@@ -3712,7 +3720,7 @@
 
 		cdf_mutex_acquire(&hdd_ipa->event_lock);
 		/* Enable IPA UC Data PIPEs when first STA connected */
-		if ((1 == hdd_ipa->sap_num_connected_sta)
+		if ((0 == hdd_ipa->sap_num_connected_sta)
 			&& (!hdd_ipa_uc_sta_is_enabled(hdd_ipa->hdd_ctx)
 			|| !hdd_ipa->sta_connected)) {
 			ret = hdd_ipa_uc_handle_first_con(hdd_ipa);
@@ -3724,6 +3732,10 @@
 				return ret;
 			}
 		}
+
+		hdd_ipa->sap_num_connected_sta++;
+		hdd_ipa->pending_cons_req = false;
+
 		cdf_mutex_release(&hdd_ipa->event_lock);
 
 		return ret;