mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-14 16:46:15 -04:00
qcacmn: Fix issues in random channel selection algorithm
Remove dummy function dfs_remove_cur_ch_from_list(). This logic is already implemented in dfs_apply_rules(). In dfs_apply_rules()/dfs_apply_rules_for_freq(), skip all the HT20 channels of the curent channel when DFS_RANDOM_CH_FLAG_NO_CURR_OPE_CH flag is set. In dfs_prepare_random_channel_for_freq(), allocate correct size of memory for leakage_adjusted_lst array. Use DFS_80_NUM_SUB_CHANNEL macro instead of DFS_80_NUM_SUB_CHANNEL_FREQ to choose correct 80MHz channel. Change-Id: Ie318d667ff1b0caef3032b7aa57f0ddfb7e1f1a7 CRs-Fixed: 2570055
This commit is contained in:
parent
21f7286344
commit
6810d038e9
3 changed files with 32 additions and 41 deletions
|
|
@ -81,6 +81,9 @@
|
|||
/* Number of 20MHz channels in bitmap */
|
||||
#define DFS_MAX_20M_SUB_CH 8
|
||||
|
||||
/* Frequency difference between 80+80 MHz */
|
||||
#define DFS_80P80M_FREQ_DIFF 40
|
||||
|
||||
/* Number of 80MHz channels in 5GHz band */
|
||||
#define DFS_MAX_80MHZ_BANDS 6
|
||||
|
||||
|
|
|
|||
|
|
@ -20,6 +20,7 @@
|
|||
#include "../dfs_random_chan_sel.h"
|
||||
#include <qdf_mc_timer.h>
|
||||
#include <wlan_utility.h>
|
||||
#include "../dfs_process_radar_found_ind.h"
|
||||
|
||||
#ifdef WLAN_ENABLE_CHNL_MATRIX_RESTRICTION
|
||||
/*
|
||||
|
|
@ -1648,7 +1649,7 @@ static uint16_t dfs_find_ch_with_fallback_for_freq(struct wlan_dfs *dfs,
|
|||
index = (rand_byte + qdf_mc_timer_get_system_ticks()) %
|
||||
final_cnt;
|
||||
target_channel = final_lst[index];
|
||||
index -= (index % DFS_80_NUM_SUB_CHANNEL_FREQ);
|
||||
index -= (index % DFS_80_NUM_SUB_CHANNEL);
|
||||
primary_seg_start_ch = final_lst[index];
|
||||
|
||||
/* reset channels associate with primary 80Mhz */
|
||||
|
|
@ -1656,12 +1657,12 @@ static uint16_t dfs_find_ch_with_fallback_for_freq(struct wlan_dfs *dfs,
|
|||
final_lst[i + index] = 0;
|
||||
/* select and calculate center freq for secondary segment */
|
||||
for (i = 0; i < final_cnt / DFS_80_NUM_SUB_CHANNEL; i++) {
|
||||
if (final_lst[i * DFS_80_NUM_SUB_CHANNEL_FREQ] &&
|
||||
if (final_lst[i * DFS_80_NUM_SUB_CHANNEL] &&
|
||||
(abs(primary_seg_start_ch -
|
||||
final_lst[i * DFS_80_NUM_SUB_CHANNEL_FREQ]) >
|
||||
(DFS_MAX_20M_SUB_CH * 2))) {
|
||||
final_lst[i * DFS_80_NUM_SUB_CHANNEL]) >
|
||||
(DFS_80P80M_FREQ_DIFF * 2))) {
|
||||
sec_seg_ch = final_lst[i *
|
||||
DFS_80_NUM_SUB_CHANNEL_FREQ] +
|
||||
DFS_80_NUM_SUB_CHANNEL] +
|
||||
DFS_80MHZ_START_CENTER_CH_FREQ_DIFF;
|
||||
break;
|
||||
}
|
||||
|
|
@ -1687,27 +1688,6 @@ static uint16_t dfs_find_ch_with_fallback_for_freq(struct wlan_dfs *dfs,
|
|||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* dfs_remove_cur_ch_from_list()- remove current operating channels
|
||||
* @ch_list: list of avilable channel list
|
||||
* @ch_cnt: number of channels.
|
||||
* @ch_wd: channel width.
|
||||
* @cur_chan: current channel.
|
||||
*
|
||||
* Remove current channels from list of available channels.
|
||||
*
|
||||
* Return: channel number
|
||||
*/
|
||||
static void dfs_remove_cur_ch_from_list(
|
||||
struct dfs_channel *ch_list,
|
||||
uint32_t *ch_cnt,
|
||||
uint8_t *ch_wd,
|
||||
struct dfs_channel *cur_chan)
|
||||
{
|
||||
/* TODO */
|
||||
return;
|
||||
}
|
||||
|
||||
bool dfs_is_freq_in_nol(struct wlan_dfs *dfs, uint32_t freq)
|
||||
{
|
||||
struct dfs_nolelem *nol;
|
||||
|
|
@ -1920,6 +1900,8 @@ static void dfs_apply_rules_for_freq(struct wlan_dfs *dfs,
|
|||
int i;
|
||||
bool found = false;
|
||||
uint16_t j;
|
||||
uint16_t freq_list[NUM_CHANNELS_160MHZ];
|
||||
uint8_t num_channels;
|
||||
|
||||
dfs_debug(dfs, WLAN_DEBUG_DFS_RANDOM_CHAN, "flags %d", flags);
|
||||
flag_no_weather = (dfs_region == DFS_ETSI_REGION_VAL) ?
|
||||
|
|
@ -1935,8 +1917,15 @@ static void dfs_apply_rules_for_freq(struct wlan_dfs *dfs,
|
|||
flag_no_2g_chan = flags & DFS_RANDOM_CH_FLAG_NO_2GHZ_CH;
|
||||
flag_no_5g_chan = flags & DFS_RANDOM_CH_FLAG_NO_5GHZ_CH;
|
||||
|
||||
if (flags & DFS_RANDOM_CH_FLAG_NO_CURR_OPE_CH) {
|
||||
num_channels =
|
||||
dfs_get_bonding_channel_without_seg_info_for_freq
|
||||
(dfs->dfs_curchan, freq_list);
|
||||
}
|
||||
|
||||
for (i = 0; i < chan_cnt; i++) {
|
||||
chan = &chan_list[i];
|
||||
found = false;
|
||||
|
||||
if ((chan->dfs_ch_ieee == 0) ||
|
||||
(chan->dfs_ch_ieee > MAX_CHANNEL_NUM)) {
|
||||
|
|
@ -1946,15 +1935,21 @@ static void dfs_apply_rules_for_freq(struct wlan_dfs *dfs,
|
|||
}
|
||||
|
||||
if (flags & DFS_RANDOM_CH_FLAG_NO_CURR_OPE_CH) {
|
||||
/* TODO : Skip all HT20 channels in the given mode */
|
||||
if (chan->dfs_ch_freq ==
|
||||
dfs->dfs_curchan->dfs_ch_freq) {
|
||||
dfs_debug(dfs, WLAN_DEBUG_DFS_RANDOM_CHAN,
|
||||
"skip %d current operating channel",
|
||||
chan->dfs_ch_ieee);
|
||||
continue;
|
||||
for (j = 0; j < num_channels; j++) {
|
||||
if (chan->dfs_ch_freq == freq_list[j]) {
|
||||
dfs_debug(dfs,
|
||||
WLAN_DEBUG_DFS_RANDOM_CHAN,
|
||||
"skip %d current operating channel",
|
||||
chan->dfs_ch_freq);
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (found)
|
||||
continue;
|
||||
}
|
||||
|
||||
if (acs_info && acs_info->acs_mode) {
|
||||
for (j = 0; j < acs_info->num_of_channel; j++) {
|
||||
if (acs_info->chan_freq_list[j] ==
|
||||
|
|
@ -2074,9 +2069,6 @@ uint8_t dfs_prepare_random_channel(struct wlan_dfs *dfs,
|
|||
if (!random_chan_list)
|
||||
return 0;
|
||||
|
||||
if (flags & DFS_RANDOM_CH_FLAG_NO_CURR_OPE_CH)
|
||||
dfs_remove_cur_ch_from_list(ch_list, &ch_cnt, ch_wd, cur_chan);
|
||||
|
||||
dfs_apply_rules(dfs, flags, random_chan_list, &random_chan_cnt,
|
||||
ch_list, ch_cnt, dfs_region, acs_info);
|
||||
|
||||
|
|
@ -2190,13 +2182,9 @@ uint16_t dfs_prepare_random_channel_for_freq(struct wlan_dfs *dfs,
|
|||
if (!random_chan_freq_list)
|
||||
return 0;
|
||||
|
||||
if (flags & DFS_RANDOM_CH_FLAG_NO_CURR_OPE_CH)
|
||||
dfs_remove_cur_ch_from_list(chan_list, &chan_cnt, chan_wd, cur_chan);
|
||||
|
||||
dfs_apply_rules_for_freq(dfs, flags, random_chan_freq_list,
|
||||
&random_chan_cnt, chan_list, chan_cnt,
|
||||
dfs_region, acs_info);
|
||||
|
||||
flag_no_weather = (dfs_region == DFS_ETSI_REGION_VAL) ?
|
||||
flags & DFS_RANDOM_CH_FLAG_NO_WEATHER_CH : 0;
|
||||
|
||||
|
|
|
|||
|
|
@ -472,7 +472,7 @@ QDF_STATUS utils_dfs_get_random_channel(struct wlan_objmgr_pdev *pdev,
|
|||
#endif
|
||||
|
||||
/**
|
||||
* utils_dfs_get_random_channel() - Get random channel.
|
||||
* utils_dfs_get_random_channel_for_freq() - Get random channel.
|
||||
* @pdev: Pointer to DFS pdev object.
|
||||
* @flags: random channel selection flags.
|
||||
* @ch_params: current channel params.
|
||||
|
|
|
|||
Loading…
Reference in a new issue