Commit b305a6ab authored by Stanislaw Gruszka's avatar Stanislaw Gruszka Committed by Kalle Valo

mt7601u: use EWMA to calculate avg_rssi

avr_rssi is not calculated correctly as we do not divide result
by 256 (mt76 sum avg_rssi1 and avg_rssi2 and divide by 512).
However dividing by 256 will make avg_rssi almost the same as
last rssi value - not really an average. So use EWMA to calculate
avg_rssi. I've chosen weight_rcp=4 to convergence quicker on signal
strength changes.
Signed-off-by: default avatarStanislaw Gruszka <sgruszka@redhat.com>
Acked-by: default avatarJakub Kicinski <kubakici@wp.pl>
Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
parent b9e5d4fe
...@@ -453,7 +453,7 @@ mt7601u_rx_monitor_beacon(struct mt7601u_dev *dev, struct mt7601u_rxwi *rxwi, ...@@ -453,7 +453,7 @@ mt7601u_rx_monitor_beacon(struct mt7601u_dev *dev, struct mt7601u_rxwi *rxwi,
{ {
dev->bcn_freq_off = rxwi->freq_off; dev->bcn_freq_off = rxwi->freq_off;
dev->bcn_phy_mode = FIELD_GET(MT_RXWI_RATE_PHY, rate); dev->bcn_phy_mode = FIELD_GET(MT_RXWI_RATE_PHY, rate);
dev->avg_rssi = (dev->avg_rssi * 15) / 16 + (rssi << 8); ewma_rssi_add(&dev->avg_rssi, -rssi);
} }
static int static int
...@@ -503,7 +503,7 @@ u32 mt76_mac_process_rx(struct mt7601u_dev *dev, struct sk_buff *skb, ...@@ -503,7 +503,7 @@ u32 mt76_mac_process_rx(struct mt7601u_dev *dev, struct sk_buff *skb,
if (mt7601u_rx_is_our_beacon(dev, data)) if (mt7601u_rx_is_our_beacon(dev, data))
mt7601u_rx_monitor_beacon(dev, rxwi, rate, rssi); mt7601u_rx_monitor_beacon(dev, rxwi, rate, rssi);
else if (rxwi->rxinfo & cpu_to_le32(MT_RXINFO_U2M)) else if (rxwi->rxinfo & cpu_to_le32(MT_RXINFO_U2M))
dev->avg_rssi = (dev->avg_rssi * 15) / 16 + (rssi << 8); ewma_rssi_add(&dev->avg_rssi, -rssi);
spin_unlock_bh(&dev->con_mon_lock); spin_unlock_bh(&dev->con_mon_lock);
return len; return len;
......
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
#include <linux/completion.h> #include <linux/completion.h>
#include <net/mac80211.h> #include <net/mac80211.h>
#include <linux/debugfs.h> #include <linux/debugfs.h>
#include <linux/average.h>
#include "regs.h" #include "regs.h"
...@@ -138,6 +139,8 @@ enum { ...@@ -138,6 +139,8 @@ enum {
MT7601U_STATE_MORE_STATS, MT7601U_STATE_MORE_STATS,
}; };
DECLARE_EWMA(rssi, 10, 4);
/** /**
* struct mt7601u_dev - adapter structure * struct mt7601u_dev - adapter structure
* @lock: protects @wcid->tx_rate. * @lock: protects @wcid->tx_rate.
...@@ -220,7 +223,7 @@ struct mt7601u_dev { ...@@ -220,7 +223,7 @@ struct mt7601u_dev {
s8 bcn_freq_off; s8 bcn_freq_off;
u8 bcn_phy_mode; u8 bcn_phy_mode;
int avg_rssi; /* starts at 0 and converges */ struct ewma_rssi avg_rssi;
u8 agc_save; u8 agc_save;
......
...@@ -975,6 +975,7 @@ void mt7601u_agc_restore(struct mt7601u_dev *dev) ...@@ -975,6 +975,7 @@ void mt7601u_agc_restore(struct mt7601u_dev *dev)
static void mt7601u_agc_tune(struct mt7601u_dev *dev) static void mt7601u_agc_tune(struct mt7601u_dev *dev)
{ {
u8 val = mt7601u_agc_default(dev); u8 val = mt7601u_agc_default(dev);
long avg_rssi;
if (test_bit(MT7601U_STATE_SCANNING, &dev->state)) if (test_bit(MT7601U_STATE_SCANNING, &dev->state))
return; return;
...@@ -984,9 +985,12 @@ static void mt7601u_agc_tune(struct mt7601u_dev *dev) ...@@ -984,9 +985,12 @@ static void mt7601u_agc_tune(struct mt7601u_dev *dev)
* Rssi updates are only on beacons and U2M so should work... * Rssi updates are only on beacons and U2M so should work...
*/ */
spin_lock_bh(&dev->con_mon_lock); spin_lock_bh(&dev->con_mon_lock);
if (dev->avg_rssi <= -70) avg_rssi = ewma_rssi_read(&dev->avg_rssi);
WARN_ON_ONCE(avg_rssi == 0);
avg_rssi = -avg_rssi;
if (avg_rssi <= -70)
val -= 0x20; val -= 0x20;
else if (dev->avg_rssi <= -60) else if (avg_rssi <= -60)
val -= 0x10; val -= 0x10;
spin_unlock_bh(&dev->con_mon_lock); spin_unlock_bh(&dev->con_mon_lock);
...@@ -1102,7 +1106,7 @@ void mt7601u_phy_con_cal_onoff(struct mt7601u_dev *dev, ...@@ -1102,7 +1106,7 @@ void mt7601u_phy_con_cal_onoff(struct mt7601u_dev *dev,
/* Start/stop collecting beacon data */ /* Start/stop collecting beacon data */
spin_lock_bh(&dev->con_mon_lock); spin_lock_bh(&dev->con_mon_lock);
ether_addr_copy(dev->ap_bssid, info->bssid); ether_addr_copy(dev->ap_bssid, info->bssid);
dev->avg_rssi = 0; ewma_rssi_init(&dev->avg_rssi);
dev->bcn_freq_off = MT_FREQ_OFFSET_INVALID; dev->bcn_freq_off = MT_FREQ_OFFSET_INVALID;
spin_unlock_bh(&dev->con_mon_lock); spin_unlock_bh(&dev->con_mon_lock);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment