qcacld-2.0: Add AC tx queue optimize feature
This feature can enable one AC tx queue optimize,
which make sure the most-recently enqueued AC packet
is transmitted and other packets in the queue is
discarded. To enable the feature, set
gEnableAcTxqOptimize in
WCNSS_qcom_cfg.ini.
Change-Id: I47d503f87dff238a088790c4dc22536b9d2136c4
CRs-Fixed: 2142709
diff --git a/CORE/HDD/inc/wlan_hdd_cfg.h b/CORE/HDD/inc/wlan_hdd_cfg.h
index 0a2bea4..bf7d2b5 100644
--- a/CORE/HDD/inc/wlan_hdd_cfg.h
+++ b/CORE/HDD/inc/wlan_hdd_cfg.h
@@ -3373,6 +3373,32 @@
#define CFG_ENABLE_NAN_SUPPORT_MAX (1)
#endif
+/*
+ * <ini>
+ * gEnableAcTxqOptimize
+ * @Min: 0
+ * @Max: 0x13
+ * @Default: 0
+ *
+ * This ini is used to enable one AC tx queue optimize
+ *
+ * Usage: Internal/External
+ *
+ * bits 0-1: WMM_AC_BE 0
+ * WMM_AC_BK 1
+ * WMM_AC_VI 2
+ * WMM_AC_VO 3
+ * bits 2-3: reserved
+ * bits 4: Enalbe
+ * bits 5-7: reserved
+ *
+ * </ini>
+ */
+#define CFG_ENABLE_AC_TXQ_OPTIMIZE "gEnableAcTxqOptimize"
+#define CFG_ENABLE_AC_TXQ_OPTIMIZE_MIN ( 0x0 )
+#define CFG_ENABLE_AC_TXQ_OPTIMIZE_MAX ( 0x13 )
+#define CFG_ENABLE_AC_TXQ_OPTIMIZE_DEFAULT ( 0x0 )
+
#define CFG_ENABLE_SELF_RECOVERY "gEnableSelfRecovery"
#define CFG_ENABLE_SELF_RECOVERY_MIN ( 0 )
#define CFG_ENABLE_SELF_RECOVERY_MAX ( 1 )
@@ -5376,6 +5402,7 @@
v_U32_t TxPower2g;
v_U32_t TxPower5g;
v_U32_t gEnableDebugLog;
+ uint8_t enable_ac_txq_optimize;
v_U8_t rxhandle;
uint8_t cpu_map_list[CFG_RPS_RX_QUEUE_CPU_MAP_LIST_LEN];
v_BOOL_t fDfsPhyerrFilterOffload;
diff --git a/CORE/HDD/src/wlan_hdd_cfg.c b/CORE/HDD/src/wlan_hdd_cfg.c
index 59437b1..1e80101 100644
--- a/CORE/HDD/src/wlan_hdd_cfg.c
+++ b/CORE/HDD/src/wlan_hdd_cfg.c
@@ -3924,6 +3924,13 @@
CFG_ENABLE_SELF_RECOVERY_MIN,
CFG_ENABLE_SELF_RECOVERY_MAX ),
+ REG_VARIABLE( CFG_ENABLE_AC_TXQ_OPTIMIZE, WLAN_PARAM_HexInteger,
+ hdd_config_t, enable_ac_txq_optimize,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_ENABLE_AC_TXQ_OPTIMIZE_DEFAULT,
+ CFG_ENABLE_AC_TXQ_OPTIMIZE_MIN,
+ CFG_ENABLE_AC_TXQ_OPTIMIZE_MAX ),
+
#ifdef FEATURE_WLAN_FORCE_SAP_SCC
REG_VARIABLE(CFG_SAP_SCC_CHAN_AVOIDANCE, WLAN_PARAM_Integer,
hdd_config_t, SapSccChanAvoidance,
@@ -5815,6 +5822,10 @@
pHddCtx->cfg_ini->enableSelfRecovery);
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH,
+ "Name = [gEnableAcTxqOptimize] Value = [%u]",
+ pHddCtx->cfg_ini->enable_ac_txq_optimize);
+
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH,
"Name = [gEnableSapSuspend] Value = [%u]",
pHddCtx->cfg_ini->enableSapSuspend);
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH,
diff --git a/CORE/HDD/src/wlan_hdd_main.c b/CORE/HDD/src/wlan_hdd_main.c
index 8419ee1..d2263ad 100644
--- a/CORE/HDD/src/wlan_hdd_main.c
+++ b/CORE/HDD/src/wlan_hdd_main.c
@@ -16538,6 +16538,10 @@
hdd_set_idle_ps_config(pHddCtx, TRUE);
}
+ if ((pHddCtx->cfg_ini->enable_ac_txq_optimize >> 4) & 0x01)
+ sme_set_ac_txq_optimize(pHddCtx->hHal,
+ &pHddCtx->cfg_ini->enable_ac_txq_optimize);
+
if (pHddCtx->cfg_ini->enable_go_cts2self_for_sta)
sme_set_cts2self_for_p2p_go(pHddCtx->hHal);
diff --git a/CORE/MAC/src/include/sirParams.h b/CORE/MAC/src/include/sirParams.h
index 7e0b89a..826ae6c 100644
--- a/CORE/MAC/src/include/sirParams.h
+++ b/CORE/MAC/src/include/sirParams.h
@@ -796,6 +796,7 @@
#define SIR_HAL_ACTION_FRAME_RANDOM_MAC (SIR_HAL_ITC_MSG_TYPES_BEGIN + 374)
#define SIR_HAL_PEER_FLUSH_PENDING (SIR_HAL_ITC_MSG_TYPES_BEGIN + 375)
+#define SIR_HAL_SET_AC_TXQ_OPTIMIZE (SIR_HAL_ITC_MSG_TYPES_BEGIN + 376)
#define SIR_HAL_MSG_TYPES_END (SIR_HAL_MSG_TYPES_BEGIN + 0x1FF)
diff --git a/CORE/SERVICES/COMMON/wma_api.h b/CORE/SERVICES/COMMON/wma_api.h
index 65346d9..62fbbff 100644
--- a/CORE/SERVICES/COMMON/wma_api.h
+++ b/CORE/SERVICES/COMMON/wma_api.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013-2016 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2013-2017 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -178,4 +178,6 @@
void wma_tx_failure_cb(void *ctx, uint32_t num_msdu,
uint8_t tid, uint32_t status);
+
+VOS_STATUS wma_set_ac_txq_optimize(void *wda_handle, uint8_t *value);
#endif
diff --git a/CORE/SERVICES/WMA/wma.c b/CORE/SERVICES/WMA/wma.c
index 88d793f..5a2f0fb 100644
--- a/CORE/SERVICES/WMA/wma.c
+++ b/CORE/SERVICES/WMA/wma.c
@@ -34436,6 +34436,10 @@
wma_peer_flush_pending(wma_handle, msg->bodyptr);
vos_mem_free(msg->bodyptr);
break;
+ case WDA_SET_AC_TXQ_OPTIMIZE:
+ wma_set_ac_txq_optimize(wma_handle, msg->bodyptr);
+ vos_mem_free(msg->bodyptr);
+ break;
default:
WMA_LOGD("unknow msg type %x", msg->type);
/* Do Nothing? MSG Body should be freed at here */
@@ -38580,6 +38584,74 @@
}
/**
+ * wmi_unified_ac_txq_optimize_send() - set command to firmware.
+ * @wmi: wmi_unified_t
+ * @ac_txq_optimize: value needs to set to firmware.
+ *
+ * Return: VOS_STATUS.
+ */
+static int32_t
+wmi_unified_ac_txq_optimize_send(wmi_unified_t wmi, uint8_t *ac_txq_optimize)
+{
+ wmi_pdev_set_ac_tx_queue_optimized_cmd_fixed_param *cmd;
+ wmi_buf_t buf;
+ int32_t len = sizeof(*cmd);
+
+ buf = wmi_buf_alloc(wmi, len);
+
+ if (!buf) {
+ WMA_LOGP("%s: wmi_buf_alloc failed", __func__);
+ return -ENOMEM;
+ }
+ cmd = (wmi_pdev_set_ac_tx_queue_optimized_cmd_fixed_param *)
+ wmi_buf_data(buf);
+ WMITLV_SET_HDR(&cmd->tlv_header,
+ WMITLV_TAG_STRUC_wmi_pdev_set_ac_tx_queue_optimized_cmd_fixed_param,
+ WMITLV_GET_STRUCT_TLVLEN(
+ wmi_pdev_set_ac_tx_queue_optimized_cmd_fixed_param));
+
+ cmd->pdev_id = 0;
+ if ((*ac_txq_optimize & 0x0f) < NUM_AC)
+ cmd->ac = *ac_txq_optimize & 0x0f;
+ else
+ return -EINVAL;
+
+ cmd->ac_tx_queue_optimize_enable = 1;
+
+ if (wmi_unified_cmd_send(wmi, buf, len,
+ WMI_PDEV_SET_AC_TX_QUEUE_OPTIMIZED_CMDID)) {
+ WMA_LOGP("%s: Failed to send AC queue optimize command",
+ __func__);
+ wmi_buf_free(buf);
+ return -EIO;
+ }
+ WMA_LOGI("%s: ac %d pdev_id %d", __func__, cmd->ac, cmd->pdev_id);
+ return 0;
+}
+
+/**
+ * wma_set_ac_txq_optimize() - set one AC Tx queue optimize command.
+ * @wda_handle: pointer to wma handle.
+ * @value: value needs to set to firmware.
+ *
+ * Return: VOS_STATUS.
+ */
+VOS_STATUS wma_set_ac_txq_optimize(void *wda_handle, uint8_t *value)
+{
+ int32_t ret;
+ tp_wma_handle wma = (tp_wma_handle)wda_handle;
+
+ ret = wmi_unified_ac_txq_optimize_send(wma->wmi_handle, value);
+ if (ret) {
+ WMA_LOGE("Fail to Set AC queue, input 0x%02x", *value);
+ return VOS_STATUS_E_FAILURE;
+ }
+
+ WMA_LOGI("Successfully Set AC queue, input 0x%02x", *value);
+ return VOS_STATUS_SUCCESS;
+}
+
+/**
* wma_set_mib_stats_enable() - enable mib stats in FW.
* @wda_handle: pointer to wma handle.
* @enable: value needs to set to firmware.
diff --git a/CORE/SME/inc/sme_Api.h b/CORE/SME/inc/sme_Api.h
index 0ffdfa0..3aed2c9 100644
--- a/CORE/SME/inc/sme_Api.h
+++ b/CORE/SME/inc/sme_Api.h
@@ -4824,4 +4824,6 @@
eHalStatus sme_set_chip_pwr_save_fail_cb(tHalHandle hal, void (*cb)( void *,
struct chip_pwr_save_fail_detected_params *));
+eHalStatus sme_set_ac_txq_optimize(tHalHandle hal_handle, uint8_t *value);
+
#endif //#if !defined( __SME_API_H )
diff --git a/CORE/SME/src/sme_common/sme_Api.c b/CORE/SME/src/sme_common/sme_Api.c
index 2eec9c6..87db225 100644
--- a/CORE/SME/src/sme_common/sme_Api.c
+++ b/CORE/SME/src/sme_common/sme_Api.c
@@ -14529,6 +14529,28 @@
return status;
}
+/**
+ * sme_set_ac_txq_optimize() - sme function to set ini parms to FW.
+ * @hal_handle: reference to the HAL
+ * @value reference to the value
+ * Return: hal_status
+ */
+eHalStatus sme_set_ac_txq_optimize(tHalHandle hal_handle, uint8_t *value)
+{
+ eHalStatus status = eHAL_STATUS_SUCCESS;
+ vos_msg_t vos_msg;
+
+ vos_msg.bodyptr = value;
+ vos_msg.type = WDA_SET_AC_TXQ_OPTIMIZE;
+ if (!VOS_IS_STATUS_SUCCESS(vos_mq_post_message(VOS_MODULE_ID_WDA,
+ &vos_msg))) {
+ VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_ERROR,
+ FL("Failed to post WDA_SET_AC_TXQ_OPTIMIZE to WDA"));
+ status = eHAL_STATUS_FAILURE;
+ }
+ return status;
+}
+
eHalStatus sme_ConfigEnablePowerSave (tHalHandle hHal, tPmcPowerSavingMode psMode)
{
eHalStatus status = eHAL_STATUS_FAILURE;
diff --git a/CORE/WDA/inc/wlan_qct_wda.h b/CORE/WDA/inc/wlan_qct_wda.h
index 71828b9..de561c9 100644
--- a/CORE/WDA/inc/wlan_qct_wda.h
+++ b/CORE/WDA/inc/wlan_qct_wda.h
@@ -1104,6 +1104,8 @@
#define WDA_UPDATE_STA_INACTIVITY_TIMEOUT SIR_HAL_STA_INACTIVITY_TIMEOUT
#define WDA_ACTION_FRAME_RANDOM_MAC SIR_HAL_ACTION_FRAME_RANDOM_MAC
+#define WDA_SET_AC_TXQ_OPTIMIZE SIR_HAL_SET_AC_TXQ_OPTIMIZE
+
tSirRetStatus wdaPostCtrlMsg(tpAniSirGlobal pMac, tSirMsgQ *pMsg);
#define HAL_USE_BD_RATE2_FOR_MANAGEMENT_FRAME 0x40 // Bit 6 will be used to control BD rate for Management frames