diff --git a/core/hdd/inc/wlan_hdd_cfg.h b/core/hdd/inc/wlan_hdd_cfg.h
index 73822aa7b9ac..fd04a684b41d 100644
--- a/core/hdd/inc/wlan_hdd_cfg.h
+++ b/core/hdd/inc/wlan_hdd_cfg.h
@@ -12111,6 +12111,875 @@ enum hdd_external_acs_freq_band {
#define CFG_IS_BSSID_HINT_PRIORITY_MIN (0)
#define CFG_IS_BSSID_HINT_PRIORITY_MAX (1)
+/*
+ *
+ * rssi_weightage - RSSI Weightage to calculate best candidate
+ * @Min: 0
+ * @Max: 100
+ * @Default: 20
+ *
+ * This ini is used to increase/decrease RSSI weightage in best candidate
+ * selection. AP with better RSSI will get more weightage.
+ *
+ * Related: None
+ *
+ * Supported Feature: STA Candidate selection
+ *
+ * Usage: External
+ *
+ *
+ */
+#define CFG_RSSI_WEIGHTAGE_NAME "rssi_weightage"
+#define CFG_RSSI_WEIGHTAGE_DEFAULT (20)
+#define CFG_RSSI_WEIGHTAGE_MIN (0)
+#define CFG_RSSI_WEIGHTAGE_MAX (100)
+
+/*
+ *
+ * ht_caps_weightage - HT caps weightage to calculate best candidate
+ * @Min: 0
+ * @Max: 100
+ * @Default: 2
+ *
+ * This ini is used to increase/decrease HT caps weightage in best candidate
+ * selection. If AP supports HT caps, AP will get additional Weightage with
+ * this param. Weightage will be given only if dot11mode is HT capable.
+ *
+ * Related: None
+ *
+ * Supported Feature: STA Candidate selection
+ *
+ * Usage: External
+ *
+ *
+ */
+#define CFG_HT_CAPABILITY_WEIGHTAGE_NAME "ht_caps_weightage"
+#define CFG_HT_CAPABILITY_WEIGHTAGE_DEFAULT (2)
+#define CFG_HT_CAPABILITY_WEIGHTAGE_MIN (0)
+#define CFG_HT_CAPABILITY_WEIGHTAGE_MAX (100)
+
+/*
+ *
+ * vht_caps_weightage - VHT caps Weightage to calculate best candidate
+ * @Min: 0
+ * @Max: 100
+ * @Default: 1
+ *
+ * This ini is used to increase/decrease VHT caps weightage in best candidate
+ * selection. If AP supports VHT caps, AP will get additional weightage with
+ * this param. Weightage will be given only if dot11mode is VHT capable.
+ *
+ * Related: None
+ *
+ * Supported Feature: STA Candidate selection
+ *
+ * Usage: External
+ *
+ *
+ */
+#define CFG_VHT_CAPABILITY_WEIGHTAGE_NAME "vht_caps_weightage"
+#define CFG_VHT_CAPABILITY_WEIGHTAGE_DEFAULT (1)
+#define CFG_VHT_CAPABILITY_WEIGHTAGE_MIN (0)
+#define CFG_VHT_CAPABILITY_WEIGHTAGE_MAX (100)
+
+/*
+ *
+ * he_caps_weightage - HE caps Weightage to calculate best candidate
+ * @Min: 0
+ * @Max: 100
+ * @Default: 1
+ *
+ * This ini is used to increase/decrease HE caps weightage in best candidate
+ * selection. If AP supports HE caps, AP will get additional weightage with
+ * this param. Weightage will be given only if dot11mode is HE capable.
+ *
+ * Related: None
+ *
+ * Supported Feature: STA Candidate selection
+ *
+ * Usage: External
+ *
+ *
+ */
+#define CFG_HE_CAPABILITY_WEIGHTAGE_NAME "he_caps_weightage"
+#define CFG_HE_CAPABILITY_WEIGHTAGE_DEFAULT (2)
+#define CFG_HE_CAPABILITY_WEIGHTAGE_MIN (0)
+#define CFG_HE_CAPABILITY_WEIGHTAGE_MAX (100)
+
+/*
+ *
+ * chan_width_weightage - Channel Width Weightage to calculate best candidate
+ * @Min: 0
+ * @Max: 100
+ * @Default: 17
+ *
+ * This ini is used to increase/decrease Channel Width weightage in best
+ * candidate selection. AP with Higher channel width will get higher weightage
+ *
+ * Related: bandwidth_weight_per_index
+ *
+ * Supported Feature: STA Candidate selection
+ *
+ * Usage: External
+ *
+ *
+ */
+#define CFG_CHAN_WIDTH_WEIGHTAGE_NAME "chan_width_weightage"
+#define CFG_CHAN_WIDTH_WEIGHTAGE_DEFAULT (17)
+#define CFG_CHAN_WIDTH_WEIGHTAGE_MIN (0)
+#define CFG_CHAN_WIDTH_WEIGHTAGE_MAX (100)
+
+/*
+ *
+ * chan_band_weightage - Channel Band perferance to 5GHZ to
+ * calculate best candidate
+ * @Min: 0
+ * @Max: 100
+ * @Default: 2
+ *
+ * This ini is used to increase/decrease Channel Band Preference weightage
+ * in best candidate selection. 5GHZ AP get this additional boost compare to
+ * 2GHZ AP before rssi_pref_5g_rssi_thresh and 2.4Ghz get weightage after
+ * rssi_pref_5g_rssi_thresh.
+ *
+ * Related: rssi_pref_5g_rssi_thresh, band_weight_per_index
+ *
+ * Supported Feature: STA Candidate selection
+ *
+ * Usage: External
+ *
+ *
+ */
+#define CFG_CHAN_BAND_WEIGHTAGE_NAME "chan_band_weightage"
+#define CFG_CHAN_BAND_WEIGHTAGE_DEFAULT (2)
+#define CFG_CHAN_BAND_WEIGHTAGE_MIN (0)
+#define CFG_CHAN_BAND_WEIGHTAGE_MAX (100)
+
+/*
+ *
+ * nss_weightage - NSS Weightage to calculate best candidate
+ * @Min: 0
+ * @Max: 100
+ * @Default: 16
+ *
+ * This ini is used to increase/decrease NSS weightage in best candidate
+ * selection. If there are two AP, one AP supports 2x2 and another one supports
+ * 1x1 and station supports 2X2, first A will get this additional weightage
+ * depending on self-capability.
+ *
+ * Related: nss_weight_per_index
+ *
+ * Supported Feature: STA Candidate selection
+ *
+ * Usage: External
+ *
+ *
+ */
+#define CFG_NSS_WEIGHTAGE_NAME "nss_weightage"
+#define CFG_NSS_WEIGHTAGE_DEFAULT (16)
+#define CFG_NSS_WEIGHTAGE_MIN (0)
+#define CFG_NSS_WEIGHTAGE_MAX (100)
+
+/*
+ *
+ * beamforming_cap_weightage - Beam Forming Weightage to
+ * calculate best candidate
+ * @Min: 0
+ * @Max: 100
+ * @Default: 2
+ *
+ * This ini is used to increase/decrease Beam forming Weightage if some AP
+ * support Beam forming or not. If AP supports Beam forming, that AP will get
+ * additional boost of this weightage.
+ *
+ * Related: None
+ *
+ * Supported Feature: STA Candidate selection
+ *
+ * Usage: External
+ *
+ *
+ */
+#define CFG_BEAMFORMING_CAP_WEIGHTAGE_NAME "beamforming_cap_weightage"
+#define CFG_BEAMFORMING_CAP_WEIGHTAGE_DEFAULT (2)
+#define CFG_BEAMFORMING_CAP_WEIGHTAGE_MIN (0)
+#define CFG_BEAMFORMING_CAP_WEIGHTAGE_MAX (100)
+
+/*
+ *
+ * pcl_weightage - PCL Weightage to calculate best candidate
+ * @Min: 0
+ * @Max: 100
+ * @Default: 10
+ *
+ * This ini is used to increase/decrease PCL weightage in best candidate
+ * selection. If some APs are in PCL list, those AP will get addition
+ * weightage.
+ *
+ * Related: None
+ *
+ * Supported Feature: STA Candidate selection
+ *
+ * Usage: External
+ *
+ *
+ */
+#define CFG_PCL_WEIGHT_WEIGHTAGE_NAME "pcl_weightage"
+#define CFG_PCL_WEIGHT_DEFAULT (10)
+#define CFG_PCL_WEIGHT_MIN (0)
+#define CFG_PCL_WEIGHT_MAX (100)
+
+/*
+ *
+ * channel_congestion_weightage - channel Congestion Weightage to
+ * calculate best candidate
+ * @Min: 0
+ * @Max: 100
+ * @Default: 5
+ *
+ * This ini is used to increase/decrease channel congestion weightage in
+ * candidate selection. Congestion is measured with the help of ESP/QBSS load.
+ *
+ * Related: num_esp_qbss_slots
+ *
+ * Supported Feature: STA Candidate selection
+ *
+ * Usage: External
+ *
+ *
+ */
+#define CFG_CHANNEL_CONGESTION_WEIGHTAGE_NAME "channel_congestion_weightage"
+#define CFG_CHANNEL_CONGESTION_WEIGHTAGE_DEFAULT (5)
+#define CFG_CHANNEL_CONGESTION_WEIGHTAGE_MIN (0)
+#define CFG_CHANNEL_CONGESTION_WEIGHTAGE_MAX (100)
+
+/*
+ *
+ * oce_wan_weightage - OCE WAN DL capacity Weightage to calculate best candidate
+ * @Min: 0
+ * @Max: 100
+ * @Default: 0
+ *
+ * This ini is used to increase/decrease OCE WAN caps weightage in best
+ * candidate selection. If AP have OCE WAN information, give weightage depending
+ * on the downaload available capacity.
+ *
+ * Related: num_oce_wan_slots
+ *
+ * Supported Feature: STA Candidate selection
+ *
+ * Usage: External
+ *
+ *
+ */
+#define CFG_OCE_WAN_WEIGHTAGE_NAME "oce_wan_weightage"
+#define CFG_OCE_WAN_WEIGHTAGE_DEFAULT (0)
+#define CFG_OCE_WAN_WEIGHTAGE_MIN (0)
+#define CFG_OCE_WAN_WEIGHTAGE_MAX (100)
+
+/*
+ *
+ * best_rssi_threshold - Best Rssi for score calculation
+ * @Min: 0
+ * @Max: 96
+ * @Default: 55
+ *
+ * This ini tells limit for best RSSI. RSSI better than this limit are
+ * considered as best RSSI. The best RSSI is given full rssi_weightage.
+ *
+ * Related: rssi_weightage
+ *
+ * Supported Feature: STA Candidate selection
+ *
+ * Usage: External
+ *
+ *
+ */
+#define CFG_BEST_RSSI_THRESHOLD_NAME "best_rssi_threshold"
+#define CFG_BEST_RSSI_THRESHOLD_DEFAULT (55)
+#define CFG_BEST_RSSI_THRESHOLD_MIN (0)
+#define CFG_BEST_RSSI_THRESHOLD_MAX (96)
+
+/*
+ *
+ * good_rssi_threshold - Good Rssi for score calculation
+ * @Min: 0
+ * @Max: 96
+ * @Default: 70
+ *
+ * This ini tells limit for good RSSI. RSSI better than this limit and less
+ * than best_rssi_threshold is considered as good RSSI.
+ *
+ * Related: rssi_weightage, best_rssi_threshold
+ *
+ * Supported Feature: STA Candidate selection
+ *
+ * Usage: External
+ *
+ *
+ */
+#define CFG_GOOD_RSSI_THRESHOLD_NAME "good_rssi_threshold"
+#define CFG_GOOD_RSSI_THRESHOLD_DEFAULT (70)
+#define CFG_GOOD_RSSI_THRESHOLD_MIN (0)
+#define CFG_GOOD_RSSI_THRESHOLD_MAX (96)
+
+/*
+ *
+ * bad_rssi_threshold - Bad Rssi for score calculation
+ * @Min: 0
+ * @Max: 96
+ * @Default: 80
+ *
+ * This ini tells limit for Bad RSSI. RSSI greater then bad_rssi_threshold
+ * is considered as bad RSSI.
+ *
+ * Related: rssi_weightage, good_rssi_threshold
+ *
+ * Supported Feature: STA Candidate selection
+ *
+ * Usage: External
+ *
+ *
+ */
+#define CFG_BAD_RSSI_THRESHOLD_NAME "bad_rssi_threshold"
+#define CFG_BAD_RSSI_THRESHOLD_DEFAULT (80)
+#define CFG_BAD_RSSI_THRESHOLD_MIN (0)
+#define CFG_BAD_RSSI_THRESHOLD_MAX (96)
+
+/*
+ *
+ * good_rssi_pcnt - Percent Score to Good RSSI out of total RSSI score.
+ * @Min: 0
+ * @Max: 100
+ * @Default: 80
+ *
+ * This ini tells about how much percent should be given to good RSSI(RSSI
+ * between best_rssi_threshold and good_rssi_threshold) out of RSSI weightage.
+ *
+ * Related: rssi_weightage, best_rssi_threshold, good_rssi_threshold
+ *
+ * Supported Feature: STA Candidate selection
+ *
+ * Usage: External
+ *
+ *
+ */
+#define CFG_GOOD_RSSI_PCNT_NAME "good_rssi_pcnt"
+#define CFG_GOOD_RSSI_PCNT_DEFAULT (80)
+#define CFG_GOOD_RSSI_PCNT_MIN (0)
+#define CFG_GOOD_RSSI_PCNT_MAX (100)
+
+/*
+ *
+ * bad_rssi_pcnt - Percent Score to BAD RSSI out of total RSSI score.
+ * @Min: 0
+ * @Max: 100
+ * @Default: 25
+ *
+ * This ini tells about how much percent should be given to bad RSSI (RSSI
+ * between good_rssi_threshold and bad_rssi_threshold) out of RSSI weightage.
+ *
+ * Related: rssi_weightage, good_rssi_threshold, bad_rssi_threshold
+ *
+ * Supported Feature: STA Candidate selection
+ *
+ * Usage: External
+ *
+ *
+ */
+#define CFG_BAD_RSSI_PCNT_NAME "bad_rssi_pcnt"
+#define CFG_BAD_RSSI_PCNT_DEFAULT (25)
+#define CFG_BAD_RSSI_PCNT_MIN (0)
+#define CFG_BAD_RSSI_PCNT_MAX (100)
+
+/*
+ *
+ * good_rssi_bucket_size - Bucket size between best and good RSSI to score.
+ * @Min: 1
+ * @Max: 10
+ * @Default: 5
+ *
+ * This ini tells about bucket size for scoring between best and good RSSI.
+ * Below Best RSSI, 100% score will be given. Between best and good RSSI, RSSI
+ * is divided in buckets and score will be assigned bucket wise starting from
+ * good_rssi_pcnt.
+ *
+ * Related: rssi_weightage, good_rssi_pcnt
+ *
+ * Supported Feature: STA Candidate selection
+ *
+ * Usage: External
+ *
+ *
+ */
+#define CFG_GOOD_RSSI_BUCKET_SIZE_NAME "good_rssi_bucket_size"
+#define CFG_GOOD_RSSI_BUCKET_SIZE_DEFAULT (5)
+#define CFG_GOOD_RSSI_BUCKET_SIZE_MIN (1)
+#define CFG_GOOD_RSSI_BUCKET_SIZE_MAX (10)
+
+/*
+ *
+ * bad_rssi_bucket_size - Bucket size between good and bad RSSI to score.
+ * @Min: 1
+ * @Max: 10
+ * @Default: 5
+ *
+ * This ini tells about bucket size for scoring between good and bad RSSI.
+ * Between good and bad RSSI, RSSI is divided in buckets and score will be
+ * assigned bucket wise starting from bad_rssi_pcnt.
+ *
+ * Related: rssi_weightage, bad_rssi_pcnt
+ *
+ * Supported Feature: STA Candidate selection
+ *
+ * Usage: External
+ *
+ *
+ */
+#define CFG_BAD_RSSI_BUCKET_SIZE_NAME "bad_rssi_bucket_size"
+#define CFG_BAD_RSSI_BUCKET_SIZE_DEFAULT (5)
+#define CFG_BAD_RSSI_BUCKET_SIZE_MIN (1)
+#define CFG_BAD_RSSI_BUCKET_SIZE_MAX (10)
+
+/*
+ *
+ * rssi_pref_5g_rssi_thresh - A RSSI threshold above which 5 GHz is not favored
+ * @Min: 0
+ * @Max: 96
+ * @Default: 76
+ *
+ * 5G AP are given chan_band_weightage. This ini tells about RSSI threshold
+ * above which 5GHZ is not favored.
+ *
+ * Related: chan_band_weightage
+ *
+ * Supported Feature: STA Candidate selection
+ *
+ * Usage: External
+ *
+ *
+ */
+#define CFG_RSSI_PERF_5G_THRESHOLD_NAME "rssi_pref_5g_rssi_thresh"
+#define CFG_RSSI_PERF_5G_THRESHOLD_DEFAULT (76)
+#define CFG_RSSI_PERF_5G_THRESHOLD_MIN (0)
+#define CFG_RSSI_PERF_5G_THRESHOLD_MAX (96)
+
+/*
+ *
+ * bandwidth_weight_per_index - percentage as per bandwidth
+ * @Min: 0x00000000
+ * @Max: 0x64646464
+ * @Default: 0x6432190C
+ *
+ * This INI give percentage value of chan_width_weightage to be used as per
+ * peer bandwidth. Self BW is also considered while calculating score. Eg if
+ * self BW is 20 MHZ 10% will be given for all AP irrespective of the AP
+ * capability.
+ *
+ * Indexes are defined in this way.
+ * 0 Index (BITS 0-7): 20 MHz - Def 12%
+ * 1 Index (BITS 8-15): 40 MHz - Def 25%
+ * 2 Index (BITS 16-23): 80 MHz - Def 50%
+ * 3 Index (BITS 24-31): 160 MHz - Def 100%
+ * These percentage values are stored in HEX. For any index max value, can be 64
+ *
+ * Related: chan_width_weightage
+ *
+ * Supported Feature: STA Candidate selection
+ *
+ * Usage: External
+ *
+ *
+ */
+#define CFG_BAND_WIDTH_WEIGHT_PER_INDEX_NAME "bandwidth_weight_per_index"
+#define CFG_BAND_WIDTH_WEIGHT_PER_INDEX_DEFAULT (0x6432190C)
+#define CFG_BAND_WIDTH_WEIGHT_PER_INDEX_MIN (0x00000000)
+#define CFG_BAND_WIDTH_WEIGHT_PER_INDEX_MAX (0x64646464)
+
+/*
+ *
+ * nss_weight_per_index - percentage as per NSS
+ * @Min: 0x00000000
+ * @Max: 0x64646464
+ * @Default: 0x6432190C
+ *
+ * This INI give percentage value of nss_weightage to be used as per peer NSS.
+ * Self NSS capability is also considered. Eg if self NSS is 1x1 10% will be
+ * given for all AP irrespective of the AP capability.
+ *
+ * Indexes are defined in this way.
+ * 0 Index (BITS 0-7): 1X1- Def 12%
+ * 1 Index (BITS 8-15): 2X2- Def 25%
+ * 2 Index (BITS 16-23): 3X3- Def 50%
+ * 3 Index (BITS 24-31): 4X4- Def 100%
+ * These percentage values are stored in HEX. For any index max value, can be 64
+ *
+ * Related: nss_weightage
+ *
+ * Supported Feature: STA Candidate selection
+ *
+ * Usage: External
+ *
+ *
+ */
+#define CFG_NSS_WEIGHT_PER_INDEX_NAME "nss_weight_per_index"
+#define CFG_NSS_WEIGHT_PER_INDEX_DEFAULT (0x6432190C)
+#define CFG_NSS_WEIGHT_PER_INDEX_MIN (0x00000000)
+#define CFG_NSS_WEIGHT_PER_INDEX_MAX (0x64646464)
+
+/*
+ *
+ * band_weight_per_index - percentage as per band
+ * @Min: 0x00000000
+ * @Max: 0x64646464
+ * @Default: 0x0000644B
+ *
+ * This INI give percentage value of chan_band_weightage to be used as per band.
+ * If RSSI is greater than rssi_pref_5g_rssi_thresh preference is given for 5Ghz
+ * else, it's given for 2.4Ghz.
+ *
+ * Indexes are defined in this way.
+ * 0 Index (BITS 0-7): 2.4GHz - Def 10%
+ * 1 Index (BITS 8-15): 5GHz - Def 20%
+ * 2 Index (BITS 16-23): Reserved
+ * 3 Index (BITS 24-31): Reserved
+ * These percentage values are stored in HEX. For any index max value, can be 64
+ *
+ * Related: chan_band_weightage, rssi_pref_5g_rssi_thresh
+ *
+ * Supported Feature: STA Candidate selection
+ *
+ * Usage: External
+ *
+ *
+ */
+#define CFG_BAND_WEIGHT_PER_INDEX_NAME "band_weight_per_index"
+#define CFG_BAND_WEIGHT_PER_INDEX_DEFAULT (0x0000644B)
+#define CFG_BAND_WEIGHT_PER_INDEX_MIN (0x00000000)
+#define CFG_BAND_WEIGHT_PER_INDEX_MAX (0x64646464)
+
+/*
+ *
+ * num_esp_qbss_slots - number of slots in which the esp/qbss load will
+ * be divided
+ *
+ * @Min: 1
+ * @Max: 15
+ * @Default: 4
+ *
+ * Number of slots in which the esp/qbss load will be divided. Max 15. index 0
+ * is used for 'not_present. Num_slot will equally divide 100. e.g, if
+ * num_slot = 4 slot 1 = 0-25% load, slot 2 = 26-50% load, slot 3 = 51-75% load,
+ * slot 4 = 76-100% load. Remaining unused index can be 0.
+ *
+ * Usage: External
+ *
+ *
+ */
+#define CFG_ESP_QBSS_SLOTS_NAME "num_esp_qbss_slots"
+#define CFG_ESP_QBSS_SLOTS_DEFAULT (4)
+#define CFG_ESP_QBSS_SLOTS_MIN (1)
+#define CFG_ESP_QBSS_SLOTS_MAX (15)
+
+/*
+ *
+ * esp_qbss_score_idx3_to_0 - percentage for esp/qbss load for slots 0-3
+ * @Min: 0x00000000
+ * @Max: 0x64646464
+ * @Default: 0x19326432
+ *
+ * This INI give percentage value of channel_congestion_weightage to be used as
+ * index in which the load value falls. Index 0 is for percentage when ESP/QBSS
+ * is not present.
+ *
+ * Indexes are defined in this way.
+ * 0 Index (BITS 0-7): when ESP/QBSS is not present
+ * 1 Index (BITS 8-15): SLOT_1
+ * 2 Index (BITS 16-23): SLOT_2
+ * 3 Index (BITS 24-31): SLOT_3
+ * These percentage values are stored in HEX. For any index max value, can be 64
+ *
+ * Related: channel_congestion_weightage, num_esp_qbss_slots
+ *
+ * Supported Feature: STA Candidate selection
+ *
+ * Usage: External
+ *
+ *
+ */
+#define CFG_ESP_QBSS_SCORE_IDX3_TO_0_NAME "esp_qbss_score_idx3_to_0"
+#define CFG_ESP_QBSS_SCORE_IDX3_TO_0_DEFAULT (0x19326432)
+#define CFG_ESP_QBSS_SCORE_IDX3_TO_0_MIN (0x00000000)
+#define CFG_ESP_QBSS_SCORE_IDX3_TO_0_MAX (0x64646464)
+
+/*
+ *
+ * esp_qbss_score_idx7_to_4 - percentage for esp/qbss load for slots 4-7
+ * @Min: 0x00000000
+ * @Max: 0x64646464
+ * @Default: 0x00000019
+ *
+ * This INI give percentage value of channel_congestion_weightage to be used as
+ * index in which the load value falls. Used only if num_esp_qbss_slots is
+ * greater than 3.
+ *
+ * Indexes are defined in this way.
+ * 0 Index (BITS 0-7): SLOT_4
+ * 1 Index (BITS 8-15): SLOT_5
+ * 2 Index (BITS 16-23): SLOT_6
+ * 3 Index (BITS 24-31): SLOT_7
+ * These percentage values are stored in HEX. For any index max value, can be 64
+ *
+ * Related: channel_congestion_weightage, num_esp_qbss_slots
+ *
+ * Supported Feature: STA Candidate selection
+ *
+ * Usage: External
+ *
+ *
+ */
+#define CFG_ESP_QBSS_SCORE_IDX7_TO_4_NAME "esp_qbss_score_idx7_to_4"
+#define CFG_ESP_QBSS_SCORE_IDX7_TO_4_DEFAULT (0x00000019)
+#define CFG_ESP_QBSS_SCORE_IDX7_TO_4_MIN (0x00000000)
+#define CFG_ESP_QBSS_SCORE_IDX7_TO_4_MAX (0x64646464)
+
+
+/*
+ *
+ * esp_qbss_score_idx11_to_8 - percentage for esp/qbss load for slots 8-11
+ * @Min: 0x00000000
+ * @Max: 0x64646464
+ * @Default: 0x00000000
+ *
+ * This INI give percentage value of channel_congestion_weightage to be used as
+ * index in which the load value falls. Used only if num_esp_qbss_slots is
+ * greater than 7.
+ *
+ * Indexes are defined in this way.
+ * 0 Index (BITS 0-7): SLOT_8
+ * 1 Index (BITS 8-15): SLOT_9
+ * 2 Index (BITS 16-23): SLOT_10
+ * 3 Index (BITS 24-31): SLOT_11
+ * These percentage values are stored in HEX. For any index max value, can be 64
+ *
+ * Related: channel_congestion_weightage, num_esp_qbss_slots
+ *
+ * Supported Feature: STA Candidate selection
+ *
+ * Usage: External
+ *
+ *
+ */
+#define CFG_ESP_QBSS_SCORE_IDX11_TO_8_NAME "esp_qbss_score_idx11_to_8"
+#define CFG_ESP_QBSS_SCORE_IDX11_TO_8_DEFAULT (0x00000000)
+#define CFG_ESP_QBSS_SCORE_IDX11_TO_8_MIN (0x00000000)
+#define CFG_ESP_QBSS_SCORE_IDX11_TO_8_MAX (0x64646464)
+
+
+/*
+ *
+ * esp_qbss_score_idx15_to_12 - percentage for esp/qbss load for slots 12-15
+ * @Min: 0x00000000
+ * @Max: 0x64646464
+ * @Default: 0x00000000
+ *
+ * This INI give percentage value of channel_congestion_weightage to be used as
+ * index in which the load value falls. Used only if num_esp_qbss_slots is
+ * greater than 11.
+ *
+ * Indexes are defined in this way.
+ * 0 Index (BITS 0-7): SLOT_12
+ * 1 Index (BITS 8-15): SLOT_13
+ * 2 Index (BITS 16-23): SLOT_14
+ * 3 Index (BITS 24-31): SLOT_15
+ * These percentage values are stored in HEX. For any index max value, can be 64
+ *
+ * Related: channel_congestion_weightage, num_esp_qbss_slots
+ *
+ * Supported Feature: STA Candidate selection
+ *
+ * Usage: External
+ *
+ *
+ */
+#define CFG_ESP_QBSS_SCORE_IDX15_TO_12_NAME "esp_qbss_score_idx15_to_12"
+#define CFG_ESP_QBSS_SCORE_IDX15_TO_12_DEFAULT (0x00000000)
+#define CFG_ESP_QBSS_SCORE_IDX15_TO_12_MIN (0x00000000)
+#define CFG_ESP_QBSS_SCORE_IDX15_TO_12_MAX (0x64646464)
+
+/*
+ *
+ * num_oce_wan_slots - number of slots in which the oce wan metrics will
+ * be divided
+ *
+ * @Min: 1
+ * @Max: 15
+ * @Default: 8
+ *
+ * Number of slots in which the oce wan metrics will be divided. Max 15. index 0
+ * is used for not_present. Num_slot will equally divide 100. e.g, if
+ * num_slot = 4 slot 1 = 0-3 DL CAP, slot 2 = 4-7 DL CAP, slot 3 = 8-11 DL CAP,
+ * slot 4 = 12-15 DL CAP. Remaining unused index can be 0.
+ *
+ * Related: oce_wan_weightage
+ *
+ * Usage: External
+ *
+ *
+ */
+#define CFG_OCE_WAN_SLOTS_NAME "num_oce_wan_slots"
+#define CFG_OCE_WAN_SLOTS_DEFAULT (8)
+#define CFG_OCE_WAN_SLOTS_MIN (1)
+#define CFG_OCE_WAN_SLOTS_MAX (15)
+
+/*
+ *
+ * oce_wan_score_idx3_to_0 - percentage for OCE WAN metrics score for slots 0-3
+ * @Min: 0x00000000
+ * @Max: 0x64646464
+ * @Default: 0x00000000
+ *
+ * This INI give percentage value of OCE WAN metrics DL CAP, to be used as
+ * index in which the DL CAP value falls. Index 0 is for percentage when
+ * OCE WAN metrics DL CAP is not present.
+ *
+ * Indexes are defined in this way.
+ * 0 Index (BITS 0-7): when OCE WAN metrics DL CAP is not present
+ * 1 Index (BITS 8-15): SLOT_1
+ * 2 Index (BITS 16-23): SLOT_2
+ * 3 Index (BITS 24-31): SLOT_3
+ * These percentage values are stored in HEX. For any index max value, can be 64
+ *
+ * Related: num_oce_wan_slots, oce_wan_weightage
+ *
+ * Supported Feature: STA Candidate selection
+ *
+ * Usage: External
+ *
+ *
+ */
+#define CFG_OCE_WAN_SCORE_IDX3_TO_0_NAME "oce_wan_score_idx3_to_0"
+#define CFG_OCE_WAN_SCORE_IDX3_TO_0_DEFAULT (0x00000000)
+#define CFG_OCE_WAN_SCORE_IDX3_TO_0_MIN (0x00000000)
+#define CFG_OCE_WAN_SCORE_IDX3_TO_0_MAX (0x64646464)
+
+/*
+ *
+ * oce_wan_score_idx7_to_4 - percentage for OCE WAN metrics score for slots 4-7
+ * @Min: 0x00000000
+ * @Max: 0x64646464
+ * @Default: 0x64640000
+ *
+ * This INI give percentage value of OCE WAN metrics DL CAP, to be used as
+ * index in which the DL CAP value falls. Used only if num_oce_wan_slots is
+ * greater than 3.
+ *
+ * Indexes are defined in this way.
+ * 0 Index (BITS 0-7): SLOT_4
+ * 1 Index (BITS 8-15): SLOT_5
+ * 2 Index (BITS 16-23): SLOT_6
+ * 3 Index (BITS 24-31): SLOT_7
+ * These percentage values are stored in HEX. For any index max value, can be 64
+ *
+ * Related: num_oce_wan_slots, oce_wan_weightage
+ *
+ * Supported Feature: STA Candidate selection
+ *
+ * Usage: External
+ *
+ *
+ */
+#define CFG_OCE_WAN_SCORE_IDX7_TO_4_NAME "oce_wan_score_idx7_to_4"
+#define CFG_OCE_WAN_SCORE_IDX7_TO_4_DEFAULT (0x64640000)
+#define CFG_OCE_WAN_SCORE_IDX7_TO_4_MIN (0x00000000)
+#define CFG_OCE_WAN_SCORE_IDX7_TO_4_MAX (0x64646464)
+
+/*
+ *
+ * oce_wan_score_idx11_to_8 - percentage for OCE WAN metrics score for slot 8-11
+ * @Min: 0x00000000
+ * @Max: 0x64646464
+ * @Default: 0x00000064
+ *
+ * This INI give percentage value of OCE WAN metrics DL CAP, to be used as
+ * index in which the DL CAP value falls. Used only if num_oce_wan_slots is
+ * greater than 7.
+ *
+ * Indexes are defined in this way.
+ * 0 Index (BITS 0-7): SLOT_8
+ * 1 Index (BITS 8-15): SLOT_9
+ * 2 Index (BITS 16-23): SLOT_10
+ * 3 Index (BITS 24-31): SLOT_11
+ * These percentage values are stored in HEX. For any index max value, can be 64
+ *
+ * Related: num_oce_wan_slots, oce_wan_weightage
+ *
+ * Supported Feature: STA Candidate selection
+ *
+ * Usage: External
+ *
+ *
+ */
+#define CFG_OCE_WAN_SCORE_IDX11_TO_8_NAME "oce_wan_score_idx11_to_8"
+#define CFG_OCE_WAN_SCORE_IDX11_TO_8_DEFAULT (0x00000064)
+#define CFG_OCE_WAN_SCORE_IDX11_TO_8_MIN (0x00000000)
+#define CFG_OCE_WAN_SCORE_IDX11_TO_8_MAX (0x64646464)
+
+/*
+ *
+ * oce_wan_score_idx15_to_12 - % for OCE WAN metrics score for slot 12-15
+ * @Min: 0x00000000
+ * @Max: 0x64646464
+ * @Default: 0x00000000
+ *
+ * This INI give percentage value of OCE WAN metrics DL CAP, to be used as
+ * index in which the DL CAP value falls. Used only if num_oce_wan_slots is
+ * greater than 11.
+ *
+ * Indexes are defined in this way.
+ * 0 Index (BITS 0-7): SLOT_12
+ * 1 Index (BITS 8-15): SLOT_13
+ * 2 Index (BITS 16-23): SLOT_14
+ * 3 Index (BITS 24-31): SLOT_15
+ * These percentage values are stored in HEX. For any index max value, can be 64
+ *
+ * Related: num_oce_wan_slots, oce_wan_weightage
+ *
+ * Supported Feature: STA Candidate selection
+ *
+ * Usage: External
+ *
+ *
+ */
+#define CFG_OCE_WAN_SCORE_IDX15_TO_12_NAME "oce_wan_score_idx15_to_12"
+#define CFG_OCE_WAN_SCORE_IDX15_TO_12_DEFAULT (0x00000000)
+#define CFG_OCE_WAN_SCORE_IDX15_TO_12_MIN (0x00000000)
+#define CFG_OCE_WAN_SCORE_IDX15_TO_12_MAX (0x64646464)
+
+/*
+ *
+ * enable_scoring_for_roam - enable/disable scoring logic in FW for candidate
+ * selection during roaming
+ *
+ * @Min: 0
+ * @Max: 1
+ * @Default: 0
+ *
+ * This ini is used to enable/disable scoring logic in FW for candidate
+ * selection during roaming.
+ *
+ * Supported Feature: STA Candidate selection by FW during roaming based on
+ * scoring logic.
+ *
+ * Usage: External
+ *
+ *
+ */
+#define CFG_ENABLE_SCORING_FOR_ROAM_NAME "enable_scoring_for_roam"
+#define CFG_ENABLE_SCORING_FOR_ROAM_DEFAULT (0)
+#define CFG_ENABLE_SCORING_FOR_ROAM_MIN (0)
+#define CFG_ENABLE_SCORING_FOR_ROAM_MAX (1)
+
/*
*
* gChanSwitchHostapdRateEnabled - Enable/disable hostapd rate when doing SAP
@@ -12235,6 +13104,7 @@ enum hdd_external_acs_freq_band {
#define CFG_MBO_CAND_RSSI_BTC_THRESHOLD_MIN (-120)
#define CFG_MBO_CAND_RSSI_BTC_THRESHOLD_MAX (0)
+
/*
* Type declarations
*/
@@ -13052,6 +13922,39 @@ struct hdd_config {
uint32_t scan_11d_interval;
bool chan_switch_hostapd_rate_enabled;
bool is_bssid_hint_priority;
+ uint8_t rssi_weightage;
+ uint8_t ht_caps_weightage;
+ uint8_t vht_caps_weightage;
+ uint8_t he_caps_weightage;
+ uint8_t chan_width_weightage;
+ uint8_t chan_band_weightage;
+ uint8_t nss_weightage;
+ uint8_t beamforming_cap_weightage;
+ uint8_t pcl_weightage;
+ uint8_t channel_congestion_weightage;
+ uint8_t oce_wan_weightage;
+ uint32_t bandwidth_weight_per_index;
+ uint32_t nss_weight_per_index;
+ uint32_t band_weight_per_index;
+ uint32_t best_rssi_threshold;
+ uint32_t good_rssi_threshold;
+ uint32_t bad_rssi_threshold;
+ uint32_t good_rssi_pcnt;
+ uint32_t bad_rssi_pcnt;
+ uint32_t good_rssi_bucket_size;
+ uint32_t bad_rssi_bucket_size;
+ uint32_t rssi_pref_5g_rssi_thresh;
+ uint8_t num_esp_qbss_slots;
+ uint32_t esp_qbss_score_slots3_to_0;
+ uint32_t esp_qbss_score_slots7_to_4;
+ uint32_t esp_qbss_score_slots11_to_8;
+ uint32_t esp_qbss_score_slots15_to_12;
+ uint8_t num_oce_wan_slots;
+ uint32_t oce_wan_score_slots3_to_0;
+ uint32_t oce_wan_score_slots7_to_4;
+ uint32_t oce_wan_score_slots11_to_8;
+ uint32_t oce_wan_score_slots15_to_12;
+ bool enable_scoring_for_roam;
bool is_fils_enabled;
/* mbo related thresholds */
int8_t mbo_candidate_rssi_thres;
diff --git a/core/hdd/src/wlan_hdd_cfg.c b/core/hdd/src/wlan_hdd_cfg.c
index c7bf5f2cf2b4..fd6f2a0ce77c 100644
--- a/core/hdd/src/wlan_hdd_cfg.c
+++ b/core/hdd/src/wlan_hdd_cfg.c
@@ -4893,6 +4893,238 @@ struct reg_table_entry g_registry_table[] = {
CFG_IS_BSSID_HINT_PRIORITY_MIN,
CFG_IS_BSSID_HINT_PRIORITY_MAX),
+ REG_VARIABLE(CFG_RSSI_WEIGHTAGE_NAME, WLAN_PARAM_Integer,
+ struct hdd_config, rssi_weightage,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_RSSI_WEIGHTAGE_DEFAULT,
+ CFG_RSSI_WEIGHTAGE_MIN,
+ CFG_RSSI_WEIGHTAGE_MAX),
+
+ REG_VARIABLE(CFG_HT_CAPABILITY_WEIGHTAGE_NAME, WLAN_PARAM_Integer,
+ struct hdd_config, ht_caps_weightage,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_HT_CAPABILITY_WEIGHTAGE_DEFAULT,
+ CFG_HT_CAPABILITY_WEIGHTAGE_MIN,
+ CFG_HT_CAPABILITY_WEIGHTAGE_MAX),
+
+ REG_VARIABLE(CFG_VHT_CAPABILITY_WEIGHTAGE_NAME, WLAN_PARAM_Integer,
+ struct hdd_config, vht_caps_weightage,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_VHT_CAPABILITY_WEIGHTAGE_DEFAULT,
+ CFG_VHT_CAPABILITY_WEIGHTAGE_MIN,
+ CFG_VHT_CAPABILITY_WEIGHTAGE_MAX),
+
+ REG_VARIABLE(CFG_HE_CAPABILITY_WEIGHTAGE_NAME, WLAN_PARAM_Integer,
+ struct hdd_config, he_caps_weightage,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_HE_CAPABILITY_WEIGHTAGE_DEFAULT,
+ CFG_HE_CAPABILITY_WEIGHTAGE_MIN,
+ CFG_HE_CAPABILITY_WEIGHTAGE_MAX),
+
+ REG_VARIABLE(CFG_CHAN_WIDTH_WEIGHTAGE_NAME, WLAN_PARAM_Integer,
+ struct hdd_config, chan_width_weightage,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_CHAN_WIDTH_WEIGHTAGE_DEFAULT,
+ CFG_CHAN_WIDTH_WEIGHTAGE_MIN,
+ CFG_CHAN_WIDTH_WEIGHTAGE_MAX),
+
+ REG_VARIABLE(CFG_CHAN_BAND_WEIGHTAGE_NAME, WLAN_PARAM_Integer,
+ struct hdd_config, chan_band_weightage,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_CHAN_BAND_WEIGHTAGE_DEFAULT,
+ CFG_CHAN_BAND_WEIGHTAGE_MIN,
+ CFG_CHAN_BAND_WEIGHTAGE_MAX),
+
+ REG_VARIABLE(CFG_NSS_WEIGHTAGE_NAME, WLAN_PARAM_Integer,
+ struct hdd_config, nss_weightage,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_NSS_WEIGHTAGE_DEFAULT,
+ CFG_NSS_WEIGHTAGE_MIN,
+ CFG_NSS_WEIGHTAGE_MAX),
+
+ REG_VARIABLE(CFG_BEAMFORMING_CAP_WEIGHTAGE_NAME, WLAN_PARAM_Integer,
+ struct hdd_config, beamforming_cap_weightage,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_BEAMFORMING_CAP_WEIGHTAGE_DEFAULT,
+ CFG_BEAMFORMING_CAP_WEIGHTAGE_MIN,
+ CFG_BEAMFORMING_CAP_WEIGHTAGE_MAX),
+
+ REG_VARIABLE(CFG_PCL_WEIGHT_WEIGHTAGE_NAME, WLAN_PARAM_Integer,
+ struct hdd_config, pcl_weightage,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_PCL_WEIGHT_DEFAULT,
+ CFG_PCL_WEIGHT_MIN,
+ CFG_PCL_WEIGHT_MAX),
+
+ REG_VARIABLE(CFG_CHANNEL_CONGESTION_WEIGHTAGE_NAME, WLAN_PARAM_Integer,
+ struct hdd_config, channel_congestion_weightage,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_CHANNEL_CONGESTION_WEIGHTAGE_DEFAULT,
+ CFG_CHANNEL_CONGESTION_WEIGHTAGE_MIN,
+ CFG_CHANNEL_CONGESTION_WEIGHTAGE_MAX),
+
+ REG_VARIABLE(CFG_OCE_WAN_WEIGHTAGE_NAME, WLAN_PARAM_Integer,
+ struct hdd_config, oce_wan_weightage,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_OCE_WAN_WEIGHTAGE_DEFAULT,
+ CFG_OCE_WAN_WEIGHTAGE_MIN,
+ CFG_OCE_WAN_WEIGHTAGE_MAX),
+
+ REG_VARIABLE(CFG_BEST_RSSI_THRESHOLD_NAME, WLAN_PARAM_Integer,
+ struct hdd_config, best_rssi_threshold,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_BEST_RSSI_THRESHOLD_DEFAULT,
+ CFG_BEST_RSSI_THRESHOLD_MIN,
+ CFG_BEST_RSSI_THRESHOLD_MAX),
+
+ REG_VARIABLE(CFG_GOOD_RSSI_THRESHOLD_NAME, WLAN_PARAM_Integer,
+ struct hdd_config, good_rssi_threshold,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_GOOD_RSSI_THRESHOLD_DEFAULT,
+ CFG_GOOD_RSSI_THRESHOLD_MIN,
+ CFG_GOOD_RSSI_THRESHOLD_MAX),
+
+ REG_VARIABLE(CFG_BAD_RSSI_THRESHOLD_NAME, WLAN_PARAM_Integer,
+ struct hdd_config, bad_rssi_threshold,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_BAD_RSSI_THRESHOLD_DEFAULT,
+ CFG_BAD_RSSI_THRESHOLD_MIN,
+ CFG_BAD_RSSI_THRESHOLD_MAX),
+
+ REG_VARIABLE(CFG_GOOD_RSSI_PCNT_NAME, WLAN_PARAM_Integer,
+ struct hdd_config, good_rssi_pcnt,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_GOOD_RSSI_PCNT_DEFAULT,
+ CFG_GOOD_RSSI_PCNT_MIN,
+ CFG_GOOD_RSSI_PCNT_MAX),
+
+ REG_VARIABLE(CFG_BAD_RSSI_PCNT_NAME, WLAN_PARAM_Integer,
+ struct hdd_config, bad_rssi_pcnt,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_BAD_RSSI_PCNT_DEFAULT,
+ CFG_BAD_RSSI_PCNT_MIN,
+ CFG_BAD_RSSI_PCNT_MAX),
+
+ REG_VARIABLE(CFG_GOOD_RSSI_BUCKET_SIZE_NAME, WLAN_PARAM_Integer,
+ struct hdd_config, good_rssi_bucket_size,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_GOOD_RSSI_BUCKET_SIZE_DEFAULT,
+ CFG_GOOD_RSSI_BUCKET_SIZE_MIN,
+ CFG_GOOD_RSSI_BUCKET_SIZE_MAX),
+
+ REG_VARIABLE(CFG_BAD_RSSI_BUCKET_SIZE_NAME, WLAN_PARAM_Integer,
+ struct hdd_config, bad_rssi_bucket_size,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_BAD_RSSI_BUCKET_SIZE_DEFAULT,
+ CFG_BAD_RSSI_BUCKET_SIZE_MIN,
+ CFG_BAD_RSSI_BUCKET_SIZE_MAX),
+
+ REG_VARIABLE(CFG_RSSI_PERF_5G_THRESHOLD_NAME, WLAN_PARAM_Integer,
+ struct hdd_config, rssi_pref_5g_rssi_thresh,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_RSSI_PERF_5G_THRESHOLD_DEFAULT,
+ CFG_RSSI_PERF_5G_THRESHOLD_MIN,
+ CFG_RSSI_PERF_5G_THRESHOLD_MAX),
+
+ REG_VARIABLE(CFG_BAND_WIDTH_WEIGHT_PER_INDEX_NAME,
+ WLAN_PARAM_HexInteger,
+ struct hdd_config, bandwidth_weight_per_index,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_BAND_WIDTH_WEIGHT_PER_INDEX_DEFAULT,
+ CFG_BAND_WIDTH_WEIGHT_PER_INDEX_MIN,
+ CFG_BAND_WIDTH_WEIGHT_PER_INDEX_MAX),
+
+ REG_VARIABLE(CFG_NSS_WEIGHT_PER_INDEX_NAME, WLAN_PARAM_HexInteger,
+ struct hdd_config, nss_weight_per_index,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_NSS_WEIGHT_PER_INDEX_DEFAULT,
+ CFG_NSS_WEIGHT_PER_INDEX_MIN,
+ CFG_NSS_WEIGHT_PER_INDEX_MAX),
+
+ REG_VARIABLE(CFG_BAND_WEIGHT_PER_INDEX_NAME, WLAN_PARAM_HexInteger,
+ struct hdd_config, band_weight_per_index,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_BAND_WEIGHT_PER_INDEX_DEFAULT,
+ CFG_BAND_WEIGHT_PER_INDEX_MIN,
+ CFG_BAND_WEIGHT_PER_INDEX_MAX),
+
+ REG_VARIABLE(CFG_ESP_QBSS_SLOTS_NAME, WLAN_PARAM_Integer,
+ struct hdd_config, num_esp_qbss_slots,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_ESP_QBSS_SLOTS_DEFAULT,
+ CFG_ESP_QBSS_SLOTS_MIN,
+ CFG_ESP_QBSS_SLOTS_MAX),
+
+ REG_VARIABLE(CFG_ESP_QBSS_SCORE_IDX3_TO_0_NAME, WLAN_PARAM_HexInteger,
+ struct hdd_config, esp_qbss_score_slots3_to_0,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_ESP_QBSS_SCORE_IDX3_TO_0_DEFAULT,
+ CFG_ESP_QBSS_SCORE_IDX3_TO_0_MIN,
+ CFG_ESP_QBSS_SCORE_IDX3_TO_0_MAX),
+
+ REG_VARIABLE(CFG_ESP_QBSS_SCORE_IDX7_TO_4_NAME, WLAN_PARAM_HexInteger,
+ struct hdd_config, esp_qbss_score_slots7_to_4,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_ESP_QBSS_SCORE_IDX7_TO_4_DEFAULT,
+ CFG_ESP_QBSS_SCORE_IDX7_TO_4_MIN,
+ CFG_ESP_QBSS_SCORE_IDX7_TO_4_MAX),
+
+ REG_VARIABLE(CFG_ESP_QBSS_SCORE_IDX11_TO_8_NAME, WLAN_PARAM_HexInteger,
+ struct hdd_config, esp_qbss_score_slots11_to_8,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_ESP_QBSS_SCORE_IDX11_TO_8_DEFAULT,
+ CFG_ESP_QBSS_SCORE_IDX11_TO_8_MIN,
+ CFG_ESP_QBSS_SCORE_IDX11_TO_8_MAX),
+
+ REG_VARIABLE(CFG_ESP_QBSS_SCORE_IDX15_TO_12_NAME, WLAN_PARAM_HexInteger,
+ struct hdd_config, esp_qbss_score_slots15_to_12,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_ESP_QBSS_SCORE_IDX15_TO_12_DEFAULT,
+ CFG_ESP_QBSS_SCORE_IDX15_TO_12_MIN,
+ CFG_ESP_QBSS_SCORE_IDX15_TO_12_MAX),
+
+ REG_VARIABLE(CFG_OCE_WAN_SLOTS_NAME, WLAN_PARAM_Integer,
+ struct hdd_config, num_oce_wan_slots,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_OCE_WAN_SLOTS_DEFAULT,
+ CFG_OCE_WAN_SLOTS_MIN,
+ CFG_OCE_WAN_SLOTS_MAX),
+
+ REG_VARIABLE(CFG_OCE_WAN_SCORE_IDX3_TO_0_NAME, WLAN_PARAM_HexInteger,
+ struct hdd_config, oce_wan_score_slots3_to_0,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_OCE_WAN_SCORE_IDX3_TO_0_DEFAULT,
+ CFG_OCE_WAN_SCORE_IDX3_TO_0_MIN,
+ CFG_OCE_WAN_SCORE_IDX3_TO_0_MAX),
+
+ REG_VARIABLE(CFG_OCE_WAN_SCORE_IDX7_TO_4_NAME, WLAN_PARAM_HexInteger,
+ struct hdd_config, oce_wan_score_slots7_to_4,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_OCE_WAN_SCORE_IDX7_TO_4_DEFAULT,
+ CFG_OCE_WAN_SCORE_IDX7_TO_4_MIN,
+ CFG_OCE_WAN_SCORE_IDX7_TO_4_MAX),
+
+ REG_VARIABLE(CFG_OCE_WAN_SCORE_IDX11_TO_8_NAME, WLAN_PARAM_HexInteger,
+ struct hdd_config, oce_wan_score_slots11_to_8,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_OCE_WAN_SCORE_IDX11_TO_8_DEFAULT,
+ CFG_OCE_WAN_SCORE_IDX11_TO_8_MIN,
+ CFG_OCE_WAN_SCORE_IDX11_TO_8_MAX),
+
+ REG_VARIABLE(CFG_OCE_WAN_SCORE_IDX15_TO_12_NAME, WLAN_PARAM_HexInteger,
+ struct hdd_config, oce_wan_score_slots15_to_12,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_OCE_WAN_SCORE_IDX15_TO_12_DEFAULT,
+ CFG_OCE_WAN_SCORE_IDX15_TO_12_MIN,
+ CFG_OCE_WAN_SCORE_IDX15_TO_12_MAX),
+
+ REG_VARIABLE(CFG_ENABLE_SCORING_FOR_ROAM_NAME, WLAN_PARAM_Integer,
+ struct hdd_config, enable_scoring_for_roam,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_ENABLE_SCORING_FOR_ROAM_DEFAULT,
+ CFG_ENABLE_SCORING_FOR_ROAM_MIN,
+ CFG_ENABLE_SCORING_FOR_ROAM_MAX),
+
REG_VARIABLE(CFG_MBO_CANDIDATE_RSSI_THRESHOLD_NAME,
WLAN_PARAM_SignedInteger, struct hdd_config,
mbo_candidate_rssi_thres,
@@ -6607,6 +6839,106 @@ void hdd_cfg_print(struct hdd_context *hdd_ctx)
hdd_debug("Name = [%s] value = [%u]",
CFG_IS_BSSID_HINT_PRIORITY_NAME,
hdd_ctx->config->is_bssid_hint_priority);
+ hdd_debug("Name = [%s] value = [%u]",
+ CFG_RSSI_WEIGHTAGE_NAME,
+ hdd_ctx->config->rssi_weightage);
+ hdd_debug("Name = [%s] value = [%u]",
+ CFG_HT_CAPABILITY_WEIGHTAGE_NAME,
+ hdd_ctx->config->ht_caps_weightage);
+ hdd_debug("Name = [%s] value = [%u]",
+ CFG_VHT_CAPABILITY_WEIGHTAGE_NAME,
+ hdd_ctx->config->vht_caps_weightage);
+ hdd_debug("Name = [%s] value = [%u]",
+ CFG_HE_CAPABILITY_WEIGHTAGE_NAME,
+ hdd_ctx->config->he_caps_weightage);
+ hdd_debug("Name = [%s] value = [%u]",
+ CFG_CHAN_WIDTH_WEIGHTAGE_NAME,
+ hdd_ctx->config->chan_width_weightage);
+ hdd_debug("Name = [%s] value = [%u]",
+ CFG_CHAN_BAND_WEIGHTAGE_NAME,
+ hdd_ctx->config->chan_band_weightage);
+ hdd_debug("Name = [%s] value = [%u]",
+ CFG_NSS_WEIGHTAGE_NAME,
+ hdd_ctx->config->nss_weightage);
+ hdd_debug("Name = [%s] value = [%u]",
+ CFG_BEAMFORMING_CAP_WEIGHTAGE_NAME,
+ hdd_ctx->config->beamforming_cap_weightage);
+ hdd_debug("Name = [%s] value = [%u]",
+ CFG_PCL_WEIGHT_WEIGHTAGE_NAME,
+ hdd_ctx->config->pcl_weightage);
+ hdd_debug("Name = [%s] value = [%u]",
+ CFG_CHANNEL_CONGESTION_WEIGHTAGE_NAME,
+ hdd_ctx->config->channel_congestion_weightage);
+ hdd_debug("Name = [%s] value = [%u]",
+ CFG_OCE_WAN_WEIGHTAGE_NAME,
+ hdd_ctx->config->oce_wan_weightage);
+ hdd_debug("Name = [%s] value = [%u]",
+ CFG_BAND_WIDTH_WEIGHT_PER_INDEX_NAME,
+ hdd_ctx->config->bandwidth_weight_per_index);
+ hdd_debug("Name = [%s] value = [%u]",
+ CFG_NSS_WEIGHT_PER_INDEX_NAME,
+ hdd_ctx->config->nss_weight_per_index);
+ hdd_debug("Name = [%s] value = [%u]",
+ CFG_BAND_WEIGHT_PER_INDEX_NAME,
+ hdd_ctx->config->band_weight_per_index);
+ hdd_debug("Name = [%s] value = [%u]",
+ CFG_BEST_RSSI_THRESHOLD_NAME,
+ hdd_ctx->config->best_rssi_threshold);
+ hdd_debug("Name = [%s] value = [%u]",
+ CFG_GOOD_RSSI_THRESHOLD_NAME,
+ hdd_ctx->config->good_rssi_threshold);
+ hdd_debug("Name = [%s] value = [%u]",
+ CFG_BAD_RSSI_THRESHOLD_NAME,
+ hdd_ctx->config->bad_rssi_threshold);
+ hdd_debug("Name = [%s] value = [%u]",
+ CFG_GOOD_RSSI_PCNT_NAME,
+ hdd_ctx->config->good_rssi_pcnt);
+ hdd_debug("Name = [%s] value = [%u]",
+ CFG_BAD_RSSI_PCNT_NAME,
+ hdd_ctx->config->bad_rssi_pcnt);
+ hdd_debug("Name = [%s] value = [%u]",
+ CFG_GOOD_RSSI_BUCKET_SIZE_NAME,
+ hdd_ctx->config->good_rssi_bucket_size);
+ hdd_debug("Name = [%s] value = [%u]",
+ CFG_BAD_RSSI_BUCKET_SIZE_NAME,
+ hdd_ctx->config->bad_rssi_bucket_size);
+ hdd_debug("Name = [%s] value = [%u]",
+ CFG_RSSI_PERF_5G_THRESHOLD_NAME,
+ hdd_ctx->config->rssi_pref_5g_rssi_thresh);
+ hdd_debug("Name = [%s] value = [%u]",
+ CFG_ESP_QBSS_SLOTS_NAME,
+ hdd_ctx->config->num_esp_qbss_slots);
+ hdd_debug("Name = [%s] value = [%u]",
+ CFG_ESP_QBSS_SCORE_IDX3_TO_0_NAME,
+ hdd_ctx->config->esp_qbss_score_slots3_to_0);
+ hdd_debug("Name = [%s] value = [%u]",
+ CFG_ESP_QBSS_SCORE_IDX7_TO_4_NAME,
+ hdd_ctx->config->esp_qbss_score_slots7_to_4);
+ hdd_debug("Name = [%s] value = [%u]",
+ CFG_ESP_QBSS_SCORE_IDX11_TO_8_NAME,
+ hdd_ctx->config->esp_qbss_score_slots11_to_8);
+ hdd_debug("Name = [%s] value = [%u]",
+ CFG_ESP_QBSS_SCORE_IDX15_TO_12_NAME,
+ hdd_ctx->config->esp_qbss_score_slots15_to_12);
+ hdd_debug("Name = [%s] value = [%u]",
+ CFG_ENABLE_SCORING_FOR_ROAM_NAME,
+ hdd_ctx->config->enable_scoring_for_roam);
+
+ hdd_debug("Name = [%s] value = [%u]",
+ CFG_OCE_WAN_SLOTS_NAME,
+ hdd_ctx->config->num_oce_wan_slots);
+ hdd_debug("Name = [%s] value = [%u]",
+ CFG_OCE_WAN_SCORE_IDX3_TO_0_NAME,
+ hdd_ctx->config->oce_wan_score_slots3_to_0);
+ hdd_debug("Name = [%s] value = [%u]",
+ CFG_OCE_WAN_SCORE_IDX7_TO_4_NAME,
+ hdd_ctx->config->oce_wan_score_slots7_to_4);
+ hdd_debug("Name = [%s] value = [%u]",
+ CFG_OCE_WAN_SCORE_IDX11_TO_8_NAME,
+ hdd_ctx->config->oce_wan_score_slots11_to_8);
+ hdd_debug("Name = [%s] value = [%u]",
+ CFG_OCE_WAN_SCORE_IDX15_TO_12_NAME,
+ hdd_ctx->config->oce_wan_score_slots15_to_12);
}
@@ -7885,6 +8217,147 @@ hdd_to_csr_wmm_mode(enum hdd_wmm_user_mode mode)
}
}
+/**
+ * hdd_limit_max_per_index_score() -check if per index score doesnt exceed 100%
+ * (0x64). If it exceed make it 100%
+ *
+ * @per_index_score: per_index_score as input
+ *
+ * Return: per_index_score within the max limit
+ */
+static uint32_t hdd_limit_max_per_index_score(uint32_t per_index_score)
+{
+ uint8_t i, score;
+
+ for (i = 0; i < MAX_INDEX_PER_INI; i++) {
+ score = WLAN_GET_SCORE_PERCENTAGE(per_index_score, i);
+ if (score > MAX_INDEX_SCORE)
+ WLAN_SET_SCORE_PERCENTAGE(per_index_score,
+ MAX_INDEX_SCORE, i);
+ }
+
+ return per_index_score;
+}
+
+/**
+ * hdd_update_score_params() -initializes the sme config for bss score params
+ *
+ * @config: pointer to config
+ * @score_params: bss score params
+ *
+ * Return: None
+ */
+static void hdd_update_bss_score_params(struct hdd_config *config,
+ struct sir_score_config *score_params)
+{
+ int total_weight;
+
+ score_params->enable_scoring_for_roam =
+ config->enable_scoring_for_roam;
+ score_params->weight_cfg.rssi_weightage = config->rssi_weightage;
+ score_params->weight_cfg.ht_caps_weightage = config->ht_caps_weightage;
+ score_params->weight_cfg.vht_caps_weightage =
+ config->vht_caps_weightage;
+ score_params->weight_cfg.he_caps_weightage =
+ config->he_caps_weightage;
+ score_params->weight_cfg.chan_width_weightage =
+ config->chan_width_weightage;
+ score_params->weight_cfg.chan_band_weightage =
+ config->chan_band_weightage;
+ score_params->weight_cfg.nss_weightage = config->nss_weightage;
+ score_params->weight_cfg.beamforming_cap_weightage =
+ config->beamforming_cap_weightage;
+ score_params->weight_cfg.pcl_weightage = config->pcl_weightage;
+ score_params->weight_cfg.channel_congestion_weightage =
+ config->channel_congestion_weightage;
+ score_params->weight_cfg.oce_wan_weightage = config->oce_wan_weightage;
+
+ total_weight = score_params->weight_cfg.rssi_weightage +
+ score_params->weight_cfg.ht_caps_weightage +
+ score_params->weight_cfg.vht_caps_weightage +
+ score_params->weight_cfg.he_caps_weightage +
+ score_params->weight_cfg.chan_width_weightage +
+ score_params->weight_cfg.chan_band_weightage +
+ score_params->weight_cfg.nss_weightage +
+ score_params->weight_cfg.beamforming_cap_weightage +
+ score_params->weight_cfg.pcl_weightage +
+ score_params->weight_cfg.channel_congestion_weightage +
+ score_params->weight_cfg.oce_wan_weightage;
+
+ if (total_weight > BEST_CANDIDATE_MAX_WEIGHT) {
+ hdd_err("total weight is greater than %d fallback to default values",
+ BEST_CANDIDATE_MAX_WEIGHT);
+
+ score_params->weight_cfg.rssi_weightage = RSSI_WEIGHTAGE;
+ score_params->weight_cfg.ht_caps_weightage =
+ HT_CAPABILITY_WEIGHTAGE;
+ score_params->weight_cfg.vht_caps_weightage = VHT_CAP_WEIGHTAGE;
+ score_params->weight_cfg.he_caps_weightage = HE_CAP_WEIGHTAGE;
+ score_params->weight_cfg.chan_width_weightage =
+ CHAN_WIDTH_WEIGHTAGE;
+ score_params->weight_cfg.chan_band_weightage =
+ CHAN_BAND_WEIGHTAGE;
+ score_params->weight_cfg.nss_weightage = NSS_WEIGHTAGE;
+ score_params->weight_cfg.beamforming_cap_weightage =
+ BEAMFORMING_CAP_WEIGHTAGE;
+ score_params->weight_cfg.pcl_weightage = PCL_WEIGHT;
+ score_params->weight_cfg.channel_congestion_weightage =
+ CHANNEL_CONGESTION_WEIGHTAGE;
+ score_params->weight_cfg.oce_wan_weightage = OCE_WAN_WEIGHTAGE;
+ }
+
+ score_params->bandwidth_weight_per_index =
+ hdd_limit_max_per_index_score(
+ config->bandwidth_weight_per_index);
+ score_params->nss_weight_per_index =
+ hdd_limit_max_per_index_score(config->nss_weight_per_index);
+ score_params->band_weight_per_index =
+ hdd_limit_max_per_index_score(config->band_weight_per_index);
+
+ score_params->rssi_score.best_rssi_threshold =
+ config->best_rssi_threshold;
+ score_params->rssi_score.good_rssi_threshold =
+ config->good_rssi_threshold;
+ score_params->rssi_score.bad_rssi_threshold =
+ config->bad_rssi_threshold;
+ score_params->rssi_score.good_rssi_pcnt = config->good_rssi_pcnt;
+ score_params->rssi_score.bad_rssi_pcnt = config->bad_rssi_pcnt;
+ score_params->rssi_score.good_rssi_bucket_size =
+ config->good_rssi_bucket_size;
+ score_params->rssi_score.bad_rssi_bucket_size =
+ config->bad_rssi_bucket_size;
+ score_params->rssi_score.rssi_pref_5g_rssi_thresh =
+ config->rssi_pref_5g_rssi_thresh;
+
+ score_params->esp_qbss_scoring.num_slot = config->num_esp_qbss_slots;
+ score_params->esp_qbss_scoring.score_pcnt3_to_0 =
+ hdd_limit_max_per_index_score(
+ config->esp_qbss_score_slots3_to_0);
+ score_params->esp_qbss_scoring.score_pcnt7_to_4 =
+ hdd_limit_max_per_index_score(
+ config->esp_qbss_score_slots7_to_4);
+ score_params->esp_qbss_scoring.score_pcnt11_to_8 =
+ hdd_limit_max_per_index_score(
+ config->esp_qbss_score_slots11_to_8);
+ score_params->esp_qbss_scoring.score_pcnt15_to_12 =
+ hdd_limit_max_per_index_score(
+ config->esp_qbss_score_slots15_to_12);
+
+ score_params->oce_wan_scoring.num_slot = config->num_oce_wan_slots;
+ score_params->oce_wan_scoring.score_pcnt3_to_0 =
+ hdd_limit_max_per_index_score(
+ config->oce_wan_score_slots3_to_0);
+ score_params->oce_wan_scoring.score_pcnt7_to_4 =
+ hdd_limit_max_per_index_score(
+ config->oce_wan_score_slots7_to_4);
+ score_params->oce_wan_scoring.score_pcnt11_to_8 =
+ hdd_limit_max_per_index_score(
+ config->oce_wan_score_slots11_to_8);
+ score_params->oce_wan_scoring.score_pcnt15_to_12 =
+ hdd_limit_max_per_index_score(
+ config->oce_wan_score_slots15_to_12);
+}
+
/**
* hdd_set_sme_config() -initializes the sme configuration parameters
*
@@ -8293,6 +8766,9 @@ QDF_STATUS hdd_set_sme_config(struct hdd_context *hdd_ctx)
smeConfig->csrConfig.num_11ag_tx_chains =
hdd_ctx->config->num_11ag_tx_chains;
+ hdd_update_bss_score_params(hdd_ctx->config,
+ &smeConfig->csrConfig.bss_score_params);
+
status = sme_update_config(hdd_ctx->hHal, smeConfig);
if (!QDF_IS_STATUS_SUCCESS(status))
hdd_err("sme_update_config() failure: %d", status);
diff --git a/core/mac/inc/sir_api.h b/core/mac/inc/sir_api.h
index ef2295335c73..f037ec331bc3 100644
--- a/core/mac/inc/sir_api.h
+++ b/core/mac/inc/sir_api.h
@@ -3099,6 +3099,93 @@ struct roam_ext_params {
uint32_t bg_scan_client_bitmap;
};
+/**
+ * struct sir_weight_config - weight params to
+ * calculate best candidate
+ * @rssi_weightage: RSSI weightage
+ * @ht_caps_weightage: HT caps weightage
+ * @vht_caps_weightage: VHT caps weightage
+ * @he_caps_weightage: HE caps weightage
+ * @chan_width_weightage: Channel width weightage
+ * @chan_band_weightage: Channel band weightage
+ * @nss_weightage: NSS weightage
+ * @beamforming_cap_weightage: Beamforming caps weightage
+ * @pcl_weightage: PCL weightage
+ * @channel_congestion_weightage: channel congestion weightage
+ * @oce_wan_weightage: OCE WAN metrics weightage
+ */
+struct sir_weight_config {
+ uint8_t rssi_weightage;
+ uint8_t ht_caps_weightage;
+ uint8_t vht_caps_weightage;
+ uint8_t he_caps_weightage;
+ uint8_t chan_width_weightage;
+ uint8_t chan_band_weightage;
+ uint8_t nss_weightage;
+ uint8_t beamforming_cap_weightage;
+ uint8_t pcl_weightage;
+ uint8_t channel_congestion_weightage;
+ uint8_t oce_wan_weightage;
+};
+
+struct sir_rssi_cfg_score {
+ uint32_t best_rssi_threshold;
+ uint32_t good_rssi_threshold;
+ uint32_t bad_rssi_threshold;
+ uint32_t good_rssi_pcnt;
+ uint32_t bad_rssi_pcnt;
+ uint32_t good_rssi_bucket_size;
+ uint32_t bad_rssi_bucket_size;
+ uint32_t rssi_pref_5g_rssi_thresh;
+};
+
+/**
+ * struct sir_per_slot_scoring - define % score for differents slots for a
+ * scoring param.
+ * num_slot: number of slots in which the param will be divided.
+ * Max 15. index 0 is used for 'not_present. Num_slot will
+ * equally divide 100. e.g, if num_slot = 4 slot 0 = 0-25%, slot
+ * 1 = 26-50% slot 2 = 51-75%, slot 3 = 76-100%
+ * score_pcnt3_to_0: Conatins score percentage for slot 0-3
+ * BITS 0-7 :- the scoring pcnt when not present
+ * BITS 8-15 :- SLOT_1
+ * BITS 16-23 :- SLOT_2
+ * BITS 24-31 :- SLOT_3
+ * score_pcnt7_to_4: Conatins score percentage for slot 4-7
+ * BITS 0-7 :- SLOT_4
+ * BITS 8-15 :- SLOT_5
+ * BITS 16-23 :- SLOT_6
+ * BITS 24-31 :- SLOT_7
+ * score_pcnt11_to_8: Conatins score percentage for slot 8-11
+ * BITS 0-7 :- SLOT_8
+ * BITS 8-15 :- SLOT_9
+ * BITS 16-23 :- SLOT_10
+ * BITS 24-31 :- SLOT_11
+ * score_pcnt15_to_12: Conatins score percentage for slot 12-15
+ * BITS 0-7 :- SLOT_12
+ * BITS 8-15 :- SLOT_13
+ * BITS 16-23 :- SLOT_14
+ * BITS 24-31 :- SLOT_15
+ */
+struct sir_per_slot_scoring {
+ uint32_t num_slot;
+ uint32_t score_pcnt3_to_0;
+ uint32_t score_pcnt7_to_4;
+ uint32_t score_pcnt11_to_8;
+ uint32_t score_pcnt15_to_12;
+};
+
+struct sir_score_config {
+ bool enable_scoring_for_roam;
+ struct sir_weight_config weight_cfg;
+ struct sir_rssi_cfg_score rssi_score;
+ struct sir_per_slot_scoring esp_qbss_scoring;
+ struct sir_per_slot_scoring oce_wan_scoring;
+ uint32_t bandwidth_weight_per_index;
+ uint32_t nss_weight_per_index;
+ uint32_t band_weight_per_index;
+};
+
/**
* struct pmkid_mode_bits - Bit flags for PMKID usage in RSN IE
* @fw_okc: Opportunistic key caching enable in firmware
@@ -3203,6 +3290,7 @@ typedef struct sSirRoamOffloadScanReq {
enum wmi_dwelltime_adaptive_mode roamscan_adaptive_dwell_mode;
tSirAddie assoc_ie;
struct lca_disallow_config_params lca_config_params;
+ struct scoring_param score_params;
} tSirRoamOffloadScanReq, *tpSirRoamOffloadScanReq;
typedef struct sSirRoamOffloadScanRsp {
diff --git a/core/sme/inc/csr_api.h b/core/sme/inc/csr_api.h
index 96a8d3db79ff..c65977bf246b 100644
--- a/core/sme/inc/csr_api.h
+++ b/core/sme/inc/csr_api.h
@@ -1352,6 +1352,7 @@ typedef struct tagCsrConfigParam {
uint32_t disallow_duration;
uint32_t rssi_channel_penalization;
uint32_t num_disallowed_aps;
+ struct sir_score_config bss_score_params;
} tCsrConfigParam;
/* Tush */
diff --git a/core/sme/inc/csr_internal.h b/core/sme/inc/csr_internal.h
index c430f5d6b58d..2540a857d6a4 100644
--- a/core/sme/inc/csr_internal.h
+++ b/core/sme/inc/csr_internal.h
@@ -630,6 +630,7 @@ struct csr_config {
uint32_t disallow_duration;
uint32_t rssi_channel_penalization;
uint32_t num_disallowed_aps;
+ struct sir_score_config bss_score_params;
};
struct csr_channel_powerinfo {
diff --git a/core/sme/src/csr/csr_api_roam.c b/core/sme/src/csr/csr_api_roam.c
index 88c313e0a23b..acbb4dbe354e 100644
--- a/core/sme/src/csr/csr_api_roam.c
+++ b/core/sme/src/csr/csr_api_roam.c
@@ -1569,6 +1569,27 @@ static void init_config_param(tpAniSirGlobal pMac)
MAWC_ROAM_RSSI_HIGH_ADJUST_DEFAULT;
pMac->roam.configParam.csr_mawc_config.mawc_roam_rssi_low_adjust =
MAWC_ROAM_RSSI_LOW_ADJUST_DEFAULT;
+
+ qdf_mem_zero(&pMac->roam.configParam.bss_score_params,
+ sizeof(struct sir_score_config));
+ pMac->roam.configParam.bss_score_params.weight_cfg.rssi_weightage =
+ RSSI_WEIGHTAGE;
+ pMac->roam.configParam.bss_score_params.weight_cfg.ht_caps_weightage =
+ HT_CAPABILITY_WEIGHTAGE;
+ pMac->roam.configParam.bss_score_params.weight_cfg.vht_caps_weightage =
+ VHT_CAP_WEIGHTAGE;
+ pMac->roam.configParam.bss_score_params.
+ weight_cfg.chan_width_weightage = CHAN_WIDTH_WEIGHTAGE;
+ pMac->roam.configParam.bss_score_params.
+ weight_cfg.chan_band_weightage = CHAN_BAND_WEIGHTAGE;
+ pMac->roam.configParam.bss_score_params.weight_cfg.nss_weightage =
+ NSS_WEIGHTAGE;
+ pMac->roam.configParam.bss_score_params.weight_cfg.
+ beamforming_cap_weightage = BEAMFORMING_CAP_WEIGHTAGE;
+ pMac->roam.configParam.bss_score_params.weight_cfg.pcl_weightage =
+ PCL_WEIGHT;
+ pMac->roam.configParam.bss_score_params.weight_cfg.
+ channel_congestion_weightage = CHANNEL_CONGESTION_WEIGHTAGE;
}
eCsrBand csr_get_current_band(tHalHandle hHal)
@@ -2926,6 +2947,10 @@ QDF_STATUS csr_change_default_config_param(tpAniSirGlobal pMac,
pMac->roam.configParam.num_disallowed_aps =
pParam->num_disallowed_aps;
+ qdf_mem_copy(&pMac->roam.configParam.bss_score_params,
+ &pParam->bss_score_params,
+ sizeof(struct sir_score_config));
+
csr_update_he_config_param(pMac, pParam);
}
return status;
@@ -3183,6 +3208,10 @@ QDF_STATUS csr_get_config_param(tpAniSirGlobal pMac, tCsrConfigParam *pParam)
&pMac->roam.configParam.csr_mawc_config,
sizeof(pParam->csr_mawc_config));
+ qdf_mem_copy(&pParam->bss_score_params,
+ &pMac->roam.configParam.bss_score_params,
+ sizeof(struct sir_score_config));
+
csr_get_he_config_param(pParam, pMac);
return QDF_STATUS_SUCCESS;
@@ -18398,6 +18427,88 @@ csr_roam_offload_per_scan(tpAniSirGlobal mac_ctx, uint8_t session_id)
return QDF_STATUS_SUCCESS;
}
+/**
+ * csr_update_score_params() - API to update Score params in RSO
+ * @mac_ctx: Mac context
+ * @req_buffer: RSO request buffer
+ *
+ * Return: None
+ */
+static void csr_update_score_params(tpAniSirGlobal mac_ctx,
+ tSirRoamOffloadScanReq *req_buffer)
+{
+ struct scoring_param *req_score_params;
+ struct rssi_scoring *req_rssi_score;
+ struct sir_score_config *bss_score_params;
+ struct sir_weight_config *weight_config;
+ struct sir_rssi_cfg_score *rssi_score;
+
+ req_score_params = &req_buffer->score_params;
+ req_rssi_score = &req_score_params->rssi_scoring;
+
+ bss_score_params = &mac_ctx->roam.configParam.bss_score_params;
+ weight_config = &bss_score_params->weight_cfg;
+ rssi_score = &bss_score_params->rssi_score;
+
+ if (!bss_score_params->enable_scoring_for_roam)
+ req_score_params->disable_bitmap =
+ WLAN_ROAM_SCORING_DISABLE_ALL;
+
+ req_score_params->rssi_weightage = weight_config->rssi_weightage;
+ req_score_params->ht_weightage = weight_config->ht_caps_weightage;
+ req_score_params->vht_weightage = weight_config->vht_caps_weightage;
+ req_score_params->he_weightage = weight_config->he_caps_weightage;
+ req_score_params->bw_weightage = weight_config->chan_width_weightage;
+ req_score_params->band_weightage = weight_config->chan_band_weightage;
+ req_score_params->nss_weightage = weight_config->nss_weightage;
+ req_score_params->esp_qbss_weightage =
+ weight_config->channel_congestion_weightage;
+ req_score_params->beamforming_weightage =
+ weight_config->beamforming_cap_weightage;
+ req_score_params->pcl_weightage =
+ weight_config->pcl_weightage;
+ req_score_params->oce_wan_weightage = weight_config->oce_wan_weightage;
+
+ req_score_params->bw_index_score =
+ bss_score_params->bandwidth_weight_per_index;
+ req_score_params->band_index_score =
+ bss_score_params->band_weight_per_index;
+ req_score_params->nss_index_score =
+ bss_score_params->nss_weight_per_index;
+
+ req_rssi_score->best_rssi_threshold = rssi_score->best_rssi_threshold;
+ req_rssi_score->good_rssi_threshold = rssi_score->good_rssi_threshold;
+ req_rssi_score->bad_rssi_threshold = rssi_score->bad_rssi_threshold;
+ req_rssi_score->good_rssi_pcnt = rssi_score->good_rssi_pcnt;
+ req_rssi_score->bad_rssi_pcnt = rssi_score->bad_rssi_pcnt;
+ req_rssi_score->good_bucket_size = rssi_score->good_rssi_bucket_size;
+ req_rssi_score->bad_bucket_size = rssi_score->bad_rssi_bucket_size;
+ req_rssi_score->rssi_pref_5g_rssi_thresh =
+ rssi_score->rssi_pref_5g_rssi_thresh;
+
+ req_score_params->esp_qbss_scoring.num_slot =
+ bss_score_params->esp_qbss_scoring.num_slot;
+ req_score_params->esp_qbss_scoring.score_pcnt3_to_0 =
+ bss_score_params->esp_qbss_scoring.score_pcnt3_to_0;
+ req_score_params->esp_qbss_scoring.score_pcnt7_to_4 =
+ bss_score_params->esp_qbss_scoring.score_pcnt7_to_4;
+ req_score_params->esp_qbss_scoring.score_pcnt11_to_8 =
+ bss_score_params->esp_qbss_scoring.score_pcnt11_to_8;
+ req_score_params->esp_qbss_scoring.score_pcnt15_to_12 =
+ bss_score_params->esp_qbss_scoring.score_pcnt15_to_12;
+
+ req_score_params->oce_wan_scoring.num_slot =
+ bss_score_params->oce_wan_scoring.num_slot;
+ req_score_params->oce_wan_scoring.score_pcnt3_to_0 =
+ bss_score_params->oce_wan_scoring.score_pcnt3_to_0;
+ req_score_params->oce_wan_scoring.score_pcnt7_to_4 =
+ bss_score_params->oce_wan_scoring.score_pcnt7_to_4;
+ req_score_params->oce_wan_scoring.score_pcnt11_to_8 =
+ bss_score_params->oce_wan_scoring.score_pcnt11_to_8;
+ req_score_params->oce_wan_scoring.score_pcnt15_to_12 =
+ bss_score_params->oce_wan_scoring.score_pcnt15_to_12;
+}
+
/**
* csr_roam_offload_scan() - populates roam offload scan request and sends to
* WMA
@@ -18609,6 +18720,7 @@ csr_roam_offload_scan(tpAniSirGlobal mac_ctx, uint8_t session_id,
session->pAddIEAssoc,
session->nAddIEAssocLength);
csr_update_driver_assoc_ies(mac_ctx, session, req_buf);
+ csr_update_score_params(mac_ctx, req_buf);
}
QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
diff --git a/core/wma/inc/wma_internal.h b/core/wma/inc/wma_internal.h
index 473b68ec2803..356a6fb839e6 100644
--- a/core/wma/inc/wma_internal.h
+++ b/core/wma/inc/wma_internal.h
@@ -288,21 +288,12 @@ A_UINT32 e_csr_auth_type_to_rsn_authmode(eCsrAuthType authtype,
A_UINT32 e_csr_encryption_type_to_rsn_cipherset(eCsrEncryptionType encr);
-void wma_roam_scan_fill_ap_profile(tp_wma_handle wma_handle,
- tpAniSirGlobal pMac,
- tSirRoamOffloadScanReq *roam_req,
- wmi_ap_profile *ap_profile_p);
-
void wma_roam_scan_fill_scan_params(tp_wma_handle wma_handle,
tpAniSirGlobal pMac,
tSirRoamOffloadScanReq *roam_req,
wmi_start_scan_cmd_fixed_param *
scan_params);
-QDF_STATUS wma_roam_scan_offload_ap_profile(tp_wma_handle wma_handle,
- wmi_ap_profile *ap_profile_p,
- uint32_t vdev_id);
-
QDF_STATUS wma_roam_scan_bmiss_cnt(tp_wma_handle wma_handle,
A_INT32 first_bcnt,
A_UINT32 final_bcnt, uint32_t vdev_id);
diff --git a/core/wma/src/wma_scan_roam.c b/core/wma/src/wma_scan_roam.c
index b64bf969bfdb..78b16f49d6a8 100644
--- a/core/wma/src/wma_scan_roam.c
+++ b/core/wma/src/wma_scan_roam.c
@@ -1210,60 +1210,56 @@ static uint32_t wma_roam_scan_get_cckm_mode(tSirRoamOffloadScanReq *roam_req,
#endif
/**
* wma_roam_scan_fill_ap_profile() - fill ap_profile
- * @wma_handle: wma handle
- * @pMac: Mac ptr
* @roam_req: roam offload scan request
- * @ap_profile_p: ap profile
+ * @profile: ap profile
*
* Fill ap_profile structure from configured parameters
*
* Return: none
*/
-void wma_roam_scan_fill_ap_profile(tp_wma_handle wma_handle,
- tpAniSirGlobal pMac,
- tSirRoamOffloadScanReq *roam_req,
- wmi_ap_profile *ap_profile_p)
+static void wma_roam_scan_fill_ap_profile(tSirRoamOffloadScanReq *roam_req,
+ struct ap_profile *profile)
{
uint32_t rsn_authmode;
- qdf_mem_zero(ap_profile_p, sizeof(wmi_ap_profile));
+ qdf_mem_zero(profile, sizeof(*profile));
if (roam_req == NULL) {
- ap_profile_p->ssid.ssid_len = 0;
- ap_profile_p->ssid.ssid[0] = 0;
- ap_profile_p->rsn_authmode = WMI_AUTH_NONE;
- ap_profile_p->rsn_ucastcipherset = WMI_CIPHER_NONE;
- ap_profile_p->rsn_mcastcipherset = WMI_CIPHER_NONE;
- ap_profile_p->rsn_mcastmgmtcipherset = WMI_CIPHER_NONE;
- ap_profile_p->rssi_threshold = WMA_ROAM_RSSI_DIFF_DEFAULT;
+ profile->ssid.length = 0;
+ profile->ssid.mac_ssid[0] = 0;
+ profile->rsn_authmode = WMI_AUTH_NONE;
+ profile->rsn_ucastcipherset = WMI_CIPHER_NONE;
+ profile->rsn_mcastcipherset = WMI_CIPHER_NONE;
+ profile->rsn_mcastmgmtcipherset = WMI_CIPHER_NONE;
+ profile->rssi_threshold = WMA_ROAM_RSSI_DIFF_DEFAULT;
} else {
- ap_profile_p->ssid.ssid_len =
+ profile->ssid.length =
roam_req->ConnectedNetwork.ssId.length;
- qdf_mem_copy(ap_profile_p->ssid.ssid,
+ qdf_mem_copy(profile->ssid.mac_ssid,
roam_req->ConnectedNetwork.ssId.ssId,
- ap_profile_p->ssid.ssid_len);
- ap_profile_p->rsn_authmode =
+ profile->ssid.length);
+ profile->rsn_authmode =
e_csr_auth_type_to_rsn_authmode(
roam_req->ConnectedNetwork.authentication,
roam_req->ConnectedNetwork.encryption);
- rsn_authmode = ap_profile_p->rsn_authmode;
+ rsn_authmode = profile->rsn_authmode;
if ((rsn_authmode == WMI_AUTH_CCKM_WPA) ||
(rsn_authmode == WMI_AUTH_CCKM_RSNA))
- ap_profile_p->rsn_authmode =
+ profile->rsn_authmode =
wma_roam_scan_get_cckm_mode(
roam_req, rsn_authmode);
- ap_profile_p->rsn_ucastcipherset =
+ profile->rsn_ucastcipherset =
e_csr_encryption_type_to_rsn_cipherset(
roam_req->ConnectedNetwork.encryption);
- ap_profile_p->rsn_mcastcipherset =
+ profile->rsn_mcastcipherset =
e_csr_encryption_type_to_rsn_cipherset(
roam_req->ConnectedNetwork.mcencryption);
- ap_profile_p->rsn_mcastmgmtcipherset =
- ap_profile_p->rsn_mcastcipherset;
- ap_profile_p->rssi_threshold = roam_req->RoamRssiDiff;
+ profile->rsn_mcastmgmtcipherset =
+ profile->rsn_mcastcipherset;
+ profile->rssi_threshold = roam_req->RoamRssiDiff;
#ifdef WLAN_FEATURE_11W
if (roam_req->ConnectedNetwork.mfp_enabled)
- ap_profile_p->flags |= WMI_AP_PROFILE_FLAG_PMF;
+ profile->flags |= WMI_AP_PROFILE_FLAG_PMF;
#endif
}
}
@@ -1585,19 +1581,23 @@ void wma_roam_scan_fill_scan_params(tp_wma_handle wma_handle,
/**
* wma_roam_scan_offload_ap_profile() - set roam ap profile in fw
* @wma_handle: wma handle
- * @ap_profile_p: ap profile
- * @vdev_id: vdev id
+ * @mac_ctx: Mac ptr
+ * @roam_req: Request which contains the ap profile
*
* Send WMI_ROAM_AP_PROFILE to firmware
*
* Return: QDF status
*/
-QDF_STATUS wma_roam_scan_offload_ap_profile(tp_wma_handle wma_handle,
- wmi_ap_profile *ap_profile_p,
- uint32_t vdev_id)
+static QDF_STATUS wma_roam_scan_offload_ap_profile(tp_wma_handle wma_handle,
+ tSirRoamOffloadScanReq *roam_req)
{
+ struct ap_profile_params ap_profile;
+
+ ap_profile.vdev_id = roam_req->sessionId;
+ wma_roam_scan_fill_ap_profile(roam_req, &ap_profile.profile);
+ ap_profile.param = roam_req->score_params;
return wmi_unified_send_roam_scan_offload_ap_cmd(wma_handle->wmi_handle,
- ap_profile_p, vdev_id);
+ &ap_profile);
}
/**
@@ -1796,7 +1796,6 @@ QDF_STATUS wma_process_roaming_config(tp_wma_handle wma_handle,
{
QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
wmi_start_scan_cmd_fixed_param scan_params;
- wmi_ap_profile ap_profile;
tpAniSirGlobal pMac = cds_get_context(QDF_MODULE_ID_PE);
uint32_t mode = 0;
struct wma_txrx_node *intr = NULL;
@@ -1881,11 +1880,8 @@ QDF_STATUS wma_process_roaming_config(tp_wma_handle wma_handle,
if (qdf_status != QDF_STATUS_SUCCESS)
break;
- wma_roam_scan_fill_ap_profile(wma_handle, pMac, roam_req,
- &ap_profile);
-
qdf_status = wma_roam_scan_offload_ap_profile(wma_handle,
- &ap_profile, roam_req->sessionId);
+ roam_req);
if (qdf_status != QDF_STATUS_SUCCESS)
break;
@@ -2122,10 +2118,8 @@ QDF_STATUS wma_process_roaming_config(tp_wma_handle wma_handle,
if (qdf_status != QDF_STATUS_SUCCESS)
break;
- wma_roam_scan_fill_ap_profile(wma_handle, pMac, roam_req,
- &ap_profile);
qdf_status = wma_roam_scan_offload_ap_profile(wma_handle,
- &ap_profile, roam_req->sessionId);
+ roam_req);
if (qdf_status != QDF_STATUS_SUCCESS)
break;