mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-23 21:19:04 -04:00
qcacld-3.0: Use new scan API to get scan results in ACS
ACS used old csr API's to get scan results, move it to use converged scan API. Change-Id: Ic62ac940bb6a5cc2eb3ea0e9888807ed74974d3a CRs-Fixed: 2450559
This commit is contained in:
parent
473f9afe2a
commit
d1cd4aed4f
3 changed files with 131 additions and 111 deletions
|
|
@ -49,6 +49,7 @@
|
|||
#include <wlan_objmgr_vdev_obj.h>
|
||||
#include <wlan_objmgr_pdev_obj.h>
|
||||
#include "wlan_reg_services_api.h"
|
||||
#include <wlan_scan_ucfg_api.h>
|
||||
#include <wlan_scan_utils_api.h>
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
|
|
@ -175,17 +176,81 @@ static const char *acs_scan_done_status_str(eCsrScanStatus status)
|
|||
}
|
||||
}
|
||||
|
||||
#ifdef FEATURE_WLAN_AP_AP_ACS_OPTIMIZE
|
||||
static void wlansap_send_acs_success_event(struct sap_context *sap_ctx,
|
||||
uint32_t scan_id)
|
||||
{
|
||||
if (scan_id) {
|
||||
QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_DEBUG,
|
||||
FL("Sending ACS Scan skip event"));
|
||||
sap_signal_hdd_event(sap_ctx, NULL,
|
||||
eSAP_ACS_SCAN_SUCCESS_EVENT,
|
||||
(void *)eSAP_STATUS_SUCCESS);
|
||||
} else {
|
||||
QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_DEBUG,
|
||||
FL("ACS scanid: %d (skipped ACS SCAN)"),
|
||||
scan_id);
|
||||
}
|
||||
}
|
||||
#else
|
||||
static inline void wlansap_send_acs_success_event(struct sap_context *sap_ctx,
|
||||
uint32_t scan_id)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
static uint8_t
|
||||
wlansap_calculate_chan_from_scan_result(mac_handle_t mac_handle,
|
||||
struct sap_context *sap_ctx,
|
||||
uint32_t scan_id)
|
||||
{
|
||||
struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
|
||||
qdf_list_t *list = NULL;
|
||||
struct scan_filter *filter;
|
||||
uint8_t oper_channel = SAP_CHANNEL_NOT_SELECTED;
|
||||
|
||||
filter = qdf_mem_malloc(sizeof(*filter));
|
||||
|
||||
if (filter)
|
||||
filter->age_threshold = qdf_get_time_of_the_day_ms() -
|
||||
sap_ctx->acs_req_timestamp;
|
||||
|
||||
list = ucfg_scan_get_result(mac_ctx->pdev, filter);
|
||||
|
||||
if (filter)
|
||||
qdf_mem_free(filter);
|
||||
|
||||
if (list)
|
||||
QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_DEBUG,
|
||||
FL("num_entries %d"), qdf_list_size(list));
|
||||
if (!list || (list && !qdf_list_size(list))) {
|
||||
sme_err("get scan result failed");
|
||||
QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
|
||||
FL("Failed to get scan results"));
|
||||
if (list)
|
||||
ucfg_scan_purge_results(list);
|
||||
/*
|
||||
* No scan results So, set the operation channel not selected
|
||||
* to allow the default channel to be set when reporting to HDD
|
||||
*/
|
||||
return oper_channel;
|
||||
}
|
||||
|
||||
wlansap_send_acs_success_event(sap_ctx, scan_id);
|
||||
|
||||
oper_channel = sap_select_channel(mac_handle, sap_ctx, list);
|
||||
ucfg_scan_purge_results(list);
|
||||
|
||||
return oper_channel;
|
||||
}
|
||||
|
||||
QDF_STATUS wlansap_pre_start_bss_acs_scan_callback(mac_handle_t mac_handle,
|
||||
struct sap_context *sap_ctx,
|
||||
uint8_t sessionid,
|
||||
uint32_t scanid,
|
||||
eCsrScanStatus scan_status)
|
||||
{
|
||||
tScanResultHandle presult = NULL;
|
||||
QDF_STATUS scan_get_result_status = QDF_STATUS_E_FAILURE;
|
||||
uint8_t oper_channel = 0;
|
||||
QDF_STATUS status = QDF_STATUS_E_FAILURE;
|
||||
tCsrScanResultFilter *filter;
|
||||
uint8_t oper_channel = SAP_CHANNEL_NOT_SELECTED;
|
||||
|
||||
host_log_acs_scan_done(acs_scan_done_status_str(scan_status),
|
||||
sessionid, scanid);
|
||||
|
|
@ -206,54 +271,8 @@ QDF_STATUS wlansap_pre_start_bss_acs_scan_callback(mac_handle_t mac_handle,
|
|||
QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
|
||||
FL("CSR scan_status = eCSR_SCAN_SUCCESS (%d)"), scan_status);
|
||||
|
||||
filter = qdf_mem_malloc(sizeof(tCsrScanResultFilter));
|
||||
if (!filter) {
|
||||
QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
|
||||
FL("Memory allocation for filter failed"));
|
||||
} else {
|
||||
filter->csrPersona = QDF_SAP_MODE;
|
||||
filter->age_threshold = qdf_get_time_of_the_day_ms() -
|
||||
sap_ctx->acs_req_timestamp;
|
||||
}
|
||||
/*
|
||||
* Now do
|
||||
* 1. Get scan results
|
||||
* 2. Run channel selection algorithm
|
||||
* select channel and store in sap_context->Channel
|
||||
*/
|
||||
scan_get_result_status = sme_scan_get_result(mac_handle,
|
||||
sap_ctx->sessionId,
|
||||
filter, &presult);
|
||||
if (filter)
|
||||
qdf_mem_free(filter);
|
||||
|
||||
if ((scan_get_result_status != QDF_STATUS_SUCCESS) &&
|
||||
(scan_get_result_status != QDF_STATUS_E_NULL_VALUE)) {
|
||||
/*
|
||||
* No scan results So, set the operation channel not selected
|
||||
* to allow the default channel to be set when reporting to HDD
|
||||
*/
|
||||
oper_channel = SAP_CHANNEL_NOT_SELECTED;
|
||||
QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
|
||||
FL("Get scan result failed! ret = %d"),
|
||||
scan_get_result_status);
|
||||
} else {
|
||||
#ifdef FEATURE_WLAN_AP_AP_ACS_OPTIMIZE
|
||||
if (scanid != 0) {
|
||||
QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
|
||||
FL("Sending ACS Scan skip event"));
|
||||
sap_signal_hdd_event(sap_ctx, NULL,
|
||||
eSAP_ACS_SCAN_SUCCESS_EVENT,
|
||||
(void *) eSAP_STATUS_SUCCESS);
|
||||
} else {
|
||||
QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
|
||||
FL("ACS scanid: %d (skipped ACS SCAN)"),
|
||||
scanid);
|
||||
}
|
||||
#endif
|
||||
oper_channel = sap_select_channel(mac_handle, sap_ctx, presult);
|
||||
sme_scan_result_purge(presult);
|
||||
}
|
||||
oper_channel = wlansap_calculate_chan_from_scan_result(mac_handle,
|
||||
sap_ctx, scanid);
|
||||
|
||||
if (oper_channel == SAP_CHANNEL_NOT_SELECTED) {
|
||||
QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO,
|
||||
|
|
@ -286,7 +305,8 @@ close_session:
|
|||
}
|
||||
#endif
|
||||
sap_hdd_signal_event_handler(sap_ctx);
|
||||
return status;
|
||||
|
||||
return QDF_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -48,6 +48,7 @@
|
|||
#include "cds_utils.h"
|
||||
#include "pld_common.h"
|
||||
#include "wlan_reg_services_api.h"
|
||||
#include <wlan_scan_utils_api.h>
|
||||
|
||||
/*--------------------------------------------------------------------------
|
||||
Function definitions
|
||||
|
|
@ -324,36 +325,39 @@ sap_check_n_add_overlapped_chnls(struct sap_context *sap_ctx,
|
|||
*/
|
||||
static void sap_process_avoid_ie(mac_handle_t mac_handle,
|
||||
struct sap_context *sap_ctx,
|
||||
tScanResultHandle scan_result,
|
||||
qdf_list_t *scan_list,
|
||||
tSapChSelSpectInfo *spect_info)
|
||||
{
|
||||
uint32_t total_ie_len = 0;
|
||||
const uint8_t *temp_ptr = NULL;
|
||||
uint8_t i = 0;
|
||||
struct sAvoidChannelIE *avoid_ch_ie;
|
||||
tCsrScanResultInfo *node = NULL;
|
||||
struct mac_context *mac_ctx = NULL;
|
||||
tSapSpectChInfo *spect_ch = NULL;
|
||||
qdf_list_node_t *cur_lst = NULL, *next_lst = NULL;
|
||||
struct scan_cache_node *cur_node = NULL;
|
||||
|
||||
mac_ctx = MAC_CONTEXT(mac_handle);
|
||||
spect_ch = spect_info->pSpectCh;
|
||||
node = sme_scan_result_get_first(mac_handle, scan_result);
|
||||
|
||||
while (node) {
|
||||
total_ie_len =
|
||||
GET_IE_LEN_IN_BSS(node->BssDescriptor.length);
|
||||
qdf_list_peek_front(scan_list, &cur_lst);
|
||||
while (cur_lst) {
|
||||
cur_node = qdf_container_of(cur_lst, struct scan_cache_node,
|
||||
node);
|
||||
|
||||
temp_ptr = wlan_get_vendor_ie_ptr_from_oui(
|
||||
SIR_MAC_QCOM_VENDOR_OUI,
|
||||
SIR_MAC_QCOM_VENDOR_SIZE,
|
||||
((uint8_t *)&node->BssDescriptor.ieFields),
|
||||
total_ie_len);
|
||||
util_scan_entry_ie_data(cur_node->entry),
|
||||
util_scan_entry_ie_len(cur_node->entry));
|
||||
|
||||
if (temp_ptr) {
|
||||
avoid_ch_ie = (struct sAvoidChannelIE *)temp_ptr;
|
||||
if (avoid_ch_ie->type !=
|
||||
QCOM_VENDOR_IE_MCC_AVOID_CH) {
|
||||
node = sme_scan_result_get_next(mac_handle,
|
||||
scan_result);
|
||||
qdf_list_peek_next(scan_list,
|
||||
cur_lst, &next_lst);
|
||||
cur_lst = next_lst;
|
||||
next_lst = NULL;
|
||||
continue;
|
||||
}
|
||||
|
||||
|
|
@ -386,7 +390,10 @@ static void sap_process_avoid_ie(mac_handle_t mac_handle,
|
|||
break;
|
||||
}
|
||||
} /* if (temp_ptr) */
|
||||
node = sme_scan_result_get_next(mac_handle, scan_result);
|
||||
|
||||
qdf_list_peek_next(scan_list, cur_lst, &next_lst);
|
||||
cur_lst = next_lst;
|
||||
next_lst = NULL;
|
||||
}
|
||||
}
|
||||
#endif /* FEATURE_AP_MCC_CH_AVOIDANCE */
|
||||
|
|
@ -1511,13 +1518,12 @@ static bool ch_in_pcl(struct sap_context *sap_ctx, uint8_t channel)
|
|||
*/
|
||||
static void sap_compute_spect_weight(tSapChSelSpectInfo *pSpectInfoParams,
|
||||
mac_handle_t mac_handle,
|
||||
tScanResultHandle pResult,
|
||||
qdf_list_t *scan_list,
|
||||
struct sap_context *sap_ctx)
|
||||
{
|
||||
int8_t rssi = 0;
|
||||
uint8_t chn_num = 0;
|
||||
uint8_t channel_id = 0;
|
||||
tCsrScanResultInfo *scan_result;
|
||||
tSapSpectChInfo *pSpectCh = pSpectInfoParams->pSpectCh;
|
||||
uint32_t operatingBand;
|
||||
uint16_t channelWidth;
|
||||
|
|
@ -1527,15 +1533,16 @@ static void sap_compute_spect_weight(tSapChSelSpectInfo *pSpectInfoParams,
|
|||
bool found;
|
||||
uint16_t centerFreq_2 = 0;
|
||||
uint16_t vhtSupport;
|
||||
uint32_t ieLen = 0;
|
||||
tSirProbeRespBeacon *pBeaconStruct;
|
||||
tSirProbeRespBeacon *bcn_struct;
|
||||
struct mac_context *mac = MAC_CONTEXT(mac_handle);
|
||||
tSapSpectChInfo *spectch_start = pSpectInfoParams->pSpectCh;
|
||||
tSapSpectChInfo *spectch_end = pSpectInfoParams->pSpectCh +
|
||||
pSpectInfoParams->numSpectChans;
|
||||
qdf_list_node_t *cur_lst = NULL, *next_lst = NULL;
|
||||
struct scan_cache_node *cur_node = NULL;
|
||||
|
||||
pBeaconStruct = qdf_mem_malloc(sizeof(tSirProbeRespBeacon));
|
||||
if (!pBeaconStruct)
|
||||
bcn_struct = qdf_mem_malloc(sizeof(tSirProbeRespBeacon));
|
||||
if (!bcn_struct)
|
||||
return;
|
||||
|
||||
QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
|
||||
|
|
@ -1546,9 +1553,13 @@ static void sap_compute_spect_weight(tSapChSelSpectInfo *pSpectInfoParams,
|
|||
*/
|
||||
SET_ACS_BAND(operatingBand, sap_ctx);
|
||||
|
||||
scan_result = sme_scan_result_get_first(mac_handle, pResult);
|
||||
qdf_list_peek_front(scan_list, &cur_lst);
|
||||
while (cur_lst) {
|
||||
uint32_t ie_len = 0;
|
||||
uint8_t *ie_ptr;
|
||||
|
||||
while (scan_result) {
|
||||
cur_node = qdf_container_of(cur_lst, struct scan_cache_node,
|
||||
node);
|
||||
pSpectCh = pSpectInfoParams->pSpectCh;
|
||||
/* Defining the default values, so that any value will hold the default values */
|
||||
channelWidth = eHT_CHANNEL_WIDTH_20MHZ;
|
||||
|
|
@ -1556,19 +1567,15 @@ static void sap_compute_spect_weight(tSapChSelSpectInfo *pSpectInfoParams,
|
|||
vhtSupport = 0;
|
||||
centerFreq = 0;
|
||||
|
||||
ie_len = util_scan_entry_ie_len(cur_node->entry);
|
||||
ie_ptr = util_scan_entry_ie_data(cur_node->entry);
|
||||
qdf_mem_zero((uint8_t *)bcn_struct,
|
||||
sizeof(tSirProbeRespBeacon));
|
||||
|
||||
ieLen = GET_IE_LEN_IN_BSS(
|
||||
scan_result->BssDescriptor.length);
|
||||
qdf_mem_zero((uint8_t *) pBeaconStruct,
|
||||
sizeof(tSirProbeRespBeacon));
|
||||
|
||||
|
||||
if ((sir_parse_beacon_ie
|
||||
(mac, pBeaconStruct, (uint8_t *)
|
||||
(scan_result->BssDescriptor.ieFields),
|
||||
ieLen)) == QDF_STATUS_SUCCESS)
|
||||
if ((sir_parse_beacon_ie(mac, bcn_struct, ie_ptr, ie_len)) ==
|
||||
QDF_STATUS_SUCCESS)
|
||||
sap_upd_chan_spec_params(
|
||||
pBeaconStruct,
|
||||
bcn_struct,
|
||||
&channelWidth,
|
||||
&secondaryChannelOffset,
|
||||
&vhtSupport, ¢erFreq,
|
||||
|
|
@ -1578,22 +1585,14 @@ static void sap_compute_spect_weight(tSapChSelSpectInfo *pSpectInfoParams,
|
|||
for (chn_num = 0; chn_num < pSpectInfoParams->numSpectChans;
|
||||
chn_num++) {
|
||||
|
||||
/*
|
||||
* If the Beacon has channel ID, use it other wise we
|
||||
* will rely on the channelIdSelf
|
||||
*/
|
||||
if (scan_result->BssDescriptor.channelId == 0)
|
||||
channel_id =
|
||||
scan_result->BssDescriptor.channelIdSelf;
|
||||
else
|
||||
channel_id =
|
||||
scan_result->BssDescriptor.channelId;
|
||||
channel_id =
|
||||
util_scan_entry_channel_num(cur_node->entry);
|
||||
|
||||
if (pSpectCh && (channel_id == pSpectCh->chNum)) {
|
||||
if (pSpectCh->rssiAgr <
|
||||
scan_result->BssDescriptor.rssi)
|
||||
cur_node->entry->rssi_raw)
|
||||
pSpectCh->rssiAgr =
|
||||
scan_result->BssDescriptor.rssi;
|
||||
cur_node->entry->rssi_raw;
|
||||
|
||||
++pSpectCh->bssCount; /* Increment the count of BSS */
|
||||
|
||||
|
|
@ -1639,13 +1638,11 @@ static void sap_compute_spect_weight(tSapChSelSpectInfo *pSpectInfoParams,
|
|||
|
||||
QDF_TRACE(QDF_MODULE_ID_SAP,
|
||||
QDF_TRACE_LEVEL_INFO_HIGH,
|
||||
"In %s, bssdes.ch_self=%d, bssdes.ch_ID=%d, bssdes.rssi=%d, SpectCh.bssCount=%d, scan_result=%pK, ChannelWidth %d, secondaryChanOffset %d, center frequency %d",
|
||||
"In %s, channel_id=%d, bssdes.rssi=%d, SpectCh.bssCount=%d, ChannelWidth %d, secondaryChanOffset %d, center frequency %d",
|
||||
__func__,
|
||||
scan_result->BssDescriptor.
|
||||
channelIdSelf,
|
||||
scan_result->BssDescriptor.channelId,
|
||||
scan_result->BssDescriptor.rssi,
|
||||
pSpectCh->bssCount, scan_result,
|
||||
channel_id,
|
||||
cur_node->entry->rssi_raw,
|
||||
pSpectCh->bssCount,
|
||||
pSpectCh->channelWidth,
|
||||
secondaryChannelOffset, centerFreq);
|
||||
pSpectCh++;
|
||||
|
|
@ -1655,9 +1652,13 @@ static void sap_compute_spect_weight(tSapChSelSpectInfo *pSpectInfoParams,
|
|||
}
|
||||
}
|
||||
|
||||
scan_result = sme_scan_result_get_next(mac_handle, pResult);
|
||||
qdf_list_peek_next(scan_list, cur_lst, &next_lst);
|
||||
cur_lst = next_lst;
|
||||
next_lst = NULL;
|
||||
}
|
||||
|
||||
qdf_mem_free(bcn_struct);
|
||||
|
||||
/* Calculate the weights for all channels in the spectrum pSpectCh */
|
||||
pSpectCh = pSpectInfoParams->pSpectCh;
|
||||
|
||||
|
|
@ -1734,7 +1735,6 @@ debug_info:
|
|||
pSpectCh++;
|
||||
}
|
||||
sap_clear_channel_status(mac);
|
||||
qdf_mem_free(pBeaconStruct);
|
||||
}
|
||||
|
||||
/*==========================================================================
|
||||
|
|
@ -2623,7 +2623,7 @@ static uint8_t sap_select_channel_no_scan_result(mac_handle_t mac_handle,
|
|||
|
||||
uint8_t sap_select_channel(mac_handle_t mac_handle,
|
||||
struct sap_context *sap_ctx,
|
||||
tScanResultHandle scan_result)
|
||||
qdf_list_t *scan_list)
|
||||
{
|
||||
/* DFS param object holding all the data req by the algo */
|
||||
tSapChSelSpectInfo spect_info_obj = { NULL, 0 };
|
||||
|
|
@ -2649,7 +2649,7 @@ uint8_t sap_select_channel(mac_handle_t mac_handle,
|
|||
* If ACS weight is not enabled on noise_floor/channel_free/tx_power,
|
||||
* then skip acs process if no bss found.
|
||||
*/
|
||||
if (!scan_result &&
|
||||
if (!scan_list &&
|
||||
!(sap_ctx->auto_channel_select_weight & 0xffff00)) {
|
||||
QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
|
||||
FL("No external AP present"));
|
||||
|
|
@ -2668,11 +2668,11 @@ uint8_t sap_select_channel(mac_handle_t mac_handle,
|
|||
return SAP_CHANNEL_NOT_SELECTED;
|
||||
}
|
||||
/* Compute the weight of the entire spectrum in the operating band */
|
||||
sap_compute_spect_weight(spect_info, mac_handle, scan_result, sap_ctx);
|
||||
sap_compute_spect_weight(spect_info, mac_handle, scan_list, sap_ctx);
|
||||
|
||||
#ifdef FEATURE_AP_MCC_CH_AVOIDANCE
|
||||
/* process avoid channel IE to collect all channels to avoid */
|
||||
sap_process_avoid_ie(mac_handle, sap_ctx, scan_result, spect_info);
|
||||
sap_process_avoid_ie(mac_handle, sap_ctx, scan_list, spect_info);
|
||||
#endif /* FEATURE_AP_MCC_CH_AVOIDANCE */
|
||||
|
||||
wlan_reg_read_current_country(mac_ctx->psoc, country);
|
||||
|
|
|
|||
|
|
@ -285,7 +285,7 @@ QDF_STATUS wlansap_pre_start_bss_acs_scan_callback(mac_handle_t mac_handle,
|
|||
* sap_select_channel() - select SAP channel
|
||||
* @mac_handle: Opaque handle to the global MAC context
|
||||
* @sap_ctx: Sap context
|
||||
* @scan_result: Handle to scan results
|
||||
* @scan_list: scan entry list
|
||||
*
|
||||
* Runs a algorithm to select the best channel to operate in based on BSS
|
||||
* rssi and bss count on each channel
|
||||
|
|
@ -293,7 +293,7 @@ QDF_STATUS wlansap_pre_start_bss_acs_scan_callback(mac_handle_t mac_handle,
|
|||
* Returns: channel number if success, 0 otherwise
|
||||
*/
|
||||
uint8_t sap_select_channel(mac_handle_t mac_handle, struct sap_context *sap_ctx,
|
||||
tScanResultHandle scan_result);
|
||||
qdf_list_t *scan_list);
|
||||
|
||||
QDF_STATUS
|
||||
sap_signal_hdd_event(struct sap_context *sap_ctx,
|
||||
|
|
|
|||
Loading…
Reference in a new issue