|
@@ -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;
|
|
|
}
|
|
|
|