qcacld-3.0: Enable enahnced flow control

a) Enabled flow control
b) Add small helper functions to avoid duplication of
   code.
c) Fix thermal mitigation unpause issue with flow control.

CRs-Fixed: 916716
Change-Id: Ic02b66d1c23768a1c71dc08ed50dcedd02b647ce
diff --git a/Kbuild b/Kbuild
index 79c831f..825909f 100644
--- a/Kbuild
+++ b/Kbuild
@@ -116,7 +116,11 @@
 	CONFIG_WLAN_NAPI_DEBUG := n
 
 	# Flag to enable FW based TX Flow control
-	CONFIG_WLAN_TX_FLOW_CONTROL_V2 := n
+	ifeq ($(CONFIG_CNSS_EOS),y)
+		CONFIG_WLAN_TX_FLOW_CONTROL_V2 := y
+	else
+		CONFIG_WLAN_TX_FLOW_CONTROL_V2 := n
+	endif
 
 	# Flag to enable LRO (Large Receive Offload)
 	ifeq ($(CONFIG_CNSS_EOS), y)
diff --git a/core/dp/txrx/ol_tx_desc.c b/core/dp/txrx/ol_tx_desc.c
index 1fa7872..4b80f5c 100644
--- a/core/dp/txrx/ol_tx_desc.c
+++ b/core/dp/txrx/ol_tx_desc.c
@@ -122,9 +122,7 @@
 
 	cdf_spin_lock_bh(&pdev->tx_mutex);
 	if (pdev->tx_desc.freelist) {
-		pdev->tx_desc.num_free--;
-		tx_desc = &pdev->tx_desc.freelist->tx_desc;
-		pdev->tx_desc.freelist = pdev->tx_desc.freelist->next;
+		tx_desc = ol_tx_get_desc_global_pool(pdev);
 		ol_tx_desc_sanity_checks(pdev, tx_desc);
 		ol_tx_desc_compute_delay(tx_desc);
 	}
@@ -175,9 +173,8 @@
 	if (pool) {
 		cdf_spin_lock_bh(&pool->flow_pool_lock);
 		if (pool->avail_desc) {
-			tx_desc = &pool->freelist->tx_desc;
-			pool->freelist = pool->freelist->next;
-			if (cdf_unlikely(--pool->avail_desc < pool->stop_th)) {
+			tx_desc = ol_tx_get_desc_flow_pool(pool);
+			if (cdf_unlikely(pool->avail_desc < pool->stop_th)) {
 				pool->status = FLOW_POOL_ACTIVE_PAUSED;
 				cdf_spin_unlock_bh(&pool->flow_pool_lock);
 				/* pause network queues */
@@ -253,10 +250,7 @@
 	ol_tx_desc_reset_pkt_type(tx_desc);
 	ol_tx_desc_reset_timestamp(tx_desc);
 
-	((union ol_tx_desc_list_elem_t *)tx_desc)->next =
-		pdev->tx_desc.freelist;
-	pdev->tx_desc.freelist = (union ol_tx_desc_list_elem_t *)tx_desc;
-	pdev->tx_desc.num_free++;
+	ol_tx_put_desc_global_pool(pdev, tx_desc);
 #if defined(CONFIG_PER_VDEV_TX_DESC_POOL)
 #ifdef QCA_LL_LEGACY_TX_FLOW_CONTROL
 	if ((cdf_atomic_read(&tx_desc->vdev->os_q_paused)) &&
@@ -298,10 +292,7 @@
 	ol_tx_desc_reset_timestamp(tx_desc);
 
 	cdf_spin_lock_bh(&pool->flow_pool_lock);
-	((union ol_tx_desc_list_elem_t *)tx_desc)->next =
-				pool->freelist;
-	pool->freelist = (union ol_tx_desc_list_elem_t *)tx_desc;
-	pool->avail_desc++;
+	ol_tx_put_desc_flow_pool(pool, tx_desc);
 	switch (pool->status) {
 	case FLOW_POOL_ACTIVE_PAUSED:
 		if (pool->avail_desc > pool->start_th) {
diff --git a/core/dp/txrx/ol_tx_desc.h b/core/dp/txrx/ol_tx_desc.h
index 392e192..c96c47a 100644
--- a/core/dp/txrx/ol_tx_desc.h
+++ b/core/dp/txrx/ol_tx_desc.h
@@ -165,8 +165,84 @@
 	 struct cdf_tso_seg_elem_t *tso_seg);
 #endif
 
+/**
+ * ol_tx_get_desc_global_pool() - get descriptor from global pool
+ * @pdev: pdev handler
+ *
+ * Caller needs to take lock and do sanity checks.
+ *
+ * Return: tx descriptor
+ */
+static inline
+struct ol_tx_desc_t *ol_tx_get_desc_global_pool(struct ol_txrx_pdev_t *pdev)
+{
+	struct ol_tx_desc_t *tx_desc = &pdev->tx_desc.freelist->tx_desc;
+	pdev->tx_desc.freelist = pdev->tx_desc.freelist->next;
+	pdev->tx_desc.num_free--;
+	return tx_desc;
+}
+
+/**
+ * ol_tx_put_desc_global_pool() - put descriptor to global pool freelist
+ * @pdev: pdev handle
+ * @tx_desc: tx descriptor
+ *
+ * Caller needs to take lock and do sanity checks.
+ *
+ * Return: none
+ */
+static inline
+void ol_tx_put_desc_global_pool(struct ol_txrx_pdev_t *pdev,
+			struct ol_tx_desc_t *tx_desc)
+{
+	((union ol_tx_desc_list_elem_t *)tx_desc)->next =
+					pdev->tx_desc.freelist;
+	pdev->tx_desc.freelist =
+			 (union ol_tx_desc_list_elem_t *)tx_desc;
+	pdev->tx_desc.num_free++;
+	return;
+}
+
+
 #ifdef QCA_LL_TX_FLOW_CONTROL_V2
 int ol_tx_free_invalid_flow_pool(struct ol_tx_flow_pool_t *pool);
+/**
+ * ol_tx_get_desc_flow_pool() - get descriptor from flow pool
+ * @pool: flow pool
+ *
+ * Caller needs to take lock and do sanity checks.
+ *
+ * Return: tx descriptor
+ */
+static inline
+struct ol_tx_desc_t *ol_tx_get_desc_flow_pool(struct ol_tx_flow_pool_t *pool)
+{
+	struct ol_tx_desc_t *tx_desc = &pool->freelist->tx_desc;
+	pool->freelist = pool->freelist->next;
+	pool->avail_desc--;
+	return tx_desc;
+}
+
+/**
+ * ol_tx_put_desc_flow_pool() - put descriptor to flow pool freelist
+ * @pool: flow pool
+ * @tx_desc: tx descriptor
+ *
+ * Caller needs to take lock and do sanity checks.
+ *
+ * Return: none
+ */
+static inline
+void ol_tx_put_desc_flow_pool(struct ol_tx_flow_pool_t *pool,
+			struct ol_tx_desc_t *tx_desc)
+{
+	tx_desc->pool = pool;
+	((union ol_tx_desc_list_elem_t *)tx_desc)->next = pool->freelist;
+	pool->freelist = (union ol_tx_desc_list_elem_t *)tx_desc;
+	pool->avail_desc++;
+	return;
+}
+
 #else
 static inline int ol_tx_free_invalid_flow_pool(void *pool)
 {
diff --git a/core/dp/txrx/ol_tx_queue.c b/core/dp/txrx/ol_tx_queue.c
index d24ae0b..a894b1c 100644
--- a/core/dp/txrx/ol_tx_queue.c
+++ b/core/dp/txrx/ol_tx_queue.c
@@ -219,7 +219,7 @@
 	struct ol_txrx_vdev_t *vdev = NULL, *tmp;
 
 	TAILQ_FOREACH_SAFE(vdev, &pdev->vdev_list, vdev_list_elem, tmp) {
-		ol_txrx_vdev_pause(vdev, reason);
+		ol_txrx_vdev_unpause(vdev, reason);
 	}
 
 }
@@ -357,6 +357,7 @@
 
 	/* Reset the phase */
 	pdev->tx_throttle.current_throttle_phase = THROTTLE_PHASE_OFF;
+	ol_txrx_thermal_unpause(pdev);
 
 	/* Start with the new time */
 	ms = pdev->tx_throttle.
diff --git a/core/dp/txrx/ol_txrx.c b/core/dp/txrx/ol_txrx.c
index ae16436..02ab179 100644
--- a/core/dp/txrx/ol_txrx.c
+++ b/core/dp/txrx/ol_txrx.c
@@ -272,7 +272,6 @@
  *
  * Return: none
  */
-inline
 void ol_tx_set_desc_global_pool_size(uint32_t num_msdu_desc)
 {
 	struct ol_txrx_pdev_t *pdev = cds_get_context(CDF_MODULE_ID_TXRX);
@@ -281,6 +280,8 @@
 		return;
 	}
 	pdev->num_msdu_desc = num_msdu_desc + TX_FLOW_MGMT_POOL_SIZE;
+	TXRX_PRINT(TXRX_PRINT_LEVEL_ERR, "Global pool size: %d = %d + %d\n",
+		pdev->num_msdu_desc, num_msdu_desc, TX_FLOW_MGMT_POOL_SIZE);
 	return;
 }
 
diff --git a/core/dp/txrx/ol_txrx_flow_control.c b/core/dp/txrx/ol_txrx_flow_control.c
index fd759ba..8278583 100644
--- a/core/dp/txrx/ol_txrx_flow_control.c
+++ b/core/dp/txrx/ol_txrx_flow_control.c
@@ -51,12 +51,9 @@
 #include <ol_tx.h>
 #include <ol_cfg.h>
 
-#define TX_FLOW_START_TH 25
-#define TX_FLOW_STOP_TH 10
 #define INVALID_FLOW_ID 0xFF
 #define MAX_INVALID_BIN 3
 
-
 #ifdef QCA_LL_TX_FLOW_GLOBAL_MGMT_POOL
 #define TX_FLOW_MGMT_POOL_ID	0xEF
 #define TX_FLOW_MGMT_POOL_SIZE  32
@@ -232,9 +229,7 @@
 	/* Take descriptors from source pool and put it in temp_list */
 	cdf_spin_lock_bh(&src_pool->flow_pool_lock);
 	for (i = 0; i < desc_move_count; i++) {
-		tx_desc = &src_pool->freelist->tx_desc;
-		src_pool->freelist = src_pool->freelist->next;
-		src_pool->avail_desc--;
+		tx_desc = ol_tx_get_desc_flow_pool(src_pool);
 		((union ol_tx_desc_list_elem_t *)tx_desc)->next = temp_list;
 		temp_list = (union ol_tx_desc_list_elem_t *)tx_desc;
 
@@ -250,11 +245,7 @@
 			break;
 		tx_desc = &temp_list->tx_desc;
 		temp_list = temp_list->next;
-		tx_desc->pool = dst_pool;
-		((union ol_tx_desc_list_elem_t *)tx_desc)->next =
-							dst_pool->freelist;
-		dst_pool->freelist = (union ol_tx_desc_list_elem_t *)tx_desc;
-		dst_pool->avail_desc++;
+		ol_tx_put_desc_flow_pool(dst_pool, tx_desc);
 		count++;
 	}
 	cdf_spin_unlock_bh(&dst_pool->flow_pool_lock);
@@ -264,11 +255,7 @@
 	while (temp_list) {
 		tx_desc = &temp_list->tx_desc;
 		temp_list = temp_list->next;
-		tx_desc->pool = src_pool;
-		((union ol_tx_desc_list_elem_t *)tx_desc)->next =
-							src_pool->freelist;
-		src_pool->freelist = (union ol_tx_desc_list_elem_t *)tx_desc;
-		src_pool->avail_desc++;
+		ol_tx_put_desc_flow_pool(src_pool, tx_desc);
 	}
 	cdf_spin_unlock_bh(&src_pool->flow_pool_lock);
 
@@ -370,9 +357,7 @@
 		size = pdev->tx_desc.num_free;
 
 	for (i = 0; i < size; i++) {
-		pdev->tx_desc.num_free--;
-		tx_desc = &pdev->tx_desc.freelist->tx_desc;
-		pdev->tx_desc.freelist = pdev->tx_desc.freelist->next;
+		tx_desc = ol_tx_get_desc_global_pool(pdev);
 		tx_desc->pool = pool;
 		((union ol_tx_desc_list_elem_t *)tx_desc)->next = temp_list;
 		temp_list = (union ol_tx_desc_list_elem_t *)tx_desc;
@@ -458,12 +443,7 @@
 		tx_desc = &temp_list->tx_desc;
 		temp_list = temp_list->next;
 
-		((union ol_tx_desc_list_elem_t *)tx_desc)->next =
-			pdev->tx_desc.freelist;
-		pdev->tx_desc.freelist =
-			 (union ol_tx_desc_list_elem_t *)tx_desc;
-		pdev->tx_desc.num_free++;
-
+		ol_tx_put_desc_global_pool(pdev, tx_desc);
 	}
 	cdf_spin_unlock_bh(&pdev->tx_mutex);