qcacmn: Reset dfs_precac_active flag only for the calling pdev

When tgt_dfs_set_precac_state API is called, the dfs_precac_active
boolean is set to false for all pdevs. This results in preCAC
being stopped for all pdevs in DBS_SBS mode when one of the
pdev becomes inactive.

Reset dfs_precac_active flag only for the calling pdev and
set the global boolean 'precac_state_started' to false only
if all the individual pdev flags are inactive.

Change-Id: I73fcacb911a5eb9028b03aa1c86775a66f2a7fc9
CRs-Fixed: 2556734
此提交包含在:
Vignesh Mohan
2019-10-31 19:36:33 +05:30
提交者 nshrivas
父節點 fb73acb147
當前提交 42bc1a9d68

查看文件

@@ -425,6 +425,8 @@ QDF_STATUS tgt_dfs_set_agile_precac_state(struct wlan_objmgr_pdev *pdev,
int agile_precac_state)
{
struct wlan_dfs *dfs;
struct dfs_soc_priv_obj *dfs_soc;
bool is_precac_running_on_given_pdev = false;
int i;
if (!tgt_dfs_is_pdev_5ghz(pdev))
@@ -436,13 +438,30 @@ QDF_STATUS tgt_dfs_set_agile_precac_state(struct wlan_objmgr_pdev *pdev,
return QDF_STATUS_E_FAILURE;
}
dfs->dfs_soc_obj->precac_state_started = agile_precac_state;
if (!dfs->dfs_soc_obj->precac_state_started) {
for (i = 0; i < dfs->dfs_soc_obj->num_dfs_privs; i++)
dfs->dfs_soc_obj->dfs_priv[i].agile_precac_active = 0;
dfs->dfs_agile_precac_freq_mhz = 0;
dfs_soc = dfs->dfs_soc_obj;
for (i = 0; i < dfs_soc->num_dfs_privs; i++) {
if (dfs_soc->dfs_priv[i].dfs == dfs) {
/* Set the pdev state to given value. */
dfs_soc->dfs_priv[i].agile_precac_active =
agile_precac_state;
/* If the pdev state is changed to inactive,
* reset the agile channel.
*/
if (!agile_precac_state)
dfs->dfs_agile_precac_freq_mhz = 0;
if (dfs_soc->cur_precac_dfs_index == i)
is_precac_running_on_given_pdev = true;
}
}
/* If preCAC is running on this pdev and the agile_precac_state
* is set to false, set the global state in dfs_soc_obj to false.
* If this global state is not set to false, then preCAC will not be
* started the next time this pdev becomes active.
*/
if (is_precac_running_on_given_pdev && !agile_precac_state)
dfs_soc->precac_state_started = PRECAC_NOT_STARTED;
return QDF_STATUS_SUCCESS;
}
#else
@@ -451,6 +470,8 @@ QDF_STATUS tgt_dfs_set_agile_precac_state(struct wlan_objmgr_pdev *pdev,
int agile_precac_state)
{
struct wlan_dfs *dfs;
struct dfs_soc_priv_obj *dfs_soc;
bool is_precac_running_on_given_pdev = false;
int i;
if (!tgt_dfs_is_pdev_5ghz(pdev))
@@ -462,13 +483,30 @@ QDF_STATUS tgt_dfs_set_agile_precac_state(struct wlan_objmgr_pdev *pdev,
return QDF_STATUS_E_FAILURE;
}
dfs->dfs_soc_obj->precac_state_started = agile_precac_state;
if (!dfs->dfs_soc_obj->precac_state_started) {
for (i = 0; i < dfs->dfs_soc_obj->num_dfs_privs; i++)
dfs->dfs_soc_obj->dfs_priv[i].agile_precac_active = 0;
dfs->dfs_agile_precac_freq = 0;
dfs_soc = dfs->dfs_soc_obj;
for (i = 0; i < dfs_soc->num_dfs_privs; i++) {
if (dfs_soc->dfs_priv[i].dfs == dfs) {
/* Set the pdev state to given value. */
dfs_soc->dfs_priv[i].agile_precac_active =
agile_precac_state;
/* If the pdev state is changed to inactive,
* reset the agile channel.
*/
if (!agile_precac_state)
dfs->dfs_agile_precac_freq = 0;
if (dfs_soc->cur_precac_dfs_index == i)
is_precac_running_on_given_pdev = true;
}
}
/* If preCAC is running on this pdev and the agile_precac_state
* is set to false, set the global state in dfs_soc_obj to false.
* If this global state is not set to false, then preCAC will not be
* started the next time this pdev becomes active.
*/
if (is_precac_running_on_given_pdev && !agile_precac_state)
dfs_soc->precac_state_started = PRECAC_NOT_STARTED;
return QDF_STATUS_SUCCESS;
}
#endif