summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgbian <gbian@qti.qualcomm.com>2016-05-26 14:04:41 +0800
committerAnjaneedevi Kapparapu <akappa@codeaurora.org>2016-06-03 12:12:12 +0530
commitf4504502baa45e5574eb3d9bf1039bb4a8db8274 (patch)
treed1e155eca3f8575000a437cee60f6ec64ad065a9
parent4694549c4182aa81b88196d85b46295d4e143a74 (diff)
qcacld-2.0: Add ini keys for WRR tx scheduler tuning
Add below four keys to allow user to tune WRR TX scheduler params. Each key is mapping to one AC defined in data path module through OL_TX_SCHED_WRR_ADV_CAT_CFG_SPEC. gEnableTxSchedWrrBE gEnableTxSchedWrrBK gEnableTxSchedWrrVI gEnableTxSchedWrrVO Change-Id: I5c34b604297d83673ea065243cc58c3f2180ff3e CRs-Fixed: 1020141
-rw-r--r--CORE/CLD_TXRX/TXRX/ol_cfg.c102
-rw-r--r--CORE/CLD_TXRX/TXRX/ol_tx_sched.c68
-rw-r--r--CORE/HDD/inc/wlan_hdd_cfg.h48
-rw-r--r--CORE/HDD/src/wlan_hdd_cfg.c33
-rw-r--r--CORE/MAC/inc/aniGlobal.h4
-rw-r--r--CORE/SERVICES/COMMON/ol_cfg.h15
-rw-r--r--CORE/SERVICES/COMMON/ol_txrx_ctrl_api.h36
-rw-r--r--CORE/SERVICES/WMA/wma.c34
-rw-r--r--CORE/VOSS/src/vos_api.c69
9 files changed, 404 insertions, 5 deletions
diff --git a/CORE/CLD_TXRX/TXRX/ol_cfg.c b/CORE/CLD_TXRX/TXRX/ol_cfg.c
index 1f9a054d2b46..84466ce74547 100644
--- a/CORE/CLD_TXRX/TXRX/ol_cfg.c
+++ b/CORE/CLD_TXRX/TXRX/ol_cfg.c
@@ -64,6 +64,7 @@ ol_pdev_handle ol_pdev_cfg_attach(adf_os_device_t osdev,
struct txrx_pdev_cfg_param_t cfg_param)
{
struct txrx_pdev_cfg_t *cfg_ctx;
+ int i;
cfg_ctx = adf_os_mem_alloc(osdev, sizeof(*cfg_ctx));
if (!cfg_ctx) {
@@ -115,6 +116,20 @@ ol_pdev_handle ol_pdev_cfg_attach(adf_os_device_t osdev,
#endif /* IPA_UC_OFFLOAD */
ol_cfg_update_bundle_params(cfg_ctx, cfg_param);
+
+ for (i = 0; i < OL_TX_NUM_WMM_AC; i++) {
+ cfg_ctx->ac_specs[i].wrr_skip_weight =
+ cfg_param.ac_specs[i].wrr_skip_weight;
+ cfg_ctx->ac_specs[i].credit_threshold =
+ cfg_param.ac_specs[i].credit_threshold;
+ cfg_ctx->ac_specs[i].send_limit =
+ cfg_param.ac_specs[i].send_limit;
+ cfg_ctx->ac_specs[i].credit_reserve =
+ cfg_param.ac_specs[i].credit_reserve;
+ cfg_ctx->ac_specs[i].discard_weight =
+ cfg_param.ac_specs[i].discard_weight;
+ }
+
return (ol_pdev_handle) cfg_ctx;
}
@@ -319,3 +334,90 @@ unsigned int ol_cfg_ipa_uc_tx_partition_base(ol_pdev_handle pdev)
}
#endif /* IPA_UC_OFFLOAD */
+/**
+ * ol_cfg_get_wrr_skip_weight() - brief Query for the param of wrr_skip_weight
+ * @pdev: handle to the physical device.
+ * @ac: access control, it will be BE, BK, VI, VO
+ *
+ * Return: wrr_skip_weight for specified ac.
+ */
+int ol_cfg_get_wrr_skip_weight(ol_pdev_handle pdev, int ac)
+{
+ struct txrx_pdev_cfg_t *cfg = (struct txrx_pdev_cfg_t *)pdev;
+
+ if (ac >= OL_TX_WMM_AC_BE && ac <= OL_TX_WMM_AC_VO)
+ return cfg->ac_specs[ac].wrr_skip_weight;
+ else
+ return 0;
+}
+
+/**
+ * ol_cfg_get_credit_threshold() - Query for the param of credit_threshold
+ * @pdev: handle to the physical device.
+ * @ac: access control, it will be BE, BK, VI, VO
+ *
+ * Return: credit_threshold for specified ac.
+ */
+uint32_t ol_cfg_get_credit_threshold(ol_pdev_handle pdev, int ac)
+{
+ struct txrx_pdev_cfg_t *cfg = (struct txrx_pdev_cfg_t *)pdev;
+
+ if (ac >= OL_TX_WMM_AC_BE && ac <= OL_TX_WMM_AC_VO)
+ return cfg->ac_specs[ac].credit_threshold;
+ else
+ return 0;
+}
+
+
+/**
+ * ol_cfg_get_send_limit() - Query for the param of send_limit
+ * @pdev: handle to the physical device.
+ * @ac: access control, it will be BE, BK, VI, VO
+ *
+ * Return: send_limit for specified ac.
+ */
+uint16_t ol_cfg_get_send_limit(ol_pdev_handle pdev, int ac)
+{
+ struct txrx_pdev_cfg_t *cfg = (struct txrx_pdev_cfg_t *)pdev;
+
+ if (ac >= OL_TX_WMM_AC_BE && ac <= OL_TX_WMM_AC_VO)
+ return cfg->ac_specs[ac].send_limit;
+ else
+ return 0;
+}
+
+
+/**
+ * ol_cfg_get_credit_reserve() - Query for the param of credit_reserve
+ * @pdev: handle to the physical device.
+ * @ac: access control, it will be BE, BK, VI, VO
+ *
+ * Return: credit_reserve for specified ac.
+ */
+int ol_cfg_get_credit_reserve(ol_pdev_handle pdev, int ac)
+{
+ struct txrx_pdev_cfg_t *cfg = (struct txrx_pdev_cfg_t *)pdev;
+
+ if (ac >= OL_TX_WMM_AC_BE && ac <= OL_TX_WMM_AC_VO)
+ return cfg->ac_specs[ac].credit_reserve;
+ else
+ return 0;
+}
+
+/**
+ * ol_cfg_get_discard_weight() - Query for the param of discard_weight
+ * @pdev: handle to the physical device.
+ * @ac: access control, it will be BE, BK, VI, VO
+ *
+ * Return: discard_weight for specified ac.
+ */
+int ol_cfg_get_discard_weight(ol_pdev_handle pdev, int ac)
+{
+ struct txrx_pdev_cfg_t *cfg = (struct txrx_pdev_cfg_t *)pdev;
+
+ if (ac >= OL_TX_WMM_AC_BE && ac <= OL_TX_WMM_AC_VO)
+ return cfg->ac_specs[ac].discard_weight;
+ else
+ return 0;
+}
+
diff --git a/CORE/CLD_TXRX/TXRX/ol_tx_sched.c b/CORE/CLD_TXRX/TXRX/ol_tx_sched.c
index 82195f7030c9..567729d4fe25 100644
--- a/CORE/CLD_TXRX/TXRX/ol_tx_sched.c
+++ b/CORE/CLD_TXRX/TXRX/ol_tx_sched.c
@@ -968,6 +968,72 @@ ol_tx_sched_category_info_wrr_adv(
*bytes = category->state.bytes;
}
+
+/**
+ * ol_tx_sched_wrr_param_update() - update the WRR TX sched params
+ * @pdev: Pointer to PDEV structure.
+ * @scheduler: Pointer to tx scheduler.
+ *
+ * Update the WRR TX schedule parameters for each category if it is
+ * specified in the ini file by user.
+ *
+ * Return: none
+ */
+void ol_tx_sched_wrr_param_update(struct ol_txrx_pdev_t *pdev,
+ struct ol_tx_sched_wrr_adv_t *scheduler)
+{
+ int i;
+ char *tx_sched_wrr_name[4] = {
+ "BE",
+ "BK",
+ "VI",
+ "VO"
+ };
+
+ if (NULL == scheduler)
+ return;
+
+ VOS_TRACE(VOS_MODULE_ID_TXRX, VOS_TRACE_LEVEL_INFO,
+ "%s: Tuning the TX scheduler wrr parameters by ini file:",
+ __func__);
+ VOS_TRACE(VOS_MODULE_ID_TXRX, VOS_TRACE_LEVEL_INFO,
+ " skip credit limit credit disc");
+
+ for (i = OL_TX_SCHED_WRR_ADV_CAT_BE;
+ i <= OL_TX_SCHED_WRR_ADV_CAT_VO; i++) {
+ if (ol_cfg_get_wrr_skip_weight(pdev->ctrl_pdev, i)) {
+ scheduler->categories[i].specs.wrr_skip_weight =
+ ol_cfg_get_wrr_skip_weight(pdev->ctrl_pdev, i);
+ scheduler->categories[i].specs.credit_threshold =
+ ol_cfg_get_credit_threshold(pdev->ctrl_pdev, i);
+ scheduler->categories[i].specs.send_limit =
+ ol_cfg_get_send_limit(pdev->ctrl_pdev, i);
+ scheduler->categories[i].specs.credit_reserve =
+ ol_cfg_get_credit_reserve(pdev->ctrl_pdev, i);
+ scheduler->categories[i].specs.discard_weight =
+ ol_cfg_get_discard_weight(pdev->ctrl_pdev, i);
+
+ VOS_TRACE(VOS_MODULE_ID_TXRX, VOS_TRACE_LEVEL_INFO,
+ "%s-update: %d, %d, %d, %d, %d",
+ tx_sched_wrr_name[i],
+ scheduler->categories[i].specs.wrr_skip_weight,
+ scheduler->categories[i].specs.credit_threshold,
+ scheduler->categories[i].specs.send_limit,
+ scheduler->categories[i].specs.credit_reserve,
+ scheduler->categories[i].specs.discard_weight);
+ } else {
+ VOS_TRACE(VOS_MODULE_ID_TXRX, VOS_TRACE_LEVEL_INFO,
+ "%s-orig: %d, %d, %d, %d, %d",
+ tx_sched_wrr_name[i],
+ scheduler->categories[i].specs.wrr_skip_weight,
+ scheduler->categories[i].specs.credit_threshold,
+ scheduler->categories[i].specs.send_limit,
+ scheduler->categories[i].specs.credit_reserve,
+ scheduler->categories[i].specs.discard_weight);
+ }
+ }
+}
+
void *
ol_tx_sched_init_wrr_adv(
struct ol_txrx_pdev_t *pdev)
@@ -991,6 +1057,8 @@ ol_tx_sched_init_wrr_adv(
OL_TX_SCHED_WRR_ADV_CAT_CFG_STORE(MCAST_DATA, scheduler);
OL_TX_SCHED_WRR_ADV_CAT_CFG_STORE(MCAST_MGMT, scheduler);
+ ol_tx_sched_wrr_param_update(pdev, scheduler);
+
for (i = 0; i < OL_TX_SCHED_WRR_ADV_NUM_CATEGORIES; i++) {
scheduler->categories[i].state.active = 0;
scheduler->categories[i].state.frms = 0;
diff --git a/CORE/HDD/inc/wlan_hdd_cfg.h b/CORE/HDD/inc/wlan_hdd_cfg.h
index 1ae35c8abba3..5c13303563e7 100644
--- a/CORE/HDD/inc/wlan_hdd_cfg.h
+++ b/CORE/HDD/inc/wlan_hdd_cfg.h
@@ -48,6 +48,8 @@
#include <wlan_hdd_tgt_cfg.h>
#define FW_MODULE_LOG_LEVEL_STRING_LENGTH (255)
+#define TX_SCHED_WRR_PARAM_STRING_LENGTH (50)
+#define TX_SCHED_WRR_PARAMS_NUM (5)
#ifdef DHCP_SERVER_OFFLOAD
#define IPADDR_NUM_ENTRIES (4)
@@ -3829,6 +3831,43 @@ enum dot11p_mode {
#define CFG_EDCA_BE_AIFS_VALUE_MAX (15)
#define CFG_EDCA_BE_AIFS_VALUE_DEFAULT (3)
+
+/*
+ * This key is mapping to VO defined in data path module through
+ * OL_TX_SCHED_WRR_ADV_CAT_CFG_SPEC. The user can tune the
+ * WRR TX sched parameters such as skip, credit, limit, credit, disc for VO.
+ * e.g., gEnableTxSchedWrrVO = 10, 9, 8, 1, 8
+ */
+#define CFG_ENABLE_TX_SCHED_WRR_VO "gEnableTxSchedWrrVO"
+#define CFG_ENABLE_TX_SCHED_WRR_VO_DEFAULT ""
+
+/*
+ * This key is mapping to VI defined in data path module through
+ * OL_TX_SCHED_WRR_ADV_CAT_CFG_SPEC. The user can tune the
+ * WRR TX sched parameters such as skip, credit, limit, credit, disc for VI.
+ * e.g., gEnableTxSchedWrrVI = 10, 9, 8, 1, 8
+ */
+#define CFG_ENABLE_TX_SCHED_WRR_VI "gEnableTxSchedWrrVI"
+#define CFG_ENABLE_TX_SCHED_WRR_VI_DEFAULT ""
+
+/*
+ * This key is mapping to BE defined in data path module through
+ * OL_TX_SCHED_WRR_ADV_CAT_CFG_SPEC. The user can tune the
+ * WRR TX sched parameters such as skip, credit, limit, credit, disc for BE.
+ * e.g., gEnableTxSchedWrrBE = 10, 9, 8, 1, 8
+ */
+#define CFG_ENABLE_TX_SCHED_WRR_BE "gEnableTxSchedWrrBE"
+#define CFG_ENABLE_TX_SCHED_WRR_BE_DEFAULT ""
+
+/*
+ * This key is mapping to BK defined in data path module through
+ * OL_TX_SCHED_WRR_ADV_CAT_CFG_SPEC. The user can tune the
+ * WRR TX sched parameters such as skip, credit, limit, credit, disc for BK.
+ * e.g., gEnableTxSchedWrrBK = 10, 9, 8, 1, 8
+ */
+#define CFG_ENABLE_TX_SCHED_WRR_BK "gEnableTxSchedWrrBK"
+#define CFG_ENABLE_TX_SCHED_WRR_BK_DEFAULT ""
+
#define CFG_TGT_GTX_USR_CFG_NAME "tgt_gtx_usr_cfg"
#define CFG_TGT_GTX_USR_CFG_MIN (0)
#define CFG_TGT_GTX_USR_CFG_MAX (32)
@@ -4607,6 +4646,15 @@ struct hdd_config {
uint32_t edca_be_aifs;
bool enable_dynamic_sta_chainmask;
+ /* Tuning TX sched parameters for VO (skip credit limit credit disc) */
+ uint8_t tx_sched_wrr_vo[TX_SCHED_WRR_PARAM_STRING_LENGTH];
+ /* Tuning TX sched parameters for VI (skip credit limit credit disc) */
+ uint8_t tx_sched_wrr_vi[TX_SCHED_WRR_PARAM_STRING_LENGTH];
+ /* Tuning TX sched parameters for BE (skip credit limit credit disc) */
+ uint8_t tx_sched_wrr_be[TX_SCHED_WRR_PARAM_STRING_LENGTH];
+ /* Tuning TX sched parameters for BK (skip credit limit credit disc) */
+ uint8_t tx_sched_wrr_bk[TX_SCHED_WRR_PARAM_STRING_LENGTH];
+
/* parameter to control GTX */
uint32_t tgt_gtx_usr_cfg;
bool sap_restrt_ch_avoid;
diff --git a/CORE/HDD/src/wlan_hdd_cfg.c b/CORE/HDD/src/wlan_hdd_cfg.c
index 984d187a0bf6..cbb0bf8b4310 100644
--- a/CORE/HDD/src/wlan_hdd_cfg.c
+++ b/CORE/HDD/src/wlan_hdd_cfg.c
@@ -4569,6 +4569,26 @@ REG_TABLE_ENTRY g_registry_table[] =
CFG_EDCA_BE_AIFS_VALUE_MIN,
CFG_EDCA_BE_AIFS_VALUE_MAX),
+ REG_VARIABLE_STRING(CFG_ENABLE_TX_SCHED_WRR_VO, WLAN_PARAM_String,
+ hdd_config_t, tx_sched_wrr_vo,
+ VAR_FLAGS_OPTIONAL,
+ (void *) CFG_ENABLE_TX_SCHED_WRR_VO_DEFAULT),
+
+ REG_VARIABLE_STRING(CFG_ENABLE_TX_SCHED_WRR_VI, WLAN_PARAM_String,
+ hdd_config_t, tx_sched_wrr_vi,
+ VAR_FLAGS_OPTIONAL,
+ (void *) CFG_ENABLE_TX_SCHED_WRR_VI_DEFAULT),
+
+ REG_VARIABLE_STRING(CFG_ENABLE_TX_SCHED_WRR_BE, WLAN_PARAM_String,
+ hdd_config_t, tx_sched_wrr_be,
+ VAR_FLAGS_OPTIONAL,
+ (void *) CFG_ENABLE_TX_SCHED_WRR_BE_DEFAULT),
+
+ REG_VARIABLE_STRING(CFG_ENABLE_TX_SCHED_WRR_BK, WLAN_PARAM_String,
+ hdd_config_t, tx_sched_wrr_bk,
+ VAR_FLAGS_OPTIONAL,
+ (void *) CFG_ENABLE_TX_SCHED_WRR_BK_DEFAULT),
+
REG_VARIABLE(CFG_TGT_GTX_USR_CFG_NAME, WLAN_PARAM_Integer,
hdd_config_t, tgt_gtx_usr_cfg,
VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
@@ -5410,6 +5430,19 @@ void print_hdd_cfg(hdd_context_t *pHddCtx)
CFG_BUG_ON_REINIT_FAILURE_NAME,
pHddCtx->cfg_ini->bug_on_reinit_failure);
+ hddLog(LOG2, "Name = [%s] Value = [%s]",
+ CFG_ENABLE_TX_SCHED_WRR_VO,
+ pHddCtx->cfg_ini->tx_sched_wrr_vo);
+ hddLog(LOG2, "Name = [%s] Value = [%s]",
+ CFG_ENABLE_TX_SCHED_WRR_VI,
+ pHddCtx->cfg_ini->tx_sched_wrr_vi);
+ hddLog(LOG2, "Name = [%s] Value = [%s]",
+ CFG_ENABLE_TX_SCHED_WRR_BK,
+ pHddCtx->cfg_ini->tx_sched_wrr_bk);
+ hddLog(LOG2, "Name = [%s] Value = [%s]",
+ CFG_ENABLE_TX_SCHED_WRR_BE,
+ pHddCtx->cfg_ini->tx_sched_wrr_be);
+
hddLog(LOG2, "Name = [%s] Value = [%u]",
CFG_TGT_GTX_USR_CFG_NAME,
pHddCtx->cfg_ini->tgt_gtx_usr_cfg);
diff --git a/CORE/MAC/inc/aniGlobal.h b/CORE/MAC/inc/aniGlobal.h
index af55de9950a1..aac66ec46068 100644
--- a/CORE/MAC/inc/aniGlobal.h
+++ b/CORE/MAC/inc/aniGlobal.h
@@ -99,6 +99,8 @@ typedef struct sAniSirGlobal *tpAniSirGlobal;
// New HAL API interface defs.
#include "logDump.h"
+#include "ol_txrx_ctrl_api.h"
+
//Check if this definition can actually move here from halInternal.h even for Volans. In that case
//this featurization can be removed.
#define PMAC_STRUCT( _hHal ) ( (tpAniSirGlobal)_hHal )
@@ -1131,6 +1133,8 @@ typedef struct sMacOpenParameters
bool force_target_assert_enabled;
uint16_t pkt_bundle_timer_value;
uint16_t pkt_bundle_size;
+
+ struct ol_tx_sched_wrr_ac_specs_t ac_specs[OL_TX_NUM_WMM_AC];
} tMacOpenParameters;
typedef struct sHalMacStartParameters
diff --git a/CORE/SERVICES/COMMON/ol_cfg.h b/CORE/SERVICES/COMMON/ol_cfg.h
index 1aa590eb8a77..f6c562342783 100644
--- a/CORE/SERVICES/COMMON/ol_cfg.h
+++ b/CORE/SERVICES/COMMON/ol_cfg.h
@@ -39,6 +39,8 @@
#include "wlan_tgt_def_config.h"
#endif
+#include "ol_txrx_ctrl_api.h"
+
/**
* @brief format of data frames delivered to/from the WLAN driver by/to the OS
*/
@@ -92,6 +94,8 @@ struct txrx_pdev_cfg_t {
#endif /* IPA_UC_OFFLOAD */
uint16_t pkt_bundle_timer_value;
uint16_t pkt_bundle_size;
+
+ struct ol_tx_sched_wrr_ac_specs_t ac_specs[OL_TX_NUM_WMM_AC];
};
/**
@@ -537,4 +541,15 @@ int ol_cfg_get_bundle_size(ol_pdev_handle pdev)
}
#endif
+
+int ol_cfg_get_wrr_skip_weight(ol_pdev_handle pdev, int ac);
+
+uint32_t ol_cfg_get_credit_threshold(ol_pdev_handle pdev, int ac);
+
+uint16_t ol_cfg_get_send_limit(ol_pdev_handle pdev, int ac);
+
+int ol_cfg_get_credit_reserve(ol_pdev_handle pdev, int ac);
+
+int ol_cfg_get_discard_weight(ol_pdev_handle pdev, int ac);
+
#endif /* _OL_CFG__H_ */
diff --git a/CORE/SERVICES/COMMON/ol_txrx_ctrl_api.h b/CORE/SERVICES/COMMON/ol_txrx_ctrl_api.h
index 260c7b70b65f..cd2e7fed0ecd 100644
--- a/CORE/SERVICES/COMMON/ol_txrx_ctrl_api.h
+++ b/CORE/SERVICES/COMMON/ol_txrx_ctrl_api.h
@@ -247,12 +247,12 @@ ol_txrx_peer_update(ol_txrx_vdev_handle data_vdev, u_int8_t *peer_mac,
ol_txrx_peer_update_select_t select);
enum {
- OL_TX_WMM_AC_BE,
- OL_TX_WMM_AC_BK,
- OL_TX_WMM_AC_VI,
- OL_TX_WMM_AC_VO,
+ OL_TX_WMM_AC_BE,
+ OL_TX_WMM_AC_BK,
+ OL_TX_WMM_AC_VI,
+ OL_TX_WMM_AC_VO,
- OL_TX_NUM_WMM_AC
+ OL_TX_NUM_WMM_AC
};
/**
@@ -967,6 +967,30 @@ ol_txrx_peer_stats_copy(
#define ol_txrx_peer_stats_copy(pdev, peer, stats) A_ERROR /* failure */
#endif /* QCA_ENABLE_OL_TXRX_PEER_STATS */
+/**
+ * struct ol_tx_sched_wrr_ac_specs_t - the wrr ac specs params structure
+ * @wrr_skip_weight: map to ol_tx_sched_wrr_adv_category_info_t.specs.
+ * wrr_skip_weight
+ * @credit_threshold: map to ol_tx_sched_wrr_adv_category_info_t.specs.
+ * credit_threshold
+ * @send_limit: map to ol_tx_sched_wrr_adv_category_info_t.specs.
+ * send_limit
+ * @credit_reserve: map to ol_tx_sched_wrr_adv_category_info_t.specs.
+ * credit_reserve
+ * @discard_weight: map to ol_tx_sched_wrr_adv_category_info_t.specs.
+ * discard_weight
+ *
+ * This structure is for wrr ac specs params set from user, it will update
+ * its content corresponding to the ol_tx_sched_wrr_adv_category_info_t.specs.
+ */
+struct ol_tx_sched_wrr_ac_specs_t {
+ int wrr_skip_weight;
+ uint32_t credit_threshold;
+ uint16_t send_limit;
+ int credit_reserve;
+ int discard_weight;
+};
+
/* Config parameters for txrx_pdev */
struct txrx_pdev_cfg_param_t {
u_int8_t is_full_reorder_offload;
@@ -982,6 +1006,8 @@ struct txrx_pdev_cfg_param_t {
u_int32_t uc_tx_partition_base;
uint16_t pkt_bundle_timer_value;
uint16_t pkt_bundle_size;
+
+ struct ol_tx_sched_wrr_ac_specs_t ac_specs[OL_TX_NUM_WMM_AC];
};
/**
diff --git a/CORE/SERVICES/WMA/wma.c b/CORE/SERVICES/WMA/wma.c
index c4f75ee79e2d..14b0346fbcc1 100644
--- a/CORE/SERVICES/WMA/wma.c
+++ b/CORE/SERVICES/WMA/wma.c
@@ -7117,6 +7117,39 @@ void ol_cfg_update_bundle_params(struct txrx_pdev_cfg_param_t *olCfg,
}
#endif
+
+/**
+ * ol_cfg_update_ac_specs_params() - update ac_specs params
+ * @olcfg: cfg handle
+ * @mac_params: mac params
+ *
+ * Return: none
+ */
+void ol_cfg_update_ac_specs_params(struct txrx_pdev_cfg_param_t *olcfg,
+ tMacOpenParameters *mac_params)
+{
+ int i;
+
+ if (NULL == olcfg)
+ return;
+
+ if (NULL == mac_params)
+ return;
+
+ for (i = 0; i < OL_TX_NUM_WMM_AC; i++) {
+ olcfg->ac_specs[i].wrr_skip_weight =
+ mac_params->ac_specs[i].wrr_skip_weight;
+ olcfg->ac_specs[i].credit_threshold =
+ mac_params->ac_specs[i].credit_threshold;
+ olcfg->ac_specs[i].send_limit =
+ mac_params->ac_specs[i].send_limit;
+ olcfg->ac_specs[i].credit_reserve =
+ mac_params->ac_specs[i].credit_reserve;
+ olcfg->ac_specs[i].discard_weight =
+ mac_params->ac_specs[i].discard_weight;
+ }
+}
+
#ifdef FEATURE_RUNTIME_PM
/**
* wma_runtime_context_init() - API to init wma runtime contexts
@@ -7343,6 +7376,7 @@ VOS_STATUS WDA_open(v_VOID_t *vos_context, v_VOID_t *os_ctx,
#endif
ol_cfg_update_bundle_params(&olCfg, mac_params);
+ ol_cfg_update_ac_specs_params(&olCfg, mac_params);
((pVosContextType) vos_context)->cfg_ctx =
ol_pdev_cfg_attach(((pVosContextType) vos_context)->adf_ctx, olCfg);
diff --git a/CORE/VOSS/src/vos_api.c b/CORE/VOSS/src/vos_api.c
index 983e08aaaa06..0ce823314587 100644
--- a/CORE/VOSS/src/vos_api.c
+++ b/CORE/VOSS/src/vos_api.c
@@ -296,6 +296,74 @@ static void vos_set_bundle_params(tMacOpenParameters *param,
}
#endif
+/**
+ * vos_set_ac_specs_params() - set ac_specs params in mac open param
+ * @param: Pointer to mac open param
+ * @hdd_ctx: Pointer to hdd context
+ *
+ * Return: none
+ */
+static void vos_set_ac_specs_params(tMacOpenParameters *param,
+ hdd_context_t *hdd_ctx)
+{
+ uint8_t num_entries = 0;
+ uint8_t tx_sched_wrr_param[TX_SCHED_WRR_PARAMS_NUM];
+ uint8_t *tx_sched_wrr_ac;
+ int i;
+
+ if (NULL == hdd_ctx)
+ return;
+
+ if (NULL == param)
+ return;
+
+ if (NULL == hdd_ctx->cfg_ini) {
+ /* Do nothing if hdd_ctx is invalid */
+ VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ "%s: Warning: hdd_ctx->cfg_ini is NULL", __func__);
+ return;
+ }
+
+ for (i = 0; i < OL_TX_NUM_WMM_AC; i++) {
+ switch (i) {
+ case OL_TX_WMM_AC_BE:
+ tx_sched_wrr_ac = hdd_ctx->cfg_ini->tx_sched_wrr_be;
+ break;
+ case OL_TX_WMM_AC_BK:
+ tx_sched_wrr_ac = hdd_ctx->cfg_ini->tx_sched_wrr_bk;
+ break;
+ case OL_TX_WMM_AC_VI:
+ tx_sched_wrr_ac = hdd_ctx->cfg_ini->tx_sched_wrr_vi;
+ break;
+ case OL_TX_WMM_AC_VO:
+ tx_sched_wrr_ac = hdd_ctx->cfg_ini->tx_sched_wrr_vo;
+ break;
+ default:
+ tx_sched_wrr_ac = NULL;
+ }
+
+ hdd_string_to_u8_array(tx_sched_wrr_ac,
+ tx_sched_wrr_param,
+ &num_entries,
+ sizeof(tx_sched_wrr_param));
+
+ if (num_entries == TX_SCHED_WRR_PARAMS_NUM) {
+ param->ac_specs[i].wrr_skip_weight =
+ tx_sched_wrr_param[0];
+ param->ac_specs[i].credit_threshold =
+ tx_sched_wrr_param[1];
+ param->ac_specs[i].send_limit =
+ tx_sched_wrr_param[2];
+ param->ac_specs[i].credit_reserve =
+ tx_sched_wrr_param[3];
+ param->ac_specs[i].discard_weight =
+ tx_sched_wrr_param[4];
+ }
+
+ num_entries = 0;
+ }
+}
+
/*---------------------------------------------------------------------------
@@ -574,6 +642,7 @@ VOS_STATUS vos_open( v_CONTEXT_t *pVosContext, v_SIZE_t hddContextSize )
vos_set_nan_enable(&macOpenParms, pHddCtx);
vos_set_bundle_params(&macOpenParms, pHddCtx);
+ vos_set_ac_specs_params(&macOpenParms, pHddCtx);
vStatus = WDA_open( gpVosContext, gpVosContext->pHDDContext,
hdd_update_tgt_cfg,