qcacld-3.0: Add INI params to set edca min, max and aifs params

qcacld-2.0 to qcacld-3.0 propagation

Add INI params gEdcaVoCwmin, gEdcaViCwmin, gEdcaBkCwmin,
gEdcaBeCwmin, gEdcaVoCwmax, gEdcaViCwmax, gEdcaBkCwmax,
gEdcaBeCwmax, gEdcaVoAifs, gEdcaViAifs, gEdcaBkAifs and
gEdcaBeAifs to control edca params for STA mode.

These params will overwrite the values from AP only if
gEnableEdcaParams is set.

Change-Id: I1e688a67df320208416aba4ca40fd870a947e3be
CRs-Fixed: 996685
diff --git a/core/hdd/inc/wlan_hdd_cfg.h b/core/hdd/inc/wlan_hdd_cfg.h
index 10b6c72..b178cf6 100644
--- a/core/hdd/inc/wlan_hdd_cfg.h
+++ b/core/hdd/inc/wlan_hdd_cfg.h
@@ -3023,6 +3023,90 @@
 #define CFG_ENABLE_FATAL_EVENT_TRIGGER_MAX             (1)
 #define CFG_ENABLE_FATAL_EVENT_TRIGGER_DEFAULT         (1)
 
+/*
+ * If gEnableEdcaParams is set to 1, params gEdcaVoCwmin,
+ * gEdcaViCwmin, gEdcaBkCwmin, gEdcaBeCwmin, gEdcaVoCwmax,
+ * gEdcaViCwmax, gEdcaBkCwmax, gEdcaBeCwmax, gEdcaVoAifs,
+ * gEdcaViAifs, gEdcaBkAifs and gEdcaBeAifs values are used
+ * to overwrite the values received from AP
+ */
+#define CFG_ENABLE_EDCA_INI_NAME       "gEnableEdcaParams"
+#define CFG_ENABLE_EDCA_INI_MIN        (0)
+#define CFG_ENABLE_EDCA_INI_MAX        (1)
+#define CFG_ENABLE_EDCA_INI_DEFAULT    (0)
+
+/* Cwmin value for EDCA_AC_VO. CWVomin = 2^gEdcaVoCwmin -1 */
+#define CFG_EDCA_VO_CWMIN_VALUE_NAME      "gEdcaVoCwmin"
+#define CFG_EDCA_VO_CWMIN_VALUE_MIN       (0x0)
+#define CFG_EDCA_VO_CWMIN_VALUE_MAX       (15)
+#define CFG_EDCA_VO_CWMIN_VALUE_DEFAULT   (2)
+
+/* Cwmin value for EDCA_AC_VI. CWVimin = 2^gEdcaViCwmin -1 */
+#define CFG_EDCA_VI_CWMIN_VALUE_NAME      "gEdcaViCwmin"
+#define CFG_EDCA_VI_CWMIN_VALUE_MIN       (0x0)
+#define CFG_EDCA_VI_CWMIN_VALUE_MAX       (15)
+#define CFG_EDCA_VI_CWMIN_VALUE_DEFAULT   (3)
+
+/* Cwmin value for EDCA_AC_BK. CWBkmin = 2^gEdcaBkCwmin -1 */
+#define CFG_EDCA_BK_CWMIN_VALUE_NAME      "gEdcaBkCwmin"
+#define CFG_EDCA_BK_CWMIN_VALUE_MIN       (0x0)
+#define CFG_EDCA_BK_CWMIN_VALUE_MAX       (15)
+#define CFG_EDCA_BK_CWMIN_VALUE_DEFAULT   (4)
+
+/* Cwmin value for EDCA_AC_BE. CWBemin = 2^gEdcaBeCwmin -1 */
+#define CFG_EDCA_BE_CWMIN_VALUE_NAME      "gEdcaBeCwmin"
+#define CFG_EDCA_BE_CWMIN_VALUE_MIN       (0x0)
+#define CFG_EDCA_BE_CWMIN_VALUE_MAX       (15)
+#define CFG_EDCA_BE_CWMIN_VALUE_DEFAULT   (4)
+
+/* Cwmax value for EDCA_AC_VO. CWVomax = 2^gEdcaVoCwmax -1 */
+#define CFG_EDCA_VO_CWMAX_VALUE_NAME      "gEdcaVoCwmax"
+#define CFG_EDCA_VO_CWMAX_VALUE_MIN       (0)
+#define CFG_EDCA_VO_CWMAX_VALUE_MAX       (15)
+#define CFG_EDCA_VO_CWMAX_VALUE_DEFAULT   (3)
+
+/* Cwmax value for EDCA_AC_VI. CWVimax = 2^gEdcaViCwmax -1 */
+#define CFG_EDCA_VI_CWMAX_VALUE_NAME      "gEdcaViCwmax"
+#define CFG_EDCA_VI_CWMAX_VALUE_MIN       (0)
+#define CFG_EDCA_VI_CWMAX_VALUE_MAX       (15)
+#define CFG_EDCA_VI_CWMAX_VALUE_DEFAULT   (4)
+
+/* Cwmax value for EDCA_AC_BK. CWBkmax = 2^gEdcaBkCwmax -1 */
+#define CFG_EDCA_BK_CWMAX_VALUE_NAME      "gEdcaBkCwmax"
+#define CFG_EDCA_BK_CWMAX_VALUE_MIN       (0)
+#define CFG_EDCA_BK_CWMAX_VALUE_MAX       (15)
+#define CFG_EDCA_BK_CWMAX_VALUE_DEFAULT   (10)
+
+/* Cwmax value for EDCA_AC_BE. CWBemax = 2^gEdcaBeCwmax -1 */
+#define CFG_EDCA_BE_CWMAX_VALUE_NAME      "gEdcaBeCwmax"
+#define CFG_EDCA_BE_CWMAX_VALUE_MIN       (0)
+#define CFG_EDCA_BE_CWMAX_VALUE_MAX       (15)
+#define CFG_EDCA_BE_CWMAX_VALUE_DEFAULT   (10)
+
+/* Aifs value for EDCA_AC_VO.*/
+#define CFG_EDCA_VO_AIFS_VALUE_NAME       "gEdcaVoAifs"
+#define CFG_EDCA_VO_AIFS_VALUE_MIN        (0)
+#define CFG_EDCA_VO_AIFS_VALUE_MAX        (15)
+#define CFG_EDCA_VO_AIFS_VALUE_DEFAULT    (2)
+
+/* Aifs value for EDCA_AC_VI.*/
+#define CFG_EDCA_VI_AIFS_VALUE_NAME       "gEdcaViAifs"
+#define CFG_EDCA_VI_AIFS_VALUE_MIN        (0)
+#define CFG_EDCA_VI_AIFS_VALUE_MAX        (15)
+#define CFG_EDCA_VI_AIFS_VALUE_DEFAULT    (2)
+
+/* Aifs value for EDCA_AC_BK.*/
+#define CFG_EDCA_BK_AIFS_VALUE_NAME       "gEdcaBkAifs"
+#define CFG_EDCA_BK_AIFS_VALUE_MIN        (0)
+#define CFG_EDCA_BK_AIFS_VALUE_MAX        (15)
+#define CFG_EDCA_BK_AIFS_VALUE_DEFAULT    (7)
+
+/* Aifs value for EDCA_AC_BE.*/
+#define CFG_EDCA_BE_AIFS_VALUE_NAME       "gEdcaBeAifs"
+#define CFG_EDCA_BE_AIFS_VALUE_MIN        (0)
+#define CFG_EDCA_BE_AIFS_VALUE_MAX        (15)
+#define CFG_EDCA_BE_AIFS_VALUE_DEFAULT    (3)
+
 /*---------------------------------------------------------------------------
    Type declarations
    -------------------------------------------------------------------------*/
@@ -3627,6 +3711,19 @@
 	uint32_t roam_dense_rssi_thresh_offset;
 	bool ignore_peer_ht_opmode;
 	uint32_t roam_dense_min_aps;
+	bool enable_edca_params;
+	uint32_t edca_vo_cwmin;
+	uint32_t edca_vi_cwmin;
+	uint32_t edca_bk_cwmin;
+	uint32_t edca_be_cwmin;
+	uint32_t edca_vo_cwmax;
+	uint32_t edca_vi_cwmax;
+	uint32_t edca_bk_cwmax;
+	uint32_t edca_be_cwmax;
+	uint32_t edca_vo_aifs;
+	uint32_t edca_vi_aifs;
+	uint32_t edca_bk_aifs;
+	uint32_t edca_be_aifs;
 	bool enable_fatal_event;
 	bool bpf_enabled;
 };
diff --git a/core/hdd/src/wlan_hdd_cfg.c b/core/hdd/src/wlan_hdd_cfg.c
index e5a3164..521f6bc 100644
--- a/core/hdd/src/wlan_hdd_cfg.c
+++ b/core/hdd/src/wlan_hdd_cfg.c
@@ -3795,6 +3795,109 @@
 			CFG_ENABLE_FATAL_EVENT_TRIGGER_MIN,
 			CFG_ENABLE_FATAL_EVENT_TRIGGER_MAX),
 
+	REG_VARIABLE(CFG_ENABLE_EDCA_INI_NAME, WLAN_PARAM_Integer,
+			struct hdd_config, enable_edca_params,
+			VAR_FLAGS_OPTIONAL |
+			VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+			CFG_ENABLE_EDCA_INI_DEFAULT,
+			CFG_ENABLE_EDCA_INI_MIN,
+			CFG_ENABLE_EDCA_INI_MAX),
+
+	REG_VARIABLE(CFG_EDCA_VO_CWMIN_VALUE_NAME, WLAN_PARAM_Integer,
+			struct hdd_config, edca_vo_cwmin,
+			VAR_FLAGS_OPTIONAL |
+			VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+			CFG_EDCA_VO_CWMIN_VALUE_DEFAULT,
+			CFG_EDCA_VO_CWMIN_VALUE_MIN,
+			CFG_EDCA_VO_CWMIN_VALUE_MAX),
+
+	REG_VARIABLE(CFG_EDCA_VI_CWMIN_VALUE_NAME, WLAN_PARAM_Integer,
+			struct hdd_config, edca_vi_cwmin,
+			VAR_FLAGS_OPTIONAL |
+			VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+			CFG_EDCA_VI_CWMIN_VALUE_DEFAULT,
+			CFG_EDCA_VI_CWMIN_VALUE_MIN,
+			CFG_EDCA_VI_CWMIN_VALUE_MAX),
+
+	REG_VARIABLE(CFG_EDCA_BK_CWMIN_VALUE_NAME, WLAN_PARAM_Integer,
+			struct hdd_config, edca_bk_cwmin,
+			VAR_FLAGS_OPTIONAL |
+			VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+			CFG_EDCA_BK_CWMIN_VALUE_DEFAULT,
+			CFG_EDCA_BK_CWMIN_VALUE_MIN,
+			CFG_EDCA_BK_CWMIN_VALUE_MAX),
+
+	REG_VARIABLE(CFG_EDCA_BE_CWMIN_VALUE_NAME, WLAN_PARAM_Integer,
+			struct hdd_config, edca_be_cwmin,
+			VAR_FLAGS_OPTIONAL |
+			VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+			CFG_EDCA_BE_CWMIN_VALUE_DEFAULT,
+			CFG_EDCA_BE_CWMIN_VALUE_MIN,
+			CFG_EDCA_BE_CWMIN_VALUE_MAX),
+
+	REG_VARIABLE(CFG_EDCA_VO_CWMAX_VALUE_NAME, WLAN_PARAM_Integer,
+			struct hdd_config, edca_vo_cwmax,
+			VAR_FLAGS_OPTIONAL |
+			VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+			CFG_EDCA_VO_CWMAX_VALUE_DEFAULT,
+			CFG_EDCA_VO_CWMAX_VALUE_MIN,
+			CFG_EDCA_VO_CWMAX_VALUE_MAX),
+
+	REG_VARIABLE(CFG_EDCA_VI_CWMAX_VALUE_NAME, WLAN_PARAM_Integer,
+			struct hdd_config, edca_vi_cwmax,
+			VAR_FLAGS_OPTIONAL |
+			VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+			CFG_EDCA_VI_CWMAX_VALUE_DEFAULT,
+			CFG_EDCA_VI_CWMAX_VALUE_MIN,
+			CFG_EDCA_VI_CWMAX_VALUE_MAX),
+
+	REG_VARIABLE(CFG_EDCA_BK_CWMAX_VALUE_NAME, WLAN_PARAM_Integer,
+			struct hdd_config, edca_bk_cwmax,
+			VAR_FLAGS_OPTIONAL |
+			VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+			CFG_EDCA_BK_CWMAX_VALUE_DEFAULT,
+			CFG_EDCA_BK_CWMAX_VALUE_MIN,
+			CFG_EDCA_BK_CWMAX_VALUE_MAX),
+
+	REG_VARIABLE(CFG_EDCA_BE_CWMAX_VALUE_NAME, WLAN_PARAM_Integer,
+			struct hdd_config, edca_be_cwmax,
+			VAR_FLAGS_OPTIONAL |
+			VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+			CFG_EDCA_BE_CWMAX_VALUE_DEFAULT,
+			CFG_EDCA_BE_CWMAX_VALUE_MIN,
+			CFG_EDCA_BE_CWMAX_VALUE_MAX),
+
+	REG_VARIABLE(CFG_EDCA_VO_AIFS_VALUE_NAME, WLAN_PARAM_Integer,
+			struct hdd_config, edca_vo_aifs,
+			VAR_FLAGS_OPTIONAL |
+			VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+			CFG_EDCA_VO_AIFS_VALUE_DEFAULT,
+			CFG_EDCA_VO_AIFS_VALUE_MIN,
+			CFG_EDCA_VO_AIFS_VALUE_MAX),
+
+	REG_VARIABLE(CFG_EDCA_VI_AIFS_VALUE_NAME, WLAN_PARAM_Integer,
+			struct hdd_config, edca_vi_aifs,
+			VAR_FLAGS_OPTIONAL |
+			VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+			CFG_EDCA_VI_AIFS_VALUE_DEFAULT,
+			CFG_EDCA_VI_AIFS_VALUE_MIN,
+			CFG_EDCA_VI_AIFS_VALUE_MAX),
+
+	REG_VARIABLE(CFG_EDCA_BK_AIFS_VALUE_NAME, WLAN_PARAM_Integer,
+			struct hdd_config, edca_bk_aifs,
+			VAR_FLAGS_OPTIONAL |
+			VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+			CFG_EDCA_BK_AIFS_VALUE_DEFAULT,
+			CFG_EDCA_BK_AIFS_VALUE_MIN,
+			CFG_EDCA_BK_AIFS_VALUE_MAX),
+
+	REG_VARIABLE(CFG_EDCA_BE_AIFS_VALUE_NAME, WLAN_PARAM_Integer,
+			struct hdd_config, edca_be_aifs,
+			VAR_FLAGS_OPTIONAL |
+			VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+			CFG_EDCA_BE_AIFS_VALUE_DEFAULT,
+			CFG_EDCA_BE_AIFS_VALUE_MIN,
+			CFG_EDCA_BE_AIFS_VALUE_MAX),
 
 };
 
@@ -5399,6 +5502,49 @@
 		CFG_IDLE_TIME_NAME,
 		pHddCtx->config->idle_time_conc);
 
+
+	hdd_info("Name = [%s] Value = [%u]",
+		CFG_ENABLE_EDCA_INI_NAME,
+		pHddCtx->config->enable_edca_params);
+
+	hdd_info("Name = [%s] Value = [%u]",
+		CFG_EDCA_VO_CWMIN_VALUE_NAME,
+		pHddCtx->config->edca_vo_cwmin);
+	hdd_info("Name = [%s] Value = [%u]",
+		CFG_EDCA_VI_CWMIN_VALUE_NAME,
+		pHddCtx->config->edca_vi_cwmin);
+	hdd_info("Name = [%s] Value = [%u]",
+		CFG_EDCA_BK_CWMIN_VALUE_NAME,
+		pHddCtx->config->edca_bk_cwmin);
+	hdd_info("Name = [%s] Value = [%u]",
+		CFG_EDCA_BE_CWMIN_VALUE_NAME,
+		pHddCtx->config->edca_be_cwmin);
+
+	hdd_info("Name = [%s] Value = [%u]",
+		CFG_EDCA_VO_CWMAX_VALUE_NAME,
+		pHddCtx->config->edca_vo_cwmax);
+	hdd_info("Name = [%s] Value = [%u]",
+		CFG_EDCA_VI_CWMAX_VALUE_NAME,
+		pHddCtx->config->edca_vi_cwmax);
+	hdd_info("Name = [%s] Value = [%u]",
+		CFG_EDCA_BK_CWMAX_VALUE_NAME,
+		pHddCtx->config->edca_bk_cwmax);
+	hdd_info("Name = [%s] Value = [%u]",
+		CFG_EDCA_BE_CWMAX_VALUE_NAME,
+		pHddCtx->config->edca_be_cwmax);
+
+	hdd_info("Name = [%s] Value = [%u]",
+		CFG_EDCA_VO_AIFS_VALUE_NAME,
+		pHddCtx->config->edca_vo_aifs);
+	hdd_info("Name = [%s] Value = [%u]",
+		CFG_EDCA_VI_AIFS_VALUE_NAME,
+		pHddCtx->config->edca_vi_aifs);
+	hdd_info("Name = [%s] Value = [%u]",
+		CFG_EDCA_BK_AIFS_VALUE_NAME,
+		pHddCtx->config->edca_bk_aifs);
+	hdd_info("Name = [%s] Value = [%u]",
+		CFG_EDCA_BE_AIFS_VALUE_NAME,
+		pHddCtx->config->edca_be_aifs);
 }
 
 
@@ -6909,6 +7055,36 @@
 	smeConfig->csrConfig.enable_fatal_event =
 			pConfig->enable_fatal_event;
 
+	smeConfig->csrConfig.enable_edca_params =
+			pConfig->enable_edca_params;
+
+	smeConfig->csrConfig.edca_vo_cwmin =
+			pConfig->edca_vo_cwmin;
+	smeConfig->csrConfig.edca_vi_cwmin =
+			pConfig->edca_vi_cwmin;
+	smeConfig->csrConfig.edca_bk_cwmin =
+			pConfig->edca_bk_cwmin;
+	smeConfig->csrConfig.edca_be_cwmin =
+			pConfig->edca_be_cwmin;
+
+	smeConfig->csrConfig.edca_vo_cwmax =
+			pConfig->edca_vo_cwmax;
+	smeConfig->csrConfig.edca_vi_cwmax =
+			pConfig->edca_vi_cwmax;
+	smeConfig->csrConfig.edca_bk_cwmax =
+			pConfig->edca_bk_cwmax;
+	smeConfig->csrConfig.edca_be_cwmax =
+			pConfig->edca_be_cwmax;
+
+	smeConfig->csrConfig.edca_vo_aifs =
+			pConfig->edca_vo_aifs;
+	smeConfig->csrConfig.edca_vi_aifs =
+			pConfig->edca_vi_aifs;
+	smeConfig->csrConfig.edca_bk_aifs =
+			pConfig->edca_bk_aifs;
+	smeConfig->csrConfig.edca_be_aifs =
+			pConfig->edca_be_aifs;
+
 	status = sme_update_config(pHddCtx->hHal, smeConfig);
 	if (!QDF_IS_STATUS_SUCCESS(status)) {
 		hddLog(LOGE, "sme_update_config() return failure %d",
diff --git a/core/mac/src/pe/sch/sch_beacon_process.c b/core/mac/src/pe/sch/sch_beacon_process.c
index be5af48..b9cdf0a 100644
--- a/core/mac/src/pe/sch/sch_beacon_process.c
+++ b/core/mac/src/pe/sch/sch_beacon_process.c
@@ -924,15 +924,44 @@
 	host_log_qos_edca_pkt_type *log_ptr = NULL;
 #endif /* FEATURE_WLAN_DIAG_SUPPORT */
 
-	PELOG1(sch_log(pMac, LOG1,
+	sch_log(pMac, LOG2,
 		FL("Updating parameter set count: Old %d ---> new %d"),
-		session->gLimEdcaParamSetCount, edca->qosInfo.count);)
+		session->gLimEdcaParamSetCount, edca->qosInfo.count);
 
 	session->gLimEdcaParamSetCount = edca->qosInfo.count;
 	session->gLimEdcaParams[EDCA_AC_BE] = edca->acbe;
 	session->gLimEdcaParams[EDCA_AC_BK] = edca->acbk;
 	session->gLimEdcaParams[EDCA_AC_VI] = edca->acvi;
 	session->gLimEdcaParams[EDCA_AC_VO] = edca->acvo;
+
+	if (pMac->roam.configParam.enable_edca_params) {
+		session->gLimEdcaParams[EDCA_AC_VO].aci.aifsn =
+			pMac->roam.configParam.edca_vo_aifs;
+		session->gLimEdcaParams[EDCA_AC_VI].aci.aifsn =
+			pMac->roam.configParam.edca_vi_aifs;
+		session->gLimEdcaParams[EDCA_AC_BK].aci.aifsn =
+			pMac->roam.configParam.edca_bk_aifs;
+		session->gLimEdcaParams[EDCA_AC_BE].aci.aifsn =
+			pMac->roam.configParam.edca_be_aifs;
+
+		session->gLimEdcaParams[EDCA_AC_VO].cw.min =
+			pMac->roam.configParam.edca_vo_cwmin;
+		session->gLimEdcaParams[EDCA_AC_VI].cw.min =
+			pMac->roam.configParam.edca_vi_cwmin;
+		session->gLimEdcaParams[EDCA_AC_BK].cw.min =
+			pMac->roam.configParam.edca_bk_cwmin;
+		session->gLimEdcaParams[EDCA_AC_BE].cw.min =
+			pMac->roam.configParam.edca_be_cwmin;
+
+		session->gLimEdcaParams[EDCA_AC_VO].cw.max =
+			pMac->roam.configParam.edca_vo_cwmax;
+		session->gLimEdcaParams[EDCA_AC_VI].cw.max =
+			pMac->roam.configParam.edca_vi_cwmax;
+		session->gLimEdcaParams[EDCA_AC_BK].cw.max =
+			pMac->roam.configParam.edca_bk_cwmax;
+		session->gLimEdcaParams[EDCA_AC_BE].cw.max =
+			pMac->roam.configParam.edca_be_cwmax;
+	}
 #ifdef FEATURE_WLAN_DIAG_SUPPORT
 	WLAN_HOST_DIAG_LOG_ALLOC(log_ptr, host_log_qos_edca_pkt_type,
 				 LOG_WLAN_QOS_EDCA_C);
@@ -967,16 +996,17 @@
 	}
 	WLAN_HOST_DIAG_LOG_REPORT(log_ptr);
 #endif /* FEATURE_WLAN_DIAG_SUPPORT */
-	PELOG1(sch_log(pMac, LOGE,
-	       FL("Updating Local EDCA Params(gLimEdcaParams) to: "));)
+	sch_log(pMac, LOG1,
+		FL("Edsa param enabled in ini %d. Updating Local EDCA Params(gLimEdcaParams) to: "),
+		pMac->roam.configParam.enable_edca_params);
 	for (i = 0; i < MAX_NUM_AC; i++) {
-		PELOG1(sch_log(pMac, LOG1,
+		sch_log(pMac, LOG1,
 		       FL("AC[%d]:  AIFSN: %d, ACM %d, CWmin %d, CWmax %d, TxOp %d"),
 		       i, session->gLimEdcaParams[i].aci.aifsn,
 		       session->gLimEdcaParams[i].aci.acm,
 		       session->gLimEdcaParams[i].cw.min,
 		       session->gLimEdcaParams[i].cw.max,
-		       session->gLimEdcaParams[i].txoplimit);)
+		       session->gLimEdcaParams[i].txoplimit);
 	}
 	return eSIR_SUCCESS;
 }
diff --git a/core/sme/inc/csr_api.h b/core/sme/inc/csr_api.h
index 802afc3..6ba1766 100644
--- a/core/sme/inc/csr_api.h
+++ b/core/sme/inc/csr_api.h
@@ -1230,6 +1230,19 @@
 	uint32_t obss_active_dwelltime;
 	uint32_t obss_passive_dwelltime;
 	bool ignore_peer_ht_opmode;
+	bool enable_edca_params;
+	uint32_t edca_vo_cwmin;
+	uint32_t edca_vi_cwmin;
+	uint32_t edca_bk_cwmin;
+	uint32_t edca_be_cwmin;
+	uint32_t edca_vo_cwmax;
+	uint32_t edca_vi_cwmax;
+	uint32_t edca_bk_cwmax;
+	uint32_t edca_be_cwmax;
+	uint32_t edca_vo_aifs;
+	uint32_t edca_vi_aifs;
+	uint32_t edca_bk_aifs;
+	uint32_t edca_be_aifs;
 	bool enable_fatal_event;
 } tCsrConfigParam;
 
diff --git a/core/sme/inc/csr_internal.h b/core/sme/inc/csr_internal.h
index 17c806f..4785acf 100644
--- a/core/sme/inc/csr_internal.h
+++ b/core/sme/inc/csr_internal.h
@@ -649,6 +649,19 @@
 	uint32_t obss_active_dwelltime;
 	uint32_t obss_passive_dwelltime;
 	bool ignore_peer_ht_opmode;
+	bool enable_edca_params;
+	uint32_t edca_vo_cwmin;
+	uint32_t edca_vi_cwmin;
+	uint32_t edca_bk_cwmin;
+	uint32_t edca_be_cwmin;
+	uint32_t edca_vo_cwmax;
+	uint32_t edca_vi_cwmax;
+	uint32_t edca_bk_cwmax;
+	uint32_t edca_be_cwmax;
+	uint32_t edca_vo_aifs;
+	uint32_t edca_vi_aifs;
+	uint32_t edca_bk_aifs;
+	uint32_t edca_be_aifs;
 	bool enable_fatal_event;
 } tCsrConfig;
 
diff --git a/core/sme/src/csr/csr_api_roam.c b/core/sme/src/csr/csr_api_roam.c
index aafc83d..4c3af49 100644
--- a/core/sme/src/csr/csr_api_roam.c
+++ b/core/sme/src/csr/csr_api_roam.c
@@ -2356,6 +2356,23 @@
 			pParam->early_stop_scan_min_threshold;
 		pMac->roam.configParam.early_stop_scan_max_threshold =
 			pParam->early_stop_scan_max_threshold;
+		pMac->roam.configParam.enable_edca_params =
+			pParam->enable_edca_params;
+		pMac->roam.configParam.edca_vo_cwmin = pParam->edca_vo_cwmin;
+		pMac->roam.configParam.edca_vi_cwmin = pParam->edca_vi_cwmin;
+		pMac->roam.configParam.edca_bk_cwmin = pParam->edca_bk_cwmin;
+		pMac->roam.configParam.edca_be_cwmin = pParam->edca_be_cwmin;
+
+		pMac->roam.configParam.edca_vo_cwmax = pParam->edca_vo_cwmax;
+		pMac->roam.configParam.edca_vi_cwmax = pParam->edca_vi_cwmax;
+		pMac->roam.configParam.edca_bk_cwmax = pParam->edca_bk_cwmax;
+		pMac->roam.configParam.edca_be_cwmax = pParam->edca_be_cwmax;
+
+		pMac->roam.configParam.edca_vo_aifs = pParam->edca_vo_aifs;
+		pMac->roam.configParam.edca_vi_aifs = pParam->edca_vi_aifs;
+		pMac->roam.configParam.edca_bk_aifs = pParam->edca_bk_aifs;
+		pMac->roam.configParam.edca_be_aifs = pParam->edca_be_aifs;
+
 		pMac->roam.configParam.enable_fatal_event =
 			pParam->enable_fatal_event;
 
@@ -2543,6 +2560,23 @@
 	pParam->enableHtSmps = pMac->roam.configParam.enableHtSmps;
 	pParam->htSmps = pMac->roam.configParam.htSmps;
 	pParam->send_smps_action = pMac->roam.configParam.send_smps_action;
+
+	pParam->enable_edca_params =
+		pMac->roam.configParam.enable_edca_params;
+	pParam->edca_vo_cwmin = pMac->roam.configParam.edca_vo_cwmin;
+	pParam->edca_vi_cwmin = pMac->roam.configParam.edca_vi_cwmin;
+	pParam->edca_bk_cwmin = pMac->roam.configParam.edca_bk_cwmin;
+	pParam->edca_be_cwmin = pMac->roam.configParam.edca_be_cwmin;
+
+	pParam->edca_vo_cwmax = pMac->roam.configParam.edca_vo_cwmax;
+	pParam->edca_vi_cwmax = pMac->roam.configParam.edca_vi_cwmax;
+	pParam->edca_bk_cwmax = pMac->roam.configParam.edca_bk_cwmax;
+	pParam->edca_be_cwmax = pMac->roam.configParam.edca_be_cwmax;
+
+	pParam->edca_vo_aifs = pMac->roam.configParam.edca_vo_aifs;
+	pParam->edca_vi_aifs = pMac->roam.configParam.edca_vi_aifs;
+	pParam->edca_bk_aifs = pMac->roam.configParam.edca_bk_aifs;
+	pParam->edca_be_aifs = pMac->roam.configParam.edca_be_aifs;
 	pParam->enable_fatal_event =
 		pMac->roam.configParam.enable_fatal_event;