summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAbhishek Singh <absingh@codeaurora.org>2017-09-18 18:03:23 -0700
committerGerrit - the friendly Code Review server <code-review@localhost>2017-09-22 18:35:50 -0700
commit9034c4d70f2e518c71eec9cb045ffb17740e3dfc (patch)
tree8e257eaee45721c9ea76b576e20e7bfafebf4dd1
parent21dc35a43d6eb6ffe7991c162a17e41071dda734 (diff)
qcacld-3.0: Fix the logic for rssi/HT/VHT score calculation
Fix the logic for rssi/HT/VHT score calculation. Change-Id: Idce23fb0a95a591a1229dd7b101186a8e31b4a01 CRs-Fixed: 2109706
-rw-r--r--core/hdd/inc/wlan_hdd_cfg.h30
-rw-r--r--core/mac/inc/sir_api.h4
-rw-r--r--core/sme/src/csr/csr_api_scan.c130
3 files changed, 112 insertions, 52 deletions
diff --git a/core/hdd/inc/wlan_hdd_cfg.h b/core/hdd/inc/wlan_hdd_cfg.h
index fa7d81dd4f16..6ae3258a4b11 100644
--- a/core/hdd/inc/wlan_hdd_cfg.h
+++ b/core/hdd/inc/wlan_hdd_cfg.h
@@ -12000,7 +12000,7 @@ enum hw_filter_mode {
* rssi_weightage - Rssi Weightage to calculate best candidate
* @Min: 0
* @Max: 100
- * @Default: 25
+ * @Default: 30
*
* This ini is used to increase/decrease rssi weightage in best candidate
* selection. AP with better RSSI will get more weightage.
@@ -12011,7 +12011,7 @@ enum hw_filter_mode {
*/
#define CFG_RSSI_WEIGHTAGE_NAME "rssi_weightage"
-#define CFG_RSSI_WEIGHTAGE_DEFAULT (25)
+#define CFG_RSSI_WEIGHTAGE_DEFAULT (30)
#define CFG_RSSI_WEIGHTAGE_MIN (0)
#define CFG_RSSI_WEIGHTAGE_MAX (100)
/*
@@ -12068,7 +12068,7 @@ enum hw_filter_mode {
* chan_width_weightage - Channel Width Weightage to calculate best candidate
* @Min: 0
* @Max: 100
- * @Default: 10
+ * @Default: 5
*
* This ini is used to increase/decrease Channel Width weightage in best
* candidate selection. AP with Higher channel width will get higher weightage.
@@ -12082,7 +12082,7 @@ enum hw_filter_mode {
* </ini>
*/
#define CFG_CHAN_WIDTH_WEIGHTAGE_NAME "chan_width_weightage"
-#define CFG_CHAN_WIDTH_WEIGHTAGE_DEFAULT (10)
+#define CFG_CHAN_WIDTH_WEIGHTAGE_DEFAULT (5)
#define CFG_CHAN_WIDTH_WEIGHTAGE_MIN (0)
#define CFG_CHAN_WIDTH_WEIGHTAGE_MAX (100)
@@ -12284,7 +12284,7 @@ enum hw_filter_mode {
* good_rssi_pcnt - Percent Score to Good RSSI out of total RSSI score.
* @Min: 0
* @Max: 100
- * @Default: 85
+ * @Default: 80
*
* This ini tells about how much percent should be given to good RSSI
* out of RSSI weightage.
@@ -12298,7 +12298,7 @@ enum hw_filter_mode {
* </ini>
*/
#define CFG_GOOD_RSSI_PCNT_NAME "good_rssi_pcnt"
-#define CFG_GOOD_RSSI_PCNT_DEFAULT (85)
+#define CFG_GOOD_RSSI_PCNT_DEFAULT (80)
#define CFG_GOOD_RSSI_PCNT_MIN (0)
#define CFG_GOOD_RSSI_PCNT_MAX (100)
@@ -12307,7 +12307,7 @@ enum hw_filter_mode {
* bad_rssi_pcnt - Percent Score to BAD RSSI out of total RSSI score.
* @Min: 0
* @Max: 100
- * @Default: 40
+ * @Default: 25
*
* This ini tells about how much percent should be given to bad RSSI
* out of RSSI weightage.
@@ -12321,7 +12321,7 @@ enum hw_filter_mode {
* </ini>
*/
#define CFG_BAD_RSSI_PCNT_NAME "bad_rssi_pcnt"
-#define CFG_BAD_RSSI_PCNT_DEFAULT (40)
+#define CFG_BAD_RSSI_PCNT_DEFAULT (25)
#define CFG_BAD_RSSI_PCNT_MIN (0)
#define CFG_BAD_RSSI_PCNT_MAX (100)
@@ -12406,10 +12406,10 @@ enum hw_filter_mode {
* For Bandwidth chan_width_weightage(10) is given. In this weightage
* this ini divide individual index weight as per bandwidth.
* Indexes are defined in this way.
- * 0 Index : 20 MHz - Def 0
- * 1 Index : 40 MHz - Def 80%
- * 2 Index : 80 MHX - Def 90%
- * 3 Index : 160 MHX - Def 100%
+ * 0 Index : 20 MHz - Def 10%
+ * 1 Index : 40 MHz - Def 20%
+ * 2 Index : 80 MHX - Def 40%
+ * 3 Index : 160 MHX - Def 80%
*
* These percentage values are stored in HEX. For any index max weight can be
* 100 so Max value for each index will be 64.
@@ -12423,7 +12423,7 @@ enum hw_filter_mode {
* </ini>
*/
#define CFG_BAND_WIDTH_WEIGHT_PER_INDEX_NAME "bandwidth_weight_per_index"
-#define CFG_BAND_WIDTH_WEIGHT_PER_INDEX_DEFAULT (0x645A5000)
+#define CFG_BAND_WIDTH_WEIGHT_PER_INDEX_DEFAULT (0x5028140A)
#define CFG_BAND_WIDTH_WEIGHT_PER_INDEX_MIN (0x00000000)
#define CFG_BAND_WIDTH_WEIGHT_PER_INDEX_MAX (0x64646464)
/*
@@ -12492,7 +12492,7 @@ enum hw_filter_mode {
* <ini>
* num_esp_qbss_slots - number of slots in which the esp/qbss load will
* be divided
- * @Min: 0
+ * @Min: 1
* @Max: 15
* @Default: 4
*
@@ -12507,7 +12507,7 @@ enum hw_filter_mode {
*/
#define CFG_ESP_QBSS_SLOTS_NAME "num_esp_qbss_slots"
#define CFG_ESP_QBSS_SLOTS_DEFAULT (4)
-#define CFG_ESP_QBSS_SLOTS_MIN (0)
+#define CFG_ESP_QBSS_SLOTS_MIN (1)
#define CFG_ESP_QBSS_SLOTS_MAX (15)
/*
diff --git a/core/mac/inc/sir_api.h b/core/mac/inc/sir_api.h
index 5a1d4136e7e8..1a5f39c2edbd 100644
--- a/core/mac/inc/sir_api.h
+++ b/core/mac/inc/sir_api.h
@@ -3374,11 +3374,11 @@ struct roam_ext_params {
};
-#define RSSI_WEIGHTAGE 25
+#define RSSI_WEIGHTAGE 30
#define HT_CAPABILITY_WEIGHTAGE 7
#define VHT_CAP_WEIGHTAGE 5
#define HE_CAP_WEIGHTAGE 2
-#define CHAN_WIDTH_WEIGHTAGE 10
+#define CHAN_WIDTH_WEIGHTAGE 5
#define CHAN_BAND_WEIGHTAGE 5
#define NSS_WEIGHTAGE 5
#define BEAMFORMING_CAP_WEIGHTAGE 2
diff --git a/core/sme/src/csr/csr_api_scan.c b/core/sme/src/csr/csr_api_scan.c
index d0e9bcb1effc..45f1d9ef9627 100644
--- a/core/sme/src/csr/csr_api_scan.c
+++ b/core/sme/src/csr/csr_api_scan.c
@@ -1689,22 +1689,54 @@ csr_save_ies(tpAniSirGlobal pMac,
}
/**
+ * csr_get_rssi_pcnt_for_slot () - calculate rssi % score based on the slot
+ * index between the high rssi and low rssi threshold
+ * @high_rssi_threshold: High rssi of the window
+ * @low_rssi_threshold: low rssi of the window
+ * @high_rssi_pcnt: % score for the high rssi
+ * @low_rssi_pcnt: %score for the low rssi
+ * @bucket_size: bucket size of the window
+ * @bss_rssi: Input rssi for which value need to be calculated
+ *
+ * Return : rssi pct to use for the given rssi
+ */
+static inline int8_t csr_get_rssi_pcnt_for_slot(int32_t high_rssi_threshold,
+ int32_t low_rssi_threshold, uint32_t high_rssi_pcnt,
+ uint32_t low_rssi_pcnt, uint32_t bucket_size, int8_t bss_rssi)
+{
+ int8_t slot_index, slot_size, rssi_diff, num_slot, rssi_pcnt;
+
+ num_slot = ((high_rssi_threshold -
+ low_rssi_threshold) / bucket_size) + 1;
+ slot_size = ((high_rssi_pcnt - low_rssi_pcnt) +
+ (num_slot / 2)) / (num_slot);
+ rssi_diff = high_rssi_threshold - bss_rssi;
+ slot_index = (rssi_diff / bucket_size) + 1;
+ rssi_pcnt = high_rssi_pcnt - (slot_size * slot_index);
+ if (rssi_pcnt < low_rssi_pcnt)
+ rssi_pcnt = low_rssi_pcnt;
+
+ sme_debug("Window %d -> %d pcnt range %d -> %d bucket_size %d bss_rssi %d num_slot %d slot_size %d rssi_diff %d slot_index %d rssi_pcnt %d",
+ high_rssi_threshold, low_rssi_threshold, high_rssi_pcnt,
+ low_rssi_pcnt, bucket_size, bss_rssi, num_slot, slot_size,
+ rssi_diff, slot_index, rssi_pcnt);
+
+ return rssi_pcnt;
+}
+
+/**
* csr_calculate_rssi_score () - Calculate RSSI score based on AP RSSI
- * @mac_ctx: Pointer to mac context
+ * @score_param: rssi score params
* @bss_info: bss information
* @rssi_weightage: rssi_weightage out of total weightage
*
* Return : rssi score
*/
-static int32_t csr_calculate_rssi_score(tpAniSirGlobal mac_ctx,
+static int32_t csr_calculate_rssi_score(struct sir_rssi_cfg_score *score_param,
tSirBssDescription *bss_info, uint8_t rssi_weightage)
{
- int8_t slot_index, slot_size;
- int8_t rssi_diff;
- int8_t num_slot;
int8_t rssi_pcnt;
int32_t total_rssi_score;
- struct sir_rssi_cfg_score *score_param;
int32_t best_rssi_threshold;
int32_t good_rssi_threshold;
int32_t bad_rssi_threshold;
@@ -1713,7 +1745,6 @@ static int32_t csr_calculate_rssi_score(tpAniSirGlobal mac_ctx,
uint32_t good_bucket_size;
uint32_t bad_bucket_size;
- score_param = &mac_ctx->roam.configParam.bss_score_params.rssi_score;
best_rssi_threshold = score_param->best_rssi_threshold*(-1);
good_rssi_threshold = score_param->good_rssi_threshold*(-1);
bad_rssi_threshold = score_param->bad_rssi_threshold*(-1);
@@ -1730,10 +1761,10 @@ static int32_t csr_calculate_rssi_score(tpAniSirGlobal mac_ctx,
total_rssi_score = (BEST_CANDIDATE_MAX_WEIGHT * rssi_weightage);
/*
- * If RSSI is better or equal to best rssi threshold then it return full
+ * If RSSI is better than the best rssi threshold then it return full
* score.
*/
- if (bss_info->rssi >= best_rssi_threshold)
+ if (bss_info->rssi > best_rssi_threshold)
return total_rssi_score;
/*
* If RSSI is less or equal to bad rssi threshold then it return
@@ -1743,32 +1774,58 @@ static int32_t csr_calculate_rssi_score(tpAniSirGlobal mac_ctx,
return (total_rssi_score * bad_rssi_pcnt) / 100;
/* RSSI lies between best to good rssi threshold */
- if (bss_info->rssi > good_rssi_threshold) {
- num_slot = (best_rssi_threshold -
- good_rssi_threshold) / good_bucket_size;
- slot_size = good_bucket_size;
- rssi_diff = best_rssi_threshold - bss_info->rssi;
- slot_index = (rssi_diff / good_bucket_size) + 1;
- if (slot_index > num_slot)
- rssi_pcnt = good_rssi_pcnt;
- else
- rssi_pcnt = 100 - slot_size * (slot_index);
- } else {
- num_slot = (good_rssi_threshold -
- bad_rssi_threshold) / bad_bucket_size;
- slot_size = bad_bucket_size;
- rssi_diff = good_rssi_threshold - bss_info->rssi;
- slot_index = (rssi_diff / bad_bucket_size) + 1;
- if (slot_index > num_slot)
- rssi_pcnt = bad_rssi_pcnt;
- else
- rssi_pcnt = good_rssi_pcnt - slot_size * (slot_index);
- }
+ if (bss_info->rssi > good_rssi_threshold)
+ rssi_pcnt = csr_get_rssi_pcnt_for_slot(best_rssi_threshold,
+ good_rssi_threshold, 100, good_rssi_pcnt,
+ good_bucket_size, bss_info->rssi);
+ else
+ rssi_pcnt = csr_get_rssi_pcnt_for_slot(good_rssi_threshold,
+ bad_rssi_threshold, good_rssi_pcnt,
+ bad_rssi_pcnt, bad_bucket_size,
+ bss_info->rssi);
+
return (total_rssi_score * rssi_pcnt) / 100;
}
/**
+ * csr_roam_calculate_prorated_pcnt_by_rssi () - Calculate prorated RSSI score
+ * based on AP RSSI. This will be used to determine HT VHT score
+ * @score_param: rssi score params
+ * @bss_info: bss information
+ * @rssi_weightage: rssi_weightage out of total weightage
+ *
+ * If rssi is greater than good threshold return 100, if less than bad return 0,
+ * if between good and bad, return prorated rssi score for the index.
+ *
+ * Return : rssi prorated score
+ */
+static int8_t csr_roam_calculate_prorated_pcnt_by_rssi(
+ struct sir_rssi_cfg_score *score_param,
+ tSirBssDescription *bss_info, uint8_t rssi_weightage)
+{
+ int32_t good_rssi_threshold;
+ int32_t bad_rssi_threshold;
+
+ good_rssi_threshold = score_param->good_rssi_threshold * (-1);
+ bad_rssi_threshold = score_param->bad_rssi_threshold * (-1);
+
+ /* If RSSI is less or equal to bad rssi threshold then it return 0 */
+ if (bss_info->rssi <= bad_rssi_threshold)
+ return 0;
+
+ if (bss_info->rssi <= good_rssi_threshold)
+ return csr_get_rssi_pcnt_for_slot(good_rssi_threshold,
+ bad_rssi_threshold,
+ score_param->good_rssi_pcnt,
+ score_param->bad_rssi_pcnt,
+ score_param->bad_rssi_bucket_size,
+ bss_info->rssi);
+ else
+ return BEST_CANDIDATE_MAX_WEIGHT;
+}
+
+/**
* csr_calculate_pcl_score () - Calculate PCL score based on PCL weightage
* @mac_ctx: Pointer to mac context
* @bss_info: bss information
@@ -2008,6 +2065,7 @@ static int32_t _csr_calculate_bss_score(tpAniSirGlobal mac_ctx,
uint32_t beamformee_cap;
uint32_t dot11mode;
struct sir_score_config *bss_score_params;
+ uint8_t prorated_pcnt;
/*
* Total weight of a BSSID is calculated on basis of 100 in which
@@ -2026,8 +2084,8 @@ static int32_t _csr_calculate_bss_score(tpAniSirGlobal mac_ctx,
bss_score_params = &mac_ctx->roam.configParam.bss_score_params;
weight_config = &bss_score_params->weight_cfg;
- rssi_score = csr_calculate_rssi_score(mac_ctx, bss_info,
- weight_config->rssi_weightage);
+ rssi_score = csr_calculate_rssi_score(&bss_score_params->rssi_score,
+ bss_info, weight_config->rssi_weightage);
score += rssi_score;
pcl_score = csr_calculate_pcl_score(mac_ctx, bss_info,
@@ -2036,10 +2094,12 @@ static int32_t _csr_calculate_bss_score(tpAniSirGlobal mac_ctx,
dot11mode = csr_translate_to_wni_cfg_dot11_mode(mac_ctx,
mac_ctx->roam.configParam.uCfgDot11Mode);
-
+ prorated_pcnt = csr_roam_calculate_prorated_pcnt_by_rssi(
+ &bss_score_params->rssi_score, bss_info,
+ weight_config->rssi_weightage);
/* If device and AP supports HT caps, extra 10% score will be added */
if (IS_DOT11_MODE_HT(dot11mode) && bss_info->ht_caps_present)
- ht_score = BEST_CANDIDATE_MAX_WEIGHT *
+ ht_score = prorated_pcnt *
weight_config->ht_caps_weightage;
score += ht_score;
@@ -2048,7 +2108,7 @@ static int32_t _csr_calculate_bss_score(tpAniSirGlobal mac_ctx,
* be added to score
*/
if (IS_DOT11_MODE_VHT(dot11mode) && bss_info->vht_caps_present)
- vht_score = BEST_CANDIDATE_MAX_WEIGHT *
+ vht_score = prorated_pcnt *
weight_config->vht_caps_weightage;
score += vht_score;