Browse Source

qcacld-3.0: Add an INI item to disable dynamic tcp delayed ack

Add an INI item to disable dynamic tcp delayed ack feature.
By default, the dynamic delayed ack is always enabled

Change-Id: I64b551ff294afc876fe46538d364e0c39add76ac
CRs-Fixed: 865144
Ravi Joshi 9 years ago
parent
commit
e2331e8f03
3 changed files with 46 additions and 8 deletions
  1. 12 0
      core/hdd/inc/wlan_hdd_cfg.h
  2. 13 0
      core/hdd/src/wlan_hdd_cfg.c
  3. 21 8
      core/hdd/src/wlan_hdd_main.c

+ 12 - 0
core/hdd/inc/wlan_hdd_cfg.h

@@ -2264,6 +2264,17 @@ typedef enum {
 #define CFG_BUS_BANDWIDTH_COMPUTE_INTERVAL_MIN     (0)
 #define CFG_BUS_BANDWIDTH_COMPUTE_INTERVAL_MAX     (10000)
 
+/*
+ * Dynamic configuration of tcp delack is enabled by default.
+ * User can set gTcpDelAckEnable flag to 0 in the INI file to disable dynamic
+ * reconfiguration of tcp delack. This does not disable the update of receive
+ * histogram
+ */
+#define CFG_ENABLE_TCP_DELACK                      "gTcpDelAckEnable"
+#define CFG_ENABLE_TCP_DELACK_DEFAULT              (1)
+#define CFG_ENABLE_TCP_DELACK_MIN                  (0)
+#define CFG_ENABLE_TCP_DELACK_MAX                  (1)
+
 #define CFG_TCP_DELACK_THRESHOLD_HIGH              "gTcpDelAckThresholdHigh"
 #define CFG_TCP_DELACK_THRESHOLD_HIGH_DEFAULT      (500)
 #define CFG_TCP_DELACK_THRESHOLD_HIGH_MIN          (0)
@@ -3392,6 +3403,7 @@ struct hdd_config {
 	uint32_t busBandwidthMediumThreshold;
 	uint32_t busBandwidthLowThreshold;
 	uint32_t busBandwidthComputeInterval;
+	uint32_t enable_tcp_delack;
 	uint32_t tcpDelackThresholdHigh;
 	uint32_t tcpDelackThresholdLow;
 	uint32_t tcp_tx_high_tput_thres;

+ 13 - 0
core/hdd/src/wlan_hdd_cfg.c

@@ -3030,12 +3030,21 @@ REG_TABLE_ENTRY g_registry_table[] = {
 		     CFG_BUS_BANDWIDTH_COMPUTE_INTERVAL_DEFAULT,
 		     CFG_BUS_BANDWIDTH_COMPUTE_INTERVAL_MIN,
 		     CFG_BUS_BANDWIDTH_COMPUTE_INTERVAL_MAX),
+
+	REG_VARIABLE(CFG_ENABLE_TCP_DELACK, WLAN_PARAM_Integer,
+		     struct hdd_config, enable_tcp_delack,
+		     VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+		     CFG_ENABLE_TCP_DELACK_DEFAULT,
+		     CFG_ENABLE_TCP_DELACK_MIN,
+		     CFG_ENABLE_TCP_DELACK_MAX),
+
 	REG_VARIABLE(CFG_TCP_DELACK_THRESHOLD_HIGH, WLAN_PARAM_Integer,
 		     struct hdd_config, tcpDelackThresholdHigh,
 		     VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
 		     CFG_TCP_DELACK_THRESHOLD_HIGH_DEFAULT,
 		     CFG_TCP_DELACK_THRESHOLD_HIGH_MIN,
 		     CFG_TCP_DELACK_THRESHOLD_HIGH_MAX),
+
 	REG_VARIABLE(CFG_TCP_DELACK_THRESHOLD_LOW, WLAN_PARAM_Integer,
 		     struct hdd_config, tcpDelackThresholdLow,
 		     VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
@@ -5098,6 +5107,10 @@ void hdd_cfg_print(hdd_context_t *pHddCtx)
 	QDF_TRACE(QDF_MODULE_ID_HDD, QDF_TRACE_LEVEL_INFO_HIGH,
 		  "Name = [gbusBandwidthComputeInterval] Value = [%u] ",
 		  pHddCtx->config->busBandwidthComputeInterval);
+	QDF_TRACE(QDF_MODULE_ID_HDD, QDF_TRACE_LEVEL_INFO_HIGH,
+		  "Name = [%s] Value = [%u] ",
+		  CFG_ENABLE_TCP_DELACK,
+		  pHddCtx->config->enable_tcp_delack);
 	QDF_TRACE(QDF_MODULE_ID_HDD, QDF_TRACE_LEVEL_INFO_HIGH,
 		  "Name = [gTcpDelAckThresholdHigh] Value = [%u] ",
 		  pHddCtx->config->tcpDelackThresholdHigh);

+ 21 - 8
core/hdd/src/wlan_hdd_main.c

@@ -4309,6 +4309,17 @@ static int hdd_wiphy_init(hdd_context_t *hdd_ctx)
 	return ret_val;
 }
 
+/**
+ * hdd_cnss_request_bus_bandwidth() - Function to control bus bandwidth
+ * @hdd_ctx - handle to hdd context
+ * @tx_packets - transmit packet count
+ * @rx_packets - receive packet count
+ *
+ * The function controls the bus bandwidth and dynamic control of
+ * tcp delayed ack configuration
+ *
+ * Returns: None
+ */
 #ifdef MSM_PLATFORM
 void hdd_cnss_request_bus_bandwidth(hdd_context_t *hdd_ctx,
 			const uint64_t tx_packets, const uint64_t rx_packets)
@@ -4335,11 +4346,8 @@ void hdd_cnss_request_bus_bandwidth(hdd_context_t *hdd_ctx,
 							next_vote_level;
 
 	if (hdd_ctx->cur_vote_level != next_vote_level) {
-		hddLog(QDF_TRACE_LEVEL_DEBUG,
-		       FL(
-			  "trigger level %d, tx_packets: %lld, rx_packets: %lld"
-			 ),
-		       next_vote_level, tx_packets, rx_packets);
+		hdd_debug("trigger level %d, tx_packets: %lld, rx_packets: %lld",
+			 next_vote_level, tx_packets, rx_packets);
 		hdd_ctx->cur_vote_level = next_vote_level;
 		cnss_request_bus_bandwidth(next_vote_level);
 	}
@@ -4357,11 +4365,16 @@ void hdd_cnss_request_bus_bandwidth(hdd_context_t *hdd_ctx,
 								next_rx_level;
 
 	if (hdd_ctx->cur_rx_level != next_rx_level) {
-		hddLog(QDF_TRACE_LEVEL_DEBUG,
-		       FL("TCP DELACK trigger level %d, average_rx: %llu"),
+		hdd_debug("TCP DELACK trigger level %d, average_rx: %llu",
 		       next_rx_level, temp_rx);
 		hdd_ctx->cur_rx_level = next_rx_level;
-		wlan_hdd_send_svc_nlink_msg(WLAN_SVC_WLAN_TP_IND,
+		/* Send throughput indication only if it is enabled.
+		 * Disabling tcp_del_ack will revert the tcp stack behavior
+		 * to default delayed ack. Note that this will disable the
+		 * dynamic delayed ack mechanism across the system
+		 */
+		if (hdd_ctx->config->enable_tcp_delack)
+			wlan_hdd_send_svc_nlink_msg(WLAN_SVC_WLAN_TP_IND,
 					    &next_rx_level,
 					    sizeof(next_rx_level));
 	}