Browse Source

qcacld-3.0: Add support for new config item ConDTIMSkipping_MaxTime

With this change add support for new ini ConDTIMSkipping_MaxTime
to set max modulated DTIM in ms.

Change-Id: I89ce2b5074ce75a1701365b5d09d8ed0244aeeef
CRs-Fixed: 3038346
Ashish 3 years ago
parent
commit
aa31fd94c1

+ 3 - 0
components/mlme/core/src/wlan_mlme_main.c

@@ -1703,6 +1703,9 @@ static void mlme_init_sta_cfg(struct wlan_objmgr_psoc *psoc,
 	sta->allow_tpc_from_ap = cfg_get(psoc, CFG_TX_POWER_CTRL);
 	sta->sta_keepalive_method =
 		cfg_get(psoc, CFG_STA_KEEPALIVE_METHOD);
+	sta->max_li_modulated_dtim_time_ms =
+		cfg_get(psoc, CFG_MAX_LI_MODULATED_DTIM_MS);
+
 	mlme_init_sta_mlo_cfg(psoc, sta);
 }
 

+ 26 - 1
components/mlme/dispatcher/inc/cfg_mlme_sta.h

@@ -512,6 +512,30 @@
 			CFG_VALUE_OR_DEFAULT, \
 			"Max modulated dtim")
 
+/*
+ * <ini>
+ * @Min: 0
+ * @Max: 2000
+ * @Default: 500
+ *
+ * This ini is used to set default ConDTIMSkipping_MaxTime in ms
+ *
+ * Related: None
+ *
+ * Supported Feature: STA
+ *
+ * Usage: External
+ *
+ * </ini>
+ */
+#define CFG_MAX_LI_MODULATED_DTIM_MS CFG_INI_UINT( \
+			"ConDTIMSkipping_MaxTime", \
+			0, \
+			2000, \
+			500, \
+			CFG_VALUE_OR_DEFAULT, \
+			"DTIM skipping max time")
+
 #ifdef WLAN_FEATURE_11BE_MLO
 /*
  * <cfg>
@@ -560,6 +584,7 @@
 	CFG(CFG_WT_CNF_TIMEOUT) \
 	CFG(CFG_CURRENT_RSSI) \
 	CFG(CFG_TX_POWER_CTRL) \
-	CFG_SINGLE_LINK_MLO_CONN_CFG
+	CFG_SINGLE_LINK_MLO_CONN_CFG \
+	CFG(CFG_MAX_LI_MODULATED_DTIM_MS)
 
 #endif /* CFG_MLME_STA_H__ */

+ 12 - 0
components/mlme/dispatcher/inc/wlan_mlme_api.h

@@ -2301,6 +2301,18 @@ QDF_STATUS
 wlan_mlme_get_sta_miracast_mcc_rest_time(struct wlan_objmgr_psoc *psoc,
 					 uint32_t *value);
 
+/**
+ * wlan_mlme_get_max_modulated_dtim_ms() - get the max modulated dtim in ms
+ * restart
+ * @psoc: pointer to psoc object
+ * @value: Value that needs to be set from the caller
+ *
+ * Return: QDF Status
+ */
+QDF_STATUS
+wlan_mlme_get_max_modulated_dtim_ms(struct wlan_objmgr_psoc *psoc,
+				    uint16_t *value);
+
 /**
  * wlan_mlme_get_scan_probe_unicast_ra() - Get scan probe unicast RA cfg
  * @psoc: pointer to psoc object

+ 2 - 0
components/mlme/dispatcher/inc/wlan_mlme_public_struct.h

@@ -1643,6 +1643,7 @@ enum station_prefer_bw {
  * @usr_disabled_roaming:           User config for roaming disable
  * @usr_scan_probe_unicast_ra:      User config unicast probe req in scan
  * @single_link_mlo_conn:           Single link mlo connection is configured
+ * @max_li_modulated_dtim_time_ms: Max modulated DTIM time in ms.
  */
 struct wlan_mlme_sta_cfg {
 	uint32_t sta_keep_alive_period;
@@ -1672,6 +1673,7 @@ struct wlan_mlme_sta_cfg {
 #ifdef WLAN_FEATURE_11BE_MLO
 	bool single_link_mlo_conn;
 #endif
+	uint16_t max_li_modulated_dtim_time_ms;
 };
 
 /**

+ 16 - 0
components/mlme/dispatcher/inc/wlan_mlme_ucfg_api.h

@@ -3677,6 +3677,22 @@ ucfg_mlme_get_sta_miracast_mcc_rest_time(struct wlan_objmgr_psoc *psoc,
 	return wlan_mlme_get_sta_miracast_mcc_rest_time(psoc, value);
 }
 
+/**
+ * ucfg_mlme_get_max_modulated_dtim_ms() - get sap max modulated dtim
+ * @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_max_modulated_dtim_ms(struct wlan_objmgr_psoc *psoc,
+				    uint16_t *value)
+{
+	return wlan_mlme_get_max_modulated_dtim_ms(psoc, value);
+}
+
 /**
  * ucfg_mlme_get_sap_mcc_chnl_avoid() - Check if SAP MCC needs to be avoided
  *

+ 15 - 0
components/mlme/dispatcher/src/wlan_mlme_api.c

@@ -2731,6 +2731,21 @@ wlan_mlme_get_sta_miracast_mcc_rest_time(struct wlan_objmgr_psoc *psoc,
 	return QDF_STATUS_SUCCESS;
 }
 
+QDF_STATUS
+wlan_mlme_get_max_modulated_dtim_ms(struct wlan_objmgr_psoc *psoc,
+				    uint16_t *value)
+{
+	struct wlan_mlme_psoc_ext_obj *mlme_obj;
+
+	mlme_obj = mlme_get_psoc_ext_obj(psoc);
+	if (!mlme_obj)
+		return QDF_STATUS_E_FAILURE;
+
+	*value = mlme_obj->cfg.sta.max_li_modulated_dtim_time_ms;
+
+	return QDF_STATUS_SUCCESS;
+}
+
 QDF_STATUS
 wlan_mlme_get_scan_probe_unicast_ra(struct wlan_objmgr_psoc *psoc,
 				    bool *value)

+ 3 - 0
core/cds/inc/cds_config.h

@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2016-2020 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
  *
  * Permission to use, copy, modify, and/or distribute this software for
  * any purpose with or without fee is hereby granted, provided that the
@@ -50,6 +51,7 @@ enum cfg_sub_20_channel_width {
  * @max_station: Max station supported
  * @max_bssid: Max Bssid Supported
  * @sta_maxlimod_dtim: station max listen interval
+ * @sta_maxlimod_dtim_ms: station max listen interval ms
  * @driver_type: Enumeration of Driver Type whether FTM or Mission mode
  * currently rest of bits are not used
  * Indicates whether support is enabled or not
@@ -80,6 +82,7 @@ struct cds_config_info {
 	uint16_t max_station;
 	uint16_t max_bssid;
 	uint8_t sta_maxlimod_dtim;
+	uint16_t sta_maxlimod_dtim_ms;
 	enum qdf_driver_type driver_type;
 	uint8_t ap_maxoffload_peers;
 	uint8_t ap_maxoffload_reorderbuffs;

+ 3 - 1
core/hdd/src/wlan_hdd_main.c

@@ -13822,6 +13822,9 @@ static int hdd_update_cds_config(struct hdd_context *hdd_ctx)
 	ucfg_mlme_get_sap_max_modulated_dtim(hdd_ctx->psoc,
 					     &cds_cfg->sta_maxlimod_dtim);
 
+	ucfg_mlme_get_max_modulated_dtim_ms(hdd_ctx->psoc,
+					    &cds_cfg->sta_maxlimod_dtim_ms);
+
 	status = ucfg_mlme_get_crash_inject(hdd_ctx->psoc, &crash_inject);
 	if (QDF_IS_STATUS_ERROR(status)) {
 		hdd_err("Failed to get crash inject ini config");
@@ -19453,7 +19456,6 @@ static int hdd_update_pmo_config(struct hdd_context *hdd_ctx)
 	ucfg_mlme_get_sap_max_modulated_dtim(hdd_ctx->psoc,
 					     &psoc_cfg.sta_max_li_mod_dtim);
 
-
 	hdd_lpass_populate_pmo_config(&psoc_cfg, hdd_ctx);
 
 	status = ucfg_pmo_update_psoc_config(hdd_ctx->psoc, &psoc_cfg);

+ 2 - 0
core/wma/inc/wma.h

@@ -852,6 +852,7 @@ struct wma_wlm_stats_data {
  * @RArateLimitInterval: RA rate limit interval
  * @is_lpass_enabled: Flag to indicate if LPASS feature is enabled or not
  * @staMaxLIModDtim: station max listen interval
+ * @sta_max_li_mod_dtim_ms: station max listen interval in ms
  * @staModDtim: station mode DTIM
  * @staDynamicDtim: station dynamic DTIM
  * @hw_bd_id: hardware board id
@@ -975,6 +976,7 @@ typedef struct {
 	bool is_lpass_enabled;
 #endif
 	uint8_t staMaxLIModDtim;
+	uint16_t sta_max_li_mod_dtim_ms;
 	uint8_t staModDtim;
 	uint8_t staDynamicDtim;
 	uint32_t hw_bd_id;

+ 16 - 0
core/wma/src/wma_dev_if.c

@@ -4990,6 +4990,7 @@ static void wma_add_sta_req_sta_mode(tp_wma_handle wma, tpAddStaParams params)
 				wmi_service_listen_interval_offload_support)) {
 		struct wlan_objmgr_vdev *vdev;
 		uint32_t moddtim;
+		bool is_connection_roaming_cfg_set = 0;
 
 		wma_debug("listen interval offload enabled, setting params");
 		status = wma_vdev_set_param(wma->wmi_handle,
@@ -5000,6 +5001,21 @@ static void wma_add_sta_req_sta_mode(tp_wma_handle wma, tpAddStaParams params)
 			wma_err("can't set MAX_LI for session: %d",
 				params->smesessionId);
 		}
+
+		ucfg_mlme_get_connection_roaming_ini_present(
+						wma->psoc,
+						&is_connection_roaming_cfg_set);
+		if (is_connection_roaming_cfg_set) {
+			status = wma_vdev_set_param(
+					wma->wmi_handle,
+					params->smesessionId,
+					WMI_VDEV_PARAM_MAX_LI_OF_MODDTIM_MS,
+					wma->sta_max_li_mod_dtim_ms);
+			if (status != QDF_STATUS_SUCCESS)
+				wma_err("can't set MAX_LI_MS for session: %d",
+					params->smesessionId);
+		}
+
 		status = wma_vdev_set_param(wma->wmi_handle,
 					    params->smesessionId,
 					    WMI_VDEV_PARAM_DYNDTIM_CNT,

+ 1 - 0
core/wma/src/wma_main.c

@@ -3439,6 +3439,7 @@ QDF_STATUS wma_open(struct wlan_objmgr_psoc *psoc,
 	wma_handle->powersave_mode =
 			ucfg_pmo_power_save_offload_enabled(wma_handle->psoc);
 	wma_handle->staMaxLIModDtim = cds_cfg->sta_maxlimod_dtim;
+	wma_handle->sta_max_li_mod_dtim_ms = cds_cfg->sta_maxlimod_dtim_ms;
 	wma_handle->staModDtim = ucfg_pmo_get_sta_mod_dtim(wma_handle->psoc);
 	wma_handle->staDynamicDtim =
 			ucfg_pmo_get_sta_dynamic_dtim(wma_handle->psoc);