瀏覽代碼

qcacld-3.0: Add changes for Napier flow control

Adds support for flow control on convergence branch.
We will have global pool and each vdev coming up will have the
descriptors allocated from global pool. Tx queue is paused and unpaused
internally in host based on the stop and start thresholds.
Changes are added under compilation flag QCA_LL_TX_FLOW_CONTROL_V2.

Change-Id: I0ccb80b0099f39efad52ccd7d47f2709fdee2a93
CRs-Fixed: 2040457
Manjunathappa Prakash 8 年之前
父節點
當前提交
6c54736903
共有 5 個文件被更改,包括 18 次插入13 次删除
  1. 4 1
      Kbuild
  2. 2 2
      core/dp/ol/inc/ol_txrx_ctrl_api.h
  3. 5 4
      core/dp/txrx/ol_txrx.c
  4. 5 4
      core/dp/txrx/ol_txrx_flow_control.c
  5. 2 2
      core/dp/txrx/ol_txrx_types.h

+ 4 - 1
Kbuild

@@ -182,7 +182,7 @@ ifneq ($(CONFIG_ROME_IF),sdio)
 	CONFIG_WLAN_NAPI_DEBUG := n
 
 	# Flag to enable FW based TX Flow control
-	ifeq ($(CONFIG_CNSS_EOS),y)
+	ifeq (y,$(findstring y,$(CONFIG_CNSS_EOS) $(CONFIG_LITHIUM)))
 		CONFIG_WLAN_TX_FLOW_CONTROL_V2 := y
 	else
 		CONFIG_WLAN_TX_FLOW_CONTROL_V2 := n
@@ -1080,6 +1080,9 @@ DP_OBJS := $(DP_SRC)/dp_main.o \
 		$(DP_SRC)/dp_rx_mon_status.o \
 		$(DP_SRC)/dp_rx_defrag.o \
 		$(DP_SRC)/dp_stats.o
+ifeq ($(CONFIG_WLAN_TX_FLOW_CONTROL_V2), y)
+DP_OBJS += $(DP_SRC)/dp_tx_flow_control.o
+endif
 endif
 
 ############ CFG ############

+ 2 - 2
core/dp/ol/inc/ol_txrx_ctrl_api.h

@@ -514,7 +514,7 @@ uint8_t ol_tx_get_is_mgmt_over_wmi_enabled(void);
 
 void ol_tx_register_flow_control(struct ol_txrx_pdev_t *pdev);
 void ol_tx_deregister_flow_control(struct ol_txrx_pdev_t *pdev);
-void ol_tx_dump_flow_pool_info(void);
+void ol_tx_dump_flow_pool_info(void *);
 void ol_tx_clear_flow_pool_stats(void);
 void ol_tx_flow_pool_map_handler(uint8_t flow_id, uint8_t flow_type,
 				 uint8_t flow_pool_id, uint16_t flow_pool_size);
@@ -557,7 +557,7 @@ static inline void ol_tx_register_flow_control(struct ol_txrx_pdev_t *pdev)
 static inline void ol_tx_deregister_flow_control(struct ol_txrx_pdev_t *pdev)
 {
 }
-static inline void ol_tx_dump_flow_pool_info(void)
+static inline void ol_tx_dump_flow_pool_info(void *ctx)
 {
 }
 static inline void ol_tx_clear_flow_pool_stats(void)

+ 5 - 4
core/dp/txrx/ol_txrx.c

@@ -1807,7 +1807,7 @@ static void ol_txrx_pdev_pre_detach(struct cdp_pdev *ppdev, int force)
 	}
 
 	/* to get flow pool status before freeing descs */
-	ol_tx_dump_flow_pool_info();
+	ol_tx_dump_flow_pool_info((void *)pdev);
 
 	for (i = 0; i < pdev->tx_desc.pool_size; i++) {
 		void *htt_tx_desc;
@@ -4566,7 +4566,7 @@ static QDF_STATUS ol_txrx_display_stats(void *soc, uint16_t value)
 		ol_txrx_stats_display_tso(pdev);
 		break;
 	case CDP_DUMP_TX_FLOW_POOL_INFO:
-		ol_tx_dump_flow_pool_info();
+		ol_tx_dump_flow_pool_info((void *)pdev);
 		break;
 	case CDP_TXRX_DESC_STATS:
 		qdf_nbuf_tx_desc_count_display();
@@ -4979,7 +4979,8 @@ exit:
  *
  * Return: QDF status
  */
-static QDF_STATUS ol_txrx_register_pause_cb(ol_tx_pause_callback_fp pause_cb)
+static QDF_STATUS ol_txrx_register_pause_cb(struct cdp_soc_t *soc,
+	tx_pause_callback pause_cb)
 {
 	struct ol_txrx_pdev_t *pdev = cds_get_context(QDF_MODULE_ID_TXRX);
 
@@ -5348,7 +5349,7 @@ static struct cdp_flowctl_ops ol_ops_flowctl = {
 #ifdef QCA_LL_TX_FLOW_CONTROL_V2
 	.register_pause_cb = ol_txrx_register_pause_cb,
 	.set_desc_global_pool_size = ol_tx_set_desc_global_pool_size,
-	.dump_flow_pool_info = ol_tx_dump_flow_pool_info
+	.dump_flow_pool_info = ol_tx_dump_flow_pool_info,
 #endif /* QCA_LL_TX_FLOW_CONTROL_V2 */
 };
 

+ 5 - 4
core/dp/txrx/ol_txrx_flow_control.c

@@ -128,8 +128,10 @@ void ol_tx_deregister_flow_control(struct ol_txrx_pdev_t *pdev)
 			break;
 		qdf_spin_unlock_bh(&pdev->tx_desc.flow_pool_list_lock);
 		ol_txrx_info("flow pool list is not empty %d!!!\n", i++);
+
 		if (i == 1)
-			ol_tx_dump_flow_pool_info();
+			ol_tx_dump_flow_pool_info((void *)pdev);
+
 		ol_tx_dec_pool_ref(pool, true);
 		qdf_spin_lock_bh(&pdev->tx_desc.flow_pool_list_lock);
 	}
@@ -274,13 +276,12 @@ QDF_STATUS ol_tx_dec_pool_ref(struct ol_tx_flow_pool_t *pool, bool force)
  *
  * Return: none
  */
-void ol_tx_dump_flow_pool_info(void)
+void ol_tx_dump_flow_pool_info(void *ctx)
 {
-	struct ol_txrx_pdev_t *pdev = cds_get_context(QDF_MODULE_ID_TXRX);
+	struct ol_txrx_pdev_t *pdev = ctx;
 	struct ol_tx_flow_pool_t *pool = NULL, *pool_prev = NULL;
 	struct ol_tx_flow_pool_t tmp_pool;
 
-
 	ol_txrx_info("Global Pool");
 	if (!pdev) {
 		ol_txrx_err("ERROR: pdev NULL");

+ 2 - 2
core/dp/txrx/ol_txrx_types.h

@@ -48,7 +48,7 @@
 #include "ol_htt_tx_api.h"
 #include "ol_htt_rx_api.h"
 #include "ol_txrx_ctrl_api.h" /* WLAN_MAX_STA_COUNT */
-#include "ol_txrx_osif_api.h" /* ol_rx_callback_fp */
+#include "ol_txrx_osif_api.h" /* ol_rx_callback */
 #include "cdp_txrx_flow_ctrl_v2.h"
 #include "cdp_txrx_peer_ops.h"
 
@@ -967,7 +967,7 @@ struct ol_txrx_pdev_t {
 	int tid_to_ac[OL_TX_NUM_TIDS + OL_TX_VDEV_NUM_QUEUES];
 	uint8_t ocb_peer_valid;
 	struct ol_txrx_peer_t *ocb_peer;
-	ol_tx_pause_callback_fp pause_cb;
+	tx_pause_callback pause_cb;
 
 	struct {
 		void (*lro_flush_cb)(void *);