Commit ef13edc0 authored by Felix Fietkau's avatar Felix Fietkau

mt76: move mt76x02_phy_get_min_avg_rssi to mt76 core

This will be used by mt7603 as well
Signed-off-by: default avatarFelix Fietkau <nbd@nbd.name>
parent 9313faac
...@@ -548,7 +548,7 @@ mt76_check_ccmp_pn(struct sk_buff *skb) ...@@ -548,7 +548,7 @@ mt76_check_ccmp_pn(struct sk_buff *skb)
} }
static void static void
mt76_check_ps(struct mt76_dev *dev, struct sk_buff *skb) mt76_check_sta(struct mt76_dev *dev, struct sk_buff *skb)
{ {
struct mt76_rx_status *status = (struct mt76_rx_status *) skb->cb; struct mt76_rx_status *status = (struct mt76_rx_status *) skb->cb;
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data; struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
...@@ -567,6 +567,9 @@ mt76_check_ps(struct mt76_dev *dev, struct sk_buff *skb) ...@@ -567,6 +567,9 @@ mt76_check_ps(struct mt76_dev *dev, struct sk_buff *skb)
sta = container_of((void *) wcid, struct ieee80211_sta, drv_priv); sta = container_of((void *) wcid, struct ieee80211_sta, drv_priv);
ewma_signal_add(&wcid->rssi, status->signal);
wcid->inactive_count = 0;
if (!test_bit(MT_WCID_FLAG_CHECK_PS, &wcid->flags)) if (!test_bit(MT_WCID_FLAG_CHECK_PS, &wcid->flags))
return; return;
...@@ -626,7 +629,7 @@ void mt76_rx_poll_complete(struct mt76_dev *dev, enum mt76_rxq_id q, ...@@ -626,7 +629,7 @@ void mt76_rx_poll_complete(struct mt76_dev *dev, enum mt76_rxq_id q,
__skb_queue_head_init(&frames); __skb_queue_head_init(&frames);
while ((skb = __skb_dequeue(&dev->rx_skb[q])) != NULL) { while ((skb = __skb_dequeue(&dev->rx_skb[q])) != NULL) {
mt76_check_ps(dev, skb); mt76_check_sta(dev, skb);
mt76_rx_aggr_reorder(skb, &frames); mt76_rx_aggr_reorder(skb, &frames);
} }
...@@ -660,6 +663,7 @@ mt76_sta_add(struct mt76_dev *dev, struct ieee80211_vif *vif, ...@@ -660,6 +663,7 @@ mt76_sta_add(struct mt76_dev *dev, struct ieee80211_vif *vif,
mt76_txq_init(dev, sta->txq[i]); mt76_txq_init(dev, sta->txq[i]);
} }
ewma_signal_init(&wcid->rssi);
rcu_assign_pointer(dev->wcid[wcid->idx], wcid); rcu_assign_pointer(dev->wcid[wcid->idx], wcid);
out: out:
......
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
#include <linux/skbuff.h> #include <linux/skbuff.h>
#include <linux/leds.h> #include <linux/leds.h>
#include <linux/usb.h> #include <linux/usb.h>
#include <linux/average.h>
#include <net/mac80211.h> #include <net/mac80211.h>
#include "util.h" #include "util.h"
...@@ -174,6 +175,8 @@ enum mt76_wcid_flags { ...@@ -174,6 +175,8 @@ enum mt76_wcid_flags {
#define MT76_N_WCIDS 128 #define MT76_N_WCIDS 128
DECLARE_EWMA(signal, 10, 8);
struct mt76_wcid { struct mt76_wcid {
struct mt76_rx_tid __rcu *aggr[IEEE80211_NUM_TIDS]; struct mt76_rx_tid __rcu *aggr[IEEE80211_NUM_TIDS];
...@@ -181,6 +184,9 @@ struct mt76_wcid { ...@@ -181,6 +184,9 @@ struct mt76_wcid {
unsigned long flags; unsigned long flags;
struct ewma_signal rssi;
int inactive_count;
u8 idx; u8 idx;
u8 hw_key_idx; u8 hw_key_idx;
...@@ -680,6 +686,8 @@ int mt76_sta_state(struct ieee80211_hw *hw, struct ieee80211_vif *vif, ...@@ -680,6 +686,8 @@ int mt76_sta_state(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
struct ieee80211_sta *mt76_rx_convert(struct sk_buff *skb); struct ieee80211_sta *mt76_rx_convert(struct sk_buff *skb);
int mt76_get_min_avg_rssi(struct mt76_dev *dev);
int mt76_get_txpower(struct ieee80211_hw *hw, struct ieee80211_vif *vif, int mt76_get_txpower(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
int *dbm); int *dbm);
......
...@@ -1077,7 +1077,9 @@ mt76x0_phy_update_channel_gain(struct mt76x02_dev *dev) ...@@ -1077,7 +1077,9 @@ mt76x0_phy_update_channel_gain(struct mt76x02_dev *dev)
u8 gain_delta; u8 gain_delta;
int low_gain; int low_gain;
dev->cal.avg_rssi_all = mt76x02_phy_get_min_avg_rssi(dev); dev->cal.avg_rssi_all = mt76_get_min_avg_rssi(&dev->mt76);
if (!dev->cal.avg_rssi_all)
dev->cal.avg_rssi_all = -75;
low_gain = (dev->cal.avg_rssi_all > mt76x02_get_rssi_gain_thresh(dev)) + low_gain = (dev->cal.avg_rssi_all > mt76x02_get_rssi_gain_thresh(dev)) +
(dev->cal.avg_rssi_all > mt76x02_get_low_rssi_gain_thresh(dev)); (dev->cal.avg_rssi_all > mt76x02_get_low_rssi_gain_thresh(dev));
......
...@@ -656,11 +656,6 @@ int mt76x02_mac_process_rx(struct mt76x02_dev *dev, struct sk_buff *skb, ...@@ -656,11 +656,6 @@ int mt76x02_mac_process_rx(struct mt76x02_dev *dev, struct sk_buff *skb,
status->tid = FIELD_GET(MT_RXWI_TID, tid_sn); status->tid = FIELD_GET(MT_RXWI_TID, tid_sn);
status->seqno = FIELD_GET(MT_RXWI_SN, tid_sn); status->seqno = FIELD_GET(MT_RXWI_SN, tid_sn);
if (sta) {
ewma_signal_add(&sta->rssi, status->signal);
sta->inactive_count = 0;
}
return mt76x02_mac_process_rate(status, rate); return mt76x02_mac_process_rate(status, rate);
} }
......
...@@ -18,8 +18,6 @@ ...@@ -18,8 +18,6 @@
#ifndef __MT76X02_MAC_H #ifndef __MT76X02_MAC_H
#define __MT76X02_MAC_H #define __MT76X02_MAC_H
#include <linux/average.h>
struct mt76x02_dev; struct mt76x02_dev;
struct mt76x02_tx_status { struct mt76x02_tx_status {
...@@ -41,8 +39,6 @@ struct mt76x02_vif { ...@@ -41,8 +39,6 @@ struct mt76x02_vif {
u8 idx; u8 idx;
}; };
DECLARE_EWMA(signal, 10, 8);
struct mt76x02_sta { struct mt76x02_sta {
struct mt76_wcid wcid; /* must be first */ struct mt76_wcid wcid; /* must be first */
...@@ -50,8 +46,6 @@ struct mt76x02_sta { ...@@ -50,8 +46,6 @@ struct mt76x02_sta {
struct mt76x02_tx_status status; struct mt76x02_tx_status status;
int n_frames; int n_frames;
struct ewma_signal rssi;
int inactive_count;
}; };
#define MT_RXINFO_BA BIT(0) #define MT_RXINFO_BA BIT(0)
......
...@@ -132,53 +132,6 @@ void mt76x02_phy_set_txpower(struct mt76x02_dev *dev, int txp_0, int txp_1) ...@@ -132,53 +132,6 @@ void mt76x02_phy_set_txpower(struct mt76x02_dev *dev, int txp_0, int txp_1)
} }
EXPORT_SYMBOL_GPL(mt76x02_phy_set_txpower); EXPORT_SYMBOL_GPL(mt76x02_phy_set_txpower);
int mt76x02_phy_get_min_avg_rssi(struct mt76x02_dev *dev)
{
struct mt76x02_sta *sta;
struct mt76_wcid *wcid;
int i, j, min_rssi = 0;
s8 cur_rssi;
local_bh_disable();
rcu_read_lock();
for (i = 0; i < ARRAY_SIZE(dev->mt76.wcid_mask); i++) {
unsigned long mask = dev->mt76.wcid_mask[i];
if (!mask)
continue;
for (j = i * BITS_PER_LONG; mask; j++, mask >>= 1) {
if (!(mask & 1))
continue;
wcid = rcu_dereference(dev->mt76.wcid[j]);
if (!wcid)
continue;
sta = container_of(wcid, struct mt76x02_sta, wcid);
spin_lock(&dev->mt76.rx_lock);
if (sta->inactive_count++ < 5)
cur_rssi = ewma_signal_read(&sta->rssi);
else
cur_rssi = 0;
spin_unlock(&dev->mt76.rx_lock);
if (cur_rssi < min_rssi)
min_rssi = cur_rssi;
}
}
rcu_read_unlock();
local_bh_enable();
if (!min_rssi)
return -75;
return min_rssi;
}
EXPORT_SYMBOL_GPL(mt76x02_phy_get_min_avg_rssi);
void mt76x02_phy_set_bw(struct mt76x02_dev *dev, int width, u8 ctrl) void mt76x02_phy_set_bw(struct mt76x02_dev *dev, int width, u8 ctrl)
{ {
int core_val, agc_val; int core_val, agc_val;
......
...@@ -51,7 +51,6 @@ void mt76x02_limit_rate_power(struct mt76_rate_power *r, int limit); ...@@ -51,7 +51,6 @@ void mt76x02_limit_rate_power(struct mt76_rate_power *r, int limit);
int mt76x02_get_max_rate_power(struct mt76_rate_power *r); int mt76x02_get_max_rate_power(struct mt76_rate_power *r);
void mt76x02_phy_set_rxpath(struct mt76x02_dev *dev); void mt76x02_phy_set_rxpath(struct mt76x02_dev *dev);
void mt76x02_phy_set_txdac(struct mt76x02_dev *dev); void mt76x02_phy_set_txdac(struct mt76x02_dev *dev);
int mt76x02_phy_get_min_avg_rssi(struct mt76x02_dev *dev);
void mt76x02_phy_set_bw(struct mt76x02_dev *dev, int width, u8 ctrl); void mt76x02_phy_set_bw(struct mt76x02_dev *dev, int width, u8 ctrl);
void mt76x02_phy_set_band(struct mt76x02_dev *dev, int band, void mt76x02_phy_set_band(struct mt76x02_dev *dev, int band,
bool primary_upper); bool primary_upper);
......
...@@ -250,8 +250,6 @@ int mt76x02_sta_add(struct mt76_dev *mdev, struct ieee80211_vif *vif, ...@@ -250,8 +250,6 @@ int mt76x02_sta_add(struct mt76_dev *mdev, struct ieee80211_vif *vif,
if (vif->type == NL80211_IFTYPE_AP) if (vif->type == NL80211_IFTYPE_AP)
set_bit(MT_WCID_FLAG_CHECK_PS, &msta->wcid.flags); set_bit(MT_WCID_FLAG_CHECK_PS, &msta->wcid.flags);
ewma_signal_init(&msta->rssi);
return 0; return 0;
} }
EXPORT_SYMBOL_GPL(mt76x02_sta_add); EXPORT_SYMBOL_GPL(mt76x02_sta_add);
......
...@@ -284,7 +284,9 @@ void mt76x2_phy_update_channel_gain(struct mt76x02_dev *dev) ...@@ -284,7 +284,9 @@ void mt76x2_phy_update_channel_gain(struct mt76x02_dev *dev)
int low_gain; int low_gain;
u32 val; u32 val;
dev->cal.avg_rssi_all = mt76x02_phy_get_min_avg_rssi(dev); dev->cal.avg_rssi_all = mt76_get_min_avg_rssi(&dev->mt76);
if (!dev->cal.avg_rssi_all)
dev->cal.avg_rssi_all = -75;
low_gain = (dev->cal.avg_rssi_all > mt76x02_get_rssi_gain_thresh(dev)) + low_gain = (dev->cal.avg_rssi_all > mt76x02_get_rssi_gain_thresh(dev)) +
(dev->cal.avg_rssi_all > mt76x02_get_low_rssi_gain_thresh(dev)); (dev->cal.avg_rssi_all > mt76x02_get_low_rssi_gain_thresh(dev));
......
...@@ -75,4 +75,46 @@ int mt76_wcid_alloc(unsigned long *mask, int size) ...@@ -75,4 +75,46 @@ int mt76_wcid_alloc(unsigned long *mask, int size)
} }
EXPORT_SYMBOL_GPL(mt76_wcid_alloc); EXPORT_SYMBOL_GPL(mt76_wcid_alloc);
int mt76_get_min_avg_rssi(struct mt76_dev *dev)
{
struct mt76_wcid *wcid;
int i, j, min_rssi = 0;
s8 cur_rssi;
local_bh_disable();
rcu_read_lock();
for (i = 0; i < ARRAY_SIZE(dev->wcid_mask); i++) {
unsigned long mask = dev->wcid_mask[i];
if (!mask)
continue;
for (j = i * BITS_PER_LONG; mask; j++, mask >>= 1) {
if (!(mask & 1))
continue;
wcid = rcu_dereference(dev->wcid[j]);
if (!wcid)
continue;
spin_lock(&dev->rx_lock);
if (wcid->inactive_count++ < 5)
cur_rssi = ewma_signal_read(&wcid->rssi);
else
cur_rssi = 0;
spin_unlock(&dev->rx_lock);
if (cur_rssi < min_rssi)
min_rssi = cur_rssi;
}
}
rcu_read_unlock();
local_bh_enable();
return min_rssi;
}
EXPORT_SYMBOL_GPL(mt76_get_min_avg_rssi);
MODULE_LICENSE("Dual BSD/GPL"); MODULE_LICENSE("Dual BSD/GPL");
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