qcacld-3.0: Get LL_LT_SAP frequency list
Get LL_LT_SAP frequency list Change-Id: Ib83247da5cda61b9ef68c5164b73de8bea309831 CRs-Fixed: 3572925
This commit is contained in:

committed by
Rahul Choudhary

szülő
551f20ba53
commit
6409215ea1
@@ -5376,6 +5376,7 @@ qdf_freq_t policy_mgr_get_lt_ll_sap_freq(struct wlan_objmgr_psoc *psoc);
|
|||||||
*/
|
*/
|
||||||
qdf_freq_t policy_mgr_get_ht_ll_sap_freq(struct wlan_objmgr_psoc *psoc);
|
qdf_freq_t policy_mgr_get_ht_ll_sap_freq(struct wlan_objmgr_psoc *psoc);
|
||||||
|
|
||||||
|
#ifndef WLAN_FEATURE_LL_LT_SAP
|
||||||
/**
|
/**
|
||||||
* policy_mgr_is_ll_sap_concurrency_valid() - Function to check whether
|
* policy_mgr_is_ll_sap_concurrency_valid() - Function to check whether
|
||||||
* low latency SAP + STA/SAP/GC/GO concurrency allowed or not
|
* low latency SAP + STA/SAP/GC/GO concurrency allowed or not
|
||||||
@@ -5389,7 +5390,15 @@ qdf_freq_t policy_mgr_get_ht_ll_sap_freq(struct wlan_objmgr_psoc *psoc);
|
|||||||
bool policy_mgr_is_ll_sap_concurrency_valid(struct wlan_objmgr_psoc *psoc,
|
bool policy_mgr_is_ll_sap_concurrency_valid(struct wlan_objmgr_psoc *psoc,
|
||||||
qdf_freq_t freq,
|
qdf_freq_t freq,
|
||||||
enum policy_mgr_con_mode mode);
|
enum policy_mgr_con_mode mode);
|
||||||
|
#else
|
||||||
|
static inline
|
||||||
|
bool policy_mgr_is_ll_sap_concurrency_valid(struct wlan_objmgr_psoc *psoc,
|
||||||
|
qdf_freq_t freq,
|
||||||
|
enum policy_mgr_con_mode mode)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
/**
|
/**
|
||||||
* policy_mgr_update_indoor_concurrency() - Function to update the indoor
|
* policy_mgr_update_indoor_concurrency() - Function to update the indoor
|
||||||
* concurrency related regulatory changes
|
* concurrency related regulatory changes
|
||||||
@@ -5649,4 +5658,23 @@ void
|
|||||||
policy_mgr_sap_on_non_psc_channel(struct wlan_objmgr_psoc *psoc,
|
policy_mgr_sap_on_non_psc_channel(struct wlan_objmgr_psoc *psoc,
|
||||||
qdf_freq_t *intf_ch_freq,
|
qdf_freq_t *intf_ch_freq,
|
||||||
uint8_t sap_vdev_id);
|
uint8_t sap_vdev_id);
|
||||||
|
|
||||||
|
#ifdef WLAN_FEATURE_LL_LT_SAP
|
||||||
|
/**
|
||||||
|
* policy_mgr_get_pcl_ch_list_for_ll_sap() - Get PCL channel list for LL_LT_SAP
|
||||||
|
* @psoc: psoc object
|
||||||
|
* @pcl: pcl list
|
||||||
|
* @vdev_id: vdev id
|
||||||
|
* @info: pointer to connection_info structure
|
||||||
|
* @connection_count: total number of existing connection present
|
||||||
|
*
|
||||||
|
* Return: QDF_STATUS
|
||||||
|
*/
|
||||||
|
QDF_STATUS policy_mgr_get_pcl_ch_list_for_ll_sap(
|
||||||
|
struct wlan_objmgr_psoc *psoc,
|
||||||
|
struct policy_mgr_pcl_list *pcl,
|
||||||
|
uint8_t vdev_id,
|
||||||
|
struct connection_info *info,
|
||||||
|
uint8_t *connection_count);
|
||||||
|
#endif
|
||||||
#endif /* __WLAN_POLICY_MGR_API_H */
|
#endif /* __WLAN_POLICY_MGR_API_H */
|
||||||
|
@@ -1673,6 +1673,9 @@ qdf_freq_t policy_mgr_get_sbs_cut_off_freq(struct wlan_objmgr_psoc *psoc)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!policy_mgr_is_hw_sbs_capable(psoc))
|
||||||
|
return 0;
|
||||||
|
|
||||||
if (pm_ctx->hw_mode.sbs_lower_band_end_freq)
|
if (pm_ctx->hw_mode.sbs_lower_band_end_freq)
|
||||||
return pm_ctx->hw_mode.sbs_lower_band_end_freq;
|
return pm_ctx->hw_mode.sbs_lower_band_end_freq;
|
||||||
/*
|
/*
|
||||||
@@ -12099,6 +12102,7 @@ qdf_freq_t policy_mgr_get_lt_ll_sap_freq(struct wlan_objmgr_psoc *psoc)
|
|||||||
return _policy_mgr_get_ll_sap_freq(psoc, LL_AP_TYPE_LT);
|
return _policy_mgr_get_ll_sap_freq(psoc, LL_AP_TYPE_LT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef WLAN_FEATURE_LL_LT_SAP
|
||||||
bool policy_mgr_is_ll_sap_concurrency_valid(struct wlan_objmgr_psoc *psoc,
|
bool policy_mgr_is_ll_sap_concurrency_valid(struct wlan_objmgr_psoc *psoc,
|
||||||
qdf_freq_t freq,
|
qdf_freq_t freq,
|
||||||
enum policy_mgr_con_mode mode)
|
enum policy_mgr_con_mode mode)
|
||||||
@@ -12127,6 +12131,7 @@ bool policy_mgr_is_ll_sap_concurrency_valid(struct wlan_objmgr_psoc *psoc,
|
|||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
bool
|
bool
|
||||||
policy_mgr_update_indoor_concurrency(struct wlan_objmgr_psoc *psoc,
|
policy_mgr_update_indoor_concurrency(struct wlan_objmgr_psoc *psoc,
|
||||||
|
@@ -4803,3 +4803,57 @@ policy_mgr_get_pcl_channel_for_ll_sap_concurrency(
|
|||||||
return QDF_STATUS_SUCCESS;
|
return QDF_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef WLAN_FEATURE_LL_LT_SAP
|
||||||
|
QDF_STATUS policy_mgr_get_pcl_ch_list_for_ll_sap(
|
||||||
|
struct wlan_objmgr_psoc *psoc,
|
||||||
|
struct policy_mgr_pcl_list *pcl,
|
||||||
|
uint8_t vdev_id,
|
||||||
|
struct connection_info *info,
|
||||||
|
uint8_t *connection_count)
|
||||||
|
{
|
||||||
|
struct policy_mgr_psoc_priv_obj *pm_ctx;
|
||||||
|
uint8_t num_cxn_del = 0;
|
||||||
|
struct policy_mgr_conc_connection_info pm_info = {0};
|
||||||
|
QDF_STATUS status;
|
||||||
|
|
||||||
|
pm_ctx = policy_mgr_get_context(psoc);
|
||||||
|
if (!pm_ctx)
|
||||||
|
return QDF_STATUS_E_FAILURE;
|
||||||
|
|
||||||
|
qdf_mutex_acquire(&pm_ctx->qdf_conc_list_lock);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Scenario: Standalone XPAN is present and CSA happens on
|
||||||
|
* LL_LT_SAP interface.
|
||||||
|
* During CSA, it will check the PCL list to get the new freq.
|
||||||
|
* Since there is already LL_LT_SAP interface entry in PCL index.
|
||||||
|
* It will lead to LL_LT_SAP + LL_LT_SAP concurrencies. To avoid
|
||||||
|
* that, delete the existing connection entry from PCL index,
|
||||||
|
* get the PCL list and restore it back.
|
||||||
|
*/
|
||||||
|
policy_mgr_store_and_del_conn_info_by_vdev_id(psoc, vdev_id,
|
||||||
|
&pm_info, &num_cxn_del);
|
||||||
|
|
||||||
|
status = policy_mgr_get_pcl(psoc, PM_LL_LT_SAP_MODE, pcl->pcl_list,
|
||||||
|
&pcl->pcl_len, pcl->weight_list,
|
||||||
|
QDF_ARRAY_SIZE(pcl->weight_list),
|
||||||
|
vdev_id);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Get existing connection info before updating LL_LT_SAP freq list
|
||||||
|
* This will help to avoid updation of SCC channel in LL_LT_SAP
|
||||||
|
* freq list.
|
||||||
|
*/
|
||||||
|
*connection_count = policy_mgr_get_connection_info(psoc, info);
|
||||||
|
|
||||||
|
/* Restore the connection entry */
|
||||||
|
if (num_cxn_del > 0)
|
||||||
|
policy_mgr_restore_deleted_conn_info(psoc, &pm_info,
|
||||||
|
num_cxn_del);
|
||||||
|
|
||||||
|
qdf_mutex_release(&pm_ctx->qdf_conc_list_lock);
|
||||||
|
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
@@ -586,6 +586,25 @@ wlan_handle_emlsr_sta_concurrency(struct wlan_objmgr_psoc *psoc,
|
|||||||
QDF_STATUS
|
QDF_STATUS
|
||||||
wlan_ll_sap_sort_channel_list(uint8_t vdev_id, qdf_list_t *list,
|
wlan_ll_sap_sort_channel_list(uint8_t vdev_id, qdf_list_t *list,
|
||||||
struct sap_sel_ch_info *ch_info);
|
struct sap_sel_ch_info *ch_info);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* wlan_ll_sap_free_chan_info() - API to free allocated memory
|
||||||
|
* @ch_param: pointer to sap_sel_ch_info structure
|
||||||
|
*
|
||||||
|
* Return: None
|
||||||
|
*/
|
||||||
|
void wlan_ll_sap_free_chan_info(struct sap_sel_ch_info *ch_param);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* wlan_ll_sap_freq_present_in_pcl() - API to check whether given
|
||||||
|
* frequency is present in PCL or not
|
||||||
|
* @pcl: pcl list
|
||||||
|
* @freq: Frequency to check in PCL list
|
||||||
|
*
|
||||||
|
* Return: True/False
|
||||||
|
*/
|
||||||
|
bool wlan_ll_sap_freq_present_in_pcl(struct policy_mgr_pcl_list *pcl,
|
||||||
|
qdf_freq_t freq);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -2288,6 +2288,24 @@ wlan_ll_sap_sort_channel_list(uint8_t vdev_id, qdf_list_t *list,
|
|||||||
{
|
{
|
||||||
return wlansap_sort_channel_list(vdev_id, list, ch_info);
|
return wlansap_sort_channel_list(vdev_id, list, ch_info);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void wlan_ll_sap_free_chan_info(struct sap_sel_ch_info *ch_param)
|
||||||
|
{
|
||||||
|
return wlansap_free_chan_info(ch_param);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wlan_ll_sap_freq_present_in_pcl(struct policy_mgr_pcl_list *pcl,
|
||||||
|
qdf_freq_t freq)
|
||||||
|
{
|
||||||
|
uint8_t i;
|
||||||
|
|
||||||
|
for (i = 0; i < pcl->pcl_len; i++) {
|
||||||
|
if (pcl->pcl_list[i] == freq)
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@@ -15,10 +15,13 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "wlan_ll_lt_sap_main.h"
|
#include "wlan_ll_lt_sap_main.h"
|
||||||
#include "wlan_scan_ucfg_api.h"
|
#include "wlan_reg_services_api.h"
|
||||||
|
#include "wlan_ll_sap_public_structs.h"
|
||||||
|
#include "wlan_policy_mgr_i.h"
|
||||||
#include "wlan_mlme_vdev_mgr_interface.h"
|
#include "wlan_mlme_vdev_mgr_interface.h"
|
||||||
#include "wlan_ll_sap_main.h"
|
#include "wlan_ll_sap_main.h"
|
||||||
#include "wlan_ll_lt_sap_bearer_switch.h"
|
#include "wlan_ll_lt_sap_bearer_switch.h"
|
||||||
|
#include "wlan_scan_api.h"
|
||||||
|
|
||||||
bool ll_lt_sap_is_supported(void)
|
bool ll_lt_sap_is_supported(void)
|
||||||
{
|
{
|
||||||
@@ -28,10 +31,20 @@ bool ll_lt_sap_is_supported(void)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
QDF_STATUS
|
/**
|
||||||
ll_lt_sap_get_sorted_user_config_acs_ch_list(struct wlan_objmgr_psoc *psoc,
|
* ll_lt_sap_get_sorted_user_config_acs_ch_list() - API to get sorted user
|
||||||
uint8_t vdev_id,
|
* configured ACS channel list
|
||||||
struct sap_sel_ch_info *ch_info)
|
* @psoc: Pointer to psoc object
|
||||||
|
* @vdev_id: Vdev Id
|
||||||
|
* @ch_info: Pointer to ch_info
|
||||||
|
*
|
||||||
|
* Return: None
|
||||||
|
*/
|
||||||
|
static
|
||||||
|
QDF_STATUS ll_lt_sap_get_sorted_user_config_acs_ch_list(
|
||||||
|
struct wlan_objmgr_psoc *psoc,
|
||||||
|
uint8_t vdev_id,
|
||||||
|
struct sap_sel_ch_info *ch_info)
|
||||||
{
|
{
|
||||||
struct scan_filter *filter;
|
struct scan_filter *filter;
|
||||||
qdf_list_t *list = NULL;
|
qdf_list_t *list = NULL;
|
||||||
@@ -146,6 +159,249 @@ QDF_STATUS ll_lt_sap_deinit(struct wlan_objmgr_vdev *vdev)
|
|||||||
return QDF_STATUS_SUCCESS;
|
return QDF_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
void ll_lt_sap_update_mac_freq(struct wlan_ll_lt_sap_mac_freq *freq_list,
|
||||||
|
qdf_freq_t sbs_cut_off_freq,
|
||||||
|
qdf_freq_t given_freq)
|
||||||
|
{
|
||||||
|
if (WLAN_REG_IS_5GHZ_CH_FREQ(given_freq) &&
|
||||||
|
((sbs_cut_off_freq && given_freq < sbs_cut_off_freq) ||
|
||||||
|
!sbs_cut_off_freq) && !freq_list->freq_5GHz_low) {
|
||||||
|
freq_list->freq_5GHz_low = given_freq;
|
||||||
|
/*
|
||||||
|
* Update same freq in 5GHz high freq if sbs_cut_off_freq
|
||||||
|
* is not present
|
||||||
|
*/
|
||||||
|
if (!sbs_cut_off_freq)
|
||||||
|
freq_list->freq_5GHz_high = given_freq;
|
||||||
|
} else if (WLAN_REG_IS_5GHZ_CH_FREQ(given_freq) &&
|
||||||
|
((sbs_cut_off_freq && given_freq > sbs_cut_off_freq) ||
|
||||||
|
!sbs_cut_off_freq) && !freq_list->freq_5GHz_high) {
|
||||||
|
freq_list->freq_5GHz_high = given_freq;
|
||||||
|
/*
|
||||||
|
* Update same freq for 5GHz low freq if sbs_cut_off_freq
|
||||||
|
* is not present
|
||||||
|
*/
|
||||||
|
if (!sbs_cut_off_freq)
|
||||||
|
freq_list->freq_5GHz_low = given_freq;
|
||||||
|
} else if (WLAN_REG_IS_6GHZ_CHAN_FREQ(given_freq) &&
|
||||||
|
!freq_list->freq_6GHz) {
|
||||||
|
freq_list->freq_6GHz = given_freq;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Threshold value of channel weight */
|
||||||
|
#define CHANNEL_WEIGHT_THRESHOLD_VALUE 20000
|
||||||
|
static
|
||||||
|
void ll_lt_sap_update_freq_list(struct wlan_objmgr_psoc *psoc,
|
||||||
|
struct sap_sel_ch_info *ch_param,
|
||||||
|
struct wlan_ll_lt_sap_freq_list *freq_list,
|
||||||
|
struct policy_mgr_pcl_list *pcl,
|
||||||
|
struct connection_info *info,
|
||||||
|
uint8_t connection_count,
|
||||||
|
uint8_t vdev_id)
|
||||||
|
{
|
||||||
|
qdf_freq_t freq, sbs_cut_off_freq;
|
||||||
|
qdf_freq_t same_mac_freq, standalone_mac_freq;
|
||||||
|
uint8_t i = 0, count;
|
||||||
|
enum policy_mgr_con_mode con_mode = PM_MAX_NUM_OF_MODE;
|
||||||
|
|
||||||
|
sbs_cut_off_freq = policy_mgr_get_sbs_cut_off_freq(psoc);
|
||||||
|
|
||||||
|
for (i = 0; i < ch_param->num_ch; i++) {
|
||||||
|
if (!ch_param->ch_info[i].valid)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
freq = ch_param->ch_info[i].chan_freq;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Do not select same channel where LL_LT_SAP was
|
||||||
|
* present earlier
|
||||||
|
*/
|
||||||
|
if (freq_list->prev_freq == freq)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
/* Check if channel is present in PCL or not */
|
||||||
|
if (!wlan_ll_sap_freq_present_in_pcl(pcl, freq))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Store first valid best channel from ACS final list
|
||||||
|
* This will be used if there is no valid freq present
|
||||||
|
* within threshold value or no concurrency present
|
||||||
|
*/
|
||||||
|
if (!freq_list->best_freq)
|
||||||
|
freq_list->best_freq = freq;
|
||||||
|
|
||||||
|
if (!connection_count)
|
||||||
|
break;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Instead of selecting random channel, select those
|
||||||
|
* channel whose weight is less than
|
||||||
|
* CHANNEL_WEIGHT_THRESHOLD_VALUE value. This will help
|
||||||
|
* to get the best channel compartively and avoid multiple
|
||||||
|
* times of channel switch.
|
||||||
|
*/
|
||||||
|
if (ch_param->ch_info[i].weight > CHANNEL_WEIGHT_THRESHOLD_VALUE)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
same_mac_freq = 0;
|
||||||
|
standalone_mac_freq = 0;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Loop through all existing connections before updating
|
||||||
|
* channels for LL_LT_SAP.
|
||||||
|
*/
|
||||||
|
for (count = 0; count < connection_count; count++) {
|
||||||
|
/* Do not select SCC channel to update freq_list */
|
||||||
|
if (freq == info[count].ch_freq) {
|
||||||
|
same_mac_freq = 0;
|
||||||
|
standalone_mac_freq = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* Check whether ch_param frequency is in same mac
|
||||||
|
* or not.
|
||||||
|
*/
|
||||||
|
if (policy_mgr_2_freq_always_on_same_mac(
|
||||||
|
psoc, freq,
|
||||||
|
info[count].ch_freq)) {
|
||||||
|
con_mode = policy_mgr_get_mode_by_vdev_id(
|
||||||
|
psoc, info[count].vdev_id);
|
||||||
|
/*
|
||||||
|
* Check whether SAP is present in same mac or
|
||||||
|
* not. If yes then do not select that frequency
|
||||||
|
* because two beacon entity can't be in same
|
||||||
|
* mac.
|
||||||
|
* Also, do not fill same_mac_freq if it's
|
||||||
|
* already filled i.e two existing connection
|
||||||
|
* are present on same mac.
|
||||||
|
*/
|
||||||
|
if (con_mode == PM_SAP_MODE || same_mac_freq) {
|
||||||
|
same_mac_freq = 0;
|
||||||
|
standalone_mac_freq = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
same_mac_freq = freq;
|
||||||
|
} else if (!standalone_mac_freq) {
|
||||||
|
/*
|
||||||
|
* Fill standalone_mac_freq only if it's not
|
||||||
|
* filled
|
||||||
|
*/
|
||||||
|
standalone_mac_freq = freq;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Scenario: Let say two concurrent connection(other than
|
||||||
|
* LL_LT_SAP) are present in both mac and one channel from
|
||||||
|
* ch_param structure needs to select to fill in freq_list for
|
||||||
|
* LL_LT_SAP.
|
||||||
|
* Since, there is an existing connection present in both mac
|
||||||
|
* then there is chance that channel from ch_param structure
|
||||||
|
* may get select for both same_mac_freq and standalone_mac_freq
|
||||||
|
*
|
||||||
|
* But ideally standalone_mac_freq is not free, some existing
|
||||||
|
* connection is already present in it.
|
||||||
|
* So, instead of giving priority to fill standalone_mac_freq
|
||||||
|
* first, fill same_mac_freq first.
|
||||||
|
*
|
||||||
|
* Example: Let say 2 concurrent interface present in channel
|
||||||
|
* 36 and 149. Now channel 48 from ch_param structure needs to
|
||||||
|
* be validate and fill based on existing interface.
|
||||||
|
* With respect to channel 36, it will fit to same_mac_freq
|
||||||
|
* and with respect to channel 149, it will fit to
|
||||||
|
* standalone_mac_freq. But in standalone_mac_freq, there is
|
||||||
|
* already existing interface present. So, give priority to
|
||||||
|
* same_mac_freq to fill the freq list.
|
||||||
|
*/
|
||||||
|
if (same_mac_freq)
|
||||||
|
ll_lt_sap_update_mac_freq(&freq_list->shared_mac,
|
||||||
|
sbs_cut_off_freq,
|
||||||
|
same_mac_freq);
|
||||||
|
else if (standalone_mac_freq)
|
||||||
|
ll_lt_sap_update_mac_freq(&freq_list->standalone_mac,
|
||||||
|
sbs_cut_off_freq,
|
||||||
|
standalone_mac_freq);
|
||||||
|
|
||||||
|
if (freq_list->shared_mac.freq_5GHz_low &&
|
||||||
|
freq_list->shared_mac.freq_5GHz_high &&
|
||||||
|
freq_list->shared_mac.freq_6GHz &&
|
||||||
|
freq_list->standalone_mac.freq_5GHz_low &&
|
||||||
|
freq_list->standalone_mac.freq_5GHz_high &&
|
||||||
|
freq_list->standalone_mac.freq_6GHz)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
ll_sap_debug("vdev %d, best %d Shared: low %d high %d 6Ghz %d, Standalone: low %d high %d 6Ghz %d, prev %d, existing connection cnt %d",
|
||||||
|
vdev_id, freq_list->best_freq,
|
||||||
|
freq_list->shared_mac.freq_5GHz_low,
|
||||||
|
freq_list->shared_mac.freq_5GHz_high,
|
||||||
|
freq_list->shared_mac.freq_6GHz,
|
||||||
|
freq_list->standalone_mac.freq_5GHz_low,
|
||||||
|
freq_list->standalone_mac.freq_5GHz_high,
|
||||||
|
freq_list->standalone_mac.freq_6GHz,
|
||||||
|
freq_list->prev_freq, connection_count);
|
||||||
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
QDF_STATUS ll_lt_sap_get_allowed_freq_list(
|
||||||
|
struct wlan_objmgr_psoc *psoc,
|
||||||
|
uint8_t vdev_id,
|
||||||
|
struct sap_sel_ch_info *ch_param,
|
||||||
|
struct wlan_ll_lt_sap_freq_list *freq_list)
|
||||||
|
{
|
||||||
|
struct connection_info conn_info[MAX_NUMBER_OF_CONC_CONNECTIONS];
|
||||||
|
uint8_t count;
|
||||||
|
struct policy_mgr_pcl_list *pcl;
|
||||||
|
QDF_STATUS status;
|
||||||
|
|
||||||
|
pcl = qdf_mem_malloc(sizeof(*pcl));
|
||||||
|
if (!pcl)
|
||||||
|
return QDF_STATUS_E_FAILURE;
|
||||||
|
|
||||||
|
status = policy_mgr_get_pcl_ch_list_for_ll_sap(psoc, pcl, vdev_id,
|
||||||
|
conn_info, &count);
|
||||||
|
if (QDF_IS_STATUS_ERROR(status))
|
||||||
|
goto end;
|
||||||
|
|
||||||
|
ll_lt_sap_update_freq_list(psoc, ch_param, freq_list, pcl,
|
||||||
|
conn_info, count, vdev_id);
|
||||||
|
|
||||||
|
status = QDF_STATUS_SUCCESS;
|
||||||
|
end:
|
||||||
|
qdf_mem_free(pcl);
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
QDF_STATUS ll_lt_sap_get_freq_list(struct wlan_objmgr_psoc *psoc,
|
||||||
|
struct wlan_ll_lt_sap_freq_list *freq_list,
|
||||||
|
uint8_t vdev_id)
|
||||||
|
{
|
||||||
|
struct sap_sel_ch_info ch_param = { NULL, 0 };
|
||||||
|
QDF_STATUS status;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This memory will be allocated in sap_chan_sel_init() as part
|
||||||
|
* of sap_sort_channel_list(). But the caller has to free up the
|
||||||
|
* allocated memory
|
||||||
|
*/
|
||||||
|
|
||||||
|
status = ll_lt_sap_get_sorted_user_config_acs_ch_list(psoc, vdev_id,
|
||||||
|
&ch_param);
|
||||||
|
|
||||||
|
if (!ch_param.num_ch || QDF_IS_STATUS_ERROR(status))
|
||||||
|
goto release_mem;
|
||||||
|
|
||||||
|
status = ll_lt_sap_get_allowed_freq_list(psoc, vdev_id, &ch_param,
|
||||||
|
freq_list);
|
||||||
|
|
||||||
|
release_mem:
|
||||||
|
wlan_ll_sap_free_chan_info(&ch_param);
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
QDF_STATUS ll_lt_sap_switch_bearer_to_ble(struct wlan_objmgr_psoc *psoc,
|
QDF_STATUS ll_lt_sap_switch_bearer_to_ble(struct wlan_objmgr_psoc *psoc,
|
||||||
struct wlan_bearer_switch_request *bs_request)
|
struct wlan_bearer_switch_request *bs_request)
|
||||||
{
|
{
|
||||||
|
@@ -36,18 +36,17 @@
|
|||||||
bool ll_lt_sap_is_supported(void);
|
bool ll_lt_sap_is_supported(void);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ll_lt_sap_get_sorted_user_config_acs_ch_list() - API to get sorted user
|
* ll_lt_sap_get_freq_list() - API to get frequency list for LL_LT_SAP
|
||||||
* configured channel list
|
|
||||||
* @psoc: Pointer to psoc object
|
* @psoc: Pointer to psoc object
|
||||||
|
* @freq_list: Pointer to wlan_ll_lt_sap_freq_list structure
|
||||||
* @vdev_id: Vdev Id
|
* @vdev_id: Vdev Id
|
||||||
* @ch_info: Pointer to ch_info
|
|
||||||
*
|
*
|
||||||
* Return: QDF_STATUS
|
* Return: QDF_STATUS
|
||||||
*/
|
*/
|
||||||
QDF_STATUS ll_lt_sap_get_sorted_user_config_acs_ch_list(
|
QDF_STATUS ll_lt_sap_get_freq_list(struct wlan_objmgr_psoc *psoc,
|
||||||
struct wlan_objmgr_psoc *psoc,
|
struct wlan_ll_lt_sap_freq_list *freq_list,
|
||||||
uint8_t vdev_id,
|
uint8_t vdev_id);
|
||||||
struct sap_sel_ch_info *ch_info);
|
|
||||||
/*
|
/*
|
||||||
* ll_lt_sap_init() - Initialize ll_lt_sap infrastructure
|
* ll_lt_sap_init() - Initialize ll_lt_sap infrastructure
|
||||||
* @vdev: Pointer to vdev
|
* @vdev: Pointer to vdev
|
||||||
|
@@ -16,7 +16,7 @@
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* DOC: contains ll_lt_sap API definitions specific to the bearer
|
* DOC: contains ll_lt_sap API definitions specific to the bearer
|
||||||
* switch functionalities
|
* switch, channel selection functionalities
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _WLAN_LL_LT_SAP_API_H_
|
#ifndef _WLAN_LL_LT_SAP_API_H_
|
||||||
@@ -24,6 +24,7 @@
|
|||||||
|
|
||||||
#include <wlan_cmn.h>
|
#include <wlan_cmn.h>
|
||||||
#include <wlan_objmgr_vdev_obj.h>
|
#include <wlan_objmgr_vdev_obj.h>
|
||||||
|
#include "wlan_objmgr_psoc_obj.h"
|
||||||
#include "wlan_ll_sap_public_structs.h"
|
#include "wlan_ll_sap_public_structs.h"
|
||||||
#include "wlan_cm_public_struct.h"
|
#include "wlan_cm_public_struct.h"
|
||||||
|
|
||||||
@@ -77,8 +78,19 @@ QDF_STATUS wlan_ll_sap_switch_bearer_on_sta_connect_complete(
|
|||||||
struct wlan_objmgr_psoc *psoc,
|
struct wlan_objmgr_psoc *psoc,
|
||||||
uint8_t vdev_id);
|
uint8_t vdev_id);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* wlan_ll_lt_sap_get_freq_list() - Get frequency list for LL_LT_SAP
|
||||||
|
* @psoc: Pointer to psoc object
|
||||||
|
* @freq_list: Pointer to wlan_ll_lt_sap_freq_list structure
|
||||||
|
* @vdev_id: Vdev Id
|
||||||
|
*
|
||||||
|
* Return: QDF_STATUS
|
||||||
|
*/
|
||||||
|
QDF_STATUS wlan_ll_lt_sap_get_freq_list(
|
||||||
|
struct wlan_objmgr_psoc *psoc,
|
||||||
|
struct wlan_ll_lt_sap_freq_list *freq_list,
|
||||||
|
uint8_t vdev_id);
|
||||||
#else
|
#else
|
||||||
|
|
||||||
static inline wlan_bs_req_id
|
static inline wlan_bs_req_id
|
||||||
wlan_ll_lt_sap_bearer_switch_get_id(struct wlan_objmgr_vdev *vdev)
|
wlan_ll_lt_sap_bearer_switch_get_id(struct wlan_objmgr_vdev *vdev)
|
||||||
{
|
{
|
||||||
@@ -109,5 +121,14 @@ wlan_ll_sap_switch_bearer_on_sta_connect_complete(struct wlan_objmgr_psoc *psoc,
|
|||||||
{
|
{
|
||||||
return QDF_STATUS_SUCCESS;
|
return QDF_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline
|
||||||
|
QDF_STATUS wlan_ll_lt_sap_get_freq_list(
|
||||||
|
struct wlan_objmgr_psoc *psoc,
|
||||||
|
struct wlan_ll_lt_sap_freq_list *freq_list,
|
||||||
|
uint8_t vdev_id)
|
||||||
|
{
|
||||||
|
return QDF_STATUS_E_FAILURE;
|
||||||
|
}
|
||||||
#endif /* WLAN_FEATURE_LL_LT_SAP */
|
#endif /* WLAN_FEATURE_LL_LT_SAP */
|
||||||
#endif /* _WLAN_LL_LT_SAP_API_H_ */
|
#endif /* _WLAN_LL_LT_SAP_API_H_ */
|
||||||
|
@@ -16,11 +16,11 @@
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* DOC: contains ll_lt_sap structure definitions specific to the bearer
|
* DOC: contains ll_lt_sap structure definitions specific to the bearer
|
||||||
* switch functionalities
|
* switch and channel selection functionalities
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _WLAN_LL_LT_SAP_BEARER_SWITCH_PUBLIC_STRUCTS_H_
|
#ifndef _WLAN_LL_SAP_PUBLIC_STRUCTS_H_
|
||||||
#define _WLAN_LL_LT_SAP_BEARER_SWITCH_PUBLIC_STRUCTS_H_
|
#define _WLAN_LL_SAP_PUBLIC_STRUCTS_H_
|
||||||
|
|
||||||
#include "wlan_objmgr_psoc_obj.h"
|
#include "wlan_objmgr_psoc_obj.h"
|
||||||
#include <qdf_status.h>
|
#include <qdf_status.h>
|
||||||
@@ -68,7 +68,38 @@ enum bearer_switch_req_source {
|
|||||||
BEARER_SWITCH_REQ_MAX,
|
BEARER_SWITCH_REQ_MAX,
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* struct wlan_ll_lt_sap_mac_freq: LL_LT_SAP mac frequency
|
||||||
|
* @freq_5GHz_low: Low 5GHz frequency
|
||||||
|
* @freq_5GHz_high: High 5GHz frequency
|
||||||
|
* @freq_6GHz: 6GHz frequency
|
||||||
|
*/
|
||||||
|
struct wlan_ll_lt_sap_mac_freq {
|
||||||
|
qdf_freq_t freq_5GHz_low;
|
||||||
|
qdf_freq_t freq_5GHz_high;
|
||||||
|
qdf_freq_t freq_6GHz;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* struct wlan_ll_lt_sap_freq_list: LL_LT_SAP frequency list structure
|
||||||
|
* @standalone_mac: Select frequency from mac which doesn't have any
|
||||||
|
* concurrent interface present.
|
||||||
|
* @shared_mac: Select frequency from mac which has one concurrent
|
||||||
|
* interface present.
|
||||||
|
* @best_freq: Best freq present in ACS final list. This freq can be
|
||||||
|
* use to bring LL_LT_SAP if none of the above channels are present
|
||||||
|
* @prev_freq: Previous/current freq on which LL_LT_SAP is present.
|
||||||
|
* This will be use to avoid SCC channel selection while updating this
|
||||||
|
* list. This freq should be filled by user.
|
||||||
|
*/
|
||||||
|
struct wlan_ll_lt_sap_freq_list {
|
||||||
|
struct wlan_ll_lt_sap_mac_freq standalone_mac;
|
||||||
|
struct wlan_ll_lt_sap_mac_freq shared_mac;
|
||||||
|
qdf_freq_t best_freq;
|
||||||
|
qdf_freq_t prev_freq;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
* typedef bearer_switch_requester_cb() - Callback function, which will
|
* typedef bearer_switch_requester_cb() - Callback function, which will
|
||||||
* be invoked with the bearer switch request status.
|
* be invoked with the bearer switch request status.
|
||||||
* @psoc: Psoc pointer
|
* @psoc: Psoc pointer
|
||||||
@@ -123,5 +154,4 @@ struct ll_sap_ops {
|
|||||||
struct wlan_objmgr_vdev *vdev,
|
struct wlan_objmgr_vdev *vdev,
|
||||||
enum bearer_switch_req_type req_type);
|
enum bearer_switch_req_type req_type);
|
||||||
};
|
};
|
||||||
|
#endif /* _WLAN_LL_SAP_PUBLIC_STRUCTS_H_ */
|
||||||
#endif /* _WLAN_LL_LT_SAP_BEARER_SWITCH_PUBLIC_STRUCTS_H_ */
|
|
||||||
|
@@ -153,3 +153,11 @@ QDF_STATUS wlan_ll_sap_switch_bearer_on_sta_connect_complete(
|
|||||||
|
|
||||||
return QDF_STATUS_SUCCESS;
|
return QDF_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QDF_STATUS wlan_ll_lt_sap_get_freq_list(
|
||||||
|
struct wlan_objmgr_psoc *psoc,
|
||||||
|
struct wlan_ll_lt_sap_freq_list *freq_list,
|
||||||
|
uint8_t vdev_id)
|
||||||
|
{
|
||||||
|
return ll_lt_sap_get_freq_list(psoc, freq_list, vdev_id);
|
||||||
|
}
|
||||||
|
@@ -1959,6 +1959,14 @@ int wlansap_update_sap_chan_list(struct sap_config *sap_config,
|
|||||||
QDF_STATUS wlansap_sort_channel_list(uint8_t vdev_id, qdf_list_t *list,
|
QDF_STATUS wlansap_sort_channel_list(uint8_t vdev_id, qdf_list_t *list,
|
||||||
struct sap_sel_ch_info *ch_info);
|
struct sap_sel_ch_info *ch_info);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* wlansap_free_chan_info() - API to free allocated memory
|
||||||
|
* @ch_param: Pointer to sap_sel_ch_info structure
|
||||||
|
*
|
||||||
|
* Return: None
|
||||||
|
*/
|
||||||
|
void wlansap_free_chan_info(struct sap_sel_ch_info *ch_param);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* wlansap_get_user_config_acs_ch_list() - Get user config ACS channel list
|
* wlansap_get_user_config_acs_ch_list() - Get user config ACS channel list
|
||||||
* @vdev_id: Vdev Id
|
* @vdev_id: Vdev Id
|
||||||
|
@@ -1655,27 +1655,7 @@ debug_info:
|
|||||||
sap_clear_channel_status(mac);
|
sap_clear_channel_status(mac);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*==========================================================================
|
void sap_chan_sel_exit(struct sap_sel_ch_info *ch_info_params)
|
||||||
FUNCTION sap_chan_sel_exit
|
|
||||||
|
|
||||||
DESCRIPTION
|
|
||||||
Exit function for free out the allocated memory, to be called
|
|
||||||
at the end of the dfsSelectChannel function
|
|
||||||
|
|
||||||
DEPENDENCIES
|
|
||||||
NA.
|
|
||||||
|
|
||||||
PARAMETERS
|
|
||||||
|
|
||||||
IN
|
|
||||||
ch_info_params : Pointer to the tSapChSelSpectInfo structure
|
|
||||||
|
|
||||||
RETURN VALUE
|
|
||||||
void : NULL
|
|
||||||
|
|
||||||
SIDE EFFECTS
|
|
||||||
============================================================================*/
|
|
||||||
static void sap_chan_sel_exit(struct sap_sel_ch_info *ch_info_params)
|
|
||||||
{
|
{
|
||||||
/* Free all the allocated memory */
|
/* Free all the allocated memory */
|
||||||
qdf_mem_free(ch_info_params->ch_info);
|
qdf_mem_free(ch_info_params->ch_info);
|
||||||
|
@@ -316,6 +316,14 @@ QDF_STATUS wlansap_pre_start_bss_acs_scan_callback(mac_handle_t mac_handle,
|
|||||||
uint32_t scanid,
|
uint32_t scanid,
|
||||||
eCsrScanStatus scan_status);
|
eCsrScanStatus scan_status);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* sap_chan_sel_exit() - Exit function for free out the allocated memory,
|
||||||
|
* @ch_info_params: Pointer to sap_sel_ch_info structure
|
||||||
|
*
|
||||||
|
* Return: None
|
||||||
|
*/
|
||||||
|
void sap_chan_sel_exit(struct sap_sel_ch_info *ch_info_params);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* sap_sort_channel_list() - Sort channel list based on channel weight
|
* sap_sort_channel_list() - Sort channel list based on channel weight
|
||||||
* @mac_ctx: Pointer to mac_context
|
* @mac_ctx: Pointer to mac_context
|
||||||
|
@@ -4373,6 +4373,11 @@ QDF_STATUS wlansap_sort_channel_list(uint8_t vdev_id, qdf_list_t *list,
|
|||||||
return QDF_STATUS_SUCCESS;
|
return QDF_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void wlansap_free_chan_info(struct sap_sel_ch_info *ch_param)
|
||||||
|
{
|
||||||
|
sap_chan_sel_exit(ch_param);
|
||||||
|
}
|
||||||
|
|
||||||
void wlansap_get_user_config_acs_ch_list(uint8_t vdev_id,
|
void wlansap_get_user_config_acs_ch_list(uint8_t vdev_id,
|
||||||
struct scan_filter *filter)
|
struct scan_filter *filter)
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user