qcacld-3.0: Filter roam scan channel list as per roam band

Filter roam scan channel list or frequency list as per the
band received from upper layer via attribute
QCA_WLAN_VENDOR_ATTR_SETBAND_MASK and
QCA_WLAN_VENDOR_ATTR_ROAMBAND_MASK.

Change-Id: I4820bfc487949d8445f215a4779dd671925d001f
CRs-Fixed: 3009758
此提交包含在:
abhinav kumar
2021-08-07 19:24:25 +05:30
提交者 Madan Koyyalamudi
父節點 885f57115e
當前提交 8d3a1d9e82

查看文件

@@ -982,6 +982,52 @@ cm_append_pref_chan_list(struct rso_chan_info *chan_info, qdf_freq_t *freq_list,
return num_chan;
}
/**
* cm_modify_chan_list_based_on_band() - Modify RSO channel list based on band
* @freq_list: Channel list coming from user space
* @num_chan: Number of channel present in freq_list buffer
* @band_bitmap: On basis of this band host modify RSO channel list
*
* Return: valid number of channel as per bandmap
*/
static uint8_t
cm_modify_chan_list_based_on_band(qdf_freq_t *freq_list, uint8_t num_chan,
uint32_t band_bitmap)
{
uint8_t i = 0, valid_chan_num = 0;
if (!(band_bitmap & BIT(REG_BAND_2G))) {
mlme_debug("disabling 2G");
for (i = 0; i < num_chan; i++) {
if (WLAN_REG_IS_24GHZ_CH_FREQ(freq_list[i]))
freq_list[i] = 0;
}
}
if (!(band_bitmap & BIT(REG_BAND_5G))) {
mlme_debug("disabling 5G");
for (i = 0; i < num_chan; i++) {
if (WLAN_REG_IS_5GHZ_CH_FREQ(freq_list[i]))
freq_list[i] = 0;
}
}
if (!(band_bitmap & BIT(REG_BAND_6G))) {
mlme_debug("disabling 6G");
for (i = 0; i < num_chan; i++) {
if (WLAN_REG_IS_6GHZ_CHAN_FREQ(freq_list[i]))
freq_list[i] = 0;
}
}
for (i = 0; i < num_chan; i++) {
if (freq_list[i])
freq_list[valid_chan_num++] = freq_list[i];
}
return valid_chan_num;
}
static QDF_STATUS cm_create_bg_scan_roam_channel_list(struct rso_chan_info *chan_info,
const qdf_freq_t *chan_freq_lst,
const uint8_t num_chan)
@@ -1000,16 +1046,90 @@ static QDF_STATUS cm_create_bg_scan_roam_channel_list(struct rso_chan_info *chan
return status;
}
/**
* cm_remove_disabled_channels() - Remove disabled channels as per current
* connected band
* @vdev: vdev common object
* @freq_list: Channel list coming from user space
* @num_chan: Number of channel present in freq_list buffer
*
* Return: Number of channels as per SETBAND mask
*/
static uint32_t cm_remove_disabled_channels(struct wlan_objmgr_vdev *vdev,
qdf_freq_t *freq_list,
uint8_t num_chan)
{
struct regulatory_channel *cur_chan_list;
struct wlan_objmgr_pdev *pdev = wlan_vdev_get_pdev(vdev);
uint32_t valid_chan_num = 0;
enum channel_state state;
uint32_t freq, i, j;
QDF_STATUS status;
uint32_t filtered_lst[NUM_CHANNELS] = {0};
cur_chan_list =
qdf_mem_malloc(NUM_CHANNELS * sizeof(struct regulatory_channel));
if (!cur_chan_list)
return 0;
status = wlan_reg_get_current_chan_list(pdev, cur_chan_list);
if (QDF_IS_STATUS_ERROR(status)) {
qdf_mem_free(cur_chan_list);
return 0;
}
for (i = 0; i < NUM_CHANNELS; i++) {
freq = cur_chan_list[i].center_freq;
state = wlan_reg_get_channel_state_for_freq(pdev, freq);
if (state != CHANNEL_STATE_DISABLE &&
state != CHANNEL_STATE_INVALID) {
for (j = 0; j < num_chan; j++) {
if (freq == freq_list[j]) {
filtered_lst[valid_chan_num++] =
freq_list[j];
break;
}
}
}
}
mlme_debug("[ROAM_BAND]: num channel :%d", valid_chan_num);
for (i = 0; i < valid_chan_num; i++)
freq_list[i] = filtered_lst[i];
qdf_mem_free(cur_chan_list);
return valid_chan_num;
}
/**
* cm_update_roam_scan_channel_list() - Update channel list as per RSO chan info
* band bitmask
* @psoc: Psoc common object
* @vdev: vdev common object
* @rso_cfg: connect config to be used to send info in RSO
* @vdev_id: vdev id
* @chan_info: hannel list already sent via RSO
* @freq_list: Channel list coming from user space
* @num_chan: Number of channel present in freq_list buffer
* @update_preferred_chan: Decide whether to update preferred chan list or not
*
* Return: QDF_STATUS
*/
static QDF_STATUS
cm_update_roam_scan_channel_list(uint8_t vdev_id,
cm_update_roam_scan_channel_list(struct wlan_objmgr_psoc *psoc,
struct wlan_objmgr_vdev *vdev,
struct rso_config *rso_cfg, uint8_t vdev_id,
struct rso_chan_info *chan_info,
qdf_freq_t *freq_list, uint8_t num_chan,
bool update_preferred_chan)
{
uint16_t pref_chan_cnt = 0;
uint32_t valid_chan_num = 0;
struct cm_roam_values_copy config;
if (chan_info->num_chan) {
mlme_debug("Current channels:");
mlme_debug("Current channel num: %d", chan_info->num_chan);
cm_dump_freq_list(chan_info);
}
@@ -1018,10 +1138,28 @@ cm_update_roam_scan_channel_list(uint8_t vdev_id,
num_chan);
num_chan = pref_chan_cnt;
}
num_chan = cm_remove_disabled_channels(vdev, freq_list, num_chan);
if (!num_chan)
return QDF_STATUS_E_FAILURE;
wlan_cm_roam_cfg_get_value(psoc, vdev_id, ROAM_BAND, &config);
/* No need to modify channel list if all channel is allowed */
if (config.uint_value != REG_BAND_MASK_ALL) {
valid_chan_num =
cm_modify_chan_list_based_on_band(freq_list, num_chan,
config.uint_value);
if (!valid_chan_num) {
mlme_debug("No valid channels left to send to the fw");
return QDF_STATUS_E_FAILURE;
}
num_chan = valid_chan_num;
}
cm_flush_roam_channel_list(chan_info);
cm_create_bg_scan_roam_channel_list(chan_info, freq_list, num_chan);
mlme_debug("New channels:");
mlme_debug("New channel num: %d", num_chan);
cm_dump_freq_list(chan_info);
return QDF_STATUS_SUCCESS;
@@ -1120,11 +1258,10 @@ wlan_cm_roam_cfg_set_value(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
status = QDF_STATUS_E_INVAL;
break;
}
status = cm_update_roam_scan_channel_list(vdev_id,
&dst_cfg->pref_chan_info,
status = cm_update_roam_scan_channel_list(psoc, vdev, rso_cfg,
vdev_id, &dst_cfg->pref_chan_info,
src_config->chan_info.freq_list,
src_config->chan_info.num_chan,
true);
src_config->chan_info.num_chan, true);
if (QDF_IS_STATUS_ERROR(status))
break;
if (mlme_obj->cfg.lfr.roam_scan_offload_enabled)
@@ -1132,11 +1269,13 @@ wlan_cm_roam_cfg_set_value(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
REASON_CHANNEL_LIST_CHANGED);
break;
case ROAM_SPECIFIC_CHAN:
cm_update_roam_scan_channel_list(vdev_id,
&dst_cfg->specific_chan_info,
status = cm_update_roam_scan_channel_list(psoc, vdev, rso_cfg,
vdev_id, &dst_cfg->specific_chan_info,
src_config->chan_info.freq_list,
src_config->chan_info.num_chan,
false);
if (QDF_IS_STATUS_ERROR(status))
break;
if (mlme_obj->cfg.lfr.roam_scan_offload_enabled)
cm_roam_update_cfg(psoc, vdev_id,
REASON_CHANNEL_LIST_CHANGED);