summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSrinivas Girigowda <sgirigow@qca.qualcomm.com>2016-02-11 17:12:55 -0800
committerAnjaneedevi Kapparapu <akappa@codeaurora.org>2016-02-22 12:19:15 +0530
commitc24b369acc31d5ea863fde8c2d514a586af476ff (patch)
tree00e0dd389b653ad8a43f6f07663c4c4bcf043639
parentda91487026730764b37760cf09b73c32cb6d9cff (diff)
qcacld: Move scan_results_available from bucket complete to cycle complete
Currently extscan_results_available event is posted to user space after a bucket scan is completed. If the extscan start request is configured for multiple buckets, then the user space application tries to fetch cached results on every extscan_results available. If the get_cached_results is issued with flush=1, then every get_cached_results will have 0 scan results and since flush=1 is set, due to a bug in firmware even the temporary scan cache is flushed, there by we miss reporting the APs found in the previous bucket scans and only the last get_cached_results will report the APs found in the last bucket scan. Whereas the expectation is get_cached_results must report all the APs found in the complete scan cycle. The proposed fix is in both firmware and host: 1. Firmware to ignore get_cached_results flush=1 and not to flush the temporary scan cache in the middle of extscan cycle. 2. Host to consume bucket_started event within host driver and map extscan_results_available with cycle_complete instead of bucket_complete. Change-Id: I399204261fa3d8515146c590630a3bb663ee801c CRs-Fixed: 975402
-rw-r--r--CORE/HDD/src/wlan_hdd_cfg80211.c106
-rw-r--r--CORE/MAC/inc/sirApi.h48
-rw-r--r--CORE/SERVICES/WMA/wma.c13
3 files changed, 85 insertions, 82 deletions
diff --git a/CORE/HDD/src/wlan_hdd_cfg80211.c b/CORE/HDD/src/wlan_hdd_cfg80211.c
index ab18e664cf76..c7c493fc1bec 100644
--- a/CORE/HDD/src/wlan_hdd_cfg80211.c
+++ b/CORE/HDD/src/wlan_hdd_cfg80211.c
@@ -23990,68 +23990,72 @@ nla_put_failure:
*/
static void
wlan_hdd_cfg80211_extscan_scan_progress_event(void *ctx,
- tpSirExtScanOnScanEventIndParams pData)
+ tpSirExtScanOnScanEventIndParams data)
{
- hdd_context_t *pHddCtx = (hdd_context_t *)ctx;
- struct sk_buff *skb = NULL;
- int flags = vos_get_gfp_flags();
- struct hdd_ext_scan_context *context;
+ hdd_context_t *pHddCtx = ctx;
+ struct sk_buff *skb;
+ int flags = vos_get_gfp_flags();
+ struct hdd_ext_scan_context *context;
- ENTER();
+ ENTER();
- if (wlan_hdd_validate_context(pHddCtx))
- return;
- if (!pData) {
- hddLog(VOS_TRACE_LEVEL_ERROR, FL("pData is null"));
- return;
- }
+ if (wlan_hdd_validate_context(pHddCtx))
+ return;
- hddLog(LOG1, "Request Id: %u ScanEventType: %u ScanEventStatus: %u buckets_scanned: %u",
- pData->requestId, pData->scanEventType, pData->status,
- pData->buckets_scanned);
+ if (!data) {
+ hddLog(LOGE, FL("data is null"));
+ EXIT();
+ return;
+ }
- spin_lock(&hdd_context_lock);
- context = &pHddCtx->ext_scan_context;
- if (pData->scanEventType == WIFI_EXTSCAN_CYCLE_COMPLETED_EVENT) {
- context->buckets_scanned = 0;
- /* No need to report to user space */
- spin_unlock(&hdd_context_lock);
- return;
- } else if (pData->scanEventType == WIFI_EXTSCAN_CYCLE_STARTED_EVENT) {
- context->buckets_scanned = pData->buckets_scanned;
- /* No need to report to user space */
- spin_unlock(&hdd_context_lock);
- return;
- } else {
- spin_unlock(&hdd_context_lock);
- }
+ hddLog(LOG1, "Request Id: %u ScanEventType: %u ScanEventStatus: %u buckets_scanned: %u",
+ data->requestId, data->scanEventType, data->status,
+ data->buckets_scanned);
- skb = cfg80211_vendor_event_alloc(pHddCtx->wiphy,
- NULL,
- EXTSCAN_EVENT_BUF_SIZE + NLMSG_HDRLEN,
- QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_SCAN_EVENT_INDEX,
- flags);
+ spin_lock(&hdd_context_lock);
+ context = &pHddCtx->ext_scan_context;
+ if (data->scanEventType == WIFI_EXTSCAN_CYCLE_COMPLETED_EVENT) {
+ context->buckets_scanned = 0;
+ data->scanEventType = WIFI_EXTSCAN_RESULTS_AVAILABLE;
+ spin_unlock(&hdd_context_lock);
+ } else if (data->scanEventType == WIFI_EXTSCAN_CYCLE_STARTED_EVENT) {
+ context->buckets_scanned = data->buckets_scanned;
+ /* No need to report to user space */
+ spin_unlock(&hdd_context_lock);
+ EXIT();
+ return;
+ } else {
+ spin_unlock(&hdd_context_lock);
+ }
- if (!skb) {
- hddLog(LOGE, FL("cfg80211_vendor_event_alloc failed"));
- return;
- }
+ skb = cfg80211_vendor_event_alloc(pHddCtx->wiphy,
+ NULL,
+ EXTSCAN_EVENT_BUF_SIZE + NLMSG_HDRLEN,
+ QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_SCAN_EVENT_INDEX,
+ flags);
- if (nla_put_u32(skb, QCA_WLAN_VENDOR_ATTR_EXTSCAN_RESULTS_REQUEST_ID,
- pData->requestId) ||
- nla_put_u8(skb, QCA_WLAN_VENDOR_ATTR_EXTSCAN_RESULTS_SCAN_EVENT_TYPE,
- pData->scanEventType)) {
- hddLog(LOGE, FL("nla put fail"));
- goto nla_put_failure;
- }
+ if (!skb) {
+ hddLog(LOGE, FL("cfg80211_vendor_event_alloc failed"));
+ EXIT();
+ return;
+ }
- cfg80211_vendor_event(skb, flags);
- EXIT();
- return;
+ if (nla_put_u32(skb, QCA_WLAN_VENDOR_ATTR_EXTSCAN_RESULTS_REQUEST_ID,
+ data->requestId) ||
+ nla_put_u8(skb, QCA_WLAN_VENDOR_ATTR_EXTSCAN_RESULTS_SCAN_EVENT_TYPE,
+ data->scanEventType)) {
+ hddLog(LOGE, FL("nla put fail"));
+ goto nla_put_failure;
+ }
+
+ cfg80211_vendor_event(skb, flags);
+ EXIT();
+ return;
nla_put_failure:
- kfree_skb(skb);
- return;
+ kfree_skb(skb);
+ EXIT();
+ return;
}
/**
diff --git a/CORE/MAC/inc/sirApi.h b/CORE/MAC/inc/sirApi.h
index 5735c08de753..19cf982b7523 100644
--- a/CORE/MAC/inc/sirApi.h
+++ b/CORE/MAC/inc/sirApi.h
@@ -5008,39 +5008,39 @@ typedef enum
WIFI_BAND_MAX
} tWifiBand;
-/* wifi scan related events */
-typedef enum
+/**
+ * enum wifi_extscan_event_type - extscan event type
+ * @WIFI_EXTSCAN_RESULTS_AVAILABLE: reported when REPORT_EVENTS_EACH_SCAN is set
+ * and a scan cycle completes. WIFI_SCAN_THRESHOLD_NUM_SCANS or
+ * WIFI_SCAN_THRESHOLD_PERCENT can be reported instead if the
+ * reason for the event is available; however, at most one of
+ * these events should be reported per scan.
+ * @WIFI_EXTSCAN_THRESHOLD_NUM_SCANS: can be reported when
+ * REPORT_EVENTS_EACH_SCAN is not set and
+ * report_threshold_num_scans is reached.
+ * @WIFI_EXTSCAN_THRESHOLD_PERCENT: can be reported when REPORT_EVENTS_EACH_SCAN
+ * is not set and report_threshold_percent is reached.
+ * @WIFI_SCAN_DISABLED: reported when currently executing gscans are disabled
+ * start_gscan will need to be called again in order to continue
+ * scanning.
+ * @WIFI_EXTSCAN_BUCKET_STARTED_EVENT: Bucket started event
+ * This event is consumed in driver only.
+ * @WIFI_EXTSCAN_CYCLE_STARTED_EVENT: Cycle started event.
+ * This event is consumed in driver only.
+ * @WIFI_EXTSCAN_CYCLE_COMPLETED_EVENT: Cycle complete event. This event
+ * triggers @WIFI_EXTSCAN_RESULTS_AVAILABLE to the user space.
+ */
+enum wifi_extscan_event_type
{
- /*
- * reported when REPORT_EVENTS_EACH_SCAN is set and a scan
- * completes. WIFI_SCAN_THRESHOLD_NUM_SCANS or
- * WIFI_SCAN_THRESHOLD_PERCENT can be reported instead if the
- * reason for the event is available; however, at most one of
- * these events should be reported per scan.
- */
WIFI_EXTSCAN_RESULTS_AVAILABLE,
- /*
- * can be reported when REPORT_EVENTS_EACH_SCAN is not set and
- * report_threshold_num_scans is reached.
- */
WIFI_EXTSCAN_THRESHOLD_NUM_SCANS,
- /*
- * can be reported when REPORT_EVENTS_EACH_SCAN is not set and
- * report_threshold_percent is reached
- */
WIFI_EXTSCAN_THRESHOLD_PERCENT,
- /*
- * reported when currently executing gscans are disabled
- * start_gscan will need to be called again in order to continue
- * scanning
- */
WIFI_SCAN_DISABLED,
- /* Below events are consumed in driver only */
WIFI_EXTSCAN_BUCKET_STARTED_EVENT = 0x10,
WIFI_EXTSCAN_CYCLE_STARTED_EVENT,
WIFI_EXTSCAN_CYCLE_COMPLETED_EVENT,
-} tWifiScanEventType;
+};
/**
* enum extscan_configuration_flags - extscan config flags
diff --git a/CORE/SERVICES/WMA/wma.c b/CORE/SERVICES/WMA/wma.c
index 4a812be6fd1e..b27d884567a5 100644
--- a/CORE/SERVICES/WMA/wma.c
+++ b/CORE/SERVICES/WMA/wma.c
@@ -3506,9 +3506,8 @@ static int wma_extscan_operations_ind_handler(tp_wma_handle wma, uint8_t *buf)
case WMI_EXTSCAN_BUCKET_COMPLETED_EVENT:
WMA_LOGD("%s: received WMI_EXTSCAN_BUCKET_COMPLETED_EVENT",
__func__);
- oprn_ind->scanEventType = WIFI_EXTSCAN_RESULTS_AVAILABLE;
oprn_ind->status = 0;
- break;
+ goto exit_handler;
case WMI_EXTSCAN_CYCLE_STARTED_EVENT:
WMA_LOGD("%s: received WMI_EXTSCAN_CYCLE_STARTED_EVENT",
__func__);
@@ -3530,19 +3529,19 @@ static int wma_extscan_operations_ind_handler(tp_wma_handle wma, uint8_t *buf)
oprn_ind->buckets_scanned = 0;
break;
case WMI_EXTSCAN_BUCKET_STARTED_EVENT:
- WMA_LOGD("%s: received WIFI_EXTSCAN_BUCKET_STARTED_EVENT",
+ WMA_LOGD("%s: received WMI_EXTSCAN_BUCKET_STARTED_EVENT",
__func__);
oprn_ind->scanEventType = WIFI_EXTSCAN_BUCKET_STARTED_EVENT;
oprn_ind->status = 0;
goto exit_handler;
case WMI_EXTSCAN_THRESHOLD_NUM_SCANS:
- WMA_LOGD("%s: received WIFI_EXTSCAN_THRESHOLD_NUM_SCANS",
+ WMA_LOGD("%s: received WMI_EXTSCAN_THRESHOLD_NUM_SCANS",
__func__);
oprn_ind->scanEventType = WIFI_EXTSCAN_THRESHOLD_NUM_SCANS;
oprn_ind->status = 0;
break;
case WMI_EXTSCAN_THRESHOLD_PERCENT:
- WMA_LOGD("%s: received WIFI_EXTSCAN_THRESHOLD_PERCENT",
+ WMA_LOGD("%s: received WMI_EXTSCAN_THRESHOLD_PERCENT",
__func__);
oprn_ind->scanEventType = WIFI_EXTSCAN_THRESHOLD_PERCENT;
oprn_ind->status = 0;
@@ -25851,14 +25850,14 @@ static VOS_STATUS wma_process_ll_stats_getReq
if (src_bucket->reportEvents & EXTSCAN_REPORT_EVENTS_EACH_SCAN)
dest_blist->notify_extscan_events =
- WMI_EXTSCAN_BUCKET_COMPLETED_EVENT;
+ WMI_EXTSCAN_CYCLE_COMPLETED_EVENT |
+ WMI_EXTSCAN_CYCLE_STARTED_EVENT;
if (src_bucket->reportEvents &
EXTSCAN_REPORT_EVENTS_FULL_RESULTS) {
dest_blist->forwarding_flags =
WMI_EXTSCAN_FORWARD_FRAME_TO_HOST;
dest_blist->notify_extscan_events |=
- WMI_EXTSCAN_BUCKET_COMPLETED_EVENT |
WMI_EXTSCAN_CYCLE_STARTED_EVENT |
WMI_EXTSCAN_CYCLE_COMPLETED_EVENT;
} else {