qcacld-3.0: Allow NAN+SAP SCC on unsafe channel

Currently host driver does not allow NAN+SAP SCC on unsafe channel.
With this change add support to allow NAN+SAP SCC on unsafe channel
if g_nan_sap_scc_on_lte_coex_chan ini is enabled.

Change-Id: Iccc37f28d8523cd335cce5fcfb0293f3f8cc8959
CRs-Fixed: 3531489
此提交包含在:
Ashish Kumar Dhanotiya
2023-06-15 15:16:05 +05:30
提交者 Rahul Choudhary
父節點 d9b6d94645
當前提交 a57d5016d7
共有 4 個檔案被更改,包括 101 行新增4 行删除

查看文件

@@ -5238,4 +5238,14 @@ bool policy_mgr_is_sap_mode(enum policy_mgr_con_mode mode);
*/
bool policy_mgr_is_beaconing_mode(enum policy_mgr_con_mode mode);
/**
* policy_mgr_get_nan_sap_scc_on_lte_coex_chnl() -Get if NAN + SAP SCC on
* lte coex channel is allowed on lte coex channel or not
* @psoc: psoc pointer
*
* Return: cfg value of nan sap scc is allowed or not on lte coex channel
*/
bool policy_mgr_get_nan_sap_scc_on_lte_coex_chnl(struct wlan_objmgr_psoc *psoc);
#endif /* __WLAN_POLICY_MGR_API_H */

查看文件

@@ -1608,6 +1608,8 @@ bool policy_mgr_is_safe_channel(struct wlan_objmgr_psoc *psoc,
bool policy_mgr_is_sap_freq_allowed(struct wlan_objmgr_psoc *psoc,
uint32_t sap_freq)
{
uint32_t nan_2g_freq, nan_5g_freq;
if (policy_mgr_is_safe_channel(psoc, sap_freq))
return true;
@@ -1621,6 +1623,19 @@ bool policy_mgr_is_sap_freq_allowed(struct wlan_objmgr_psoc *psoc,
return true;
}
nan_2g_freq =
policy_mgr_mode_specific_get_channel(psoc, PM_NAN_DISC_MODE);
nan_5g_freq = wlan_nan_get_disc_5g_ch_freq(psoc);
if ((WLAN_REG_IS_SAME_BAND_FREQS(nan_2g_freq, sap_freq) ||
WLAN_REG_IS_SAME_BAND_FREQS(nan_5g_freq, sap_freq)) &&
policy_mgr_is_force_scc(psoc) &&
policy_mgr_get_nan_sap_scc_on_lte_coex_chnl(psoc)) {
policy_mgr_debug("NAN+SAP SCC on unsafe freq %d is allowed",
sap_freq);
return true;
}
return false;
}
@@ -2100,6 +2115,10 @@ void policy_mgr_nan_sap_post_disable_conc_check(struct wlan_objmgr_psoc *psoc)
struct policy_mgr_conc_connection_info *sap_info = NULL;
uint32_t sap_freq = 0, i;
QDF_STATUS status;
uint32_t user_config_freq;
uint8_t band_mask = 0;
uint8_t chn_idx, num_chan;
struct regulatory_channel *channel_list;
pm_ctx = policy_mgr_get_context(psoc);
if (!pm_ctx) {
@@ -2118,13 +2137,48 @@ void policy_mgr_nan_sap_post_disable_conc_check(struct wlan_objmgr_psoc *psoc)
if (sap_freq == 0 || policy_mgr_is_safe_channel(psoc, sap_freq))
return;
user_config_freq = policy_mgr_get_user_config_sap_freq(
psoc, sap_info->vdev_id);
sap_freq = policy_mgr_get_nondfs_preferred_channel(psoc, PM_SAP_MODE,
false,
sap_info->vdev_id);
policy_mgr_debug("User/ACS orig Freq: %d New SAP Freq: %d",
policy_mgr_get_user_config_sap_freq(
psoc, sap_info->vdev_id),
sap_freq);
user_config_freq, sap_freq);
if (wlan_reg_is_enable_in_secondary_list_for_freq(pm_ctx->pdev,
user_config_freq) &&
policy_mgr_is_safe_channel(psoc, user_config_freq)) {
policy_mgr_debug("Give preference to user config freq");
sap_freq = user_config_freq;
} else {
channel_list = qdf_mem_malloc(
sizeof(struct regulatory_channel) *
NUM_CHANNELS);
if (!channel_list)
return;
band_mask |= BIT(wlan_reg_freq_to_band(user_config_freq));
num_chan = wlan_reg_get_band_channel_list_for_pwrmode(
pm_ctx->pdev,
band_mask,
channel_list,
REG_CURRENT_PWR_MODE);
for (chn_idx = 0; chn_idx < num_chan; chn_idx++) {
if (wlan_reg_is_enable_in_secondary_list_for_freq(
pm_ctx->pdev,
channel_list[chn_idx].center_freq) &&
policy_mgr_is_safe_channel(
psoc,
channel_list[chn_idx].center_freq)) {
policy_mgr_debug("Prefer user config band freq %d",
channel_list[chn_idx].center_freq);
sap_freq = channel_list[chn_idx].center_freq;
}
}
qdf_mem_free(channel_list);
}
if (pm_ctx->hdd_cbacks.hdd_is_chan_switch_in_progress &&
pm_ctx->hdd_cbacks.hdd_is_chan_switch_in_progress()) {
policy_mgr_debug("wait as channel switch is already in progress");
@@ -2586,6 +2640,7 @@ policy_mgr_valid_sap_conc_channel_check(struct wlan_objmgr_psoc *psoc,
bool is_6ghz_cap;
bool is_sta_sap_scc;
enum policy_mgr_con_mode con_mode;
uint32_t nan_2g_freq, nan_5g_freq;
pm_ctx = policy_mgr_get_context(psoc);
if (!pm_ctx) {
@@ -2622,6 +2677,10 @@ policy_mgr_valid_sap_conc_channel_check(struct wlan_objmgr_psoc *psoc,
is_sta_sap_scc = policy_mgr_is_sta_sap_scc(psoc, ch_freq);
nan_2g_freq =
policy_mgr_mode_specific_get_channel(psoc, PM_NAN_DISC_MODE);
nan_5g_freq = wlan_nan_get_disc_5g_ch_freq(psoc);
sta_sap_scc_on_dfs_chan =
policy_mgr_is_sta_sap_scc_allowed_on_dfs_chan(psoc);
@@ -2658,7 +2717,10 @@ policy_mgr_valid_sap_conc_channel_check(struct wlan_objmgr_psoc *psoc,
ch_freq);
} else if (!policy_mgr_is_safe_channel(psoc, ch_freq) &&
!(policy_mgr_sta_sap_scc_on_lte_coex_chan(psoc) &&
is_sta_sap_scc)) {
is_sta_sap_scc) &&
!(policy_mgr_get_nan_sap_scc_on_lte_coex_chnl(psoc) &&
(WLAN_REG_IS_SAME_BAND_FREQS(nan_2g_freq, ch_freq) ||
WLAN_REG_IS_SAME_BAND_FREQS(nan_5g_freq, ch_freq)))) {
find_alternate = true;
policymgr_nofl_debug("sap not capable unsafe con ch_freq %d",
ch_freq);

查看文件

@@ -11181,3 +11181,15 @@ bool policy_mgr_is_beaconing_mode(enum policy_mgr_con_mode mode)
return false;
}
bool policy_mgr_get_nan_sap_scc_on_lte_coex_chnl(struct wlan_objmgr_psoc *psoc)
{
struct policy_mgr_psoc_priv_obj *pm_ctx;
pm_ctx = policy_mgr_get_context(psoc);
if (!pm_ctx) {
policy_mgr_err("pm_ctx is NULL");
return 0;
}
return pm_ctx->cfg.nan_sap_scc_on_lte_coex_chnl;
}

查看文件

@@ -40,6 +40,7 @@
#include "wlan_cm_ucfg_api.h"
#include "wlan_cm_roam_api.h"
#include "wlan_scan_api.h"
#include "wlan_nan_api.h"
/*
* first_connection_pcl_table - table which provides PCL for the
@@ -537,6 +538,7 @@ void policy_mgr_update_with_safe_channel_list(struct wlan_objmgr_psoc *psoc,
uint32_t safe_channel_count = 0, current_channel_count = 0;
struct policy_mgr_psoc_priv_obj *pm_ctx;
uint8_t scc_on_lte_coex = 0;
uint32_t nan_2g_freq, nan_5g_freq;
pm_ctx = policy_mgr_get_context(psoc);
if (!pm_ctx) {
@@ -565,6 +567,11 @@ void policy_mgr_update_with_safe_channel_list(struct wlan_objmgr_psoc *psoc,
qdf_mem_zero(weight_list, weight_len);
policy_mgr_get_sta_sap_scc_lte_coex_chnl(psoc, &scc_on_lte_coex);
nan_2g_freq =
policy_mgr_mode_specific_get_channel(pm_ctx->psoc,
PM_NAN_DISC_MODE);
nan_5g_freq = wlan_nan_get_disc_5g_ch_freq(pm_ctx->psoc);
for (i = 0; i < current_channel_count; i++) {
is_unsafe = 0;
for (j = 0; j < pm_ctx->unsafe_channel_count; j++) {
@@ -582,6 +589,12 @@ void policy_mgr_update_with_safe_channel_list(struct wlan_objmgr_psoc *psoc,
policy_mgr_debug("CH %d unsafe ignored when STA present on it",
current_channel_list[i]);
is_unsafe = 0;
} else if (is_unsafe &&
(nan_2g_freq == current_channel_list[i] ||
nan_5g_freq == current_channel_list[i]) &&
policy_mgr_is_force_scc(pm_ctx->psoc) &&
policy_mgr_get_nan_sap_scc_on_lte_coex_chnl(pm_ctx->psoc)) {
is_unsafe = 0;
}
if (!is_unsafe) {