qcacmn: Check ext cc event support before pouplating sec chan list

Currently host is populating secondary channel list from master
channel list based on ap power type. In case fw doesn't support
extd cc event then secondary channel list will not have 6g freq,
which may break legacy 6g handling.

Fix is to add validation check for ext cc event support, copy
secondary channel list from ap power type in case ext cc event
is supported by fw else copy secondary channel list from reg
current channel list.

Change-Id: I2e13be2936b624ccbee5e8e426987355076a0062
CRs-Fixed: 2987951
This commit is contained in:
sheenam monga 2021-07-09 16:54:00 +05:30 • committed by Madan Koyyalamudi
commit 8fd69cb240
3 changed files with 28 additions and 6 deletions

View file

@ -228,8 +228,12 @@ target_if_reg_is_reg_cc_ext_event_host_supported(struct wlan_objmgr_psoc *psoc)
return reg_ext_cc_supp;
}
if (reg_tx_ops->register_master_ext_handler)
if (reg_tx_ops->register_master_ext_handler) {
reg_ext_cc_supp = true;
wlan_psoc_nif_fw_ext_cap_set(psoc,
WLAN_SOC_EXT_EVENT_SUPPORTED);
}
return reg_ext_cc_supp;
}

View file

@ -146,6 +146,8 @@
#define WLAN_SOC_CEXT_SCAN_PER_CH_CONFIG 0x01000000
/* CAPABILITY: csa offload in case of AP */
#define WLAN_SOC_CEXT_CSA_TX_OFFLOAD 0x02000000
/* ext event supported by fw */
#define WLAN_SOC_EXT_EVENT_SUPPORTED 0x04000000
/* feature_flags */
/* CONF: ATH FF enabled */

View file

@ -1046,15 +1046,31 @@ static void
reg_populate_secondary_cur_chan_list(struct wlan_regulatory_pdev_priv_obj
*pdev_priv_obj)
{
qdf_mem_copy(pdev_priv_obj->secondary_cur_chan_list,
pdev_priv_obj->cur_chan_list,
(NUM_CHANNELS - NUM_6GHZ_CHANNELS) *
sizeof(struct regulatory_channel));
qdf_mem_copy(&pdev_priv_obj->
struct wlan_objmgr_psoc *psoc;
psoc = wlan_pdev_get_psoc(pdev_priv_obj->pdev_ptr);
if (!psoc) {
reg_err("psoc is NULL");
return;
}
if (wlan_psoc_nif_fw_ext_cap_get(psoc,
WLAN_SOC_EXT_EVENT_SUPPORTED)) {
qdf_mem_copy(pdev_priv_obj->secondary_cur_chan_list,
pdev_priv_obj->cur_chan_list,
(NUM_CHANNELS - NUM_6GHZ_CHANNELS) *
sizeof(struct regulatory_channel));
qdf_mem_copy(&pdev_priv_obj->
secondary_cur_chan_list[MIN_6GHZ_CHANNEL],
pdev_priv_obj->mas_chan_list_6g_ap
[pdev_priv_obj->reg_cur_6g_ap_pwr_type],
NUM_6GHZ_CHANNELS * sizeof(struct regulatory_channel));
} else {
qdf_mem_copy(pdev_priv_obj->secondary_cur_chan_list,
pdev_priv_obj->cur_chan_list,
(NUM_CHANNELS) *
sizeof(struct regulatory_channel));
}
}
#else /* CONFIG_REG_CLIENT */
static void