Merge "qcacmn: Reduce log level for stats message"
diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c
index b263ca2..5d9416e 100644
--- a/dp/wifi3.0/dp_main.c
+++ b/dp/wifi3.0/dp_main.c
@@ -1189,9 +1189,95 @@
 	return QDF_STATUS_SUCCESS;
 }
 
+#ifdef WLAN_DP_PER_RING_TYPE_CONFIG
+/**
+ * dp_srng_configure_interrupt_thresholds() - Retrieve interrupt
+ * threshold values from the wlan_srng_cfg table for each ring type
+ * @soc: device handle
+ * @ring_params: per ring specific parameters
+ * @ring_type: Ring type
+ * @ring_num: Ring number for a given ring type
+ *
+ * Fill the ring params with the interrupt threshold
+ * configuration parameters available in the per ring type wlan_srng_cfg
+ * table.
+ *
+ * Return: None
+ */
+static void
+dp_srng_configure_interrupt_thresholds(struct dp_soc *soc,
+				       struct hal_srng_params *ring_params,
+				       int ring_type, int ring_num,
+				       int num_entries)
+{
+	if (ring_type == WBM2SW_RELEASE && (ring_num == 3)) {
+		ring_params->intr_timer_thres_us =
+				wlan_cfg_get_int_timer_threshold_other(soc->wlan_cfg_ctx);
+		ring_params->intr_batch_cntr_thres_entries =
+				wlan_cfg_get_int_batch_threshold_other(soc->wlan_cfg_ctx);
+	} else {
+		ring_params->intr_timer_thres_us =
+				soc->wlan_srng_cfg[ring_type].timer_threshold;
+		ring_params->intr_batch_cntr_thres_entries =
+				soc->wlan_srng_cfg[ring_type].batch_count_threshold;
+	}
+	ring_params->low_threshold =
+			soc->wlan_srng_cfg[ring_type].low_threshold;
 
-/*
- * dp_setup_srng - Internal function to setup SRNG rings used by data path
+	if (ring_params->low_threshold)
+		ring_params->flags |= HAL_SRNG_LOW_THRES_INTR_ENABLE;
+}
+#else
+static void
+dp_srng_configure_interrupt_thresholds(struct dp_soc *soc,
+				       struct hal_srng_params *ring_params,
+				       int ring_type, int ring_num,
+				       int num_entries)
+{
+	if (ring_type == REO_DST) {
+		ring_params->intr_timer_thres_us =
+			wlan_cfg_get_int_timer_threshold_rx(soc->wlan_cfg_ctx);
+		ring_params->intr_batch_cntr_thres_entries =
+			wlan_cfg_get_int_batch_threshold_rx(soc->wlan_cfg_ctx);
+	} else if (ring_type == WBM2SW_RELEASE && (ring_num < 3)) {
+		ring_params->intr_timer_thres_us =
+			wlan_cfg_get_int_timer_threshold_tx(soc->wlan_cfg_ctx);
+		ring_params->intr_batch_cntr_thres_entries =
+			wlan_cfg_get_int_batch_threshold_tx(soc->wlan_cfg_ctx);
+	} else {
+		ring_params->intr_timer_thres_us =
+			wlan_cfg_get_int_timer_threshold_other(soc->wlan_cfg_ctx);
+		ring_params->intr_batch_cntr_thres_entries =
+			wlan_cfg_get_int_batch_threshold_other(soc->wlan_cfg_ctx);
+	}
+
+	/* Enable low threshold interrupts for rx buffer rings (regular and
+	 * monitor buffer rings.
+	 * TODO: See if this is required for any other ring
+	 */
+	if ((ring_type == RXDMA_BUF) || (ring_type == RXDMA_MONITOR_BUF) ||
+	    (ring_type == RXDMA_MONITOR_STATUS)) {
+		/* TODO: Setting low threshold to 1/8th of ring size
+		 * see if this needs to be configurable
+		 */
+		ring_params->low_threshold = num_entries >> 3;
+		ring_params->intr_timer_thres_us =
+			wlan_cfg_get_int_timer_threshold_rx(soc->wlan_cfg_ctx);
+		ring_params->flags |= HAL_SRNG_LOW_THRES_INTR_ENABLE;
+		ring_params->intr_batch_cntr_thres_entries = 0;
+	}
+}
+#endif
+
+/**
+ * dp_srng_setup() - Internal function to setup SRNG rings used by data path
+ * @soc: datapath soc handle
+ * @srng: srng handle
+ * @ring_type: ring that needs to be configured
+ * @mac_id: mac number
+ * @num_entries: Total number of entries for a given ring
+ *
+ * Return: non-zero - failure/zero - success
  */
 static int dp_srng_setup(struct dp_soc *soc, struct dp_srng *srng,
 			 int ring_type, int ring_num, int mac_id,
@@ -1254,42 +1340,9 @@
 				 ring_type, ring_num);
 	}
 
-	/*
-	 * Setup interrupt timer and batch counter thresholds for
-	 * interrupt mitigation based on ring type
-	 */
-	if (ring_type == REO_DST) {
-		ring_params.intr_timer_thres_us =
-			wlan_cfg_get_int_timer_threshold_rx(soc->wlan_cfg_ctx);
-		ring_params.intr_batch_cntr_thres_entries =
-			wlan_cfg_get_int_batch_threshold_rx(soc->wlan_cfg_ctx);
-	} else if (ring_type == WBM2SW_RELEASE && (ring_num < 3)) {
-		ring_params.intr_timer_thres_us =
-			wlan_cfg_get_int_timer_threshold_tx(soc->wlan_cfg_ctx);
-		ring_params.intr_batch_cntr_thres_entries =
-			wlan_cfg_get_int_batch_threshold_tx(soc->wlan_cfg_ctx);
-	} else {
-		ring_params.intr_timer_thres_us =
-			wlan_cfg_get_int_timer_threshold_other(soc->wlan_cfg_ctx);
-		ring_params.intr_batch_cntr_thres_entries =
-			wlan_cfg_get_int_batch_threshold_other(soc->wlan_cfg_ctx);
-	}
-
-	/* Enable low threshold interrupts for rx buffer rings (regular and
-	 * monitor buffer rings.
-	 * TODO: See if this is required for any other ring
-	 */
-	if ((ring_type == RXDMA_BUF) || (ring_type == RXDMA_MONITOR_BUF) ||
-		(ring_type == RXDMA_MONITOR_STATUS)) {
-		/* TODO: Setting low threshold to 1/8th of ring size
-		 * see if this needs to be configurable
-		 */
-		ring_params.low_threshold = num_entries >> 3;
-		ring_params.flags |= HAL_SRNG_LOW_THRES_INTR_ENABLE;
-		ring_params.intr_timer_thres_us =
-			wlan_cfg_get_int_timer_threshold_rx(soc->wlan_cfg_ctx);
-		ring_params.intr_batch_cntr_thres_entries = 0;
-	}
+	dp_srng_configure_interrupt_thresholds(soc, &ring_params,
+					       ring_type, ring_num,
+					       num_entries);
 
 	if (cached) {
 		ring_params.flags |= HAL_SRNG_CACHED_DESC;
@@ -9407,6 +9460,8 @@
 	soc->osdev = qdf_osdev;
 	soc->num_hw_dscp_tid_map = HAL_MAX_HW_DSCP_TID_MAPS;
 
+	wlan_set_srng_cfg(&soc->wlan_srng_cfg);
+
 	soc->wlan_cfg_ctx = wlan_cfg_soc_attach(soc->ctrl_psoc);
 	if (!soc->wlan_cfg_ctx) {
 		dp_err("wlan_cfg_ctx failed\n");
diff --git a/dp/wifi3.0/dp_types.h b/dp/wifi3.0/dp_types.h
index fc0ed82..8bab926 100644
--- a/dp/wifi3.0/dp_types.h
+++ b/dp/wifi3.0/dp_types.h
@@ -1118,6 +1118,8 @@
 	uint8_t pcp_tid_map[PCP_TID_MAP_MAX];
 	/* TID map priority value */
 	uint8_t tidmap_prty;
+	/* Pointer to global per ring type specific configuration table */
+	struct wlan_srng_cfg *wlan_srng_cfg;
 };
 
 #ifdef IPA_OFFLOAD
diff --git a/umac/cp_stats/dispatcher/src/wlan_cp_stats_mc_tgt_api.c b/umac/cp_stats/dispatcher/src/wlan_cp_stats_mc_tgt_api.c
index befc0b4..b4eb746 100644
--- a/umac/cp_stats/dispatcher/src/wlan_cp_stats_mc_tgt_api.c
+++ b/umac/cp_stats/dispatcher/src/wlan_cp_stats_mc_tgt_api.c
@@ -253,7 +253,7 @@
 	peer = wlan_objmgr_get_peer_by_mac(psoc, peer_mac_addr,
 					   WLAN_CP_STATS_ID);
 	if (!peer) {
-		cp_stats_err("peer is null");
+		cp_stats_debug("peer is null");
 		return QDF_STATUS_E_EXISTS;
 	}
 	peer_cp_stats_priv = wlan_cp_stats_get_peer_stats_obj(peer);
@@ -300,7 +300,7 @@
 	peer = wlan_objmgr_get_peer_by_mac(psoc, peer_mac_addr,
 				    WLAN_CP_STATS_ID);
 	if (!peer) {
-		cp_stats_err("peer is null");
+		cp_stats_debug("peer is null");
 		return QDF_STATUS_E_EXISTS;
 	}
 
@@ -353,7 +353,7 @@
 	peer = wlan_objmgr_get_peer_by_mac(psoc, peer_mac_addr,
 					   WLAN_CP_STATS_ID);
 	if (!peer) {
-		cp_stats_err("peer is null");
+		cp_stats_debug("peer is null");
 		return QDF_STATUS_E_EXISTS;
 	}
 
@@ -511,7 +511,7 @@
 	/* no matched peer */
 	if (!QDF_IS_ADDR_BROADCAST(last_req.peer_mac_addr) &&
 	    selected == ev->num_peer_adv_stats) {
-		cp_stats_err("peer not found for extd stats");
+		cp_stats_debug("peer not found for extd stats");
 		return;
 	}
 
@@ -617,7 +617,7 @@
 	peer = wlan_objmgr_get_peer(psoc, last_req.pdev_id,
 				    last_req.peer_mac_addr, WLAN_CP_STATS_ID);
 	if (!peer) {
-		cp_stats_err("peer is null %pM", last_req.peer_mac_addr);
+		cp_stats_debug("peer is null %pM", last_req.peer_mac_addr);
 		goto end;
 	}
 
diff --git a/wlan_cfg/cfg_dp.h b/wlan_cfg/cfg_dp.h
index 452e67f..402bba6 100644
--- a/wlan_cfg/cfg_dp.h
+++ b/wlan_cfg/cfg_dp.h
@@ -88,6 +88,9 @@
 #define WLAN_CFG_INT_TIMER_THRESHOLD_OTHER 8
 #endif
 
+#define WLAN_CFG_INT_TIMER_THRESHOLD_WBM_RELEASE_RING 256
+#define WLAN_CFG_INT_TIMER_THRESHOLD_REO_RING 256
+
 #define WLAN_CFG_PER_PDEV_RX_RING_MIN 0
 #define WLAN_CFG_PER_PDEV_RX_RING_MAX 0
 
@@ -112,6 +115,12 @@
 #define WLAN_CFG_INT_BATCH_THRESHOLD_RX_MIN 1
 #define WLAN_CFG_INT_BATCH_THRESHOLD_RX_MAX 128
 
+#define WLAN_CFG_INT_BATCH_THRESHOLD_REO_RING_MIN 1
+#define WLAN_CFG_INT_BATCH_THRESHOLD_REO_RING_MAX 128
+
+#define WLAN_CFG_INT_BATCH_THRESHOLD_WBM_RELEASE_RING_MIN 1
+#define WLAN_CFG_INT_BATCH_THRESHOLD_WBM_RELEASE_RING_MAX 128
+
 #define WLAN_CFG_INT_BATCH_THRESHOLD_OTHER_MIN 1
 #define WLAN_CFG_INT_BATCH_THRESHOLD_OTHER_MAX 1
 
@@ -124,6 +133,12 @@
 #define WLAN_CFG_INT_TIMER_THRESHOLD_OTHER_MIN 8
 #define WLAN_CFG_INT_TIMER_THRESHOLD_OTHER_MAX 1000
 
+#define WLAN_CFG_INT_TIMER_THRESHOLD_REO_RING_MIN 8
+#define WLAN_CFG_INT_TIMER_THRESHOLD_REO_RING_MAX 500
+
+#define WLAN_CFG_INT_TIMER_THRESHOLD_WBM_RELEASE_RING_MIN 8
+#define WLAN_CFG_INT_TIMER_THRESHOLD_WBM_RELEASE_RING_MAX 500
+
 #define WLAN_CFG_NSS_TX_COMP_RING_SIZE 0x2000
 #define WLAN_CFG_NSS_TX_COMP_RING_SIZE_MIN 0x2000
 #define WLAN_CFG_NSS_TX_COMP_RING_SIZE_MAX 0xc000
@@ -257,14 +272,14 @@
 		WLAN_CFG_INT_BATCH_THRESHOLD_OTHER_MIN, \
 		WLAN_CFG_INT_BATCH_THRESHOLD_OTHER_MAX, \
 		WLAN_CFG_INT_BATCH_THRESHOLD_OTHER, \
-		CFG_VALUE_OR_DEFAULT, "DP INT threshold Other")
+		CFG_VALUE_OR_DEFAULT, "DP INT batch threshold Other")
 
 #define CFG_DP_INT_BATCH_THRESHOLD_RX \
 		CFG_INI_UINT("dp_int_batch_threshold_rx", \
 		WLAN_CFG_INT_BATCH_THRESHOLD_RX_MIN, \
 		WLAN_CFG_INT_BATCH_THRESHOLD_RX_MAX, \
 		WLAN_CFG_INT_BATCH_THRESHOLD_RX, \
-		CFG_VALUE_OR_DEFAULT, "DP INT threshold Rx")
+		CFG_VALUE_OR_DEFAULT, "DP INT batch threshold Rx")
 
 #define CFG_DP_INT_BATCH_THRESHOLD_TX \
 		CFG_INI_UINT("dp_int_batch_threshold_tx", \
@@ -287,6 +302,20 @@
 		WLAN_CFG_INT_TIMER_THRESHOLD_RX, \
 		CFG_VALUE_OR_DEFAULT, "DP INT timer threshold Rx")
 
+#define CFG_DP_INT_TIMER_THRESHOLD_REO_RING \
+		CFG_INI_UINT("dp_int_timer_threshold_reo_ring", \
+		WLAN_CFG_INT_TIMER_THRESHOLD_REO_RING_MIN, \
+		WLAN_CFG_INT_TIMER_THRESHOLD_REO_RING_MAX, \
+		WLAN_CFG_INT_TIMER_THRESHOLD_REO_RING, \
+		CFG_VALUE_OR_DEFAULT, "DP INT timer threshold Reo ring")
+
+#define CFG_DP_INT_TIMER_THRESHOLD_WBM_RELEASE_RING \
+		CFG_INI_UINT("dp_int_timer_threshold_wbm_release_ring", \
+		WLAN_CFG_INT_TIMER_THRESHOLD_WBM_RELEASE_RING_MIN, \
+		WLAN_CFG_INT_TIMER_THRESHOLD_WBM_RELEASE_RING_MAX, \
+		WLAN_CFG_INT_TIMER_THRESHOLD_WBM_RELEASE_RING, \
+		CFG_VALUE_OR_DEFAULT, "DP INT timer threshold wbm release ring")
+
 #define CFG_DP_INT_TIMER_THRESHOLD_TX \
 		CFG_INI_UINT("dp_int_timer_threshold_tx", \
 		WLAN_CFG_INT_TIMER_THRESHOLD_TX_MIN, \
diff --git a/wlan_cfg/wlan_cfg.c b/wlan_cfg/wlan_cfg.c
index 9de7abd..44a5ffb 100644
--- a/wlan_cfg/wlan_cfg.c
+++ b/wlan_cfg/wlan_cfg.c
@@ -27,6 +27,7 @@
 #include <cdp_txrx_ops.h>
 #include "wlan_cfg.h"
 #include "cfg_ucfg_api.h"
+#include "hal_api.h"
 
 /*
  * FIX THIS -
@@ -203,6 +204,82 @@
 #endif /*CONFIG_MCL*/
 
 /**
+ * g_wlan_srng_cfg[] - Per ring_type specific configuration
+ *
+ */
+struct wlan_srng_cfg g_wlan_srng_cfg[MAX_RING_TYPES];
+
+/* REO_DST ring configuration */
+struct wlan_srng_cfg wlan_srng_reo_cfg = {
+	.timer_threshold = WLAN_CFG_INT_TIMER_THRESHOLD_REO_RING,
+	.batch_count_threshold = 0,
+	.low_threshold = 0,
+};
+
+/* WBM2SW_RELEASE ring configuration */
+struct wlan_srng_cfg wlan_srng_wbm_release_cfg = {
+	.timer_threshold = WLAN_CFG_INT_TIMER_THRESHOLD_WBM_RELEASE_RING,
+	.batch_count_threshold = 0,
+	.low_threshold = 0,
+};
+
+/* RXDMA_BUF ring configuration */
+struct wlan_srng_cfg wlan_srng_rxdma_buf_cfg = {
+	.timer_threshold = WLAN_CFG_INT_TIMER_THRESHOLD_RX,
+	.batch_count_threshold = 0,
+	.low_threshold = WLAN_CFG_RXDMA_REFILL_RING_SIZE >> 3,
+};
+
+/* RXDMA_MONITOR_BUF ring configuration */
+struct wlan_srng_cfg wlan_srng_rxdma_monitor_buf_cfg = {
+	.timer_threshold = WLAN_CFG_INT_TIMER_THRESHOLD_RX,
+	.batch_count_threshold = 0,
+	.low_threshold = WLAN_CFG_RXDMA_MONITOR_BUF_RING_SIZE >> 3,
+};
+
+/* RXDMA_MONITOR_STATUS ring configuration */
+struct wlan_srng_cfg wlan_srng_rxdma_monitor_status_cfg = {
+	.timer_threshold = WLAN_CFG_INT_TIMER_THRESHOLD_RX,
+	.batch_count_threshold = 0,
+	.low_threshold = WLAN_CFG_RXDMA_MONITOR_STATUS_RING_SIZE >> 3,
+};
+
+/* DEFAULT_CONFIG ring configuration */
+struct wlan_srng_cfg wlan_srng_default_cfg = {
+	.timer_threshold = WLAN_CFG_INT_TIMER_THRESHOLD_OTHER,
+	.batch_count_threshold = WLAN_CFG_INT_BATCH_THRESHOLD_OTHER,
+	.low_threshold = 0,
+};
+
+void wlan_set_srng_cfg(struct wlan_srng_cfg **wlan_cfg)
+{
+	g_wlan_srng_cfg[REO_DST] = wlan_srng_reo_cfg;
+	g_wlan_srng_cfg[WBM2SW_RELEASE] = wlan_srng_wbm_release_cfg;
+	g_wlan_srng_cfg[REO_EXCEPTION] = wlan_srng_default_cfg;
+	g_wlan_srng_cfg[REO_REINJECT] = wlan_srng_default_cfg;
+	g_wlan_srng_cfg[REO_CMD] = wlan_srng_default_cfg;
+	g_wlan_srng_cfg[REO_STATUS] = wlan_srng_default_cfg;
+	g_wlan_srng_cfg[TCL_DATA] = wlan_srng_default_cfg;
+	g_wlan_srng_cfg[TCL_CMD] = wlan_srng_default_cfg;
+	g_wlan_srng_cfg[TCL_STATUS] = wlan_srng_default_cfg;
+	g_wlan_srng_cfg[WBM_IDLE_LINK] = wlan_srng_default_cfg;
+	g_wlan_srng_cfg[SW2WBM_RELEASE] = wlan_srng_default_cfg;
+	g_wlan_srng_cfg[RXDMA_BUF] = wlan_srng_rxdma_buf_cfg;
+	g_wlan_srng_cfg[RXDMA_DST] = wlan_srng_default_cfg;
+	g_wlan_srng_cfg[RXDMA_MONITOR_BUF] =
+			wlan_srng_rxdma_monitor_buf_cfg;
+	g_wlan_srng_cfg[RXDMA_MONITOR_STATUS] =
+			wlan_srng_rxdma_monitor_status_cfg;
+	g_wlan_srng_cfg[RXDMA_MONITOR_DST] = wlan_srng_default_cfg;
+	g_wlan_srng_cfg[RXDMA_MONITOR_DESC] = wlan_srng_default_cfg;
+	g_wlan_srng_cfg[DIR_BUF_RX_DMA_SRC] = wlan_srng_default_cfg;
+#ifdef WLAN_FEATURE_CIF_CFR
+	g_wlan_srng_cfg[WIFI_POS_SRC] = wlan_srng_default_cfg;
+#endif
+	*wlan_cfg = g_wlan_srng_cfg;
+}
+
+/**
  * wlan_cfg_soc_attach() - Allocate and prepare SoC configuration
  * @psoc - Object manager psoc
  * Return: wlan_cfg_ctx - Handle to Configuration context
@@ -241,6 +318,7 @@
 
 	wlan_cfg_ctx->tx_comp_ring_size_nss =
 		cfg_get(psoc, CFG_DP_NSS_COMP_RING_SIZE);
+
 	wlan_cfg_ctx->int_batch_threshold_tx =
 			cfg_get(psoc, CFG_DP_INT_BATCH_THRESHOLD_TX);
 	wlan_cfg_ctx->int_timer_threshold_tx =
diff --git a/wlan_cfg/wlan_cfg.h b/wlan_cfg/wlan_cfg.h
index a4928cb..a50fcc0 100644
--- a/wlan_cfg/wlan_cfg.h
+++ b/wlan_cfg/wlan_cfg.h
@@ -75,6 +75,19 @@
 struct wlan_cfg_dp_pdev_ctxt;
 
 /**
+ * struct wlan_srng_cfg - Per ring configuration parameters
+ * @timer_threshold: Config to control interrupts based on timer duration
+ * @batch_count_threshold: Config to control interrupts based on
+ * number of packets in the ring
+ * @low_threshold: Config to control low threshold interrupts for SRC rings
+ */
+struct wlan_srng_cfg {
+	uint32_t timer_threshold;
+	uint32_t batch_count_threshold;
+	uint32_t low_threshold;
+};
+
+/**
  * struct wlan_cfg_dp_soc_ctxt - Configuration parameters for SoC (core TxRx)
  * @num_int_ctxts: Number of NAPI/Interrupt contexts to be registered for DP
  * @max_clients: Maximum number of peers/stations supported by device
@@ -1002,6 +1015,16 @@
 bool
 wlan_cfg_get_dp_caps(struct wlan_cfg_dp_soc_ctxt *cfg,
 		     enum cdp_capabilities dp_caps);
+
+/**
+ * wlan_set_srng_cfg() - Fill per ring specific
+ * configuration parameters
+ * @wlan_cfg: global srng configuration table
+ *
+ * Return: None
+ */
+void wlan_set_srng_cfg(struct wlan_srng_cfg **wlan_cfg);
+
 #ifdef QCA_LL_TX_FLOW_CONTROL_V2
 int wlan_cfg_get_tx_flow_stop_queue_th(struct wlan_cfg_dp_soc_ctxt *cfg);