diff options
| author | Mukul Sharma <mukul@codeaurora.org> | 2016-08-12 18:13:36 +0530 |
|---|---|---|
| committer | qcabuildsw <qcabuildsw@localhost> | 2016-08-17 17:06:45 -0700 |
| commit | fa937be21aee449d240527d7a9f8057506d89609 (patch) | |
| tree | cdf2f8f3685b272685208209cfc94f3abf76897b | |
| parent | dd3bc6012f1c7a5b626cf901b82f85e3b9680d29 (diff) | |
qcacld-3.0: Enhance EXTSCAN feature
qcacld-2.0 to qcacld-3.0 propagation
Make the following enhancements to the EXTSCAN feature:
* Add buckets_scanned param while sending
on_full_scan_result/cached result event to user space.
* Configure REPORT_EVENTS_CONTEXT_HUB to firmware.
* Remove status while sending on_scan_event to user space.
* Add support for SCAN_THRESHOLD_NUM_SCANS /
SCAN_THRESHOLD_PERCENT while sending scan event.
Change-Id: Ib37ce7cef5b3ce9d9ee4ebdc5ea9bcadaad7b695
CRs-Fixed: 960456
| -rw-r--r-- | core/hdd/src/wlan_hdd_cfg80211.h | 12 | ||||
| -rw-r--r-- | core/hdd/src/wlan_hdd_ext_scan.c | 62 | ||||
| -rw-r--r-- | core/mac/inc/sir_api.h | 34 | ||||
| -rw-r--r-- | core/wma/src/wma_scan_roam.c | 50 |
4 files changed, 136 insertions, 22 deletions
diff --git a/core/hdd/src/wlan_hdd_cfg80211.h b/core/hdd/src/wlan_hdd_cfg80211.h index 57bb546278ab..d3adc4ff5a97 100644 --- a/core/hdd/src/wlan_hdd_cfg80211.h +++ b/core/hdd/src/wlan_hdd_cfg80211.h @@ -931,10 +931,9 @@ enum qca_wlan_vendor_attr { * @QCA_WLAN_VENDOR_ATTR_EXTSCAN_BUCKET_SPEC_MAX_PERIOD: * Unsigned 32-bit value. If max_period is non zero or different than * period, then this bucket is an exponential backoff bucket. - * @QCA_WLAN_VENDOR_ATTR_EXTSCAN_BUCKET_SPEC_EXPONENT: + * @QCA_WLAN_VENDOR_ATTR_EXTSCAN_BUCKET_SPEC_BASE: * Unsigned 32-bit value. For exponential back off bucket, - * number of scans performed at a given period and until the - * exponent is applied. + * number of scans to performed for a given period. * @QCA_WLAN_VENDOR_ATTR_EXTSCAN_BUCKET_SPEC_STEP_COUNT: * Unsigned 8-bit value; in number of scans, wake up AP after these * many scans. @@ -1010,7 +1009,7 @@ enum qca_wlan_vendor_attr_extscan_config_params { QCA_WLAN_VENDOR_ATTR_EXTSCAN_BSSID_HOTLIST_PARAMS_LOST_AP_SAMPLE_SIZE, QCA_WLAN_VENDOR_ATTR_EXTSCAN_BUCKET_SPEC_MAX_PERIOD, - QCA_WLAN_VENDOR_ATTR_EXTSCAN_BUCKET_SPEC_EXPONENT, + QCA_WLAN_VENDOR_ATTR_EXTSCAN_BUCKET_SPEC_BASE, QCA_WLAN_VENDOR_ATTR_EXTSCAN_BUCKET_SPEC_STEP_COUNT, QCA_WLAN_VENDOR_ATTR_EXTSCAN_SCAN_CMD_PARAMS_REPORT_THRESHOLD_NUM_SCANS, @@ -1130,6 +1129,10 @@ enum qca_wlan_vendor_attr_extscan_config_params { * Unsigned 32bit value; Max number of epno networks by ssid * @QCA_WLAN_VENDOR_ATTR_EXTSCAN_RESULTS_CAPABILITIES_MAX_NUM_WHITELISTED_SSID: * Unsigned 32bit value; Max number of whitelisted ssids + * @QCA_WLAN_VENDOR_ATTR_EXTSCAN_RESULTS_BUCKETS_SCANNED: + * Unsigned 32bit value, Bit mask of all buckets scanned in the + * current EXTSCAN CYCLE. For e.g. If fw scan is going to scan + * following buckets 0, 1, 2 in current cycle then it will be (0x111) * @QCA_WLAN_VENDOR_ATTR_EXTSCAN_RESULTS_AFTER_LAST: After last * @QCA_WLAN_VENDOR_ATTR_EXTSCAN_RESULTS_MAX: Max value */ @@ -1250,6 +1253,7 @@ enum qca_wlan_vendor_attr_extscan_results { /* Use attr QCA_WLAN_VENDOR_ATTR_EXTSCAN_NUM_RESULTS_AVAILABLE * to indicate number of results. */ + QCA_WLAN_VENDOR_ATTR_EXTSCAN_RESULTS_BUCKETS_SCANNED, /* keep last */ QCA_WLAN_VENDOR_ATTR_EXTSCAN_RESULTS_AFTER_LAST, diff --git a/core/hdd/src/wlan_hdd_ext_scan.c b/core/hdd/src/wlan_hdd_ext_scan.c index 36a521165437..ff8897248ca6 100644 --- a/core/hdd/src/wlan_hdd_ext_scan.c +++ b/core/hdd/src/wlan_hdd_ext_scan.c @@ -46,6 +46,7 @@ * @ignore_cached_results: Flag to ignore cached results or not * @context_lock: Spinlock to serialize all context accesses * @capability_response: Ext scan capability response data from target + * @buckets_scanned: bitmask of buckets scanned in extscan cycle */ struct hdd_ext_scan_context { uint32_t request_id; @@ -54,6 +55,7 @@ struct hdd_ext_scan_context { struct completion response_event; spinlock_t context_lock; struct ext_scan_capabilities_response capability_response; + uint32_t buckets_scanned; }; static struct hdd_ext_scan_context ext_scan_context; @@ -314,6 +316,7 @@ wlan_hdd_cfg80211_extscan_cached_results_ind(void *ctx, #define EXTSCAN_CACHED_NL_FIXED_TLV \ ((sizeof(data->request_id) + NLA_HDRLEN) + \ (sizeof(data->num_scan_ids) + NLA_HDRLEN) + \ + (sizeof(data->buckets_scanned) + NLA_HDRLEN)+ \ (sizeof(data->more_data) + NLA_HDRLEN)) #define EXTSCAN_CACHED_NL_SCAN_ID_TLV \ ((sizeof(result->scan_id) + NLA_HDRLEN) + \ @@ -365,8 +368,9 @@ wlan_hdd_cfg80211_extscan_cached_results_ind(void *ctx, hdd_err("cfg80211_vendor_cmd_alloc_reply_skb failed"); goto fail; } - hdd_notice("Req Id %u Num_scan_ids %u More Data %u", - data->request_id, data->num_scan_ids, data->more_data); + hdd_notice("Req Id %u Num_scan_ids %u More Data %u buckets_scanned %u", + data->request_id, data->num_scan_ids, data->more_data, + data->buckets_scanned); result = &data->result[0]; for (i = 0; i < data->num_scan_ids; i++) { @@ -450,6 +454,9 @@ wlan_hdd_cfg80211_extscan_cached_results_ind(void *ctx, QCA_WLAN_VENDOR_ATTR_EXTSCAN_CACHED_RESULTS_FLAGS, result->flags) || nla_put_u32(skb, + QCA_WLAN_VENDOR_ATTR_EXTSCAN_RESULTS_BUCKETS_SCANNED, + data->buckets_scanned) || + nla_put_u32(skb, QCA_WLAN_VENDOR_ATTR_EXTSCAN_NUM_RESULTS_AVAILABLE, result->num_results)) { hdd_err("put fail"); @@ -774,6 +781,7 @@ wlan_hdd_cfg80211_extscan_full_scan_result_event(void *ctx, hdd_context_t *pHddCtx = (hdd_context_t *) ctx; struct sk_buff *skb = NULL; struct timespec ts; + struct hdd_ext_scan_context *context; int flags = cds_get_gfp_flags(); @@ -878,6 +886,17 @@ wlan_hdd_cfg80211_extscan_full_scan_result_event(void *ctx, goto nla_put_failure; } + context = &ext_scan_context; + spin_lock(&context->context_lock); + if (nla_put_u32(skb, + QCA_WLAN_VENDOR_ATTR_EXTSCAN_RESULTS_BUCKETS_SCANNED, + context->buckets_scanned)) { + spin_unlock(&context->context_lock); + hdd_notice("Failed to include buckets_scanned"); + goto nla_put_failure; + } + spin_unlock(&context->context_lock); + cfg80211_vendor_event(skb, flags); EXIT(); return; @@ -966,6 +985,7 @@ wlan_hdd_cfg80211_extscan_scan_progress_event(void *ctx, hdd_context_t *pHddCtx = (hdd_context_t *) ctx; struct sk_buff *skb = NULL; int flags = cds_get_gfp_flags(); + struct hdd_ext_scan_context *context; ENTER(); @@ -987,17 +1007,32 @@ wlan_hdd_cfg80211_extscan_scan_progress_event(void *ctx, hdd_err("cfg80211_vendor_event_alloc failed"); return; } - hdd_notice("Req Id %u Scan event type %u Scan event status %u", - pData->requestId, pData->scanEventType, pData->status); + + hdd_notice("Request Id %u Scan event type %u Scan event status %u buckets scanned %u", + pData->requestId, pData->scanEventType, pData->status, + pData->buckets_scanned); + + + context = &ext_scan_context; + spin_lock(&context->context_lock); + if (pData->scanEventType == WIFI_EXTSCAN_CYCLE_COMPLETED_EVENT) { + context->buckets_scanned = 0; + pData->scanEventType = WIFI_EXTSCAN_RESULTS_AVAILABLE; + spin_unlock(&context->context_lock); + } else if (pData->scanEventType == WIFI_EXTSCAN_CYCLE_STARTED_EVENT) { + context->buckets_scanned = pData->buckets_scanned; + /* No need to report to user space */ + spin_unlock(&context->context_lock); + return; + } else { + spin_unlock(&context->context_lock); + } 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) || - nla_put_u32(skb, - QCA_WLAN_VENDOR_ATTR_EXTSCAN_RESULTS_SCAN_EVENT_STATUS, - pData->status)) { + pData->scanEventType)) { hdd_err("nla put fail"); goto nla_put_failure; } @@ -2771,14 +2806,14 @@ static int hdd_extscan_start_fill_bucket_channel_spec( hdd_notice("max period %u", req_msg->buckets[bkt_index].max_period); - /* Parse and fetch exponent */ - if (!bucket[QCA_WLAN_VENDOR_ATTR_EXTSCAN_BUCKET_SPEC_EXPONENT]) { - hdd_err("attr exponent failed"); + /* Parse and fetch base */ + if (!bucket[QCA_WLAN_VENDOR_ATTR_EXTSCAN_BUCKET_SPEC_BASE]) { + hdd_err("attr base failed"); return -EINVAL; } req_msg->buckets[bkt_index].exponent = nla_get_u32( - bucket[QCA_WLAN_VENDOR_ATTR_EXTSCAN_BUCKET_SPEC_EXPONENT]); - hdd_notice("exponent %u", + bucket[QCA_WLAN_VENDOR_ATTR_EXTSCAN_BUCKET_SPEC_BASE]); + hdd_notice("base %u", req_msg->buckets[bkt_index].exponent); /* Parse and fetch step count */ @@ -3241,6 +3276,7 @@ __wlan_hdd_cfg80211_extscan_start(struct wiphy *wiphy, spin_lock(&context->context_lock); INIT_COMPLETION(context->response_event); context->request_id = request_id = pReqMsg->requestId; + context->buckets_scanned = 0; spin_unlock(&context->context_lock); status = sme_ext_scan_start(pHddCtx->hHal, pReqMsg); diff --git a/core/mac/inc/sir_api.h b/core/mac/inc/sir_api.h index 2aa2318bdf8e..369d7f5ec653 100644 --- a/core/mac/inc/sir_api.h +++ b/core/mac/inc/sir_api.h @@ -4210,8 +4210,35 @@ typedef enum { /* wifi scan related events */ typedef enum { - WIFI_SCAN_BUFFER_FULL, - WIFI_SCAN_COMPLETE, + /* + * 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; /** @@ -4381,12 +4408,14 @@ typedef struct { * @more_data: 0 - for last fragment * 1 - still more fragment(s) coming * @num_scan_ids: number of scan ids + * @buckets_scanned: bitmask of buckets scanned in current extscan cycle * @result: wifi scan result */ struct extscan_cached_scan_results { uint32_t request_id; bool more_data; uint32_t num_scan_ids; + uint32_t buckets_scanned; struct extscan_cached_scan_result *result; }; @@ -4655,6 +4684,7 @@ typedef struct { uint32_t requestId; uint32_t status; uint8_t scanEventType; + uint32_t buckets_scanned; } tSirExtScanOnScanEventIndParams, *tpSirExtScanOnScanEventIndParams; /** diff --git a/core/wma/src/wma_scan_roam.c b/core/wma/src/wma_scan_roam.c index 6af4604dad3b..493ce3e8c780 100644 --- a/core/wma/src/wma_scan_roam.c +++ b/core/wma/src/wma_scan_roam.c @@ -86,12 +86,14 @@ * fire completion events regardless of REPORT_EVENTS_EACH_SCAN. * @EXTSCAN_REPORT_EVENTS_NO_BATCH: controls batching, * 0 => batching, 1 => no batching - */ + * @EXTSCAN_REPORT_EVENTS_CONTEXT_HUB: forward results to context hub + */ enum extscan_report_events_type { EXTSCAN_REPORT_EVENTS_BUFFER_FULL = 0x00, EXTSCAN_REPORT_EVENTS_EACH_SCAN = 0x01, EXTSCAN_REPORT_EVENTS_FULL_RESULTS = 0x02, EXTSCAN_REPORT_EVENTS_NO_BATCH = 0x04, + EXTSCAN_REPORT_EVENTS_CONTEXT_HUB = 0x08, }; #define WMA_EXTSCAN_CYCLE_WAKE_LOCK_DURATION (5 * 1000) /* in msec */ @@ -3617,6 +3619,8 @@ int wma_extscan_operations_event_handler(void *handle, WMI_EXTSCAN_OPERATION_EVENTID_param_tlvs *param_buf; wmi_extscan_operation_event_fixed_param *oprn_event; tSirExtScanOnScanEventIndParams *oprn_ind; + uint32_t cnt; + tpAniSirGlobal pMac = cds_get_context(QDF_MODULE_ID_PE); if (!pMac) { WMA_LOGE("%s: Invalid pMac", __func__); @@ -3644,22 +3648,56 @@ int wma_extscan_operations_event_handler(void *handle, switch (oprn_event->event) { case WMI_EXTSCAN_BUCKET_COMPLETED_EVENT: - oprn_ind->scanEventType = WIFI_SCAN_COMPLETE; + WMA_LOGD("%s: received WMI_EXTSCAN_BUCKET_COMPLETED_EVENT", + __func__); + oprn_ind->scanEventType = WIFI_EXTSCAN_RESULTS_AVAILABLE; oprn_ind->status = 0; break; + case WMI_EXTSCAN_CYCLE_STARTED_EVENT: WMA_LOGD("%s: received WMI_EXTSCAN_CYCLE_STARTED_EVENT", __func__); qdf_wake_lock_timeout_acquire(&wma->extscan_wake_lock, WMA_EXTSCAN_CYCLE_WAKE_LOCK_DURATION, WIFI_POWER_EVENT_WAKELOCK_EXT_SCAN); - goto exit_handler; + oprn_ind->scanEventType = WIFI_EXTSCAN_CYCLE_STARTED_EVENT; + oprn_ind->status = 0; + oprn_ind->buckets_scanned = 0; + for (cnt = 0; cnt < oprn_event->num_buckets; cnt++) + oprn_ind->buckets_scanned |= + (1 << param_buf->bucket_id[cnt]); + WMA_LOGD(FL("num_buckets %u request_id %u buckets_scanned %u"), + oprn_event->num_buckets, oprn_ind->requestId, + oprn_ind->buckets_scanned); + break; case WMI_EXTSCAN_CYCLE_COMPLETED_EVENT: WMA_LOGD("%s: received WMI_EXTSCAN_CYCLE_COMPLETED_EVENT", __func__); qdf_wake_lock_release(&wma->extscan_wake_lock, WIFI_POWER_EVENT_WAKELOCK_EXT_SCAN); + oprn_ind->scanEventType = WIFI_EXTSCAN_CYCLE_COMPLETED_EVENT; + oprn_ind->status = 0; + /* Set bucket scanned mask to zero on cycle complete */ + oprn_ind->buckets_scanned = 0; + break; + case WMI_EXTSCAN_BUCKET_STARTED_EVENT: + WMA_LOGD("%s: received WIFI_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", + __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", + __func__); + oprn_ind->scanEventType = WIFI_EXTSCAN_THRESHOLD_PERCENT; + oprn_ind->status = 0; + break; default: WMA_LOGE("%s: Unknown event(%d) from target", __func__, oprn_event->event); @@ -4159,6 +4197,7 @@ int wma_extscan_cached_results_event_handler(void *handle, qdf_mem_zero(dest_cachelist, sizeof(*dest_cachelist)); dest_cachelist->request_id = event->request_id; dest_cachelist->more_data = moredata; + dest_cachelist->buckets_scanned = event->buckets_scanned; scan_ids_cnt = wma_extscan_find_unique_scan_ids(cmd_param_info); WMA_LOGI("%s: scan_ids_cnt %d", __func__, scan_ids_cnt); @@ -4656,6 +4695,11 @@ QDF_STATUS wma_get_buf_extscan_start_cmd(tp_wma_handle wma_handle, dest_blist->configuration_flags = WMI_EXTSCAN_BUCKET_CACHE_RESULTS; + if (src_bucket->reportEvents & + EXTSCAN_REPORT_EVENTS_CONTEXT_HUB) + dest_blist->configuration_flags |= + WMI_EXTSCAN_REPORT_EVENT_CONTEXT_HUB; + WMA_LOGI("%s: ntfy_extscan_events:%u cfg_flags:%u fwd_flags:%u", __func__, dest_blist->notify_extscan_events, dest_blist->configuration_flags, |
