diff options
| author | Srinivas Girigowda <sgirigow@qca.qualcomm.com> | 2016-02-11 17:12:55 -0800 |
|---|---|---|
| committer | Anjaneedevi Kapparapu <akappa@codeaurora.org> | 2016-02-22 12:19:15 +0530 |
| commit | c24b369acc31d5ea863fde8c2d514a586af476ff (patch) | |
| tree | 00e0dd389b653ad8a43f6f07663c4c4bcf043639 | |
| parent | da91487026730764b37760cf09b73c32cb6d9cff (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.c | 106 | ||||
| -rw-r--r-- | CORE/MAC/inc/sirApi.h | 48 | ||||
| -rw-r--r-- | CORE/SERVICES/WMA/wma.c | 13 |
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 { |
