qcacld-3.0: Add PSC & VLP 6GHz chan to mandatory list

According to new requirement, when SAP manadatory channel list
enabled (gWlanMccToSccSwitchMode = 4,
gEnableSAPManadatoryChanList=1), the SAP will only be started on
PSC and VLP channels on 6Ghz band. Add all 6GHz PSC & VLP channels
to SAP mandatory list.

Change-Id: I00514c0af9c1cc07460120c928ced652aa2e8d4e
CRs-Fixed: 2870590
此提交包含在:
Liangwei Dong
2021-01-19 11:08:38 +08:00
提交者 snandini
父節點 7bf7ccbde6
當前提交 460b428c6b
共有 6 個檔案被更改,包括 147 行新增34 行删除

查看文件

@@ -1974,7 +1974,8 @@ QDF_STATUS policy_mgr_get_nss_for_vdev(struct wlan_objmgr_psoc *psoc,
/**
* policy_mgr_get_sap_mandatory_channel() - Get the mandatory channel for SAP
* @psoc: PSOC object information
* @ch_freq: Pointer to the SAP mandatory channel frequency
* @sap_ch_freq: sap current frequency in MHz
* @intf_ch_freq: input/out interference channel frequency to sap
*
* Gets the mandatory channel for SAP operation
*
@@ -1982,7 +1983,8 @@ QDF_STATUS policy_mgr_get_nss_for_vdev(struct wlan_objmgr_psoc *psoc,
*/
QDF_STATUS
policy_mgr_get_sap_mandatory_channel(struct wlan_objmgr_psoc *psoc,
uint32_t *ch_freq);
uint32_t sap_ch_freq,
uint32_t *intf_ch_freq);
/**
* policy_mgr_set_sap_mandatory_channels() - Set the mandatory channel for SAP
@@ -3106,15 +3108,17 @@ uint32_t policy_mgr_get_sap_mandatory_chan_list_len(
struct wlan_objmgr_psoc *psoc);
/**
* policy_mgr_init_sap_mandatory_2g_chan() - Init 2.4G SAP mandatory channel
* policy_mgr_init_sap_mandatory_chan() - Init 2.4G 5G 6G SAP mandatory channel
* list
* @psoc: Pointer to soc
* @org_ch_freq: sap initial channel frequency MHz
*
* Initialize the 2.4G SAP mandatory channels
* Initialize the 2.4G 5G 6G SAP mandatory channels
*
* Return: None
*/
void policy_mgr_init_sap_mandatory_2g_chan(struct wlan_objmgr_psoc *psoc);
void policy_mgr_init_sap_mandatory_chan(struct wlan_objmgr_psoc *psoc,
uint32_t org_ch_freq);
/**
* policy_mgr_remove_sap_mandatory_chan() - Remove channel from SAP mandatory

查看文件

@@ -3466,7 +3466,10 @@ void policy_mgr_add_sap_mandatory_chan(struct wlan_objmgr_psoc *psoc,
if (ch_freq == pm_ctx->sap_mandatory_channels[i])
return;
}
if (pm_ctx->sap_mandatory_channels_len >= NUM_CHANNELS) {
policy_mgr_err("mand list overflow (%hu)", ch_freq);
return;
}
policy_mgr_debug("Ch freq: %hu", ch_freq);
pm_ctx->sap_mandatory_channels[pm_ctx->sap_mandatory_channels_len++]
= ch_freq;
@@ -3486,7 +3489,79 @@ uint32_t policy_mgr_get_sap_mandatory_chan_list_len(
return pm_ctx->sap_mandatory_channels_len;
}
void policy_mgr_init_sap_mandatory_2g_chan(struct wlan_objmgr_psoc *psoc)
#if defined(CONFIG_BAND_6GHZ)
/**
* policy_mgr_add_sap_mandatory_6ghz_chan() - Add 6GHz SAP mandatory channel
* list
* @psoc: Pointer to soc
*
* Add the 6GHz PSC VLP channel to SAP mandatory channel list.
*
* Return: None
*/
static
void policy_mgr_add_sap_mandatory_6ghz_chan(struct wlan_objmgr_psoc *psoc)
{
uint32_t ch_freq_list[NUM_CHANNELS] = {0};
uint32_t len = 0;
int i;
QDF_STATUS status;
struct policy_mgr_psoc_priv_obj *pm_ctx;
bool is_psd;
uint16_t tx_power;
uint16_t eirp_psd_power;
pm_ctx = policy_mgr_get_context(psoc);
if (!pm_ctx) {
policy_mgr_err("Invalid Context");
return;
}
status = policy_mgr_get_valid_chans(psoc, ch_freq_list, &len);
if (QDF_IS_STATUS_ERROR(status)) {
policy_mgr_err("Error in getting valid channels");
return;
}
for (i = 0; (i < len) && (i < NUM_CHANNELS) &&
(pm_ctx->sap_mandatory_channels_len < NUM_CHANNELS); i++) {
if (!WLAN_REG_IS_6GHZ_CHAN_FREQ(ch_freq_list[i]))
continue;
if (WLAN_REG_IS_6GHZ_PSC_CHAN_FREQ(ch_freq_list[i])) {
status = wlan_reg_get_6g_chan_ap_power(
pm_ctx->pdev, ch_freq_list[i], &is_psd,
&tx_power, &eirp_psd_power);
if (status != QDF_STATUS_SUCCESS || !tx_power)
continue;
policy_mgr_debug("Add chan %hu to mandatory list",
ch_freq_list[i]);
pm_ctx->sap_mandatory_channels[
pm_ctx->sap_mandatory_channels_len++] =
ch_freq_list[i];
}
}
}
#else
static inline
void policy_mgr_add_sap_mandatory_6ghz_chan(struct wlan_objmgr_psoc *psoc)
{
}
#endif
/**
* policy_mgr_init_sap_mandatory_chan_by_band() - Init SAP mandatory channel
* list based on band
* @psoc: Pointer to soc
* @band_bitmap: band bitmap of type reg_wifi_band
*
* Initialize the 2.4G 5G 6G SAP mandatory channels based on band
*
* Return: None
*/
static void
policy_mgr_init_sap_mandatory_chan_by_band(struct wlan_objmgr_psoc *psoc,
uint32_t band_bitmap)
{
uint32_t ch_freq_list[NUM_CHANNELS] = {0};
uint32_t len = 0;
@@ -3506,7 +3581,6 @@ void policy_mgr_init_sap_mandatory_2g_chan(struct wlan_objmgr_psoc *psoc)
return;
}
pm_ctx->sap_mandatory_channels_len = 0;
for (i = 0; (i < len) && (i < NUM_CHANNELS); i++) {
if (WLAN_REG_IS_24GHZ_CH_FREQ(ch_freq_list[i])) {
policy_mgr_debug("Add chan %hu to mandatory list",
@@ -3516,6 +3590,33 @@ void policy_mgr_init_sap_mandatory_2g_chan(struct wlan_objmgr_psoc *psoc)
ch_freq_list[i];
}
}
if (band_bitmap & BIT(REG_BAND_5G))
policy_mgr_add_sap_mandatory_chan(psoc,
SAP_MANDATORY_5G_CH_FREQ);
if (band_bitmap & BIT(REG_BAND_6G))
policy_mgr_add_sap_mandatory_6ghz_chan(psoc);
}
void policy_mgr_init_sap_mandatory_chan(struct wlan_objmgr_psoc *psoc,
uint32_t org_ch_freq)
{
if (WLAN_REG_IS_5GHZ_CH_FREQ(org_ch_freq)) {
policy_mgr_debug("channel %hu, sap mandatory chan list enabled",
org_ch_freq);
if (!policy_mgr_get_sap_mandatory_chan_list_len(psoc))
policy_mgr_init_sap_mandatory_chan_by_band(
psoc, BIT(REG_BAND_2G));
policy_mgr_add_sap_mandatory_chan(
psoc, org_ch_freq);
} else if (WLAN_REG_IS_6GHZ_CHAN_FREQ(org_ch_freq)) {
policy_mgr_init_sap_mandatory_chan_by_band(
psoc,
BIT(REG_BAND_2G) | BIT(REG_BAND_5G) |
BIT(REG_BAND_6G));
} else {
policy_mgr_init_sap_mandatory_chan_by_band(
psoc, BIT(REG_BAND_2G));
}
}
void policy_mgr_remove_sap_mandatory_chan(struct wlan_objmgr_psoc *psoc,

查看文件

@@ -31,6 +31,8 @@
#define POLICY_MGR_SER_CMD_TIMEOUT 4000
#define SAP_MANDATORY_5G_CH_FREQ 5745
#ifdef QCA_WIFI_3_0_EMU
#define CONNECTION_UPDATE_TIMEOUT (POLICY_MGR_SER_CMD_TIMEOUT + 3000)
#else

查看文件

@@ -1,5 +1,5 @@
/*
* Copyright (c) 2012-2020 The Linux Foundation. All rights reserved.
* Copyright (c) 2012-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
@@ -2367,11 +2367,15 @@ QDF_STATUS policy_mgr_modify_sap_pcl_based_on_mandatory_channel(
return QDF_STATUS_SUCCESS;
}
QDF_STATUS policy_mgr_get_sap_mandatory_channel(struct wlan_objmgr_psoc *psoc,
uint32_t *ch_freq)
QDF_STATUS
policy_mgr_get_sap_mandatory_channel(struct wlan_objmgr_psoc *psoc,
uint32_t sap_ch_freq,
uint32_t *intf_ch_freq)
{
QDF_STATUS status;
struct policy_mgr_pcl_list pcl;
uint32_t i;
uint32_t sap_new_freq;
qdf_mem_zero(&pcl, sizeof(pcl));
@@ -2417,8 +2421,19 @@ QDF_STATUS policy_mgr_get_sap_mandatory_channel(struct wlan_objmgr_psoc *psoc,
return QDF_STATUS_E_FAILURE;
}
*ch_freq = pcl.pcl_list[0];
policy_mgr_debug("mandatory channel:%d", *ch_freq);
sap_new_freq = pcl.pcl_list[0];
if (WLAN_REG_IS_6GHZ_CHAN_FREQ(sap_ch_freq)) {
for (i = 0; i < pcl.pcl_len; i++) {
if (pcl.pcl_list[i] == *intf_ch_freq) {
sap_new_freq = pcl.pcl_list[i];
break;
}
}
}
*intf_ch_freq = sap_new_freq;
policy_mgr_debug("mandatory channel:%d org sap ch %d", *intf_ch_freq,
sap_ch_freq);
return QDF_STATUS_SUCCESS;
}

查看文件

@@ -6507,22 +6507,9 @@ static int __wlan_hdd_cfg80211_start_ap(struct wiphy *wiphy,
if (QDF_STATUS_SUCCESS !=
ucfg_policy_mgr_get_sap_mandt_chnl(hdd_ctx->psoc, &mandt_chnl_list))
hdd_err("can't get mandatory channel list");
if (mandt_chnl_list) {
if (WLAN_REG_IS_5GHZ_CH(channel)) {
hdd_debug("channel %hu, sap mandatory chan list enabled",
channel);
if (!policy_mgr_get_sap_mandatory_chan_list_len(
hdd_ctx->psoc))
policy_mgr_init_sap_mandatory_2g_chan(
hdd_ctx->psoc);
policy_mgr_add_sap_mandatory_chan(
hdd_ctx->psoc, wlan_chan_to_freq(channel));
} else {
policy_mgr_init_sap_mandatory_2g_chan(
hdd_ctx->psoc);
}
}
if (mandt_chnl_list)
policy_mgr_init_sap_mandatory_chan(hdd_ctx->psoc,
chandef->chan->center_freq);
adapter->session.ap.sap_config.ch_params.center_freq_seg0 =
cds_freq_to_chan(chandef->center_freq1);

查看文件

@@ -1034,17 +1034,20 @@ uint16_t csr_check_concurrent_channel_overlap(struct mac_context *mac_ctx,
} else if (cc_switch_mode ==
QDF_MCC_TO_SCC_SWITCH_WITH_FAVORITE_CHANNEL) {
status = policy_mgr_get_sap_mandatory_channel(
mac_ctx->psoc,
mac_ctx->psoc, sap_ch_freq,
&intf_ch_freq);
if (QDF_IS_STATUS_ERROR(status))
sme_err("no mandatory channel");
sme_err("no mandatory channels (%d, %d)",
sap_ch_freq, intf_ch_freq);
}
} else if ((intf_ch_freq == sap_ch_freq) && (cc_switch_mode ==
QDF_MCC_TO_SCC_SWITCH_WITH_FAVORITE_CHANNEL)) {
if (WLAN_REG_IS_24GHZ_CH_FREQ(intf_ch_freq)) {
if (WLAN_REG_IS_24GHZ_CH_FREQ(intf_ch_freq) ||
WLAN_REG_IS_6GHZ_CHAN_FREQ(sap_ch_freq)) {
status =
policy_mgr_get_sap_mandatory_channel(
mac_ctx->psoc, &intf_ch_freq);
mac_ctx->psoc, sap_ch_freq,
&intf_ch_freq);
if (QDF_IS_STATUS_ERROR(status))
sme_err("no mandatory channel");
}
@@ -1053,7 +1056,8 @@ uint16_t csr_check_concurrent_channel_overlap(struct mac_context *mac_ctx,
if (intf_ch_freq == sap_ch_freq)
intf_ch_freq = 0;
sme_debug("##Concurrent Channels %s Interfering",
sme_debug("##Concurrent Channels (%d, %d) %s Interfering", sap_ch_freq,
intf_ch_freq,
intf_ch_freq == 0 ? "Not" : "Are");
return intf_ch_freq;