diff --git a/mlme/core/src/wlan_mlme_main.c b/mlme/core/src/wlan_mlme_main.c
index 6a2f32da89..4bf374ecd2 100644
--- a/mlme/core/src/wlan_mlme_main.c
+++ b/mlme/core/src/wlan_mlme_main.c
@@ -1308,6 +1308,15 @@ static void mlme_init_wmm_in_cfg(struct wlan_objmgr_psoc *psoc,
cfg_get(psoc, CFG_QOS_WMM_UAPSD_BK_SRV_INTV);
wmm_params->ac_bk.uapsd_bk_sus_intv =
cfg_get(psoc, CFG_QOS_WMM_UAPSD_BK_SUS_INTV);
+
+ wmm_params->wmm_config.wmm_mode =
+ cfg_get(psoc, CFG_QOS_WMM_MODE);
+ wmm_params->wmm_config.b80211e_is_enabled =
+ cfg_get(psoc, CFG_QOS_WMM_80211E_ENABLED);
+ wmm_params->wmm_config.uapsd_mask =
+ cfg_get(psoc, CFG_QOS_WMM_UAPSD_MASK);
+ wmm_params->wmm_config.bimplicit_qos_enabled =
+ cfg_get(psoc, CFG_QOS_WMM_IMPLICIT_SETUP_ENABLED);
}
static void mlme_init_wps_params_cfg(struct wlan_objmgr_psoc *psoc,
diff --git a/mlme/dispatcher/inc/cfg_mlme_fe_wmm.h b/mlme/dispatcher/inc/cfg_mlme_fe_wmm.h
index 872ac5ed5e..3ac32832af 100644
--- a/mlme/dispatcher/inc/cfg_mlme_fe_wmm.h
+++ b/mlme/dispatcher/inc/cfg_mlme_fe_wmm.h
@@ -756,6 +756,101 @@
CFG_VALUE_OR_DEFAULT, \
"Infra uapsd bk sus intv")
+/* WMM configuration */
+/*
+ *
+ * WmmIsEnabled - Enable WMM feature
+ * @Min: 0
+ * @Max: 2
+ * @Default: 0
+ *
+ * This ini is used to enable/disable WMM.
+ *
+ * Related: None.
+ *
+ * Supported Feature: WMM
+ *
+ * Usage: Internal/External
+ *
+ *
+ */
+#define CFG_QOS_WMM_MODE CFG_INI_UINT( \
+ "WmmIsEnabled", \
+ 0, \
+ 2, \
+ 2, \
+ CFG_VALUE_OR_DEFAULT, \
+ "Enable WMM feature")
+
+/*
+ *
+ * 80211eIsEnabled - Enable 802.11e feature
+ * @Min: 0
+ * @Max: 1
+ * @Default: 0
+ *
+ * This ini is used to enable/disable 802.11e.
+ *
+ * Related: None.
+ *
+ * Supported Feature: 802.11e
+ *
+ * Usage: Internal/External
+ *
+ *
+ */
+#define CFG_QOS_WMM_80211E_ENABLED CFG_INI_BOOL( \
+ "80211eIsEnabled", \
+ 0, \
+ "Enable 802.11e feature")
+
+/*
+ *
+ * UapsdMask - To setup U-APSD mask for ACs
+ * @Min: 0x00
+ * @Max: 0xFF
+ * @Default: 0x00
+ *
+ * This ini is used to setup U-APSD mask for ACs.
+ *
+ * Related: None.
+ *
+ * Supported Feature: WMM
+ *
+ * Usage: Internal/External
+ *
+ *
+ */
+#define CFG_QOS_WMM_UAPSD_MASK CFG_INI_UINT( \
+ "UapsdMask", \
+ 0x00, \
+ 0xFF, \
+ 0x00, \
+ CFG_VALUE_OR_DEFAULT, \
+ "setup U-APSD mask for ACs")
+
+/*
+ *
+ * ImplicitQosIsEnabled - Enableimplicit QOS
+ * @Min: 0
+ * @Max: 1
+ * @Default: 0
+ *
+ * This ini is used to enable/disable implicit QOS.
+ *
+ * Related: None.
+ *
+ * Supported Feature: WMM
+ *
+ * Usage: Internal/External
+ *
+ *
+ */
+#define CFG_QOS_WMM_IMPLICIT_SETUP_ENABLED CFG_INI_BOOL( \
+ "ImplicitQosIsEnabled", \
+ 0, \
+ "Enable implicit QOS")
+
#define CFG_WMM_PARAMS_ALL \
CFG(CFG_QOS_ENABLED) \
CFG(CFG_WME_ENABLED) \
@@ -789,6 +884,10 @@
CFG(CFG_QOS_WMM_MIN_PHY_RATE_AC_BK) \
CFG(CFG_QOS_WMM_SBA_AC_BK) \
CFG(CFG_QOS_WMM_UAPSD_BK_SRV_INTV) \
- CFG(CFG_QOS_WMM_UAPSD_BK_SUS_INTV)
+ CFG(CFG_QOS_WMM_UAPSD_BK_SUS_INTV) \
+ CFG(CFG_QOS_WMM_MODE) \
+ CFG(CFG_QOS_WMM_80211E_ENABLED) \
+ CFG(CFG_QOS_WMM_UAPSD_MASK) \
+ CFG(CFG_QOS_WMM_IMPLICIT_SETUP_ENABLED)
#endif /* __CFG_MLME_FE_WMM_H */
diff --git a/mlme/dispatcher/inc/wlan_mlme_api.h b/mlme/dispatcher/inc/wlan_mlme_api.h
index 0010f1a166..39a3c9ae97 100644
--- a/mlme/dispatcher/inc/wlan_mlme_api.h
+++ b/mlme/dispatcher/inc/wlan_mlme_api.h
@@ -883,6 +883,47 @@ QDF_STATUS
wlan_mlme_get_wmm_uapsd_bk_sus_intv(struct wlan_objmgr_psoc *psoc,
uint32_t *value);
+/**
+ * wlan_mlme_get_wmm_mode() - Enable WMM feature
+ * @psoc: pointer to psoc object
+ * @value: pointer to the value which will be filled for the caller
+ *
+ * Return: QDF Status
+ */
+QDF_STATUS
+wlan_mlme_get_wmm_mode(struct wlan_objmgr_psoc *psoc, uint8_t *value);
+
+/**
+ * wlan_mlme_get_80211e_is_enabled() - Enable 802.11e feature
+ * @psoc: pointer to psoc object
+ * @value: pointer to the value which will be filled for the caller
+ *
+ * Return: QDF Status
+ */
+QDF_STATUS
+wlan_mlme_get_80211e_is_enabled(struct wlan_objmgr_psoc *psoc, bool *value);
+
+/**
+ * wlan_mlme_get_wmm_uapsd_mask() - setup U-APSD mask for ACs
+ * @psoc: pointer to psoc object
+ * @value: pointer to the value which will be filled for the caller
+ *
+ * Return: QDF Status
+ */
+QDF_STATUS
+wlan_mlme_get_wmm_uapsd_mask(struct wlan_objmgr_psoc *psoc, uint8_t *value);
+
+/**
+ * wlan_mlme_get_implicit_qos_is_enabled() - Enable implicit QOS
+ * @psoc: pointer to psoc object
+ * @value: pointer to the value which will be filled for the caller
+ *
+ * Return: QDF Status
+ */
+QDF_STATUS
+wlan_mlme_get_implicit_qos_is_enabled(struct wlan_objmgr_psoc *psoc,
+ bool *value);
+
/**
* wlan_mlme_get_wmm_dir_ac_vo() - Get TSPEC direction
* for VO
diff --git a/mlme/dispatcher/inc/wlan_mlme_public_struct.h b/mlme/dispatcher/inc/wlan_mlme_public_struct.h
index f734d1fbe9..e3b4bd0cc6 100644
--- a/mlme/dispatcher/inc/wlan_mlme_public_struct.h
+++ b/mlme/dispatcher/inc/wlan_mlme_public_struct.h
@@ -997,6 +997,20 @@ struct wlan_mlme_lfr_cfg {
uint32_t roam_preauth_no_ack_timeout;
};
+/**
+ * struct wlan_mlme_wmm_config - WMM configuration
+ * @wmm_mode: Enable WMM feature
+ * @b80211e_is_enabled: Enable 802.11e feature
+ * @uapsd_mask: what ACs to setup U-APSD for at assoc
+ * @bimplicit_qos_enabled: Enable implicit QOS
+ */
+struct wlan_mlme_wmm_config {
+ uint8_t wmm_mode;
+ bool b80211e_is_enabled;
+ uint8_t uapsd_mask;
+ bool bimplicit_qos_enabled;
+};
+
/**
* struct wlan_mlme_wmm_ac_vo - Default TSPEC parameters
* for AC_VO
@@ -1100,6 +1114,7 @@ struct wlan_mlme_wmm_params {
uint8_t max_sp_length;
bool wsm_enabled;
uint32_t edca_profile;
+ struct wlan_mlme_wmm_config wmm_config;
struct wlan_mlme_wmm_ac_vo ac_vo;
struct wlan_mlme_wmm_ac_vi ac_vi;
struct wlan_mlme_wmm_ac_be ac_be;
diff --git a/mlme/dispatcher/inc/wlan_mlme_ucfg_api.h b/mlme/dispatcher/inc/wlan_mlme_ucfg_api.h
index abee54832c..1ad51b486d 100644
--- a/mlme/dispatcher/inc/wlan_mlme_ucfg_api.h
+++ b/mlme/dispatcher/inc/wlan_mlme_ucfg_api.h
@@ -2049,4 +2049,65 @@ ucfg_mlme_get_wmm_uapsd_bk_sus_intv(struct wlan_objmgr_psoc *psoc,
return wlan_mlme_get_wmm_uapsd_bk_sus_intv(psoc, value);
}
+/**
+ * ucfg_mlme_get_wmm_mode() - Enable WMM feature
+ * @psoc: pointer to psoc object
+ * @value: Value that needs to be set from the caller
+ *
+ * Inline UCFG API to be used by HDD/OSIF callers
+ *
+ * Return: QDF Status
+ */
+static inline QDF_STATUS
+ucfg_mlme_get_wmm_mode(struct wlan_objmgr_psoc *psoc, uint8_t *value)
+{
+ return wlan_mlme_get_wmm_mode(psoc, value);
+}
+
+/**
+ * ucfg_mlme_get_80211e_is_enabled() - Enable 802.11e feature
+ * @psoc: pointer to psoc object
+ * @value: Value that needs to be set from the caller
+ *
+ * Inline UCFG API to be used by HDD/OSIF callers
+ *
+ * Return: QDF Status
+ */
+static inline QDF_STATUS
+ucfg_mlme_get_80211e_is_enabled(struct wlan_objmgr_psoc *psoc, bool *value)
+{
+ return wlan_mlme_get_80211e_is_enabled(psoc, value);
+}
+
+/**
+ * ucfg_mlme_get_wmm_uapsd_mask() - setup U-APSD mask for ACs
+ * @psoc: pointer to psoc object
+ * @value: Value that needs to be set from the caller
+ *
+ * Inline UCFG API to be used by HDD/OSIF callers
+ *
+ * Return: QDF Status
+ */
+static inline QDF_STATUS
+ucfg_mlme_get_wmm_uapsd_mask(struct wlan_objmgr_psoc *psoc, uint8_t *value)
+{
+ return wlan_mlme_get_wmm_uapsd_mask(psoc, value);
+}
+
+/**
+ * ucfg_mlme_get_implicit_qos_is_enabled() - Enable implicit QOS
+ * @psoc: pointer to psoc object
+ * @value: Value that needs to be set from the caller
+ *
+ * Inline UCFG API to be used by HDD/OSIF callers
+ *
+ * Return: QDF Status
+ */
+static inline QDF_STATUS
+ucfg_mlme_get_implicit_qos_is_enabled(struct wlan_objmgr_psoc *psoc,
+ bool *value)
+{
+ return wlan_mlme_get_implicit_qos_is_enabled(psoc, value);
+}
+
#endif /* _WLAN_MLME_UCFG_API_H_ */
diff --git a/mlme/dispatcher/src/wlan_mlme_api.c b/mlme/dispatcher/src/wlan_mlme_api.c
index 76841212a9..bbd4375ab3 100644
--- a/mlme/dispatcher/src/wlan_mlme_api.c
+++ b/mlme/dispatcher/src/wlan_mlme_api.c
@@ -1024,6 +1024,71 @@ wlan_mlme_get_wmm_uapsd_bk_sus_intv(struct wlan_objmgr_psoc *psoc,
return QDF_STATUS_SUCCESS;
}
+QDF_STATUS
+wlan_mlme_get_wmm_mode(struct wlan_objmgr_psoc *psoc, uint8_t *value)
+{
+ struct wlan_mlme_psoc_obj *mlme_obj;
+
+ mlme_obj = mlme_get_psoc_obj(psoc);
+ if (!mlme_obj) {
+ mlme_err("Failed to get MLME Obj");
+ return QDF_STATUS_E_FAILURE;
+ }
+
+ *value = mlme_obj->cfg.wmm_params.wmm_config.wmm_mode;
+
+ return QDF_STATUS_SUCCESS;
+}
+
+QDF_STATUS
+wlan_mlme_get_80211e_is_enabled(struct wlan_objmgr_psoc *psoc, bool *value)
+{
+ struct wlan_mlme_psoc_obj *mlme_obj;
+
+ mlme_obj = mlme_get_psoc_obj(psoc);
+ if (!mlme_obj) {
+ mlme_err("Failed to get MLME Obj");
+ return QDF_STATUS_E_FAILURE;
+ }
+
+ *value = mlme_obj->cfg.wmm_params.wmm_config.b80211e_is_enabled;
+
+ return QDF_STATUS_SUCCESS;
+}
+
+QDF_STATUS
+wlan_mlme_get_wmm_uapsd_mask(struct wlan_objmgr_psoc *psoc, uint8_t *value)
+{
+ struct wlan_mlme_psoc_obj *mlme_obj;
+
+ mlme_obj = mlme_get_psoc_obj(psoc);
+ if (!mlme_obj) {
+ mlme_err("Failed to get MLME Obj");
+ return QDF_STATUS_E_FAILURE;
+ }
+
+ *value = mlme_obj->cfg.wmm_params.wmm_config.uapsd_mask;
+
+ return QDF_STATUS_SUCCESS;
+}
+
+QDF_STATUS
+wlan_mlme_get_implicit_qos_is_enabled(struct wlan_objmgr_psoc *psoc,
+ bool *value)
+{
+ struct wlan_mlme_psoc_obj *mlme_obj;
+
+ mlme_obj = mlme_get_psoc_obj(psoc);
+ if (!mlme_obj) {
+ mlme_err("Failed to get MLME Obj");
+ return QDF_STATUS_E_FAILURE;
+ }
+
+ *value = mlme_obj->cfg.wmm_params.wmm_config.bimplicit_qos_enabled;
+
+ return QDF_STATUS_SUCCESS;
+}
+
QDF_STATUS wlan_mlme_set_sap_listen_interval(struct wlan_objmgr_psoc *psoc,
int value)
{