Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 120775a6 authored by Abdul Muqtadeer Ahmed's avatar Abdul Muqtadeer Ahmed Committed by snandini
Browse files

qcacld-3.0: Add a new feature to support forced dtim

Add vendor command interface/feature through which the user
or vendor can set the dtim count as per their requirement.

Change-Id: I26010948c4ed7e3c49bfe0453119235d4f438c6f
CRs-Fixed: 2894349
parent f9604d47
Loading
Loading
Loading
Loading
+13 −1
Original line number Diff line number Diff line
/*
 * Copyright (c) 2017-2018, 2020 The Linux Foundation. All rights reserved.
 * Copyright (c) 2017-2018, 2020-2021 The Linux Foundation. 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
@@ -348,6 +348,18 @@ QDF_STATUS pmo_core_txrx_suspend(struct wlan_objmgr_psoc *psoc);
 * Return: QDF_STATUS
 */
QDF_STATUS pmo_core_txrx_resume(struct wlan_objmgr_psoc *psoc);

/**
 * pmo_core_config_forced_dtim() - function to configure forced dtim
 * @vdev: objmgr vdev handle
 * @dynamic_dtim: dynamic dtim value passed by user
 *
 * This function configures the forced modulated dtim in firmware
 *
 * Return: QDF_STATUS
 */
QDF_STATUS pmo_core_config_forced_dtim(struct wlan_objmgr_vdev *vdev,
				       uint32_t dynamic_dtim);
#endif /* WLAN_POWER_MANAGEMENT_OFFLOAD */

#endif /* end  of _WLAN_PMO_SUSPEND_RESUME_H_ */
+1 −0
Original line number Diff line number Diff line
@@ -186,6 +186,7 @@ static void wlan_pmo_init_cfg(struct wlan_objmgr_psoc *psoc,
	psoc_cfg->sta_mod_dtim = cfg_get(psoc, CFG_PMO_ENABLE_MODULATED_DTIM);
	psoc_cfg->enable_mc_list = cfg_get(psoc, CFG_PMO_MC_ADDR_LIST_ENABLE);
	psoc_cfg->power_save_mode = cfg_get(psoc, CFG_PMO_POWERSAVE_MODE);
	psoc_cfg->sta_forced_dtim = cfg_get(psoc, CFG_PMO_ENABLE_FORCED_DTIM);
	psoc_cfg->is_mod_dtim_on_sys_suspend_enabled =
			cfg_get(psoc, CFG_PMO_MOD_DTIM_ON_SYS_SUSPEND);
	psoc_cfg->is_bus_suspend_enabled_in_sap_mode =
+35 −0
Original line number Diff line number Diff line
@@ -816,6 +816,10 @@ pmo_core_enable_wow_in_fw(struct wlan_objmgr_psoc *psoc,
		param.flags |= WMI_WOW_FLAG_MOD_DTIM_ON_SYS_SUSPEND;
	}

	if (psoc_cfg->sta_forced_dtim) {
		pmo_info("forced DTIM enabled");
		param.flags |= WMI_WOW_FLAG_FORCED_DTIM_ON_SYS_SUSPEND;
	}
	status = pmo_tgt_psoc_send_wow_enable_req(psoc, &param);
	if (status != QDF_STATUS_SUCCESS) {
		pmo_err("Failed to enable wow in fw");
@@ -1683,6 +1687,34 @@ QDF_STATUS pmo_core_config_listen_interval(struct wlan_objmgr_vdev *vdev,
	return status;
}

QDF_STATUS pmo_core_config_forced_dtim(struct wlan_objmgr_vdev *vdev,
				       uint32_t dynamic_dtim)
{
	struct pmo_vdev_priv_obj *vdev_ctx;
	uint8_t vdev_id;
	QDF_STATUS status;

	vdev_id = pmo_vdev_get_id(vdev);
	vdev_ctx = pmo_vdev_get_priv(vdev);

	qdf_spin_lock_bh(&vdev_ctx->pmo_vdev_lock);
	vdev_ctx->dyn_modulated_dtim = dynamic_dtim;
	vdev_ctx->dyn_modulated_dtim_enabled = dynamic_dtim >= 1;
	qdf_spin_unlock_bh(&vdev_ctx->pmo_vdev_lock);

	status = pmo_tgt_vdev_update_param_req(vdev,
					       pmo_vdev_param_forced_dtim_count,
					       dynamic_dtim);

	if (QDF_IS_STATUS_ERROR(status)) {
		pmo_err("Failed to set forced DTIM for vdev id %d",
			vdev_id);
	}

	wlan_objmgr_vdev_release_ref(vdev, WLAN_PMO_ID);
	return status;
}

QDF_STATUS pmo_core_config_modulated_dtim(struct wlan_objmgr_vdev *vdev,
					  uint32_t mod_dtim)
{
@@ -1706,6 +1738,9 @@ QDF_STATUS pmo_core_config_modulated_dtim(struct wlan_objmgr_vdev *vdev,
	vdev_ctx = pmo_vdev_get_priv(vdev);
	psoc_cfg = &vdev_ctx->pmo_psoc_ctx->psoc_cfg;

	if (psoc_cfg->sta_forced_dtim)
		return pmo_core_config_forced_dtim(vdev, mod_dtim);

	/* Calculate Maximum allowed modulated DTIM */
	beacon_interval_mod =
		pmo_core_get_vdev_beacon_interval(vdev) / 100;
+23 −0
Original line number Diff line number Diff line
@@ -247,6 +247,28 @@
	0, \
	"Modulated DTIM on System suspend wow")

/*
 * <ini>
 * gEnableForcedDTIM - Enable/Disable forced DTIM feature
 * @Min: 0
 * @Max: 1
 * @Default: 0
 *
 * This ini is used to enable/disable forced DTIM feature.
 *
 * 0 - Disable forced DTIM.
 * 1 - Enable forced DTIM
 *
 *
 * Usage: External
 *
 * </ini>
 */
#define CFG_PMO_ENABLE_FORCED_DTIM CFG_INI_BOOL( \
	"gEnableForcedDTIM", \
	0, \
	"Enable/disable Forced DTIM feature")

/*
 * <ini>
 * gMaxPsPoll - Max powersave poll
@@ -468,6 +490,7 @@
	CFG(CFG_PMO_ENABLE_HOST_NSOFFLOAD) \
	CFG(CFG_PMO_ENABLE_DYNAMIC_DTIM) \
	CFG(CFG_PMO_ENABLE_MODULATED_DTIM) \
	CFG(CFG_PMO_ENABLE_FORCED_DTIM) \
	CFG(CFG_PMO_MC_ADDR_LIST_ENABLE) \
	CFG(CFG_PMO_POWERSAVE_MODE) \
	CFG(CFG_PMO_MAX_PS_POLL) \
+4 −0
Original line number Diff line number Diff line
@@ -55,11 +55,13 @@
 * enum pmo_vdev_param_id: tell vdev param id
 * @pmo_vdev_param_listen_interval: vdev listen interval param id
 * @pmo_vdev_param_dtim_policy: vdev param dtim policy
 * @pmo_vdev_param_forced_dtim_count: vdev param forced dtim count
 * @pmo_vdev_max_param: Max vdev param id
 */
enum pmo_vdev_param_id {
	pmo_vdev_param_listen_interval = 0,
	pmo_vdev_param_dtim_policy,
	pmo_vdev_param_forced_dtim_count,
	pmo_vdev_max_param
};

@@ -275,6 +277,7 @@ enum active_apf_mode {
 * @sta_dynamic_dtim: station dynamic DTIM value
 * @sta_mod_dtim: station modulated DTIM value
 * @sta_max_li_mod_dtim: station max listen interval DTIM value
 * @sta_forced_dtim: station forced DTIM value
 * @wow_enable: enable wow with majic pattern match or pattern byte match
 * @power_save_mode: power save mode for psoc
 * @runtime_pm_delay: set runtime pm's inactivity timer
@@ -333,6 +336,7 @@ struct pmo_psoc_cfg {
	uint8_t sta_dynamic_dtim;
	uint8_t sta_mod_dtim;
	uint8_t sta_max_li_mod_dtim;
	bool sta_forced_dtim;
	enum pmo_wow_enable_type wow_enable;
	enum powersave_mode power_save_mode;
	enum powersave_mode default_power_save_mode;
Loading