From 784de16c5861ceb09d161169e90cbe858683b4fc Mon Sep 17 00:00:00 2001 From: Himani Gupta Date: Fri, 4 Jan 2019 12:02:22 +0530 Subject: [PATCH] [RAMEN9610-10619][Common][9610] wlbt: [ACS] Rssi factor calculation issue. Driver changes to calculate rssi factor for 2.4GHZ. Change-Id: I3e091c379d4b2e62d51ea1e118569a5a58ea109c SCSC-Bug-Id: SSB-47988 Signed-off-by: Himani Gupta --- drivers/net/wireless/scsc/nl80211_vendor.c | 6 +++-- drivers/net/wireless/scsc/nl80211_vendor.h | 4 +-- drivers/net/wireless/scsc/rx.c | 31 +++++++++++++++++++--- 3 files changed, 33 insertions(+), 8 deletions(-) diff --git a/drivers/net/wireless/scsc/nl80211_vendor.c b/drivers/net/wireless/scsc/nl80211_vendor.c index d011b1db74ff..c475041fa73e 100755 --- a/drivers/net/wireless/scsc/nl80211_vendor.c +++ b/drivers/net/wireless/scsc/nl80211_vendor.c @@ -6232,11 +6232,13 @@ static int slsi_acs_init(struct wiphy *wiphy, return -ENOMEM; } memcpy(freq_list, nla_data(attr), nla_len(attr)); - freq_list_len = nla_len(attr); + freq_list_len = nla_len(attr) / sizeof(u32); + SLSI_INFO(sdev, "ACS freq_list_len: %d\n", freq_list_len); break; } default: - SLSI_ERR(sdev, "Invalid type : %d\n", type); + if (type > SLSI_ACS_ATTR_MAX) + SLSI_ERR(sdev, "Invalid type : %d\n", type); break; } } diff --git a/drivers/net/wireless/scsc/nl80211_vendor.h b/drivers/net/wireless/scsc/nl80211_vendor.h index 1d75011004db..2d456372e790 100755 --- a/drivers/net/wireless/scsc/nl80211_vendor.h +++ b/drivers/net/wireless/scsc/nl80211_vendor.h @@ -1649,8 +1649,8 @@ struct slsi_acs_chan_info { u8 num_bss_load_ap; u8 total_chan_utilization; u8 avg_chan_utilization; - u8 rssi_factor; - u8 adj_rssi_factor; + int rssi_factor; + int adj_rssi_factor; }; struct slsi_acs_selected_channels { diff --git a/drivers/net/wireless/scsc/rx.c b/drivers/net/wireless/scsc/rx.c index 9d1fb2f88769..693f6e9ad026 100755 --- a/drivers/net/wireless/scsc/rx.c +++ b/drivers/net/wireless/scsc/rx.c @@ -575,7 +575,7 @@ int slsi_set_2g_auto_channel(struct slsi_dev *sdev, struct netdev_vif *ndev_vif struct slsi_acs_selected_channels *acs_selected_channels, struct slsi_acs_chan_info *ch_info) { - int i = 0, j = 0, adjacent_rssi, avg_load, total_num_ap, total_rssi; + int i = 0, j = 0, avg_load, total_num_ap, total_rssi, adjacent_rssi; bool all_bss_load = true, none_bss_load = true; int min_avg_chan_utilization = INT_MAX, min_adjacent_rssi = INT_MAX; int ch_idx_min_load = 0, ch_idx_min_rssi = 0; @@ -814,6 +814,24 @@ int slsi_set_5g_auto_channel(struct slsi_dev *sdev, struct netdev_vif *ndev_vif return ret; } +int slsi_acs_get_rssi_factor(struct slsi_dev *sdev, int rssi, int ch_util) +{ + int frac_pow_val[10] = {10, 12, 15, 19, 25, 31, 39, 50, 63, 79}; + int res = 1; + int i; + + if (rssi < 0) + rssi = 0 - rssi; + else + return INT_MAX; + for (i = 0; i < rssi / 10; i++) + res *= 10; + res = (10000000 * ch_util / res) / frac_pow_val[rssi % 10]; + + SLSI_DBG3(sdev, SLSI_MLME, "ch_util:%d\n", ch_util); + return res; +} + struct slsi_acs_chan_info *slsi_acs_scan_results(struct slsi_dev *sdev, struct netdev_vif *ndev_vif, u16 scan_id) { struct sk_buff *scan_res; @@ -869,9 +887,14 @@ struct slsi_acs_chan_info *slsi_acs_scan_results(struct slsi_dev *sdev, struct n ch_info[idx].total_chan_utilization += ch_util; } } - if (idx == scan_channel->hw_value - 1) /*if 2.4GHZ channel */ - ch_info[idx].rssi_factor += 10 ^ (fapi_get_s16(scan_res, - u.mlme_scan_ind.rssi) / 10) * ch_util; + if (idx == scan_channel->hw_value - 1) { /*if 2.4GHZ channel */ + int res = 0; + + res = slsi_acs_get_rssi_factor(sdev, fapi_get_s16(scan_res, u.mlme_scan_ind.rssi), + ch_util); + ch_info[idx].rssi_factor += res; + SLSI_DBG3(sdev, SLSI_MLME, "ch_info[idx].rssi_factor:%d\n", ch_info[idx].rssi_factor); + } } else { goto next_scan; } -- 2.20.1