From cdcbb39764a5a552a10d1aff3965b606e39faf56 Mon Sep 17 00:00:00 2001 From: Om Prakash Tripathi Date: Tue, 18 Apr 2017 18:51:20 +0530 Subject: [PATCH] qcacmn: update average rssi in scan entry If elapsed time since last rssi update for a particular scan entry is smaller than a thresold, calculate a running average of the RSSI values. Otherwise last RSSI is more representive of the signal strength. Change-Id: I4cbecc8b6bfbb73c272544114b063b25c26e14fe CRs-Fixed: 1095299 --- umac/scan/core/src/wlan_scan_cache_db.c | 24 +++++++++++++++++-- .../dispatcher/inc/wlan_scan_public_structs.h | 2 +- .../scan/dispatcher/inc/wlan_scan_utils_api.h | 1 + .../scan/dispatcher/src/wlan_scan_utils_api.c | 7 +++--- 4 files changed, 27 insertions(+), 7 deletions(-) diff --git a/umac/scan/core/src/wlan_scan_cache_db.c b/umac/scan/core/src/wlan_scan_cache_db.c index 2c4ceafc36ab..50b33ceaa598 100644 --- a/umac/scan/core/src/wlan_scan_cache_db.c +++ b/umac/scan/core/src/wlan_scan_cache_db.c @@ -364,12 +364,11 @@ static void scm_delete_duplicate_entry(struct scan_dbs *scan_db, struct scan_cache_node *scan_node) { struct scan_cache_entry *scan_entry; + uint64_t time_gap; scan_entry = scan_node->entry; /* If old entry have the ssid but new entry does not */ if (!scan_params->ssid.length && scan_entry->ssid.length) { - uint64_t time_gap; - /* * New entry has a hidden SSID and old one has the SSID. * Add the entry by using the ssid of the old entry @@ -397,9 +396,29 @@ static void scm_delete_duplicate_entry(struct scan_dbs *scan_db, */ if (scan_params->channel_mismatch) { scan_params->rssi_raw = scan_entry->rssi_raw; + scan_params->avg_rssi = scan_entry->avg_rssi; scan_params->rssi_timestamp = scan_entry->rssi_timestamp; + } else { + /* If elapsed time since last rssi update for this + * entry is smaller than a thresold, calculate a + * running average of the RSSI values. + * Otherwise last RSSI is more representive of the + * signal strength. + */ + time_gap = + scan_entry->rssi_timestamp - + scan_params->rssi_timestamp; + if (time_gap > WLAN_RSSI_AVERAGING_TIME) + scan_params->avg_rssi = + WLAN_RSSI_IN(scan_params->rssi_raw); + else + WLAN_RSSI_LPF(scan_params->avg_rssi, + scan_params->rssi_raw); + + scan_params->rssi_timestamp = scan_params->scan_entry_time; } + /* copy wsn ie from scan_entry to scan_params*/ scm_update_alt_wcn_ie(scan_entry, scan_params); @@ -542,6 +561,7 @@ QDF_STATUS scm_handle_bcn_probe(struct scheduler_msg *msg) goto free_nbuf; } + scm_info("Received %s from BSSID: %pM tsf_delta = %u Seq Num: %x ssid:%.*s", (bcn->frm_type == MGMT_SUBTYPE_PROBE_RESP) ? "Probe Rsp" : "Beacon", scan_entry->bssid.bytes, diff --git a/umac/scan/dispatcher/inc/wlan_scan_public_structs.h b/umac/scan/dispatcher/inc/wlan_scan_public_structs.h index a258b447b2d6..ad1f6b865ddf 100644 --- a/umac/scan/dispatcher/inc/wlan_scan_public_structs.h +++ b/umac/scan/dispatcher/inc/wlan_scan_public_structs.h @@ -247,7 +247,7 @@ struct scan_cache_entry { struct wlan_ssid ssid; uint16_t seq_num; enum wlan_phymode phy_mode; - int8_t avg_rssi; + int32_t avg_rssi; int8_t rssi_raw; uint16_t bcn_int; union wlan_capability cap_info; diff --git a/umac/scan/dispatcher/inc/wlan_scan_utils_api.h b/umac/scan/dispatcher/inc/wlan_scan_utils_api.h index 2e68b7e36f26..8ec0b23314ad 100644 --- a/umac/scan/dispatcher/inc/wlan_scan_utils_api.h +++ b/umac/scan/dispatcher/inc/wlan_scan_utils_api.h @@ -181,6 +181,7 @@ util_scan_entry_reset_timestamp(struct scan_cache_entry *scan_entry) /* * Macros used for RSSI calculation. */ +#define WLAN_RSSI_AVERAGING_TIME (5 * 1000) /* 5 seconds */ #define WLAN_RSSI_EP_MULTIPLIER (1<<7) /* pow2 to optimize out * and / */ diff --git a/umac/scan/dispatcher/src/wlan_scan_utils_api.c b/umac/scan/dispatcher/src/wlan_scan_utils_api.c index eb940b4a5f40..4f224e2cce11 100644 --- a/umac/scan/dispatcher/src/wlan_scan_utils_api.c +++ b/umac/scan/dispatcher/src/wlan_scan_utils_api.c @@ -575,6 +575,7 @@ util_scan_unpack_beacon_frame(uint8_t *frame, (le16toh(*(uint16_t *)hdr->i_seq) >> WLAN_SEQ_SEQ_SHIFT); scan_entry->rssi_raw = rx_param->rssi; + scan_entry->avg_rssi = WLAN_RSSI_DUMMY_MARKER; scan_entry->tsf_delta = rx_param->tsf_delta; /* store jiffies */ @@ -593,10 +594,8 @@ util_scan_unpack_beacon_frame(uint8_t *frame, bcn->timestamp, 8); scan_entry->erp = ERP_NON_ERP_PRESENT; - - scan_entry->rssi_timestamp = - scan_entry->scan_entry_time = - qdf_mc_timer_get_system_time(); + scan_entry->scan_entry_time = + qdf_mc_timer_get_system_time(); scan_entry->raw_frame.len = frame_len; qdf_mem_copy(scan_entry->raw_frame.ptr,