From 6c547369034c686becd777dda60511a81aca3027 Mon Sep 17 00:00:00 2001 From: Manjunathappa Prakash Date: Thu, 30 Mar 2017 20:11:47 -0700 Subject: [PATCH] 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 --- Kbuild | 5 ++++- core/dp/ol/inc/ol_txrx_ctrl_api.h | 4 ++-- core/dp/txrx/ol_txrx.c | 9 +++++---- core/dp/txrx/ol_txrx_flow_control.c | 9 +++++---- core/dp/txrx/ol_txrx_types.h | 4 ++-- 5 files changed, 18 insertions(+), 13 deletions(-) diff --git a/Kbuild b/Kbuild index fc4f0a715b5a..ee372fd4b9c6 100644 --- a/Kbuild +++ b/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 ############ diff --git a/core/dp/ol/inc/ol_txrx_ctrl_api.h b/core/dp/ol/inc/ol_txrx_ctrl_api.h index fd6c498af8a3..de4fc9e41200 100644 --- a/core/dp/ol/inc/ol_txrx_ctrl_api.h +++ b/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) diff --git a/core/dp/txrx/ol_txrx.c b/core/dp/txrx/ol_txrx.c index 205d83449bb5..fa33c2f4dcc2 100644 --- a/core/dp/txrx/ol_txrx.c +++ b/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 */ }; diff --git a/core/dp/txrx/ol_txrx_flow_control.c b/core/dp/txrx/ol_txrx_flow_control.c index 037335213ffa..405ed382f6c3 100644 --- a/core/dp/txrx/ol_txrx_flow_control.c +++ b/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"); diff --git a/core/dp/txrx/ol_txrx_types.h b/core/dp/txrx/ol_txrx_types.h index 9b7eadfc6f25..050818ffda28 100644 --- a/core/dp/txrx/ol_txrx_types.h +++ b/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 *);