From 293c2d3bf676cecfec8fd7f4fe371972f9ed3451 Mon Sep 17 00:00:00 2001 From: Abhishek Ambure Date: Mon, 10 Feb 2020 06:26:47 +0530 Subject: [PATCH] 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 --- core/sme/src/common/sme_api.c | 68 +++++++++++++++++++++++++++++------ 1 file changed, 58 insertions(+), 10 deletions(-) diff --git a/core/sme/src/common/sme_api.c b/core/sme/src/common/sme_api.c index 332302d2d2cb..6806479db6c5 100644 --- a/core/sme/src/common/sme_api.c +++ b/core/sme/src/common/sme_api.c @@ -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; }