qcacld-3.0: Always append preferred roam scan channels

For ADDROAMSCANCHANNELS command, always append user given channels
into the existing preferred channels list in driver. If the preferred
channel list exceeds SIR_ROAM_MAX_CHANNELS i.e. 80 then overwrite
oldest entries with new channels.

Change-Id: Ifa12b1e4d75dd927bdbceea9a076ed1bcbd91f4f
CRs-Fixed: 2618318
This commit is contained in:
Abhishek Ambure 2020-02-10 06:26:47 +05:30 • committed by nshrivas
commit 293c2d3bf6

View file

@ -7322,6 +7322,27 @@ static bool sme_validate_freq_list(mac_handle_t mac_handle,
return true;
}
static uint8_t
csr_append_pref_chan_list(tCsrChannelInfo *chan_info, uint32_t *freq_list,
uint8_t num_chan)
{
uint8_t i = 0, j = 0;
for (i = 0; i < chan_info->numOfChannels; i++) {
for (j = 0; j < num_chan; j++)
if (chan_info->freq_list[i] == freq_list[j])
break;
if (j < num_chan)
continue;
if (num_chan == SIR_ROAM_MAX_CHANNELS)
break;
freq_list[num_chan++] = chan_info->freq_list[i];
}
return num_chan;
}
/**
* sme_update_roam_scan_channel_list() - to update scan channel list
* @mac_handle: Opaque handle to the global MAC context
@ -7342,11 +7363,17 @@ sme_update_roam_scan_channel_list(mac_handle_t mac_handle, uint8_t vdev_id,
{
QDF_STATUS status = QDF_STATUS_SUCCESS;
struct mac_context *mac = MAC_CONTEXT(mac_handle);
uint16_t pref_chan_cnt = 0;
if (chan_info->numOfChannels) {
sme_debug("Current channels:");
sme_dump_freq_list(chan_info);
}
pref_chan_cnt = csr_append_pref_chan_list(chan_info, freq_list,
num_chan);
num_chan = pref_chan_cnt;
csr_flush_cfg_bg_scan_roam_channel_list(chan_info);
csr_create_bg_scan_roam_channel_list(mac, chan_info, freq_list,
num_chan);
@ -7504,11 +7531,13 @@ QDF_STATUS sme_get_roam_scan_channel_list(mac_handle_t mac_handle,
uint32_t *freq_list, uint8_t *pNumChannels,
uint8_t sessionId)
{
int i = 0;
int i = 0, chan_cnt = 0;
struct mac_context *mac = MAC_CONTEXT(mac_handle);
tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
QDF_STATUS status = QDF_STATUS_SUCCESS;
tCsrChannelInfo *chan_info;
struct csr_channel *occupied_ch_lst =
&mac->scan.occupiedChannels[sessionId];
if (sessionId >= WLAN_MAX_VDEVS) {
QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
@ -7522,22 +7551,41 @@ QDF_STATUS sme_get_roam_scan_channel_list(mac_handle_t mac_handle,
return status;
chan_info = &pNeighborRoamInfo->cfgParams.specific_chan_info;
if (!chan_info->numOfChannels) {
if (chan_info->numOfChannels) {
*pNumChannels = chan_info->numOfChannels;
for (i = 0; i < (*pNumChannels) &&
i < WNI_CFG_VALID_CHANNEL_LIST_LEN; i++)
freq_list[i] = chan_info->freq_list[i];
*pNumChannels = i;
} else {
chan_info = &pNeighborRoamInfo->cfgParams.pref_chan_info;
if (!chan_info->numOfChannels) {
*pNumChannels = chan_info->numOfChannels;
if (chan_info->numOfChannels) {
for (chan_cnt = 0; chan_cnt < (*pNumChannels) &&
chan_cnt < WNI_CFG_VALID_CHANNEL_LIST_LEN;
chan_cnt++)
freq_list[chan_cnt] =
chan_info->freq_list[chan_cnt];
}
if (occupied_ch_lst->numChannels) {
for (i = 0; i < occupied_ch_lst->numChannels &&
chan_cnt < WNI_CFG_VALID_CHANNEL_LIST_LEN; i++)
freq_list[chan_cnt++] =
occupied_ch_lst->channel_freq_list[i];
}
*pNumChannels = chan_cnt;
if (!(chan_info->numOfChannels ||
occupied_ch_lst->numChannels)) {
sme_err("Roam Scan channel list is NOT yet initialized");
*pNumChannels = 0;
sme_release_global_lock(&mac->sme);
return status;
status = QDF_STATUS_E_INVAL;
}
}
*pNumChannels = chan_info->numOfChannels;
for (i = 0; i < (*pNumChannels); i++)
freq_list[i] = chan_info->freq_list[i];
freq_list[i] = '\0';
sme_release_global_lock(&mac->sme);
return status;
}