qcacmn: Cleanup old random channel function

Removed WIN based random channel selection algorithm.
To choose a new random channel, use converged random
channel  algorithm.

Change-Id: I0ece0cb71ffeb694c9f5264d97a25e49d59b1ae8
CRs-Fixed: 2120265
此提交包含在:
Shashikala Prabhu
2017-10-06 09:59:22 +05:30
提交者 snandini
父節點 68431d3ea5
當前提交 2427663f1f
共有 8 個檔案被更改,包括 0 行新增443 行删除

查看文件

@@ -1475,18 +1475,6 @@ int dfs_create_object(struct wlan_dfs **dfs);
*/
void dfs_destroy_object(struct wlan_dfs *dfs);
/**
* dfs_random_channel() - Function to choose the random channel from the current
* channel list.
* @dfs: Pointer to wlan_dfs structure.
* @is_select_nondfs: Select NON-DFS chan or both NON-DFS and DFS.
* @skip_curchan: Select the next channel post radar detecr and skip the
* curchan.
*/
int dfs_random_channel(struct wlan_dfs *dfs,
uint8_t is_select_nondfs,
uint8_t skip_curchan);
/**
* dfs_detach() - Wrapper function to free dfs variables.
* @dfs: Pointer to wlan_dfs structure.

查看文件

@@ -230,313 +230,3 @@ void dfs_stacac_stop(struct wlan_dfs *dfs)
"Stopping STA CAC Timer %d procphyerr 0x%08x",
dfs->dfs_curchan->dfs_ch_freq, phyerr);
}
int dfs_random_channel(struct wlan_dfs *dfs,
uint8_t is_select_nondfs,
uint8_t skip_curchan)
{
int chanStart, n = 0;
uint64_t curChanFlags = 0, chan_flags;
uint16_t chan_flagext = 0;
int numGChannels = 0;
int numAChannels = 0;
int j = 0;
int ht160_count = 0;
int ht80_80_count = 0;
int ht80_count = 0;
int ht40plus_count = 0;
int ht40minus_count = 0;
int ht20_count = 0;
int use_lower_5g_only = 0;
int use_upper_5g_only = 0;
/*
* IR: 107025 -- Random channel selction not correct instead
* of uint8_t available_chan_idx[IEEE80211_CHAN_MAX+1] use
* int *available_chan_idx and dynamically allocate it
* storing int charStart in byte array available_chan_idx[]
* is reason for random channel selection failure when
* number of max channel (IEEE80211_CHAN_MAX) is more than 255.
*/
int *available_chan_idx;
int available_chan_count = 0;
int ret_val = -1;
uint32_t alt_chan_mode = 0;
int chan_count = 0;
struct dfs_ieee80211_channel *c = NULL, lc;
int nchans = 0;
uint8_t no_wradar = 0;
c = &lc;
available_chan_idx = qdf_mem_malloc(
(IEEE80211_CHAN_MAX + 1) * sizeof(int));
if (!(available_chan_idx)) {
dfs_alert(dfs, WLAN_DEBUG_DFS_ALWAYS, "cannot allocate memory");
return ret_val;
}
/*
* FR 27305: In Japan domain, if current channel is below
* channel 100 then find a new channel that is below 100.
* Similarly if the current channel is 100 or higher then
* pick a channel that is 100 or higher.
*/
if (utils_get_dfsdomain(dfs->dfs_pdev_obj) == DFS_MKK4_DOMAIN) {
if (IEEE80211_IS_CHAN_11AC_VHT80_80(dfs->dfs_curchan)) {
/* No action required for now. */
use_lower_5g_only = 0;
use_upper_5g_only = 0;
dfs_info(dfs, WLAN_DEBUG_DFS_ALWAYS,
"-- MMK4 domain, HT80_80, no restriction on using upper or lower 5G channel"
);
} else if (IEEE80211_IS_CHAN_11AC_VHT160(dfs->dfs_curchan)) {
/* No action required for now. */
use_lower_5g_only = 0;
use_upper_5g_only = 0;
dfs_info(dfs, WLAN_DEBUG_DFS_ALWAYS,
"-- MMK4 domain, HT160, will look for HT160. if can't find no restriction on using upper or lower 5G channel"
);
} else {
if (dfs->dfs_curchan->dfs_ch_freq < CH100_START_FREQ) {
use_lower_5g_only = 1;
use_upper_5g_only = 0;
dfs_info(dfs, WLAN_DEBUG_DFS_ALWAYS,
"-- MMK4 domain, search for lower 5G (less than 5490 MHz) channels"
);
} else {
use_lower_5g_only = 0;
use_upper_5g_only = 1;
dfs_info(dfs, WLAN_DEBUG_DFS_ALWAYS,
"-- MMK4 domain, search for upper 5G (more than 5490 MHz) channels"
);
}
}
}
/*
* Pick a random channel.
* Find how many G channels are present in the channel list.
* Assuming all G channels are present at the beginning of the
* list, followed by all A channels
*/
dfs_mlme_get_dfs_ch_nchans(dfs->dfs_pdev_obj, &nchans);
for (j = 0; j < nchans; j++) {
dfs_mlme_get_dfs_ch_channels(dfs->dfs_pdev_obj,
&(c->dfs_ch_freq),
&(c->dfs_ch_flags),
&(c->dfs_ch_flagext),
&(c->dfs_ch_ieee),
&(c->dfs_ch_vhtop_ch_freq_seg1),
&(c->dfs_ch_vhtop_ch_freq_seg2),
j);
chan_flags = c->dfs_ch_flags;
if (chan_flags & IEEE80211_CHAN_2GHZ) {
numGChannels++;
continue;
} else
break;
}
numAChannels = (nchans - numGChannels);
chanStart = numGChannels;
curChanFlags = (dfs->dfs_curchan->dfs_ch_flags) & IEEE80211_CHAN_ALL;
if (dfs_mlme_dfs_ch_flags_ext(dfs->dfs_pdev_obj) &
IEEE80211_FEXT_BLKDFSCHAN)
curChanFlags &= ~IEEE80211_CHAN_DFS;
for (n = 0; n < nchans; chanStart++, n++) {
if (chanStart == nchans)
chanStart = 0;
dfs_mlme_get_dfs_ch_channels(dfs->dfs_pdev_obj,
&(c->dfs_ch_freq),
&(c->dfs_ch_flags),
&(c->dfs_ch_flagext),
&(c->dfs_ch_ieee),
&(c->dfs_ch_vhtop_ch_freq_seg1),
&(c->dfs_ch_vhtop_ch_freq_seg2),
chanStart);
chan_flags = c->dfs_ch_flags;
chan_flagext = c->dfs_ch_flagext;
if (skip_curchan) {
/* Skip curchan when choosing apriori random channel.
*/
if (c->dfs_ch_freq == dfs->dfs_curchan->dfs_ch_freq)
continue;
}
/* These channels have CAC of 10 minutes so skipping these. */
dfs_mlme_get_dfs_ch_no_weather_radar_chan(dfs->dfs_pdev_obj,
&no_wradar);
if (no_wradar) {
/*
* We should also avoid this channel in HT40 mode as
* extension channel will be on 5600.
*/
uint32_t freq = 0;
freq = dfs_ieee80211_chan2freq(c);
if (((IS_CHANNEL_WEATHER_RADAR(freq)) ||
((IEEE80211_CHAN_11NA_HT40PLUS &
chan_flags)
&& (freq == ADJACENT_WEATHER_RADAR_CHANNEL)
)) && (DFS_ETSI_DOMAIN ==
utils_get_dfsdomain(dfs->dfs_pdev_obj)))
continue;
}
#undef ADJACENT_WEATHER_RADAR_CHANNEL
/*
* 1) Skip static turbo channel as it will require STA to be
* in static turbo to work.
* 2) Skip channel which's marked with radar detction.
* 3) WAR: We allow user to config not to use any DFS channel.
* When we pick a channel, skip excluded 11D channels.
* See bug 3124.
*/
if ((chan_flags & IEEE80211_CHAN_STURBO) ||
(chan_flags & IEEE80211_CHAN_DFS_RADAR) ||
(chan_flagext & IEEE80211_CHAN_11D_EXCLUDED) ||
(chan_flagext & IEEE80211_CHAN_DFS &&
dfs_mlme_dfs_ch_flags_ext(dfs->dfs_pdev_obj) &
IEEE80211_FEXT_BLKDFSCHAN) ||
(chan_flagext & IEEE80211_CHAN_DFS && is_select_nondfs))
continue;
/*
* FR 27305: In Japan domain, if current channel is below
* channel 100 then find a new channel that is below 100.
* Similarly if the current channel is 100 or higher then
* pick a channel that is 100 or higher.
*/
if (use_lower_5g_only) {
if (IEEE80211_IS_CHAN_11AC_VHT80_80(c)) {
if ((c->dfs_ch_freq > CH100_START_FREQ) ||
(c->dfs_ch_vhtop_ch_freq_seg2 >
CH100)) {
/* Skip this channel. */
continue;
}
} else {
if (c->dfs_ch_freq > CH100_START_FREQ) {
/* Skip this channel. */
continue;
}
}
}
if (use_upper_5g_only) {
if (IEEE80211_IS_CHAN_11AC_VHT80_80(c)) {
if ((c->dfs_ch_freq < CH100_START_FREQ) ||
(c->dfs_ch_vhtop_ch_freq_seg2 <
CH100)) {
/* Skip this channel. */
continue;
}
} else {
if (c->dfs_ch_freq < CH100_START_FREQ) {
/* Skip this channel. */
continue;
}
}
}
/*
* Keep a count of VHT160, VHT80_80 and VHT80 channels
* so that we can move from VHT160 to VHT80_80 to VHT80
* if we cannot find a channel in current mode.
*/
if (chan_flags & IEEE80211_CHAN_VHT20)
ht20_count++;
else if (chan_flags & IEEE80211_CHAN_VHT40PLUS)
ht40plus_count++;
else if (chan_flags & IEEE80211_CHAN_VHT40MINUS)
ht40minus_count++;
else if (chan_flags & IEEE80211_CHAN_VHT80)
ht80_count++;
else if (chan_flags & IEEE80211_CHAN_VHT80_80)
ht80_80_count++;
else if (chan_flags & IEEE80211_CHAN_VHT160)
ht160_count++;
if ((chan_flags & IEEE80211_CHAN_ALL) == curChanFlags) {
available_chan_idx[available_chan_count++] = chanStart;
if (available_chan_count >= IEEE80211_CHAN_MAX + 1)
break;
}
}
if (available_chan_count) {
uint32_t random_byte = 0;
get_random_bytes(&random_byte, 1);
j = (random_byte + qdf_system_ticks()) % available_chan_count;
chanStart = (available_chan_idx[j]);
ret_val = chanStart;
} else {
dfs_info(dfs, WLAN_DEBUG_DFS_ALWAYS,
"Cannot find a channel, looking for channel in other mode. ht80_count=%d, ht80_80_count=%d, ht160_count=%d",
ht80_count,
ht80_80_count, ht160_count);
/*
* We need to handle HT160/HT80_80 in a special way HT160
* has only two channels available. We will try to change
* to HT80_80 if we cannot find any 160 MHz contiguous
* channel. If there is no HT80_80 channel then we will
* look for HT80 channel. Also we will change HT80_80 to
* HT80 in case we can't find a HT80_80 channel. This can
* happen in some design with two 5G radios where one
* radio operates in channel 36 through 64. The same could
* be done for other 11AC modes but we have plenty of HT80,
* HT40 and HT20 channels. The following code can also
* be enhanced to switch automatically to a wider channel
* whenever one is present.
*/
if (ht160_count > 0) {
alt_chan_mode = IEEE80211_CHAN_VHT160;
chan_count = ht160_count;
} else if (ht80_80_count > 0) {
alt_chan_mode = IEEE80211_CHAN_VHT80_80;
chan_count = ht80_80_count;
} else if (ht80_count > 0) {
alt_chan_mode = IEEE80211_CHAN_VHT80;
chan_count = ht80_count;
} else if (ht40plus_count > 0) {
alt_chan_mode = IEEE80211_CHAN_VHT40PLUS;
chan_count = ht40plus_count;
} else if (ht40minus_count > 0) {
alt_chan_mode = IEEE80211_CHAN_VHT40MINUS;
chan_count = ht40minus_count;
} else if (ht20_count > 0) {
alt_chan_mode = IEEE80211_CHAN_VHT20;
chan_count = ht20_count;
}
if (chan_count) {
ret_val = dfs_mlme_find_alternate_mode_channel
(dfs->dfs_pdev_obj, alt_chan_mode, chan_count);
if (ret_val == -1) {
/* Last attempt to get a valid channel. */
dfs_info(dfs, WLAN_DEBUG_DFS_ALWAYS,
"Cannot find a channel. Forcing to first available HT20 channel"
);
dfs_mlme_find_any_valid_channel
(dfs->dfs_pdev_obj,
IEEE80211_CHAN_VHT20, &ret_val);
}
} else {
/*
* When all the DFS channels are in NOL and there
* is no DFS channel, chan_count is 0 and observed
* 'Division by zero in kernel'.
*/
ret_val = -1;
}
}
qdf_mem_free(available_chan_idx);
return ret_val;
}

查看文件

@@ -97,35 +97,6 @@ void dfs_mlme_deliver_event_up_afrer_cac(struct wlan_objmgr_pdev *pdev);
*/
void dfs_mlme_get_dfs_ch_nchans(struct wlan_objmgr_pdev *pdev, int *nchans);
/**
* dfs_mlme_get_dfs_ch_no_weather_radar_chan() - Checks is the channel is
* weather radar channel.
* @pdev: Pointer to DFS pdev object.
* @no_wradar: Pointer to save weather radar filter value.
*/
void dfs_mlme_get_dfs_ch_no_weather_radar_chan(struct wlan_objmgr_pdev *pdev,
uint8_t *no_wradar);
/**
* dfs_mlme_find_alternate_mode_channel() - Finds the channel.
* @pdev: Pointer to DFS pdev object.
* @alt_chan_mode: Input mode.
* @chan_count: channel count.
*/
int dfs_mlme_find_alternate_mode_channel(struct wlan_objmgr_pdev *pdev,
uint32_t alt_chan_mode,
int chan_count);
/**
* dfs_mlme_find_any_valid_channel() - Finds the channel with the given mode.
* @pdev: Pointer to DFS pdev object.
* @chan_mode: Channel mode.
* @ret_val: Pointer to save the channel index.
*/
void dfs_mlme_find_any_valid_channel(struct wlan_objmgr_pdev *pdev,
uint32_t chan_mode,
int *ret_val);
/**
* dfs_mlme_get_extchan() - Get extension channel.
* @pdev: Pointer to DFS pdev object.

查看文件

@@ -42,10 +42,6 @@
* space
* @mlme_get_dfs_ch_nchans: Get number of channels in the channel
* list.
* @mlme_get_dfs_ch_no_weather_radar_chan: Checks is the channel is weather
* radar channel.
* @mlme_find_alternate_mode_channel: Finds the channel.
* @mlme_find_any_valid_channel: Find the valid channeil.
* @mlme_get_extchan: Gets the extension channel.
* @mlme_set_no_chans_available: Sets no_chans_available flag.
* @mlme_ieee2mhz: Gets Channel freq from ieee number.
@@ -86,18 +82,6 @@ struct dfs_to_mlme {
struct wlan_objmgr_pdev *pdev);
QDF_STATUS (*mlme_get_dfs_ch_nchans)(struct wlan_objmgr_pdev *pdev,
int *nchans);
QDF_STATUS (*mlme_get_dfs_ch_no_weather_radar_chan)(
struct wlan_objmgr_pdev *pdev,
uint8_t *no_wradar);
QDF_STATUS (*mlme_find_alternate_mode_channel)(
struct wlan_objmgr_pdev *pdev,
uint32_t alt_chan_mode,
int chan_count,
int *ret_val);
QDF_STATUS (*mlme_find_any_valid_channel)(
struct wlan_objmgr_pdev *pdev,
uint32_t chan_mode,
int *ret_val);
QDF_STATUS (*mlme_get_extchan)(struct wlan_objmgr_pdev *pdev,
uint16_t *dfs_ch_freq,
uint64_t *dfs_ch_flags,

查看文件

@@ -168,23 +168,6 @@ QDF_STATUS utils_dfs_cac_stop(struct wlan_objmgr_pdev *pdev);
*/
QDF_STATUS utils_dfs_stacac_stop(struct wlan_objmgr_pdev *pdev);
/**
* utils_dfs_random_channel() - Function to choose the random channel from the
* current channel list.
* @pdev: Pointer to DFS pdev object.
* @is_select_nondfs: Select NON-DFS chan or both NON-DFS and DFS.
* @skip_curchan: Select the next channel post radar detecr and skip the
* curchan.
* @target_channel: Pointer to target_channel.
*
* wrapper function for dfs_random_channel(). this
* function called from outside of dfs component.
*/
QDF_STATUS utils_dfs_random_channel(struct wlan_objmgr_pdev *pdev,
uint8_t is_select_nondfs,
uint8_t skip_curchan,
int *target_channel);
/**
* utils_dfs_get_usenol() - Returns use_nol flag.
* @pdev: Pointer to DFS pdev object.

查看文件

@@ -65,12 +65,6 @@ void register_dfs_callbacks(void)
tmp_dfs_to_mlme->mlme_deliver_event_up_afrer_cac =
mlme_dfs_deliver_event_up_afrer_cac;
tmp_dfs_to_mlme->mlme_get_dfs_ch_nchans = mlme_dfs_get_dfs_ch_nchans;
tmp_dfs_to_mlme->mlme_get_dfs_ch_no_weather_radar_chan =
mlme_dfs_get_dfs_ch_no_weather_radar_chan;
tmp_dfs_to_mlme->mlme_find_alternate_mode_channel =
mlme_dfs_find_alternate_mode_channel;
tmp_dfs_to_mlme->mlme_find_any_valid_channel =
mlme_dfs_find_any_valid_channel;
tmp_dfs_to_mlme->mlme_get_extchan = mlme_dfs_get_extchan;
tmp_dfs_to_mlme->mlme_set_no_chans_available =
mlme_dfs_set_no_chans_available;

查看文件

@@ -141,40 +141,6 @@ void dfs_mlme_get_dfs_ch_nchans(struct wlan_objmgr_pdev *pdev,
nchans);
}
void dfs_mlme_get_dfs_ch_no_weather_radar_chan(struct wlan_objmgr_pdev *pdev,
uint8_t *no_wradar)
{
if (global_dfs_to_mlme.mlme_get_dfs_ch_no_weather_radar_chan != NULL)
global_dfs_to_mlme.mlme_get_dfs_ch_no_weather_radar_chan(
pdev,
no_wradar);
}
int dfs_mlme_find_alternate_mode_channel(struct wlan_objmgr_pdev *pdev,
uint32_t alt_chan_mode,
int chan_count)
{
int ret_val = 0;
if (global_dfs_to_mlme.mlme_find_alternate_mode_channel != NULL)
global_dfs_to_mlme.mlme_find_alternate_mode_channel(
pdev,
alt_chan_mode, chan_count, &ret_val);
return ret_val;
}
void dfs_mlme_find_any_valid_channel(struct wlan_objmgr_pdev *pdev,
uint32_t chan_mode,
int *ret_val)
{
if (global_dfs_to_mlme.mlme_find_any_valid_channel != NULL)
global_dfs_to_mlme.mlme_find_any_valid_channel(
pdev,
chan_mode,
ret_val);
}
QDF_STATUS dfs_mlme_get_extchan(struct wlan_objmgr_pdev *pdev,
uint16_t *dfs_ch_freq,
uint64_t *dfs_ch_flags,

查看文件

@@ -167,25 +167,6 @@ QDF_STATUS utils_dfs_stacac_stop(struct wlan_objmgr_pdev *pdev)
}
EXPORT_SYMBOL(utils_dfs_stacac_stop);
QDF_STATUS utils_dfs_random_channel(struct wlan_objmgr_pdev *pdev,
uint8_t is_select_nondfs,
uint8_t skip_curchan,
int *target_channel)
{
struct wlan_dfs *dfs;
dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev);
if (!dfs)
return QDF_STATUS_E_FAILURE;
*target_channel = dfs_random_channel(dfs,
is_select_nondfs,
skip_curchan);
return QDF_STATUS_SUCCESS;
}
EXPORT_SYMBOL(utils_dfs_random_channel);
QDF_STATUS utils_dfs_get_usenol(struct wlan_objmgr_pdev *pdev, uint16_t *usenol)
{
struct wlan_dfs *dfs;