|
@@ -6154,6 +6154,8 @@ QDF_STATUS sme_set_roam_scan_control(mac_handle_t mac_handle, uint8_t sessionId,
|
|
{
|
|
{
|
|
struct mac_context *mac = MAC_CONTEXT(mac_handle);
|
|
struct mac_context *mac = MAC_CONTEXT(mac_handle);
|
|
QDF_STATUS status = QDF_STATUS_SUCCESS;
|
|
QDF_STATUS status = QDF_STATUS_SUCCESS;
|
|
|
|
+ tCsrChannelInfo *specific_channel_info;
|
|
|
|
+ tCsrNeighborRoamControlInfo *neighbor_roam_info;
|
|
|
|
|
|
MTRACE(qdf_trace(QDF_MODULE_ID_SME,
|
|
MTRACE(qdf_trace(QDF_MODULE_ID_SME,
|
|
TRACE_CODE_SME_RX_HDD_SET_SCANCTRL, NO_SESSION, 0));
|
|
TRACE_CODE_SME_RX_HDD_SET_SCANCTRL, NO_SESSION, 0));
|
|
@@ -6165,29 +6167,33 @@ QDF_STATUS sme_set_roam_scan_control(mac_handle_t mac_handle, uint8_t sessionId,
|
|
}
|
|
}
|
|
|
|
|
|
status = sme_acquire_global_lock(&mac->sme);
|
|
status = sme_acquire_global_lock(&mac->sme);
|
|
- if (QDF_IS_STATUS_SUCCESS(status)) {
|
|
|
|
- QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
|
|
|
|
- "LFR runtime successfully set roam scan control to %d - old value is %d - roam state is %s",
|
|
|
|
- roamScanControl,
|
|
|
|
- mac->roam.configParam.nRoamScanControl,
|
|
|
|
- mac_trace_get_neighbour_roam_state(mac->roam.
|
|
|
|
- neighborRoamInfo
|
|
|
|
- [sessionId].
|
|
|
|
- neighborRoamState));
|
|
|
|
- mac->roam.configParam.nRoamScanControl = roamScanControl;
|
|
|
|
- if (0 == roamScanControl) {
|
|
|
|
- QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
|
|
|
|
- "LFR runtime successfully cleared roam scan cache");
|
|
|
|
- csr_flush_cfg_bg_scan_roam_channel_list(mac,
|
|
|
|
- sessionId);
|
|
|
|
- if (mac->mlme_cfg->lfr.roam_scan_offload_enabled) {
|
|
|
|
- csr_roam_offload_scan(mac, sessionId,
|
|
|
|
- ROAM_SCAN_OFFLOAD_UPDATE_CFG,
|
|
|
|
- REASON_FLUSH_CHANNEL_LIST);
|
|
|
|
- }
|
|
|
|
|
|
+ if (QDF_IS_STATUS_ERROR(status))
|
|
|
|
+ return status;
|
|
|
|
+ neighbor_roam_info = &mac->roam.neighborRoamInfo[sessionId];
|
|
|
|
+ sme_debug("LFR runtime successfully set roam scan control to %d - old value is %d - roam state is %s",
|
|
|
|
+ roamScanControl,
|
|
|
|
+ mac->roam.configParam.nRoamScanControl,
|
|
|
|
+ mac_trace_get_neighbour_roam_state(
|
|
|
|
+ neighbor_roam_info->neighborRoamState));
|
|
|
|
+ if (!roamScanControl && mac->roam.configParam.nRoamScanControl) {
|
|
|
|
+ /**
|
|
|
|
+ * Clear the specific channel info cache when roamScanControl
|
|
|
|
+ * is set to 0. If any preffered channel list is configured,
|
|
|
|
+ * that will be sent to firmware for further roam scans.
|
|
|
|
+ */
|
|
|
|
+ sme_debug("LFR runtime successfully cleared roam scan cache");
|
|
|
|
+ specific_channel_info =
|
|
|
|
+ &neighbor_roam_info->cfgParams.specific_chan_info;
|
|
|
|
+ csr_flush_cfg_bg_scan_roam_channel_list(specific_channel_info);
|
|
|
|
+ if (mac->mlme_cfg->lfr.roam_scan_offload_enabled) {
|
|
|
|
+ csr_roam_offload_scan(mac, sessionId,
|
|
|
|
+ ROAM_SCAN_OFFLOAD_UPDATE_CFG,
|
|
|
|
+ REASON_FLUSH_CHANNEL_LIST);
|
|
}
|
|
}
|
|
- sme_release_global_lock(&mac->sme);
|
|
|
|
}
|
|
}
|
|
|
|
+ mac->roam.configParam.nRoamScanControl = roamScanControl;
|
|
|
|
+ sme_release_global_lock(&mac->sme);
|
|
|
|
+
|
|
return status;
|
|
return status;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -7166,7 +7172,7 @@ uint8_t sme_get_roam_rssi_diff(mac_handle_t mac_handle)
|
|
* sme_change_roam_scan_channel_list() - to change scan channel list
|
|
* sme_change_roam_scan_channel_list() - to change scan channel list
|
|
* @mac_handle: Opaque handle to the global MAC context
|
|
* @mac_handle: Opaque handle to the global MAC context
|
|
* @sessionId: sme session id
|
|
* @sessionId: sme session id
|
|
- * @pChannelList: Output channel list
|
|
|
|
|
|
+ * @channel_list: Output channel list
|
|
* @numChannels: Output number of channels
|
|
* @numChannels: Output number of channels
|
|
*
|
|
*
|
|
* This routine is called to Change roam scan channel list.
|
|
* This routine is called to Change roam scan channel list.
|
|
@@ -7176,7 +7182,7 @@ uint8_t sme_get_roam_rssi_diff(mac_handle_t mac_handle)
|
|
*/
|
|
*/
|
|
QDF_STATUS sme_change_roam_scan_channel_list(mac_handle_t mac_handle,
|
|
QDF_STATUS sme_change_roam_scan_channel_list(mac_handle_t mac_handle,
|
|
uint8_t sessionId,
|
|
uint8_t sessionId,
|
|
- uint8_t *pChannelList,
|
|
|
|
|
|
+ uint8_t *channel_list,
|
|
uint8_t numChannels)
|
|
uint8_t numChannels)
|
|
{
|
|
{
|
|
struct mac_context *mac = MAC_CONTEXT(mac_handle);
|
|
struct mac_context *mac = MAC_CONTEXT(mac_handle);
|
|
@@ -7199,7 +7205,7 @@ QDF_STATUS sme_change_roam_scan_channel_list(mac_handle_t mac_handle,
|
|
sme_err("Failed to acquire SME lock");
|
|
sme_err("Failed to acquire SME lock");
|
|
return status;
|
|
return status;
|
|
}
|
|
}
|
|
- chan_info = &pNeighborRoamInfo->cfgParams.channelInfo;
|
|
|
|
|
|
+ chan_info = &pNeighborRoamInfo->cfgParams.specific_chan_info;
|
|
|
|
|
|
if (chan_info->freq_list) {
|
|
if (chan_info->freq_list) {
|
|
for (i = 0; i < chan_info->numOfChannels; i++) {
|
|
for (i = 0; i < chan_info->numOfChannels; i++) {
|
|
@@ -7212,9 +7218,9 @@ QDF_STATUS sme_change_roam_scan_channel_list(mac_handle_t mac_handle,
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- csr_flush_cfg_bg_scan_roam_channel_list(mac, sessionId);
|
|
|
|
- csr_create_bg_scan_roam_channel_list(mac, sessionId, pChannelList,
|
|
|
|
- numChannels);
|
|
|
|
|
|
+ csr_flush_cfg_bg_scan_roam_channel_list(chan_info);
|
|
|
|
+ csr_create_bg_scan_roam_channel_list(mac, chan_info, channel_list,
|
|
|
|
+ numChannels);
|
|
sme_set_roam_scan_control(mac_handle, sessionId, 1);
|
|
sme_set_roam_scan_control(mac_handle, sessionId, 1);
|
|
if (chan_info->freq_list) {
|
|
if (chan_info->freq_list) {
|
|
j = 0;
|
|
j = 0;
|
|
@@ -7261,6 +7267,7 @@ QDF_STATUS sme_get_roam_scan_channel_list(mac_handle_t mac_handle,
|
|
struct mac_context *mac = MAC_CONTEXT(mac_handle);
|
|
struct mac_context *mac = MAC_CONTEXT(mac_handle);
|
|
tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
|
|
tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
|
|
QDF_STATUS status = QDF_STATUS_SUCCESS;
|
|
QDF_STATUS status = QDF_STATUS_SUCCESS;
|
|
|
|
+ tCsrChannelInfo *specific_chan_info;
|
|
|
|
|
|
if (sessionId >= WLAN_MAX_VDEVS) {
|
|
if (sessionId >= WLAN_MAX_VDEVS) {
|
|
QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
|
|
QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
|
|
@@ -7272,7 +7279,8 @@ QDF_STATUS sme_get_roam_scan_channel_list(mac_handle_t mac_handle,
|
|
status = sme_acquire_global_lock(&mac->sme);
|
|
status = sme_acquire_global_lock(&mac->sme);
|
|
if (!QDF_IS_STATUS_SUCCESS(status))
|
|
if (!QDF_IS_STATUS_SUCCESS(status))
|
|
return status;
|
|
return status;
|
|
- if (!pNeighborRoamInfo->cfgParams.channelInfo.freq_list) {
|
|
|
|
|
|
+ specific_chan_info = &pNeighborRoamInfo->cfgParams.specific_chan_info;
|
|
|
|
+ if (!specific_chan_info->freq_list) {
|
|
QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_WARN,
|
|
QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_WARN,
|
|
FL("Roam Scan channel list is NOT yet initialized"));
|
|
FL("Roam Scan channel list is NOT yet initialized"));
|
|
*pNumChannels = 0;
|
|
*pNumChannels = 0;
|
|
@@ -7280,12 +7288,12 @@ QDF_STATUS sme_get_roam_scan_channel_list(mac_handle_t mac_handle,
|
|
return status;
|
|
return status;
|
|
}
|
|
}
|
|
|
|
|
|
- *pNumChannels = pNeighborRoamInfo->cfgParams.channelInfo.numOfChannels;
|
|
|
|
|
|
+ *pNumChannels = specific_chan_info->numOfChannels;
|
|
for (i = 0; i < (*pNumChannels); i++)
|
|
for (i = 0; i < (*pNumChannels); i++)
|
|
pOutPtr[i] =
|
|
pOutPtr[i] =
|
|
wlan_reg_freq_to_chan(
|
|
wlan_reg_freq_to_chan(
|
|
mac->pdev,
|
|
mac->pdev,
|
|
- pNeighborRoamInfo->cfgParams.channelInfo.freq_list[i]);
|
|
|
|
|
|
+ specific_chan_info->freq_list[i]);
|
|
|
|
|
|
pOutPtr[i] = '\0';
|
|
pOutPtr[i] = '\0';
|
|
sme_release_global_lock(&mac->sme);
|
|
sme_release_global_lock(&mac->sme);
|